{"thread":{"id":"41479","subject":"[PATCH 0/3] Tests for merge-recursive rename options","startedAt":"2016-02-23T04:38:42Z","lastAt":"2016-02-23T07:06:05Z","messageCount":5,"participants":["Felipe Gonçalves Assis","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"278961","messageId":"1456202325-6037-1-git-send-email-felipegassis@gmail.com","threadId":"41479","inReplyTo":null,"subject":"[PATCH 0/3] Tests for merge-recursive rename options","fromName":"Felipe Gonçalves Assis","fromEmail":"felipeg.assis@gmail.com","sentAt":"2016-02-23T04:38:42Z","receivedAt":"2016-02-23T04:38:42Z","isPatch":true,"sender":{"key":"felipeg.assis@gmail.com","avatar":null},"body":"Based on c443d39 (merge-recursive: find-renames resets threshold, 2016-02-21).\n\nThis patch involves only the tests for the features introduced in\nfa/merge-recursive-no-rename, for better review.\n\nThe tests were rewritten so that the similarity indices are parsed instead of\nassumed.\n\nFelipe Gonçalves Assis (3):\n  t3034: add rename threshold tests\n  t3034: test option to disable renames\n  t3034: test deprecated interface\n\n ...s.sh => t3032-merge-recursive-space-options.sh} |   2 +-\n t/t3034-merge-recursive-rename-options.sh          | 309 +++++++++++++++++++++\n 2 files changed, 310 insertions(+), 1 deletion(-)\n rename t/{t3032-merge-recursive-options.sh => t3032-merge-recursive-space-options.sh} (99%)\n create mode 100755 t/t3034-merge-recursive-rename-options.sh\n\n-- \n2.7.1.492.gd821b20\n"},{"id":"278962","messageId":"1456202325-6037-2-git-send-email-felipegassis@gmail.com","threadId":"41479","inReplyTo":"1456202325-6037-1-git-send-email-felipegassis@gmail.com","subject":"[PATCH 1/3] t3034: add rename threshold tests","fromName":"Felipe Gonçalves Assis","fromEmail":"felipeg.assis@gmail.com","sentAt":"2016-02-23T04:38:43Z","receivedAt":"2016-02-23T04:38:43Z","isPatch":true,"sender":{"key":"felipeg.assis@gmail.com","avatar":null},"body":"10ae752 (merge-recursive: option to specify rename threshold,\n2010-09-27) introduced this feature but did not include any tests.\n\nThe tests use the new option --find-renames, which replaces the then\nintroduced and now deprecated option --rename-threshold.\n\nAlso update name and description of t3032 for consistency:\n\"merge-recursive options\" -> \"merge-recursive space options\"\n\nSigned-off-by: Felipe Gonçalves Assis <felipegassis@gmail.com>\n---\n ...s.sh => t3032-merge-recursive-space-options.sh} |   2 +-\n t/t3034-merge-recursive-rename-options.sh          | 235 +++++++++++++++++++++\n 2 files changed, 236 insertions(+), 1 deletion(-)\n rename t/{t3032-merge-recursive-options.sh => t3032-merge-recursive-space-options.sh} (99%)\n create mode 100755 t/t3034-merge-recursive-rename-options.sh\n\ndiff --git a/t/t3032-merge-recursive-options.sh b/t/t3032-merge-recursive-space-options.sh\nsimilarity index 99%\nrename from t/t3032-merge-recursive-options.sh\nrename to t/t3032-merge-recursive-space-options.sh\nindex 4029c9c..b56180e 100755\n--- a/t/t3032-merge-recursive-options.sh\n+++ b/t/t3032-merge-recursive-space-options.sh\n@@ -1,6 +1,6 @@\n #!/bin/sh\n \n-test_description='merge-recursive options\n+test_description='merge-recursive space options\n \n * [master] Clarify\n  ! [remote] Remove cruft\ndiff --git a/t/t3034-merge-recursive-rename-options.sh b/t/t3034-merge-recursive-rename-options.sh\nnew file mode 100755\nindex 0000000..66fee8a\n--- /dev/null\n+++ b/t/t3034-merge-recursive-rename-options.sh\n@@ -0,0 +1,235 @@\n+#!/bin/sh\n+\n+test_description='merge-recursive rename options\n+\n+Test rename detection by examining rename/delete conflicts.\n+\n+* (HEAD -> rename) rename\n+| * (master) delete\n+|/\n+* base\n+\n+git diff --name-status base master\n+D\t0-old\n+D\t1-old\n+D\t2-old\n+D\t3-old\n+\n+git diff --name-status -M01 base rename\n+R025    0-old   0-new\n+R050    1-old   1-new\n+R075    2-old   2-new\n+R100    3-old   3-new\n+\n+Actual similarity indices are parsed from diff output. We rely on the fact that\n+they are rounded down (see, e.g., Documentation/diff-generate-patch.txt, which\n+mentions this in a different context).\n+'\n+\n+. ./test-lib.sh\n+\n+get_expected_stages () {\n+\tgit checkout rename -- $1-new &&\n+\tgit ls-files --stage $1-new >expected-stages-undetected-$1 &&\n+\tsed \"s/ 0\t/ 2\t/\" <expected-stages-undetected-$1 \\\n+\t\t>expected-stages-detected-$1 &&\n+\tgit read-tree -u --reset HEAD\n+}\n+\n+rename_detected () {\n+\tgit ls-files --stage $1-old $1-new >stages-actual-$1 &&\n+\ttest_cmp expected-stages-detected-$1 stages-actual-$1\n+}\n+\n+rename_undetected () {\n+\tgit ls-files --stage $1-old $1-new >stages-actual-$1 &&\n+\ttest_cmp expected-stages-undetected-$1 stages-actual-$1\n+}\n+\n+check_common () {\n+\tgit ls-files --stage >stages-actual &&\n+\ttest_line_count = 4 stages-actual\n+}\n+\n+check_threshold_0 () {\n+\tcheck_common &&\n+\trename_detected 0 &&\n+\trename_detected 1 &&\n+\trename_detected 2 &&\n+\trename_detected 3\n+}\n+\n+check_threshold_1 () {\n+\tcheck_common &&\n+\trename_undetected 0 &&\n+\trename_detected 1 &&\n+\trename_detected 2 &&\n+\trename_detected 3\n+}\n+\n+check_threshold_2 () {\n+\tcheck_common &&\n+\trename_undetected 0 &&\n+\trename_undetected 1 &&\n+\trename_detected 2 &&\n+\trename_detected 3\n+}\n+\n+check_exact_renames () {\n+\tcheck_common &&\n+\trename_undetected 0 &&\n+\trename_undetected 1 &&\n+\trename_undetected 2 &&\n+\trename_detected 3\n+}\n+\n+test_expect_success 'setup 1/2: basic setup' '\n+\tcat <<-\\EOF >3-old &&\n+\t33a\n+\t33b\n+\t33c\n+\t33d\n+\tEOF\n+\tsed s/33/22/ <3-old >2-old &&\n+\tsed s/33/11/ <3-old >1-old &&\n+\tsed s/33/00/ <3-old >0-old &&\n+\tgit add [0-3]-old &&\n+\tgit commit -m base &&\n+\tgit rm [0-3]-old &&\n+\tgit commit -m delete &&\n+\tgit checkout -b rename HEAD^ &&\n+\tcp 3-old 3-new &&\n+\tsed 1,1s/./x/ <2-old >2-new &&\n+\tsed 1,2s/./x/ <1-old >1-new &&\n+\tsed 1,3s/./x/ <0-old >0-new &&\n+\tgit add [0-3]-new &&\n+\tgit rm [0-3]-old &&\n+\tgit commit -m rename &&\n+\tget_expected_stages 0 &&\n+\tget_expected_stages 1 &&\n+\tget_expected_stages 2 &&\n+\tget_expected_stages 3 &&\n+\tcheck_50=\"false\" &&\n+\ttail=\"HEAD^ -- HEAD master\"\n+'\n+\n+test_expect_success 'setup 2/2: threshold array' '\n+\tgit diff --name-status -M01 HEAD^ HEAD >diff-output &&\n+\ttest_debug \"cat diff-output\" &&\n+\ttest_line_count = 4 diff-output &&\n+\tgrep \"R[0-9]\\{3\\}\t\\([0-3]\\)-old\t\\1-new\" diff-output \\\n+\t\t>grep-output &&\n+\ttest_cmp diff-output grep-output &&\n+\twhile read status old new\n+\tdo\n+\t\tth[${old:0:1}]=${status:1}\n+\tdone <diff-output &&\n+\ttest \"${th[0]}\" -lt \"${th[1]}\" &&\n+\ttest \"${th[1]}\" -lt \"${th[2]}\" &&\n+\ttest \"${th[2]}\" -lt \"${th[3]}\" &&\n+\ttest \"${th[3]}\" = 100 &&\n+\tif [ 50 -le \"${th[0]}\" ]; then\n+\t\tcheck_50=check_threshold_0\n+\telif [ 50 -le \"${th[1]}\" ]; then\n+\t\tcheck_50=check_threshold_1\n+\telif [ 50 -le \"${th[2]}\" ]; then\n+\t\tcheck_50=check_threshold_2\n+\tfi &&\n+\tth[0]+=\"%\" &&\n+\tth[1]+=\"%\" &&\n+\tth[2]+=\"%\" &&\n+\tth[3]+=\"%\"\n+'\n+\n+test_expect_success 'assumption for tests: rename detection with diff' '\n+\tgit diff --name-status -M${th[0]} --diff-filter=R HEAD^ HEAD \\\n+\t\t>diff-output-0 &&\n+\tgit diff --name-status -M${th[1]} --diff-filter=R HEAD^ HEAD \\\n+\t\t>diff-output-1 &&\n+\tgit diff --name-status -M${th[2]} --diff-filter=R HEAD^ HEAD \\\n+\t\t>diff-output-2 &&\n+\tgit diff --name-status -M100% --diff-filter=R HEAD^ HEAD \\\n+\t\t>diff-output-3 &&\n+\ttest_line_count = 4 diff-output-0 &&\n+\ttest_line_count = 3 diff-output-1 &&\n+\ttest_line_count = 2 diff-output-2 &&\n+\ttest_line_count = 1 diff-output-3\n+'\n+\n+test_expect_success 'default similarity threshold is 50%' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive $tail &&\n+\t$check_50\n+'\n+\n+test_expect_success 'low rename threshold' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --find-renames=${th[0]} $tail &&\n+\tcheck_threshold_0\n+'\n+\n+test_expect_success 'medium rename threshold' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --find-renames=${th[1]} $tail &&\n+\tcheck_threshold_1\n+'\n+\n+test_expect_success 'high rename threshold' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --find-renames=${th[2]} $tail &&\n+\tcheck_threshold_2\n+'\n+\n+test_expect_success 'exact renames only' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --find-renames=100% $tail &&\n+\tcheck_exact_renames\n+'\n+\n+test_expect_success 'rename threshold is truncated' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --find-renames=200% $tail &&\n+\tcheck_exact_renames\n+'\n+\n+test_expect_success 'last wins in --find-renames=<m> --find-renames=<n>' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive \\\n+\t\t--find-renames=${th[0]} --find-renames=${th[2]} $tail &&\n+\tcheck_threshold_2\n+'\n+\n+test_expect_success '--find-renames resets threshold' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive \\\n+\t\t--find-renames=${th[0]} --find-renames $tail &&\n+\t$check_50\n+'\n+\n+test_expect_success 'assumption for further tests: trivial merge succeeds' '\n+\tgit read-tree --reset -u HEAD &&\n+\tgit merge-recursive HEAD -- HEAD HEAD &&\n+\tgit diff --quiet --cached &&\n+\tgit merge-recursive --find-renames=${th[0]} HEAD -- HEAD HEAD &&\n+\tgit diff --quiet --cached &&\n+\tgit merge-recursive --find-renames=${th[2]} HEAD -- HEAD HEAD &&\n+\tgit diff --quiet --cached &&\n+\tgit merge-recursive --find-renames=100% HEAD -- HEAD HEAD &&\n+\tgit diff --quiet --cached\n+'\n+\n+test_expect_success '--find-renames rejects negative argument' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --find-renames=-${th[0]} \\\n+\t\tHEAD -- HEAD HEAD &&\n+\tgit diff --quiet --cached\n+'\n+\n+test_expect_success '--find-renames rejects non-numbers' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --find-renames=0xf \\\n+\t\tHEAD -- HEAD HEAD &&\n+\tgit diff --quiet --cached\n+'\n+\n+test_done\n-- \n2.7.1.492.gd821b20\n"},{"id":"278963","messageId":"1456202325-6037-3-git-send-email-felipegassis@gmail.com","threadId":"41479","inReplyTo":"1456202325-6037-1-git-send-email-felipegassis@gmail.com","subject":"[PATCH 2/3] t3034: test option to disable renames","fromName":"Felipe Gonçalves Assis","fromEmail":"felipeg.assis@gmail.com","sentAt":"2016-02-23T04:38:44Z","receivedAt":"2016-02-23T04:38:44Z","isPatch":true,"sender":{"key":"felipeg.assis@gmail.com","avatar":null},"body":"Signed-off-by: Felipe Gonçalves Assis <felipegassis@gmail.com>\n---\n t/t3034-merge-recursive-rename-options.sh | 28 ++++++++++++++++++++++++++++\n 1 file changed, 28 insertions(+)\n\ndiff --git a/t/t3034-merge-recursive-rename-options.sh b/t/t3034-merge-recursive-rename-options.sh\nindex 66fee8a..03ce77c 100755\n--- a/t/t3034-merge-recursive-rename-options.sh\n+++ b/t/t3034-merge-recursive-rename-options.sh\n@@ -83,6 +83,14 @@ check_exact_renames () {\n \trename_detected 3\n }\n \n+check_no_renames () {\n+\tcheck_common &&\n+\trename_undetected 0 &&\n+\trename_undetected 1 &&\n+\trename_undetected 2 &&\n+\trename_undetected 3\n+}\n+\n test_expect_success 'setup 1/2: basic setup' '\n \tcat <<-\\EOF >3-old &&\n \t33a\n@@ -192,6 +200,12 @@ test_expect_success 'rename threshold is truncated' '\n \tcheck_exact_renames\n '\n \n+test_expect_success 'disabled rename detection' '\n+\tgit read-tree --reset -u HEAD &&\n+\tgit merge-recursive --no-renames $tail &&\n+\tcheck_no_renames\n+'\n+\n test_expect_success 'last wins in --find-renames=<m> --find-renames=<n>' '\n \tgit read-tree --reset -u HEAD &&\n \ttest_must_fail git merge-recursive \\\n@@ -206,6 +220,18 @@ test_expect_success '--find-renames resets threshold' '\n \t$check_50\n '\n \n+test_expect_success 'last wins in --no-renames --find-renames' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --no-renames --find-renames $tail &&\n+\t$check_50\n+'\n+\n+test_expect_success 'last wins in --find-renames --no-renames' '\n+\tgit read-tree --reset -u HEAD &&\n+\tgit merge-recursive --find-renames --no-renames $tail &&\n+\tcheck_no_renames\n+'\n+\n test_expect_success 'assumption for further tests: trivial merge succeeds' '\n \tgit read-tree --reset -u HEAD &&\n \tgit merge-recursive HEAD -- HEAD HEAD &&\n@@ -215,6 +241,8 @@ test_expect_success 'assumption for further tests: trivial merge succeeds' '\n \tgit merge-recursive --find-renames=${th[2]} HEAD -- HEAD HEAD &&\n \tgit diff --quiet --cached &&\n \tgit merge-recursive --find-renames=100% HEAD -- HEAD HEAD &&\n+\tgit diff --quiet --cached &&\n+\tgit merge-recursive --no-renames HEAD -- HEAD HEAD &&\n \tgit diff --quiet --cached\n '\n \n-- \n2.7.1.492.gd821b20\n"},{"id":"278964","messageId":"1456202325-6037-4-git-send-email-felipegassis@gmail.com","threadId":"41479","inReplyTo":"1456202325-6037-1-git-send-email-felipegassis@gmail.com","subject":"[PATCH 3/3] t3034: test deprecated interface","fromName":"Felipe Gonçalves Assis","fromEmail":"felipeg.assis@gmail.com","sentAt":"2016-02-23T04:38:45Z","receivedAt":"2016-02-23T04:38:45Z","isPatch":true,"sender":{"key":"felipeg.assis@gmail.com","avatar":null},"body":"--find-renames= and --rename-threshold= should be aliases.\n\nSigned-off-by: Felipe Gonçalves Assis <felipegassis@gmail.com>\n---\n t/t3034-merge-recursive-rename-options.sh | 46 +++++++++++++++++++++++++++++++\n 1 file changed, 46 insertions(+)\n\ndiff --git a/t/t3034-merge-recursive-rename-options.sh b/t/t3034-merge-recursive-rename-options.sh\nindex 03ce77c..59599ec 100755\n--- a/t/t3034-merge-recursive-rename-options.sh\n+++ b/t/t3034-merge-recursive-rename-options.sh\n@@ -260,4 +260,50 @@ test_expect_success '--find-renames rejects non-numbers' '\n \tgit diff --quiet --cached\n '\n \n+test_expect_success 'rename-threshold=<n> is a synonym for find-renames=<n>' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --rename-threshold=${th[0]} $tail &&\n+\tcheck_threshold_0\n+'\n+\n+test_expect_success 'last wins in --no-renames --rename-threshold=<n>' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --no-renames --rename-threshold=${th[0]} $tail &&\n+\tcheck_threshold_0\n+'\n+\n+test_expect_success 'last wins in --rename-threshold=<n> --no-renames' '\n+\tgit read-tree --reset -u HEAD &&\n+\tgit merge-recursive --rename-threshold=${th[0]} --no-renames $tail &&\n+\tcheck_no_renames\n+'\n+\n+test_expect_success '--rename-threshold=<n> rejects negative argument' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --rename-threshold=-${th[0]} \\\n+\t\tHEAD -- HEAD HEAD &&\n+\tgit diff --quiet --cached\n+'\n+\n+test_expect_success '--rename-threshold=<n> rejects non-numbers' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive --rename-threshold=0xf \\\n+\t\tHEAD -- HEAD HEAD &&\n+\tgit diff --quiet --cached\n+'\n+\n+test_expect_success 'last wins in --rename-threshold=<m> --find-renames=<n>' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive \\\n+\t\t--rename-threshold=${th[0]} --find-renames=${th[2]} $tail &&\n+\tcheck_threshold_2\n+'\n+\n+test_expect_success 'last wins in --find-renames=<m> --rename-threshold=<n>' '\n+\tgit read-tree --reset -u HEAD &&\n+\ttest_must_fail git merge-recursive \\\n+\t\t--find-renames=${th[2]} --rename-threshold=${th[0]} $tail &&\n+\tcheck_threshold_0\n+'\n+\n test_done\n-- \n2.7.1.492.gd821b20\n"},{"id":"278979","messageId":"xmqqa8mr3nz6.fsf@gitster.mtv.corp.google.com","threadId":"41479","inReplyTo":"1456202325-6037-2-git-send-email-felipegassis@gmail.com","subject":"Re: [PATCH 1/3] t3034: add rename threshold tests","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2016-02-23T07:06:05Z","receivedAt":"2016-02-23T07:06:05Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Felipe Gonçalves Assis\"  <felipeg.assis@gmail.com> writes:\n\n> +\ttest_cmp diff-output grep-output &&\n> +\twhile read status old new\n> +\tdo\n> +\t\tth[${old:0:1}]=${status:1}\n> +\tdone <diff-output &&\n\nSorry, but I think this uses a few blatant bash-isms that we cannot\nuse in our scripts.\n"}]}