diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-08-26 22:16:26 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-08-26 22:16:26 +0400 |
commit | 4109c28e055dba27d73cefb956bea5e611f66ec0 (patch) | |
tree | 8b323ced930a0eb5bb7912059506278f88ec36a9 | |
parent | a3d54f9a1fa481727a849b8753fc9d1abafe6583 (diff) | |
parent | e09867f0605702c2d4e65b99e178cdaa215a7370 (diff) |
Merge branch 'jk/diff-tree-t-fix'
Fix (rarely used) "git diff-tree -t" regression in 2.0.
* jk/diff-tree-t-fix:
intersect_paths: respect mode in git's tree-sort
-rw-r--r-- | combine-diff.c | 12 | ||||
-rwxr-xr-x | t/t4038-diff-combined.sh | 34 |
2 files changed, 45 insertions, 1 deletions
diff --git a/combine-diff.c b/combine-diff.c index f9975d2c2e..60cb4f81f9 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -12,6 +12,16 @@ #include "sha1-array.h" #include "revision.h" +static int compare_paths(const struct combine_diff_path *one, + const struct diff_filespec *two) +{ + if (!S_ISDIR(one->mode) && !S_ISDIR(two->mode)) + return strcmp(one->path, two->path); + + return base_name_compare(one->path, strlen(one->path), one->mode, + two->path, strlen(two->path), two->mode); +} + static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent) { struct diff_queue_struct *q = &diff_queued_diff; @@ -52,7 +62,7 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, i = 0; while ((p = *tail) != NULL) { cmp = ((i >= q->nr) - ? -1 : strcmp(p->path, q->queue[i]->two->path)); + ? -1 : compare_paths(p, q->queue[i]->two)); if (cmp < 0) { /* p->path not in q->queue[]; drop it */ diff --git a/t/t4038-diff-combined.sh b/t/t4038-diff-combined.sh index 41913c3aa3..0b4f7dfdc6 100755 --- a/t/t4038-diff-combined.sh +++ b/t/t4038-diff-combined.sh @@ -401,4 +401,38 @@ test_expect_success 'combine diff missing delete bug' ' compare_diff_patch expected actual ' +test_expect_success 'combine diff gets tree sorting right' ' + # create a directory and a file that sort differently in trees + # versus byte-wise (implied "/" sorts after ".") + git checkout -f master && + mkdir foo && + echo base >foo/one && + echo base >foo/two && + echo base >foo.ext && + git add foo foo.ext && + git commit -m base && + + # one side modifies a file in the directory, along with the root + # file... + echo master >foo/one && + echo master >foo.ext && + git commit -a -m master && + + # the other side modifies the other file in the directory + git checkout -b other HEAD^ && + echo other >foo/two && + git commit -a -m other && + + # And now we merge. The files in the subdirectory will resolve cleanly, + # meaning that a combined diff will not find them interesting. But it + # will find the tree itself interesting, because it had to be merged. + git checkout master && + git merge other && + + printf "MM\tfoo\n" >expect && + git diff-tree -c --name-status -t HEAD >actual.tmp && + sed 1d <actual.tmp >actual && + test_cmp expect actual +' + test_done |