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
This commit is contained in:
Junio C Hamano 2020-06-08 18:06:28 -07:00
commit 7e75aeb290
2 changed files with 30 additions and 17 deletions

4
fsck.c
View File

@ -598,7 +598,7 @@ static int verify_ordered(unsigned mode1, const char *name1,
/* /*
* There can be non-consecutive duplicates due to the implicitly * There can be non-consecutive duplicates due to the implicitly
* add slash, e.g.: * added slash, e.g.:
* *
* foo * foo
* foo.bar * foo.bar
@ -620,7 +620,7 @@ static int verify_ordered(unsigned mode1, const char *name1,
if (!f_name) if (!f_name)
break; break;
if (!skip_prefix(name2, f_name, &p)) if (!skip_prefix(name2, f_name, &p))
break; continue;
if (!*p) if (!*p)
return TREE_HAS_DUPS; return TREE_HAS_DUPS;
if (is_less_than_slash(*p)) { if (is_less_than_slash(*p)) {

View File

@ -257,21 +257,34 @@ test_expect_success 'tree object with duplicate entries' '
test_i18ngrep "error in tree .*contains duplicate file entries" out test_i18ngrep "error in tree .*contains duplicate file entries" out
' '
test_expect_success 'tree object with dublicate names' ' check_duplicate_names () {
test_when_finished "remove_object \$blob" && expect=$1 &&
test_when_finished "remove_object \$tree" && shift &&
test_when_finished "remove_object \$badtree" && names=$@ &&
blob=$(echo blob | git hash-object -w --stdin) && test_expect_$expect "tree object with duplicate names: $names" '
printf "100644 blob %s\t%s\n" $blob x.2 >tree && test_when_finished "remove_object \$blob" &&
tree=$(git mktree <tree) && test_when_finished "remove_object \$tree" &&
printf "100644 blob %s\t%s\n" $blob x.1 >badtree && test_when_finished "remove_object \$badtree" &&
printf "100644 blob %s\t%s\n" $blob x >>badtree && blob=$(echo blob | git hash-object -w --stdin) &&
printf "040000 tree %s\t%s\n" $tree x >>badtree && printf "100644 blob %s\t%s\n" $blob x.2 >tree &&
badtree=$(git mktree <badtree) && tree=$(git mktree <tree) &&
test_must_fail git fsck 2>out && for name in $names
test_i18ngrep "$badtree" out && do
test_i18ngrep "error in tree .*contains duplicate file entries" out 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_expect_success 'unparseable tree object' '
test_oid_cache <<-\EOF && test_oid_cache <<-\EOF &&