From 4df52a5e989c28d81cf69e3ad8b27ff35d492046 Mon Sep 17 00:00:00 2001 From: Markus Lehtonen Date: Wed, 18 Sep 2013 17:20:41 +0300 Subject: GitRepository.__git_inout: prevent blocking of stdin Signed-off-by: Markus Lehtonen --- gbp/git/repository.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/gbp/git/repository.py b/gbp/git/repository.py index 6cce5a7..64757fe 100644 --- a/gbp/git/repository.py +++ b/gbp/git/repository.py @@ -231,22 +231,28 @@ class GitRepository(object): cmd = ['git', command] + args env = cls.__build_env(extra_env) + stdin_arg = subprocess.PIPE if stdin else None stderr_arg = subprocess.PIPE if capture_stderr else None log.debug(cmd) popen = subprocess.Popen(cmd, - stdin=subprocess.PIPE, + stdin=stdin_arg, stdout=subprocess.PIPE, stderr=stderr_arg, env=env, close_fds=True, cwd=cwd) - if stdin: - popen.stdin.write(stdin) - popen.stdin.close() out_fds = [popen.stdout] + ([popen.stderr] if capture_stderr else []) - while out_fds: - ready = select.select(out_fds, [], []) + in_fds = [popen.stdin] if stdin else [] + w_ind = 0 + while out_fds or in_fds: + ready = select.select(out_fds, in_fds, []) + # Write in chunks of 512 bytes + if ready[1]: + popen.stdin.write(stdin[w_ind:w_ind+512]) + w_ind += 512 + if w_ind > len(stdin): + rm_polled_fd(popen.stdin, in_fds) # Read in chunks of 4k stdout = popen.stdout.read(4096) if popen.stdout in ready[0] else '' stderr = popen.stderr.read(4096) if popen.stderr in ready[0] else '' -- cgit v1.2.3