On Tue, Mar 07, 2017 at 08:34:37AM -0500, Jeff King wrote: > Yuck. In the original, the error was generated by the child index-pack, > and we relayed it over the sideband. But we don't even get as far as > running index-pack in the newer version; we fail trying to make the > tmpdir. The error ends up in the "unpack" protocol field, but the client > side does a bad job of showing that. With the rest of the patches, it > looks like: > > $ git push ~/tmp/foo.git HEAD > Counting objects: 210973, done. > Delta compression using up to 8 threads. > Compressing objects: 100% (52799/52799), done. > error: remote unpack failed: unable to create temporary object directory > error: failed to push some refs to '/home/peff/tmp/foo.git' There are two other options here I should mention. One is that when pack-objects dies, we suppress the ref-status table entirely. Which is fair, because it doesn't have anything interesting to say. But for a case like this where the other side stops reading our pack early but still produces status reports, we could actually read them all and have a status table like: $ git push ~/tmp/foo.git HEAD Counting objects: 209843, done. Delta compression using up to 8 threads. Compressing objects: 100% (52186/52186), done. error: remote unpack failed: unable to create temporary object directory To /home/peff/tmp/foo.git ! [remote rejected] HEAD -> jk/push-index-pack-deadlock (unpacker error) error: failed to push some refs to '/home/peff/tmp/foo.git' We'd have to take some care to make sure we handle the case when the remote _doesn't_ manage to give us the status (e.g., when there's a complete hangup). I don't know if it's worth the effort. There's no new information there. The second thing is that I think the design of the "unpack <reason>" report is a bit dated. These days everybody supports the sideband protocol, so it would probably make more sense to just issue the "<reason>" report via the sideband (at which point it gets a nice "remote: " prefix). We could do something like this: diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index f2c6953a3..6204d3d00 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -1670,6 +1670,8 @@ static const char *unpack(int err_fd, struct shallow_info *si) if (!tmp_objdir) { if (err_fd > 0) close(err_fd); + rp_error("unable to create temporary object directory: %s", + strerror(errno)); return "unable to create temporary object directory"; } child.env = tmp_objdir_env(tmp_objdir); and drop the "try to show the unpack failure" parts of my series, and you'd end up with: $ git push ~/tmp/foo.git HEAD Counting objects: 209843, done. Delta compression using up to 8 threads. Compressing objects: 100% (52186/52186), done. remote: error: unable to create temporary object directory: Permission denied error: failed to push some refs to '/home/peff/tmp/foo.git' but in cases where pack-objects _doesn't_ fail, existing git versions do show the "unpack" error. So you'd see it twice. I don't know if it's worth trying to hack around. -Peff