summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-11-03 15:32:41 -0800
committerJunio C Hamano <gitster@pobox.com>2015-11-03 15:32:41 -0800
commit5c15ca0b3c866398f22cbab974d0a1964ef105ca (patch)
treef7c7b00472862c2665c05bf522836b6401dc4e8e
parent3a27eec48ecfcc0764c90b3f478a124c01c082bc (diff)
parente34f80278e920e53b69016c7cecb24e4621e4564 (diff)
downloadgit-5c15ca0b3c866398f22cbab974d0a1964ef105ca.tar.gz
Merge branch 'jk/merge-file-exit-code' into maint
"git merge-file" tried to signal how many conflicts it found, which obviously would not work well when there are too many of them. * jk/merge-file-exit-code: merge-file: clamp exit code to maximum 127
-rw-r--r--Documentation/git-merge-file.txt3
-rw-r--r--builtin/merge-file.c3
-rwxr-xr-xt/t7600-merge.sh33
3 files changed, 38 insertions, 1 deletions
diff --git a/Documentation/git-merge-file.txt b/Documentation/git-merge-file.txt
index d2fc12ec77..f856032613 100644
--- a/Documentation/git-merge-file.txt
+++ b/Documentation/git-merge-file.txt
@@ -41,7 +41,8 @@ lines from `<other-file>`, or lines from both respectively. The length of the
conflict markers can be given with the `--marker-size` option.
The exit value of this program is negative on error, and the number of
-conflicts otherwise. If the merge was clean, the exit value is 0.
+conflicts otherwise (truncated to 127 if there are more than that many
+conflicts). If the merge was clean, the exit value is 0.
'git merge-file' is designed to be a minimal clone of RCS 'merge'; that is, it
implements all of RCS 'merge''s functionality which is needed by
diff --git a/builtin/merge-file.c b/builtin/merge-file.c
index 50d0bc873b..55447053f2 100644
--- a/builtin/merge-file.c
+++ b/builtin/merge-file.c
@@ -104,5 +104,8 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
free(result.ptr);
}
+ if (ret > 127)
+ ret = 127;
+
return ret;
}
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index 75c50eea15..302e238263 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -692,4 +692,37 @@ test_expect_success GPG 'merge --no-edit tag should skip editor' '
test_cmp actual expect
'
+test_expect_success 'set up mod-256 conflict scenario' '
+ # 256 near-identical stanzas...
+ for i in $(test_seq 1 256); do
+ for j in 1 2 3 4 5; do
+ echo $i-$j
+ done
+ done >file &&
+ git add file &&
+ git commit -m base &&
+
+ # one side changes the first line of each to "master"
+ sed s/-1/-master/ <file >tmp &&
+ mv tmp file &&
+ git commit -am master &&
+
+ # and the other to "side"; merging the two will
+ # yield 256 separate conflicts
+ git checkout -b side HEAD^ &&
+ sed s/-1/-side/ <file >tmp &&
+ mv tmp file &&
+ git commit -am side
+'
+
+test_expect_success 'merge detects mod-256 conflicts (recursive)' '
+ git reset --hard &&
+ test_must_fail git merge -s recursive master
+'
+
+test_expect_success 'merge detects mod-256 conflicts (resolve)' '
+ git reset --hard &&
+ test_must_fail git merge -s resolve master
+'
+
test_done