Revision e4cb3693a45a74ac9fdd142ab6392832b0a895d3 authored by Junio C Hamano on 30 August 2021, 23:06:05 UTC, committed by Johannes Schindelin on 22 March 2023, 17:00:36 UTC
"git range-diff" code clean-up. Needed to pacify modern GCC versions.

* jk/range-diff-fixes:
  range-diff: use ssize_t for parsed "len" in read_patches()
  range-diff: handle unterminated lines in read_patches()
  range-diff: drop useless "offset" variable from read_patches()
2 parent s 3c7896e + c025b4b
Raw File
send-pack-pipeline.txt
Git-send-pack internals
=======================

Overall operation
-----------------

. Connects to the remote side and invokes git-receive-pack.

. Learns what refs the remote has and what commit they point at.
  Matches them to the refspecs we are pushing.

. Checks if there are non-fast-forwards.  Unlike fetch-pack,
  the repository send-pack runs in is supposed to be a superset
  of the recipient in fast-forward cases, so there is no need
  for want/have exchanges, and fast-forward check can be done
  locally.  Tell the result to the other end.

. Calls pack_objects() which generates a packfile and sends it
  over to the other end.

. If the remote side is new enough (v1.1.0 or later), wait for
  the unpack and hook status from the other end.

. Exit with appropriate error codes.


Pack_objects pipeline
---------------------

This function gets one file descriptor (`fd`) which is either a
socket (over the network) or a pipe (local).  What's written to
this fd goes to git-receive-pack to be unpacked.

    send-pack ---> fd ---> receive-pack

The function pack_objects creates a pipe and then forks.  The
forked child execs pack-objects with --revs to receive revision
parameters from its standard input. This process will write the
packfile to the other end.

    send-pack
       |
       pack_objects() ---> fd ---> receive-pack
          | ^ (pipe)
	  v |
         (child)

The child dup2's to arrange its standard output to go back to
the other end, and read its standard input to come from the
pipe.  After that it exec's pack-objects.  On the other hand,
the parent process, before starting to feed the child pipeline,
closes the reading side of the pipe and fd to receive-pack.

    send-pack
       |
       pack_objects(parent)
          |
	  v [0]
         pack-objects [0] ---> receive-pack


[jc: the pipeline was much more complex and needed documentation before
 I understood an earlier bug, but now it is trivial and straightforward.]
back to top