diff options
author | Jeff King <peff@peff.net> | 2015-10-28 18:44:21 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-10-29 12:10:23 -0700 |
commit | e34f80278e920e53b69016c7cecb24e4621e4564 (patch) | |
tree | 74ef9ebff60018e37116154b565a6fb87c20c69b /builtin/merge-file.c | |
parent | 282616c72d1d08a77ca4fe1186cb708c38408d87 (diff) | |
download | git-e34f80278e920e53b69016c7cecb24e4621e4564.tar.gz git-e34f80278e920e53b69016c7cecb24e4621e4564.tar.xz |
merge-file: clamp exit code to maximum 127
Git-merge-file is documented to return one of three exit
codes:
- zero means the merge was successful
- a negative number means an error occurred
- a positive number indicates the number of conflicts
Unfortunately, this all gets stuffed into an 8-bit return
code. Which means that if you have 256 conflicts, this wraps
to zero, and the merge appears to succeed (and commits a
blob full of conflict-marker cruft!).
This patch clamps the return value to a maximum of 127,
which we should be able to safely represent everywhere. This
also leaves 128-255 for other values. Shells (and some parts
of git) will typically represent signal death as 128 plus
the signal number. And negative values are typically coerced
to an 8-bit unsigned value (so "return -1" ends up as 255).
Technically negative returns have the same problem (e.g.,
"-256" wraps back to 0), but this is not a problem in
practice, as the only negative value we use is "-1".
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/merge-file.c')
-rw-r--r-- | builtin/merge-file.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/builtin/merge-file.c b/builtin/merge-file.c index 844f84f40..ab4330a3d 100644 --- a/builtin/merge-file.c +++ b/builtin/merge-file.c @@ -102,5 +102,8 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix) free(result.ptr); } + if (ret > 127) + ret = 127; + return ret; } |