This will allow to extend the read logic further. We also return a better error message than usage() when the given filename can't be opened, and avoid whitespace options not being set when reading from stdin with the "-" argument as a side effect. Signed-off-by: Mike Hommey <mh@xxxxxxxxxxxx> --- builtin-apply.c | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-) diff --git a/builtin-apply.c b/builtin-apply.c index f2e9a33..8c8162a 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -182,11 +182,23 @@ static void say_patch_name(FILE *output, const char *pre, #define CHUNKSIZE (8192) #define SLOP (16) -static void read_patch_file(struct strbuf *sb, int fd) +static void read_patch_file(struct strbuf *sb, const char *filename) { + int fd; + + if (!strcmp(filename, "-")) { + fd = 0; + } else { + fd = open(filename, O_RDONLY); + if (fd < 0) + die("git-apply: could not open %s: %s", filename, + strerror(errno)); + } + if (strbuf_read(sb, fd, 0) < 0) die("git-apply: read returned %s", strerror(errno)); + close(fd); /* * Make sure that we have some slop in the buffer * so that we can do speculative "memcmp" etc, and @@ -2705,7 +2717,7 @@ static void prefix_patches(struct patch *p) } } -static int apply_patch(int fd, const char *filename, int inaccurate_eof) +static int apply_patch(const char *filename, int inaccurate_eof) { size_t offset; struct strbuf buf; @@ -2714,7 +2726,7 @@ static int apply_patch(int fd, const char *filename, int inaccurate_eof) strbuf_init(&buf, 0); patch_input_file = filename; - read_patch_file(&buf, fd); + read_patch_file(&buf, filename); offset = 0; while (offset < buf.len) { struct patch *patch; @@ -2807,13 +2819,7 @@ int cmd_apply(int argc, const char **argv, const char *unused_prefix) for (i = 1; i < argc; i++) { const char *arg = argv[i]; char *end; - int fd; - if (!strcmp(arg, "-")) { - errs |= apply_patch(0, "<stdin>", inaccurate_eof); - read_stdin = 0; - continue; - } if (!prefixcmp(arg, "--exclude=")) { struct excludes *x = xmalloc(sizeof(*x)); x->path = arg + 10; @@ -2916,17 +2922,13 @@ int cmd_apply(int argc, const char **argv, const char *unused_prefix) if (0 < prefix_length) arg = prefix_filename(prefix, prefix_length, arg); - fd = open(arg, O_RDONLY); - if (fd < 0) - usage(apply_usage); read_stdin = 0; set_default_whitespace_mode(whitespace_option); - errs |= apply_patch(fd, arg, inaccurate_eof); - close(fd); + errs |= apply_patch(arg, inaccurate_eof); } set_default_whitespace_mode(whitespace_option); if (read_stdin) - errs |= apply_patch(0, "<stdin>", inaccurate_eof); + errs |= apply_patch("-", inaccurate_eof); if (whitespace_error) { if (squelch_whitespace_errors && squelch_whitespace_errors < whitespace_error) { -- 1.5.3.7 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html