git-p4: use subprocess in p4CmdList
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>
This commit is contained in:
parent
a5e407988b
commit
9f90c7335e
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user