-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'jk/diffcore-rename-duplicate'
A corrupt input to "git diff -M" can cause us to segfault. * jk/diffcore-rename-duplicate: diffcore-rename: avoid processing duplicate destinations diffcore-rename: split locate_rename_dst into two functions
- Loading branch information
Showing
2 changed files
with
110 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
#!/bin/sh | ||
|
||
test_description='test tree diff when trees have duplicate entries' | ||
. ./test-lib.sh | ||
|
||
# make_tree_entry <mode> <mode> <sha1> | ||
# | ||
# We have to rely on perl here because not all printfs understand | ||
# hex escapes (only octal), and xxd is not portable. | ||
make_tree_entry () { | ||
printf '%s %s\0' "$1" "$2" && | ||
perl -e 'print chr(hex($_)) for ($ARGV[0] =~ /../g)' "$3" | ||
} | ||
|
||
# Like git-mktree, but without all of the pesky sanity checking. | ||
# Arguments come in groups of three, each group specifying a single | ||
# tree entry (see make_tree_entry above). | ||
make_tree () { | ||
while test $# -gt 2; do | ||
make_tree_entry "$1" "$2" "$3" | ||
shift; shift; shift | ||
done | | ||
git hash-object -w -t tree --stdin | ||
} | ||
|
||
# this is kind of a convoluted setup, but matches | ||
# a real-world case. Each tree contains four entries | ||
# for the given path, one with one sha1, and three with | ||
# the other. The first tree has them split across | ||
# two subtrees (which are themselves duplicate entries in | ||
# the root tree), and the second has them all in a single subtree. | ||
test_expect_success 'create trees with duplicate entries' ' | ||
blob_one=$(echo one | git hash-object -w --stdin) && | ||
blob_two=$(echo two | git hash-object -w --stdin) && | ||
inner_one_a=$(make_tree \ | ||
100644 inner $blob_one | ||
) && | ||
inner_one_b=$(make_tree \ | ||
100644 inner $blob_two \ | ||
100644 inner $blob_two \ | ||
100644 inner $blob_two | ||
) && | ||
outer_one=$(make_tree \ | ||
040000 outer $inner_one_a \ | ||
040000 outer $inner_one_b | ||
) && | ||
inner_two=$(make_tree \ | ||
100644 inner $blob_one \ | ||
100644 inner $blob_two \ | ||
100644 inner $blob_two \ | ||
100644 inner $blob_two | ||
) && | ||
outer_two=$(make_tree \ | ||
040000 outer $inner_two | ||
) && | ||
git tag one $outer_one && | ||
git tag two $outer_two | ||
' | ||
|
||
test_expect_success 'diff-tree between trees' ' | ||
{ | ||
printf ":000000 100644 $_z40 $blob_two A\touter/inner\n" && | ||
printf ":000000 100644 $_z40 $blob_two A\touter/inner\n" && | ||
printf ":000000 100644 $_z40 $blob_two A\touter/inner\n" && | ||
printf ":100644 000000 $blob_two $_z40 D\touter/inner\n" && | ||
printf ":100644 000000 $blob_two $_z40 D\touter/inner\n" && | ||
printf ":100644 000000 $blob_two $_z40 D\touter/inner\n" | ||
} >expect && | ||
git diff-tree -r --no-abbrev one two >actual && | ||
test_cmp expect actual | ||
' | ||
|
||
test_expect_success 'diff-tree with renames' ' | ||
# same expectation as above, since we disable rename detection | ||
git diff-tree -M -r --no-abbrev one two >actual && | ||
test_cmp expect actual | ||
' | ||
|
||
test_done |