Skip to content

Commit

Permalink
git-p4: use subprocess in p4CmdList
Browse files Browse the repository at this point in the history
This allows bidirectional piping - useful for "-x -" to avoid commandline
arguments - and is a step toward bypassing the shell.

Signed-off-by: Scott Lamb <slamb@slamb.org>
Signed-off-by: Simon Hausmann <simon@lst.de>
  • Loading branch information
Scott Lamb authored and Simon Hausmann committed Jul 17, 2007
1 parent a5e4079 commit 9f90c73
Showing 1 changed file with 18 additions and 5 deletions.
23 changes: 18 additions & 5 deletions contrib/fast-import/git-p4
Original file line number Diff line number Diff line change
Expand Up @@ -63,21 +63,34 @@ def system(cmd):
if os.system(cmd) != 0:
die("command failed: %s" % cmd)

def p4CmdList(cmd):
def p4CmdList(cmd, stdin=None, stdin_mode='w+b'):
cmd = "p4 -G %s" % cmd
if verbose:
sys.stderr.write("Opening pipe: %s\n" % cmd)
pipe = os.popen(cmd, "rb")

# Use a temporary file to avoid deadlocks without
# subprocess.communicate(), which would put another copy
# of stdout into memory.
stdin_file = None
if stdin is not None:
stdin_file = tempfile.TemporaryFile(prefix='p4-stdin', mode=stdin_mode)
stdin_file.write(stdin)
stdin_file.flush()
stdin_file.seek(0)

p4 = subprocess.Popen(cmd, shell=True,
stdin=stdin_file,
stdout=subprocess.PIPE)

result = []
try:
while True:
entry = marshal.load(pipe)
entry = marshal.load(p4.stdout)
result.append(entry)
except EOFError:
pass
exitCode = pipe.close()
if exitCode != None:
exitCode = p4.wait()
if exitCode != 0:
entry = {}
entry["p4ExitCode"] = exitCode
result.append(entry)
Expand Down

0 comments on commit 9f90c73

Please sign in to comment.