mirror of
https://github.com/git/git
synced 2024-10-02 14:45:21 +00:00
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:
commit
7e75aeb290
4
fsck.c
4
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)) {
|
||||
|
|
|
@ -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 &&
|
||||
|
|
Loading…
Reference in a new issue