Skip to content

Commit

Permalink
Merge branch 'sp/push-sideband'
Browse files Browse the repository at this point in the history
* sp/push-sideband:
  receive-pack: Send internal errors over side-band #2
  t5401: Use a bare repository for the remote peer
  receive-pack: Send hook output over side band #2
  receive-pack: Wrap status reports inside side-band-64k
  receive-pack: Refactor how capabilities are shown to the client
  send-pack: demultiplex a sideband stream with status data
  run-command: support custom fd-set in async
  run-command: Allow stderr to be a caller supplied pipe
  • Loading branch information
Junio C Hamano committed Feb 21, 2010
2 parents 25666af + cc8eb64 commit 5f8a0de
Show file tree
Hide file tree
Showing 10 changed files with 370 additions and 134 deletions.
52 changes: 41 additions & 11 deletions Documentation/technical/api-run-command.txt
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ The functions above do the following:
`start_async`::

Run a function asynchronously. Takes a pointer to a `struct
async` that specifies the details and returns a pipe FD
from which the caller reads. See below for details.
async` that specifies the details and returns a set of pipe FDs
for communication with the function. See below for details.

`finish_async`::

Expand Down Expand Up @@ -135,7 +135,7 @@ stderr as follows:

.in: The FD must be readable; it becomes child's stdin.
.out: The FD must be writable; it becomes child's stdout.
.err > 0 is not supported.
.err: The FD must be writable; it becomes child's stderr.

The specified FD is closed by start_command(), even if it fails to
run the sub-process!
Expand Down Expand Up @@ -180,17 +180,47 @@ The caller:
struct async variable;
2. initializes .proc and .data;
3. calls start_async();
4. processes the data by reading from the fd in .out;
5. closes .out;
4. processes communicates with proc through .in and .out;
5. closes .in and .out;
6. calls finish_async().

The members .in, .out are used to provide a set of fd's for
communication between the caller and the callee as follows:

. Specify 0 to have no file descriptor passed. The callee will
receive -1 in the corresponding argument.

. Specify < 0 to have a pipe allocated; start_async() replaces
with the pipe FD in the following way:

.in: Returns the writable pipe end into which the caller
writes; the readable end of the pipe becomes the function's
in argument.

.out: Returns the readable pipe end from which the caller
reads; the writable end of the pipe becomes the function's
out argument.

The caller of start_async() must close the returned FDs after it
has completed reading from/writing from them.

. Specify a file descriptor > 0 to be used by the function:

.in: The FD must be readable; it becomes the function's in.
.out: The FD must be writable; it becomes the function's out.

The specified FD is closed by start_async(), even if it fails to
run the function.

The function pointer in .proc has the following signature:

int proc(int fd, void *data);
int proc(int in, int out, void *data);

. fd specifies a writable file descriptor to which the function must
write the data that it produces. The function *must* close this
descriptor before it returns.
. in, out specifies a set of file descriptors to which the function
must read/write the data that it needs/produces. The function
*must* close these descriptors before it returns. A descriptor
may be -1 if the caller did not configure a descriptor for that
direction.

. data is the value that the caller has specified in the .data member
of struct async.
Expand All @@ -205,8 +235,8 @@ because this facility is implemented by a pipe to a forked process on
UNIX, but by a thread in the same address space on Windows:

. It cannot change the program's state (global variables, environment,
etc.) in a way that the caller notices; in other words, .out is the
only communication channel to the caller.
etc.) in a way that the caller notices; in other words, .in and .out
are the only communication channels to the caller.

. It must not change the program's state that the caller of the
facility also uses.
7 changes: 4 additions & 3 deletions builtin-fetch-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -586,12 +586,12 @@ static int everything_local(struct ref **refs, int nr_match, char **match)
return retval;
}

static int sideband_demux(int fd, void *data)
static int sideband_demux(int in, int out, void *data)
{
int *xd = data;

int ret = recv_sideband("fetch-pack", xd[0], fd);
close(fd);
int ret = recv_sideband("fetch-pack", xd[0], out);
close(out);
return ret;
}

Expand All @@ -613,6 +613,7 @@ static int get_pack(int xd[2], char **pack_lockfile)
*/
demux.proc = sideband_demux;
demux.data = xd;
demux.out = -1;
if (start_async(&demux))
die("fetch-pack: unable to fork off sideband"
" demultiplexer");
Expand Down
Loading

0 comments on commit 5f8a0de

Please sign in to comment.