run_processes_parallel: treat output of children as byte array
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>
This commit is contained in:
parent
8c6b549118
commit
2dac9b5637
@ -994,7 +994,7 @@ static void pp_cleanup(struct parallel_processes *pp)
|
|||||||
* When get_next_task added messages to the buffer in its last
|
* When get_next_task added messages to the buffer in its last
|
||||||
* iteration, the buffered output is non empty.
|
* iteration, the buffered output is non empty.
|
||||||
*/
|
*/
|
||||||
fputs(pp->buffered_output.buf, stderr);
|
strbuf_write(&pp->buffered_output, stderr);
|
||||||
strbuf_release(&pp->buffered_output);
|
strbuf_release(&pp->buffered_output);
|
||||||
|
|
||||||
sigchain_pop_common();
|
sigchain_pop_common();
|
||||||
@ -1079,7 +1079,7 @@ static void pp_output(struct parallel_processes *pp)
|
|||||||
int i = pp->output_owner;
|
int i = pp->output_owner;
|
||||||
if (pp->children[i].state == GIT_CP_WORKING &&
|
if (pp->children[i].state == GIT_CP_WORKING &&
|
||||||
pp->children[i].err.len) {
|
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);
|
strbuf_reset(&pp->children[i].err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1117,11 +1117,11 @@ static int pp_collect_finished(struct parallel_processes *pp)
|
|||||||
strbuf_addbuf(&pp->buffered_output, &pp->children[i].err);
|
strbuf_addbuf(&pp->buffered_output, &pp->children[i].err);
|
||||||
strbuf_reset(&pp->children[i].err);
|
strbuf_reset(&pp->children[i].err);
|
||||||
} else {
|
} else {
|
||||||
fputs(pp->children[i].err.buf, stderr);
|
strbuf_write(&pp->children[i].err, stderr);
|
||||||
strbuf_reset(&pp->children[i].err);
|
strbuf_reset(&pp->children[i].err);
|
||||||
|
|
||||||
/* Output all other finished child processes */
|
/* Output all other finished child processes */
|
||||||
fputs(pp->buffered_output.buf, stderr);
|
strbuf_write(&pp->buffered_output, stderr);
|
||||||
strbuf_reset(&pp->buffered_output);
|
strbuf_reset(&pp->buffered_output);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
6
strbuf.c
6
strbuf.c
@ -395,6 +395,12 @@ ssize_t strbuf_read_once(struct strbuf *sb, int fd, size_t hint)
|
|||||||
return cnt;
|
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)
|
#define STRBUF_MAXLINK (2*PATH_MAX)
|
||||||
|
|
||||||
int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
|
int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
|
||||||
|
6
strbuf.h
6
strbuf.h
@ -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);
|
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
|
* Read a line from a FILE *, overwriting the existing contents
|
||||||
* of the strbuf. The second argument specifies the line
|
* of the strbuf. The second argument specifies the line
|
||||||
|
Loading…
Reference in New Issue
Block a user