Skip to content

Commit

Permalink
run_processes_parallel: treat output of children as byte array
Browse files Browse the repository at this point in the history
We do not want the output to be interrupted by a NUL byte, so we
cannot use raw fputs. Introduce strbuf_write to avoid having long
arguments in run-command.c.

Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Stefan Beller authored and Junio C Hamano committed Mar 1, 2016
1 parent 8c6b549 commit 2dac9b5
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
8 changes: 4 additions & 4 deletions run-command.c
Original file line number Diff line number Diff line change
Expand Up @@ -994,7 +994,7 @@ static void pp_cleanup(struct parallel_processes *pp)
* When get_next_task added messages to the buffer in its last
* iteration, the buffered output is non empty.
*/
fputs(pp->buffered_output.buf, stderr);
strbuf_write(&pp->buffered_output, stderr);
strbuf_release(&pp->buffered_output);

sigchain_pop_common();
Expand Down Expand Up @@ -1079,7 +1079,7 @@ static void pp_output(struct parallel_processes *pp)
int i = pp->output_owner;
if (pp->children[i].state == GIT_CP_WORKING &&
pp->children[i].err.len) {
fputs(pp->children[i].err.buf, stderr);
strbuf_write(&pp->children[i].err, stderr);
strbuf_reset(&pp->children[i].err);
}
}
Expand Down Expand Up @@ -1117,11 +1117,11 @@ static int pp_collect_finished(struct parallel_processes *pp)
strbuf_addbuf(&pp->buffered_output, &pp->children[i].err);
strbuf_reset(&pp->children[i].err);
} else {
fputs(pp->children[i].err.buf, stderr);
strbuf_write(&pp->children[i].err, stderr);
strbuf_reset(&pp->children[i].err);

/* Output all other finished child processes */
fputs(pp->buffered_output.buf, stderr);
strbuf_write(&pp->buffered_output, stderr);
strbuf_reset(&pp->buffered_output);

/*
Expand Down
6 changes: 6 additions & 0 deletions strbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,12 @@ ssize_t strbuf_read_once(struct strbuf *sb, int fd, size_t hint)
return cnt;
}

ssize_t strbuf_write(struct strbuf *sb, FILE *f)
{
return sb->len ? fwrite(sb->buf, 1, sb->len, f) : 0;
}


#define STRBUF_MAXLINK (2*PATH_MAX)

int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
Expand Down
6 changes: 6 additions & 0 deletions strbuf.h
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,12 @@ extern ssize_t strbuf_read_file(struct strbuf *sb, const char *path, size_t hint
*/
extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint);

/**
* Write the whole content of the strbuf to the stream not stopping at
* NUL bytes.
*/
extern ssize_t strbuf_write(struct strbuf *sb, FILE *stream);

/**
* Read a line from a FILE *, overwriting the existing contents
* of the strbuf. The second argument specifies the line
Expand Down

0 comments on commit 2dac9b5

Please sign in to comment.