mirror of https://github.com/git/git.git
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
|
* 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)) {
|
||||||
|
|
|
@ -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 &&
|
||||||
|
|
Loading…
Reference in New Issue