run-command: allow stdin for run_processes_parallel

While it makes sense not to inherit stdin from the parent process to avoid deadlocking, it's not necessary to completely ban stdin to children. An informed user should be able to configure stdin safely. By setting `some_child.process.no_stdin=1` before calling `get_next_task()` we provide a reasonable default behavior but enable users to set up stdin streaming for themselves during the callback. `some_child.process.stdout_to_stderr`, however, remains unmodifiable by `get_next_task()` - the rest of the run_processes_parallel() API depends on child output in stderr. Signed-off-by: Emily Shaffer <emilyshaffer@google.com> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Emily Shaffer committed Feb 8, 2023 at 20:21 UTC 540267304d37d6257edb3144e770693071d8fbb7
1 file changed +8 -1
run-command.c
+8 -1
@@ -1586,6 +1586,14 @@ static int pp_start_one(struct parallel_processes *pp,
1586 if (i == opts->processes)
1587 BUG("bookkeeping is hard");
1588
1589 + /*
1590 + * By default, do not inherit stdin from the parent process - otherwise,
1591 + * all children would share stdin! Users may overwrite this to provide
1592 + * something to the child's stdin by having their 'get_next_task'
1593 + * callback assign 0 to .no_stdin and an appropriate integer to .in.
1594 + */
1595 + pp->children[i].process.no_stdin = 1;
1596 +
1597 code = opts->get_next_task(&pp->children[i].process,
1598 opts->ungroup ? NULL : &pp->children[i].err,
1599 opts->data,
@@ -1601,7 +1609,6 @@ static int pp_start_one(struct parallel_processes *pp,
1609 pp->children[i].process.err = -1;
1610 pp->children[i].process.stdout_to_stderr = 1;
1611 }
1604 - pp->children[i].process.no_stdin = 1;
1612
1613 if (start_command(&pp->children[i].process)) {
1614 if (opts->start_failure)