diff options
author | Markus Lehtonen <markus.lehtonen@linux.intel.com> | 2013-09-18 17:20:41 +0300 |
---|---|---|
committer | Markus Lehtonen <markus.lehtonen@linux.intel.com> | 2014-11-14 14:22:00 +0200 |
commit | 0993f2d4c14779d8701a72b20b81fc779e6824fd (patch) | |
tree | 025192116e8a47a2dc10a88e550b9d7d466c6bc0 /gbp | |
parent | 81e297044a229274eeb3d4a3b1e0d7b037b5277b (diff) | |
download | git-buildpackage-0993f2d4c14779d8701a72b20b81fc779e6824fd.tar.gz git-buildpackage-0993f2d4c14779d8701a72b20b81fc779e6824fd.tar.bz2 git-buildpackage-0993f2d4c14779d8701a72b20b81fc779e6824fd.zip |
GitRepository.__git_inout: prevent blocking of stdin
Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
Diffstat (limited to 'gbp')
-rw-r--r-- | gbp/git/repository.py | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/gbp/git/repository.py b/gbp/git/repository.py index db9659ba..0522ecbb 100644 --- a/gbp/git/repository.py +++ b/gbp/git/repository.py @@ -212,22 +212,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 '' |