mirror of
https://github.com/git/git.git
synced 2024-11-24 10:26:17 +08:00
diff.c: Ensure "index $from..$to" line contains unambiguous SHA1s
In the metainfo section of git diffs there's an "index" line providing abbreviated (unless --full-index is used) blob SHA1s from the pre-/post-images used to generate the diff. These provide hints that can be used to reconstruct a 3-way merge when applying the patch (see the --3way option to 'git am' for more details). In order for this to work, however, the blob SHA1s must not be abbreviated into ambiguity. This patch eliminates the possible ambiguity by using find_unique_abbrev() to produce the abbreviated SHA1s (instead of blind abbreviation by way of "%.*s"). A testcase verifying the fix is also included. Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
81fa024cd8
commit
3e5a188f1d
6
diff.c
6
diff.c
@ -2419,9 +2419,9 @@ static void fill_metainfo(struct strbuf *msg,
|
||||
(!fill_mmfile(&mf, two) && diff_filespec_is_binary(two)))
|
||||
abbrev = 40;
|
||||
}
|
||||
strbuf_addf(msg, "index %.*s..%.*s",
|
||||
abbrev, sha1_to_hex(one->sha1),
|
||||
abbrev, sha1_to_hex(two->sha1));
|
||||
strbuf_addf(msg, "index %s..",
|
||||
find_unique_abbrev(one->sha1, abbrev));
|
||||
strbuf_addstr(msg, find_unique_abbrev(two->sha1, abbrev));
|
||||
if (one->mode == two->mode)
|
||||
strbuf_addf(msg, " %06o", one->mode);
|
||||
strbuf_addch(msg, '\n');
|
||||
|
35
t/t4044-diff-index-unique-abbrev.sh
Executable file
35
t/t4044-diff-index-unique-abbrev.sh
Executable file
@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='test unique sha1 abbreviation on "index from..to" line'
|
||||
. ./test-lib.sh
|
||||
|
||||
cat >expect_initial <<EOF
|
||||
100644 blob 51d2738463ea4ca66f8691c91e33ce64b7d41bb1 foo
|
||||
EOF
|
||||
|
||||
cat >expect_update <<EOF
|
||||
100644 blob 51d2738efb4ad8a1e40bed839ab8e116f0a15e47 foo
|
||||
EOF
|
||||
|
||||
test_expect_success 'setup' '
|
||||
echo 4827 > foo &&
|
||||
git add foo &&
|
||||
git commit -m "initial" &&
|
||||
git cat-file -p HEAD: > actual &&
|
||||
test_cmp expect_initial actual &&
|
||||
echo 11742 > foo &&
|
||||
git commit -a -m "update" &&
|
||||
git cat-file -p HEAD: > actual &&
|
||||
test_cmp expect_update actual
|
||||
'
|
||||
|
||||
cat >expect <<EOF
|
||||
index 51d27384..51d2738e 100644
|
||||
EOF
|
||||
|
||||
test_expect_success 'diff does not produce ambiguous index line' '
|
||||
git diff HEAD^..HEAD | grep index > actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_done
|
Loading…
Reference in New Issue
Block a user