On Tue, Apr 28, 2015 at 10:07:43PM +0200, erik elfström wrote: > On Tue, Apr 28, 2015 at 8:17 AM, Jeff King <peff@xxxxxxxx> wrote: > > > > There was a discussion not too long ago on strategies for returning > > errors, and one of the suggestions was to return an "error strbuf" > > rather than a code[1]. That's less flexible, as the caller can't react > > differently based on the type of error. But for cases like this, where > > the only fate for the code is to get converted back into a message, > > it can reduce the boilerplate. > > > > What you have here is OK to me, and I don't want to hold up your patch > > series in a flamewar about error-reporting techniques. But I think it's > > an interesting case study. > > > > -Peff > > Thanks. I haven't had time to look through that thread yet, I'll try > to get to that later. > > My initial reaction is a bit skeptical though. For this case we > currently don't want any error reporting, the NULL return is > sufficient and even allocating and sending in the int* is pure noise. > Allocating and releasing a strbuf seems like a lot more overhead for > this type of caller? The one other potential candidate caller for > read_gitfile_gently that I have seen (clone.c:get_repo_path) don't > want any error code or message either as far as i can tell. I had envisioned that the strbuf would be optional. I.e., you would have: /* like error(), but dump the message in a strbuf instead of stderr */ int error_buf(struct strbuf *buf, const char *fmt, ...) { if (buf) { va_list ap; va_start(ap, fmt); strbuf_vaddf(buf, fmt, ap); va_end(ap); } return -1; } and then in the error-reporting function: const char *read_gitfile_gently(const char *path, struct strbuf *err) { ... fd = open(path, O_RDONLY); if (fd < 0) { error_buf(err, "unable to open %s: %s", path, strerror(errno)); return NULL; /* or goto cleanup if necessary */ } } and then one caller can do: if (!read_gitfile_gently(path, NULL)) { /* we know there was an error, but we did not ask for details */ ... } and the non-gentle read_gitfile() becomes: const char *read_gitfile(const char *path) { struct strbuf err = STRBUF_INIT; const char *ret = read_gitfile_gently(path, &err); if (!ret) die("%s", err.buf); /* no need to free err; if there was no error, nothing was written */ return path; } Note that the "return -1" from error_buf() is not useful here, but it might be used as a shortcut in other situations (e.g., the same places we call "return error()" now). > Also if it turns out that we actually need to treat the "file too > large" error differently in clean (as discussed in thread on the file > size check) then we can no longer communicate that back using the > strbuf interface. Yeah, agreed. This system breaks down as soon as you need to programatically know which error happened. -Peff -- 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