From 1966a0fac77db0cc9665caa816385be83cd6bb44 Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Sun, 2 Dec 2018 22:53:00 -0500 Subject: [PATCH] If using --log or -j > 1, disable stdin. Parallelism and redo-log cause lots of confusion for any rules that try to ask the user for questions, so disable it altogether. Arguably, we should just disable stdin all the time, but maybe it's still occasionally useful (even though you have to pass --no-log to get it back). --- Documentation/redo.md | 5 +++++ builder.py | 7 ++++++- redo-ifchange.py | 3 ++- redo.py | 6 ++++-- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Documentation/redo.md b/Documentation/redo.md index b98d189..4a4024a 100644 --- a/Documentation/redo.md +++ b/Documentation/redo.md @@ -38,6 +38,11 @@ instead. A .do script can call redo recursively to build its dependencies. +To avoid confusion caused by multiple programs trying to +use the terminal, inside .do scripts, stdin is normally +redirected to /dev/null. The only exception is if the `-j` +option is *not* given and `--no-log` is used. + # OPTIONS diff --git a/builder.py b/builder.py index 5c4bd69..3f5d422 100644 --- a/builder.py +++ b/builder.py @@ -22,9 +22,14 @@ def _try_stat(filename): log_reader_pid = None +def close_stdin(): + f = open('/dev/null') + os.dup2(f.fileno(), 0) + f.close() + + def start_stdin_log_reader(status, details, pretty, color, debug_locks, debug_pids): - if not vars.LOG: return global log_reader_pid r, w = os.pipe() # main pipe to redo-log ar, aw = os.pipe() # ack pipe from redo-log --ack-fd diff --git a/redo-ifchange.py b/redo-ifchange.py index d4d7cb7..c9db239 100755 --- a/redo-ifchange.py +++ b/redo-ifchange.py @@ -19,7 +19,8 @@ def should_build(t): rv = 202 try: - if vars_init.is_toplevel: + if vars_init.is_toplevel and vars.LOG: + builder.close_stdin() builder.start_stdin_log_reader(status=True, details=True, pretty=True, color=True, debug_locks=False, debug_pids=False) if vars.TARGET and not vars.UNLOCKED: diff --git a/redo.py b/redo.py index 80c0224..4303df2 100755 --- a/redo.py +++ b/redo.py @@ -79,7 +79,10 @@ import vars, state, builder, jwack from logs import warn, err try: - if vars_init.is_toplevel: + j = atoi(opt.jobs or 1) + if vars_init.is_toplevel and (vars.LOG or j > 1): + builder.close_stdin() + if vars_init.is_toplevel and vars.LOG: builder.start_stdin_log_reader(status=opt.status, details=opt.details, pretty=opt.pretty, color=opt.color, debug_locks=opt.debug_locks, debug_pids=opt.debug_pids) @@ -91,7 +94,6 @@ try: % f.nicename()) state.rollback() - j = atoi(opt.jobs or 1) if j < 1 or j > 1000: err('invalid --jobs value: %r\n' % opt.jobs) jwack.setup(j)