summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2020-06-08 18:06:28 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2020-06-08 18:06:29 -0700
commit7e75aeb290b5f0d858019359fee4e0132637c726 (patch)
treee69483b90bf8aed5adcf7c071b303b87657fd1ae
parentMerge branch 'es/bugreport-shell' (diff)
parentfsck: detect more in-tree d/f conflicts (diff)
downloadtgif-7e75aeb290b5f0d858019359fee4e0132637c726.tar.xz
Merge branch 'rs/fsck-duplicate-names-in-trees'
The check in "git fsck" to ensure that the tree objects are sorted still had corner cases it missed unsorted entries. * rs/fsck-duplicate-names-in-trees: fsck: detect more in-tree d/f conflicts t1450: demonstrate undetected in-tree d/f conflict t1450: increase test coverage of in-tree d/f detection fsck: fix a typo in a comment
-rw-r--r--fsck.c4
-rwxr-xr-xt/t1450-fsck.sh43
2 files changed, 30 insertions, 17 deletions
diff --git a/fsck.c b/fsck.c
index 8bb3ecf282..f82e2fe9e3 100644
--- a/fsck.c
+++ b/fsck.c
@@ -598,7 +598,7 @@ static int verify_ordered(unsigned mode1, const char *name1,
/*
* There can be non-consecutive duplicates due to the implicitly
- * add slash, e.g.:
+ * added slash, e.g.:
*
* foo
* foo.bar
@@ -620,7 +620,7 @@ static int verify_ordered(unsigned mode1, const char *name1,
if (!f_name)
break;
if (!skip_prefix(name2, f_name, &p))
- break;
+ continue;
if (!*p)
return TREE_HAS_DUPS;
if (is_less_than_slash(*p)) {
diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh
index 91a6e34f38..344a2aad82 100755
--- a/t/t1450-fsck.sh
+++ b/t/t1450-fsck.sh
@@ -257,21 +257,34 @@ test_expect_success 'tree object with duplicate entries' '
test_i18ngrep "error in tree .*contains duplicate file entries" out
'
-test_expect_success 'tree object with dublicate names' '
- test_when_finished "remove_object \$blob" &&
- test_when_finished "remove_object \$tree" &&
- test_when_finished "remove_object \$badtree" &&
- blob=$(echo blob | git hash-object -w --stdin) &&
- printf "100644 blob %s\t%s\n" $blob x.2 >tree &&
- tree=$(git mktree <tree) &&
- printf "100644 blob %s\t%s\n" $blob x.1 >badtree &&
- printf "100644 blob %s\t%s\n" $blob x >>badtree &&
- printf "040000 tree %s\t%s\n" $tree x >>badtree &&
- badtree=$(git mktree <badtree) &&
- test_must_fail git fsck 2>out &&
- test_i18ngrep "$badtree" out &&
- test_i18ngrep "error in tree .*contains duplicate file entries" out
-'
+check_duplicate_names () {
+ expect=$1 &&
+ shift &&
+ names=$@ &&
+ test_expect_$expect "tree object with duplicate names: $names" '
+ test_when_finished "remove_object \$blob" &&
+ test_when_finished "remove_object \$tree" &&
+ test_when_finished "remove_object \$badtree" &&
+ blob=$(echo blob | git hash-object -w --stdin) &&
+ printf "100644 blob %s\t%s\n" $blob x.2 >tree &&
+ tree=$(git mktree <tree) &&
+ for name in $names
+ do
+ case "$name" in
+ */) printf "040000 tree %s\t%s\n" $tree "${name%/}" ;;
+ *) printf "100644 blob %s\t%s\n" $blob "$name" ;;
+ esac
+ done >badtree &&
+ badtree=$(git mktree <badtree) &&
+ test_must_fail git fsck 2>out &&
+ test_i18ngrep "$badtree" out &&
+ test_i18ngrep "error in tree .*contains duplicate file entries" out
+ '
+}
+
+check_duplicate_names success x x.1 x/
+check_duplicate_names success x x.1.2 x.1/ x/
+check_duplicate_names success x x.1 x.1.2 x/
test_expect_success 'unparseable tree object' '
test_oid_cache <<-\EOF &&