Skip to content

Commit

Permalink
Merge branch 'jk/merge-file-exit-code'
Browse files Browse the repository at this point in the history
"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
  • Loading branch information
Junio C Hamano committed Oct 30, 2015
2 parents f60b5dc + e34f802 commit 54bc414
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Documentation/git-merge-file.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions builtin/merge-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
33 changes: 33 additions & 0 deletions t/t7600-merge.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 54bc414

Please sign in to comment.