_Yet_ more python 2.5 compat
[trackgit.git] / git.py
blobebfc06acc4996935c09ba0f700e8f34d6bb51258
1 # stolen from curseforge's packager repo
3 import os
4 import sys
5 import subprocess
7 def execute(executable, *args, **kwargs):
8 ret_pipe = kwargs.pop('ret_pipe', False)
9 cwd = kwargs.pop('cwd', None)
10 input = kwargs.pop('input', None)
11 input_pipe = kwargs.pop('input_pipe', subprocess.PIPE)
12 if kwargs.pop('stderr', False):
13 stderr = subprocess.STDOUT
14 else:
15 stderr = subprocess.PIPE
16 _env = kwargs.pop('env', None)
17 if _env:
18 env = dict(os.environ)
19 env.update(_env)
20 else:
21 env = None
22 process = subprocess.Popen(args=(executable,) + args, shell=False,
23 stdout=subprocess.PIPE, stderr=stderr,
24 stdin=input_pipe, cwd=cwd, env=env)
25 if input:
26 process.stdin.write(input)
27 if ret_pipe:
28 return process.stdout
29 if process.stdin: # 'None' if input_pipe was set
30 process.stdin.close()
31 output = process.stdout.read()
32 process.wait()
33 # sys.stdout.write("(Done)\n")
34 # sys.stdout.flush()
35 if stderr == subprocess.STDOUT:
36 errors = output # not really much we can do here
37 else:
38 errors = process.stderr.read()
39 if process.returncode != 0:
40 sys.stdout.write("ERROR %d with %r: %s\n%s\n"
41 % (process.returncode, (executable,)+args, output, errors))
42 sys.stdout.flush()
43 return errors, process.returncode or 1
44 return output, 0
46 def git(*args, **kwargs):
47 return execute('git', '--no-pager', *args, **kwargs)