summaryrefslogtreecommitdiff
path: root/gbp
diff options
context:
space:
mode:
authorMarkus Lehtonen <markus.lehtonen@linux.intel.com>2013-09-18 17:20:41 +0300
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>2014-11-14 14:22:00 +0200
commit0993f2d4c14779d8701a72b20b81fc779e6824fd (patch)
tree025192116e8a47a2dc10a88e550b9d7d466c6bc0 /gbp
parent81e297044a229274eeb3d4a3b1e0d7b037b5277b (diff)
downloadgit-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.py18
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 ''