Browse Source

Merge branch 'sg/diff-multiple-identical-renames' into maint

"git diff -M" used to work better when two originally identical
files A and B got renamed to X/A and X/B by pairing A to X/A and B
to X/B, but this was broken in the 2.0 timeframe.

* sg/diff-multiple-identical-renames:
  diffcore: fix iteration order of identical files during rename detection
maint
Junio C Hamano 9 years ago
parent
commit
b96c396cce
  1. 6
      diffcore-rename.c
  2. 11
      t/t4001-diff-rename.sh

6
diffcore-rename.c

@ -340,9 +340,11 @@ static int find_exact_renames(struct diff_options *options) @@ -340,9 +340,11 @@ static int find_exact_renames(struct diff_options *options)
int i, renames = 0;
struct hashmap file_table;

/* Add all sources to the hash table */
/* Add all sources to the hash table in reverse order, because
* later on they will be retrieved in LIFO order.
*/
hashmap_init(&file_table, NULL, rename_src_nr);
for (i = 0; i < rename_src_nr; i++)
for (i = rename_src_nr-1; i >= 0; i--)
insert_file_table(&file_table, i, rename_src[i].p->one);

/* Walk the destinations and find best source match */

11
t/t4001-diff-rename.sh

@ -77,6 +77,17 @@ test_expect_success 'favour same basenames even with minor differences' ' @@ -77,6 +77,17 @@ test_expect_success 'favour same basenames even with minor differences' '
git show HEAD:path1 | sed "s/15/16/" > subdir/path1 &&
git status | test_i18ngrep "renamed: .*path1 -> subdir/path1"'

test_expect_success 'two files with same basename and same content' '
git reset --hard &&
mkdir -p dir/A dir/B &&
cp path1 dir/A/file &&
cp path1 dir/B/file &&
git add dir &&
git commit -m 2 &&
git mv dir other-dir &&
git status | test_i18ngrep "renamed: .*dir/A/file -> other-dir/A/file"
'

test_expect_success 'setup for many rename source candidates' '
git reset --hard &&
for i in 0 1 2 3 4 5 6 7 8 9;

Loading…
Cancel
Save