Robin Jarry <robin.jarry@xxxxxxxxx> writes: > Abort the push operation (i.e. do not migrate the objects from temporary > to permanent storage) if the client has disconnected while the > pre-receive hook was running. > > This reduces the risk of inconsistencies on network errors or if the > user hits ctrl-c while the pre-receive hook is running. > > Send a keepalive packet (empty) on sideband 2 (the one to report > progress). If the client has exited, receive-pack will be killed via > SIGPIPE and the push will be aborted. This only works when sideband* > capabilities are advertised by the client. > > Signed-off-by: Robin Jarry <robin.jarry@xxxxxxxxx> > --- > v2 -> v3: > I had missed Documentation/technical/pack-protocol.txt. Using > sideband 2 to send the keepalive packet works. Yes, as long as sideband capability is supported (which is true everywhere these days), this would be good. Simple and sensible. Thanks. > builtin/receive-pack.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c > index 9f4a0b816cf9..8b0d56897c9f 100644 > --- a/builtin/receive-pack.c > +++ b/builtin/receive-pack.c > @@ -1971,6 +1971,15 @@ static void execute_commands(struct command *commands, > return; > } > > + /* > + * Send a keepalive packet on sideband 2 (progress info) to ensure that > + * the client has not disconnected while pre-receive was running. > + */ > + if (use_sideband) { > + static const char buf[] = "0005\2"; > + write_or_die(1, buf, sizeof(buf) - 1); > + } > + > /* > * Now we'll start writing out refs, which means the objects need > * to be in their final positions so that other processes can see them.