From ddafa7e93325d45cd4bd950dd8e89ff3188d0250 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 29 May 2005 16:54:59 -0700 Subject: [PATCH] [PATCH] diff-helper: Fix R/C score parsing under -z flag. The score number that follow R/C status were parsed but the parse pointer was not updated, causing the entire line to become unrecognized. This patch fixes this problem. There was a test missing to catch this breakage, which this commit adds as t4009-diff-rename-4.sh. The diff-raw tests used in related t4005-diff-rename-2.sh (the same test without -z) and t4007-rename-3.sh were stricter than necessarily, despite that the comment for the tests said otherwise. This patch also corrects them. The documentation is updated to say that the status can optionally be followed by a number called "score"; it does not have to stay similarity index forever and there is no reason to limit it only to C and R. Signed-off-by: Junio C Hamano Signed-off-by: Linus Torvalds --- Documentation/diff-format.txt | 2 +- diff-helper.c | 17 +++---- t/t4005-diff-rename-2.sh | 20 +++++--- t/t4007-rename-3.sh | 2 +- ...005-diff-rename-2.sh => t4009-diff-rename-4.sh} | 59 ++++++++++++++-------- 5 files changed, 60 insertions(+), 40 deletions(-) copy t/{t4005-diff-rename-2.sh => t4009-diff-rename-4.sh} (83%) diff --git a/Documentation/diff-format.txt b/Documentation/diff-format.txt index f85a605f0a..1d92a01a02 100644 --- a/Documentation/diff-format.txt +++ b/Documentation/diff-format.txt @@ -36,7 +36,7 @@ That is, from the left to the right: (6) sha1 for "src"; 0{40} if creation or unmerged. (7) a space. (8) sha1 for "dst"; 0{40} if creation, unmerged or "look at work tree". - (9) status, followed by similarlity index number only for C and R. + (9) status, followed by optional "score" number. (10) a tab or a NUL when '-z' option is used. (11) path for "src" (12) a tab or a NUL when '-z' option is used; only exists for C or R. diff --git a/diff-helper.c b/diff-helper.c index 5ad2273bf0..c9e287f652 100644 --- a/diff-helper.c +++ b/diff-helper.c @@ -80,17 +80,16 @@ int main(int ac, const char **av) { if (!strchr("MCRNDU", status)) break; two_paths = score = 0; - if (status == 'R' || status == 'C') { + if (status == 'R' || status == 'C') two_paths = 1; - sscanf(cp, "%d", &score); - if (line_termination) { - cp = strchr(cp, - inter_name_termination); - if (!cp) - break; - } - } + /* pick up score if exists */ + if (sscanf(cp, "%d", &score) != 1) + score = 0; + cp = strchr(cp, + inter_name_termination); + if (!cp) + break; if (*cp++ != inter_name_termination) break; diff --git a/t/t4005-diff-rename-2.sh b/t/t4005-diff-rename-2.sh index a519855182..5ac29d1f98 100644 --- a/t/t4005-diff-rename-2.sh +++ b/t/t4005-diff-rename-2.sh @@ -8,11 +8,17 @@ test_description='Same rename detection as t4003 but testing diff-raw. ' . ./test-lib.sh +_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' +_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" +sanitize_diff_raw='s/ '"$_x40"' '"$_x40"' \([A-Z]\)[0-9]* / X X \1# /' compare_diff_raw () { # When heuristics are improved, the score numbers would change. # Ignore them while comparing. - sed -e 's/ \([CR]\)[0-9]* /\1#/' <"$1" >.tmp-1 - sed -e 's/ \([CR]\)[0-9]* /\1#/' <"$2" >.tmp-2 + # Also we do not check SHA1 hash generation in this test, which + # is a job for t0000-basic.sh + + sed -e "$sanitize_diff_raw" <"$1" >.tmp-1 + sed -e "$sanitize_diff_raw" <"$2" >.tmp-2 diff -u .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2 } @@ -109,11 +115,6 @@ test_expect_success \ 'validate output from rename/copy detection (#2)' \ 'compare_diff_raw current expected' -test_expect_success \ - 'prepare work tree once again' \ - 'cat ../../COPYING >COPYING && - git-update-cache --add --remove COPYING COPYING.1' - # make sure diff-helper can grok it. mv expected diff-raw GIT_DIFF_OPTS=--unified=0 git-diff-helper current @@ -151,6 +152,11 @@ test_expect_success \ # anything about rezrov nor COPYING, since the revised again diff-raw # nows how to say Copy. +test_expect_success \ + 'prepare work tree once again' \ + 'cat ../../COPYING >COPYING && + git-update-cache --add --remove COPYING COPYING.1' + git-diff-cache -C $tree >current cat >expected <<\EOF :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 COPYING COPYING.1 diff --git a/t/t4007-rename-3.sh b/t/t4007-rename-3.sh index 518892b90c..76ae7201f0 100644 --- a/t/t4007-rename-3.sh +++ b/t/t4007-rename-3.sh @@ -10,7 +10,7 @@ test_description='Rename interaction with pathspec. _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" -sanitize_diff_raw='s/ \('"$_x40"'\) \1 \([CR]\)[0-9]* / \1 \1 \2# /' +sanitize_diff_raw='s/ '"$_x40"' '"$_x40"' \([A-Z]\)[0-9]* / X X \1# /' compare_diff_raw () { # When heuristics are improved, the score numbers would change. # Ignore them while comparing. diff --git a/t/t4005-diff-rename-2.sh b/t/t4009-diff-rename-4.sh similarity index 83% copy from t/t4005-diff-rename-2.sh copy to t/t4009-diff-rename-4.sh index a519855182..01d2766926 100644 --- a/t/t4005-diff-rename-2.sh +++ b/t/t4009-diff-rename-4.sh @@ -3,16 +3,22 @@ # Copyright (c) 2005 Junio C Hamano # -test_description='Same rename detection as t4003 but testing diff-raw. +test_description='Same rename detection as t4003 but testing diff-raw -z. ' . ./test-lib.sh +_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' +_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" +sanitize_diff_raw='/^:/s/ '"$_x40"' '"$_x40"' \([A-Z]\)[0-9]*$/ X X \1#/' compare_diff_raw () { # When heuristics are improved, the score numbers would change. # Ignore them while comparing. - sed -e 's/ \([CR]\)[0-9]* /\1#/' <"$1" >.tmp-1 - sed -e 's/ \([CR]\)[0-9]* /\1#/' <"$2" >.tmp-2 + # Also we do not check SHA1 hash generation in this test, which + # is a job for t0000-basic.sh + + tr '\0' '\012' <"$1" | sed -e "$sanitize_diff_raw" >.tmp-1 + tr '\0' '\012' <"$2" | sed -e "$sanitize_diff_raw" >.tmp-2 diff -u .tmp-1 .tmp-2 && rm -f .tmp-1 .tmp-2 } @@ -44,11 +50,15 @@ test_expect_success \ # and COPYING.2 are based on COPYING, and do not say anything about # rezrov. -git-diff-cache -M $tree >current +git-diff-cache -z -M $tree >current cat >expected <<\EOF -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 COPYING COPYING.1 -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 06c67961bbaed34a127f76d261f4c0bf73eda471 R1234 COPYING COPYING.2 +:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 +COPYING +COPYING.1 +:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 06c67961bbaed34a127f76d261f4c0bf73eda471 R1234 +COPYING +COPYING.2 EOF test_expect_success \ @@ -56,8 +66,8 @@ test_expect_success \ 'compare_diff_raw current expected' # make sure diff-helper can grok it. -mv expected diff-raw -GIT_DIFF_OPTS=--unified=0 git-diff-helper current +mv current diff-raw +GIT_DIFF_OPTS=--unified=0 git-diff-helper -z current cat >expected <<\EOF diff --git a/COPYING b/COPYING.1 copy from COPYING @@ -99,24 +109,22 @@ test_expect_success \ # is based on COPYING and COPYING is still there, and do not say anything # about rezrov. -git-diff-cache -C $tree >current +git-diff-cache -z -C $tree >current cat >expected <<\EOF -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 06c67961bbaed34a127f76d261f4c0bf73eda471 M COPYING -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 COPYING COPYING.1 +:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 06c67961bbaed34a127f76d261f4c0bf73eda471 M +COPYING +:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 +COPYING +COPYING.1 EOF test_expect_success \ 'validate output from rename/copy detection (#2)' \ 'compare_diff_raw current expected' -test_expect_success \ - 'prepare work tree once again' \ - 'cat ../../COPYING >COPYING && - git-update-cache --add --remove COPYING COPYING.1' - # make sure diff-helper can grok it. -mv expected diff-raw -GIT_DIFF_OPTS=--unified=0 git-diff-helper current +mv current diff-raw +GIT_DIFF_OPTS=--unified=0 git-diff-helper -z current cat >expected <<\EOF diff --git a/COPYING b/COPYING --- a/COPYING @@ -151,9 +159,16 @@ test_expect_success \ # anything about rezrov nor COPYING, since the revised again diff-raw # nows how to say Copy. -git-diff-cache -C $tree >current +test_expect_success \ + 'prepare work tree once again' \ + 'cat ../../COPYING >COPYING && + git-update-cache --add --remove COPYING COPYING.1' + +git-diff-cache -z -C $tree >current cat >expected <<\EOF -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 COPYING COPYING.1 +:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0603b3238a076dc6c8022aedc6648fa523a17178 C1234 +COPYING +COPYING.1 EOF test_expect_success \ @@ -161,8 +176,8 @@ test_expect_success \ 'compare_diff_raw current expected' # make sure diff-helper can grok it. -mv expected diff-raw -GIT_DIFF_OPTS=--unified=0 git-diff-helper current +mv current diff-raw +GIT_DIFF_OPTS=--unified=0 git-diff-helper -z current cat >expected <<\EOF diff --git a/COPYING b/COPYING.1 copy from COPYING -- 2.11.4.GIT