Skip to content
  • Johannes Sixt's avatar
    upload-pack: Use finish_{command,async}() instead of waitpid(). · 4c324c00
    Johannes Sixt authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    upload-pack spawns two processes, rev-list and pack-objects, and carefully
    monitors their status so that it can report failure to the remote end.
    This change removes the complicated procedures on the grounds of the
    following observations:
    
    - If everything is OK, rev-list closes its output pipe end, upon which
      pack-objects (which reads from the pipe) sees EOF and terminates itself,
      closing its output (and error) pipes. upload-pack reads from both until
      it sees EOF in both. It collects the exit codes of the child processes
      (which indicate success) and terminates successfully.
    
    - If rev-list sees an error, it closes its output and terminates with
      failure. pack-objects sees EOF in its input and terminates successfully.
      Again upload-pack reads its inputs until EOF. When it now collects
      the exit codes of its child processes, it notices the failure of rev-list
      and signals failure to the remote end.
    
    - If pack-objects sees an error, it terminates with failure. Since this
      breaks the pipe to rev-list, rev-list is killed with SIGPIPE.
      upload-pack reads its input until EOF, then collects the exit codes of
      the child processes, notices their failures, and signals failure to the
      remote end.
    
    - If upload-pack itself dies unexpectedly, pack-objects is killed with
      SIGPIPE, and subsequently also rev-list.
    
    The upshot of this is that precise monitoring of child processes is not
    required because both terminate if either one of them dies unexpectedly.
    This allows us to use finish_command() and finish_async() instead of
    an explicit waitpid(2) call.
    
    The change is smaller than it looks because most of it only reduces the
    indentation of a large part of the inner loop.
    
    Signed-off-by: default avatarJohannes Sixt <johannes.sixt@telecom.at>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    4c324c00