cat-file: handle streaming failures consistently

There are three ways to convince cat-file to stream a blob: - cat-file -p $blob - cat-file blob $blob - echo $batch | cat-file --batch In the first two, we simply exit with the error code of streaw_blob_to_fd(). That means that an error will cause us to exit with "-1" (which we try to avoid) without printing any kind of error message (which is confusing to the user). Instead, let's match the third case, which calls die() on an error. Unfortunately we cannot be more specific, as stream_blob_to_fd() does not tell us whether the problem was on reading (e.g., a corrupt object) or on writing (e.g., ENOSPC). That might be an opportunity for future work, but for now we will at least exit with a sane message and exit code. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Oct 30, 2018 at 19:23 UTC 98f425b453870cdb20b4bf8daa29f52af8e59866
1 file changed +12 -4
builtin/cat-file.c
+12 -4
@@ -45,6 +45,13 @@ static int filter_object(const char *path, unsigned mode,
45 return 0;
46 }
47
48 +static int stream_blob(const struct object_id *oid)
49 +{
50 + if (stream_blob_to_fd(1, oid, NULL, 0))
51 + die("unable to stream %s to stdout", oid_to_hex(oid));
52 + return 0;
53 +}
54 +
55 static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
56 int unknown_type)
57 {
@@ -124,7 +131,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
131 }
132
133 if (type == OBJ_BLOB)
127 - return stream_blob_to_fd(1, &oid, NULL, 0);
134 + return stream_blob(&oid);
135 buf = read_sha1_file(oid.hash, &type, &size);
136 if (!buf)
137 die("Cannot read object %s", obj_name);
@@ -146,7 +153,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
153 oidcpy(&blob_oid, &oid);
154
155 if (sha1_object_info(blob_oid.hash, NULL) == OBJ_BLOB)
149 - return stream_blob_to_fd(1, &blob_oid, NULL, 0);
156 + return stream_blob(&blob_oid);
157 /*
158 * we attempted to dereference a tag to a blob
159 * and failed; there may be new dereference
@@ -306,8 +313,9 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d
313 die("BUG: invalid cmdmode: %c", opt->cmdmode);
314 batch_write(opt, contents, size);
315 free(contents);
309 - } else if (stream_blob_to_fd(1, oid, NULL, 0) < 0)
310 - die("unable to stream %s to stdout", oid_to_hex(oid));
316 + } else {
317 + stream_blob(oid);
318 + }
319 }
320 else {
321 enum object_type type;