summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>2013-09-18 17:20:41 +0300
committerTzafrir Cohen <tzafrir@debian.org>2015-03-26 14:21:52 +0200
commit4df52a5e989c28d81cf69e3ad8b27ff35d492046 (patch)
tree208ae1ba0bf6927695c57747d90c5393423e3134
parent8807629663f52199c2ff8c759eb001b67cf82bdd (diff)
GitRepository.__git_inout: prevent blocking of stdin
Signed-off-by: Markus Lehtonen <markus.lehtonen@linux.intel.com>
-rw-r--r--gbp/git/repository.py18
1 files 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 ''