aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--MgaRepo/svn.py5
-rw-r--r--MgaRepo/util.py68
2 files changed, 37 insertions, 36 deletions
diff --git a/MgaRepo/svn.py b/MgaRepo/svn.py
index 6de8a85..56b4da7 100644
--- a/MgaRepo/svn.py
+++ b/MgaRepo/svn.py
@@ -208,7 +208,10 @@ class SVN:
if lines is None:
return None
pairs = [[w.strip() for w in line.split(":", 1)] for line in lines]
- info = dict(pairs)
+ info = {}
+ for pair in pairs:
+ if pair != ['']:
+ info[pair[0]]=pair[1]
return info
def ls(self, path, **kwargs):
diff --git a/MgaRepo/util.py b/MgaRepo/util.py
index 84c8a63..9d1086d 100644
--- a/MgaRepo/util.py
+++ b/MgaRepo/util.py
@@ -12,18 +12,39 @@ from io import BytesIO
import httplib2
#import commands
-# Our own version of commands' getstatusoutput(). We have a commands
+# Our own version of commands' commands_exec(). We have a commands
# module directory, so we can't import Python's standard module
-def commands_getstatusoutput(cmd):
- """Return (status, output) of executing cmd in a shell."""
- import os
- pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
- text = pipe.read()
- sts = pipe.close()
- if sts is None: sts = 0
- if text[-1:] == '\n': text = text[:-1]
- return sts, text
+def commands_exec(cmdstr, **kwargs):
+ err = BytesIO()
+ out = BytesIO()
+ pstdin = kwargs.get("stdin") if kwargs.get("stdin") else None
+ p = subprocess.Popen(cmdstr, shell=True,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+ stdin=pstdin)
+ of = p.stdout.fileno()
+ ef = p.stderr.fileno()
+ while True:
+ r,w,x = select.select((of,ef), (), ())
+ odata = None
+ if of in r:
+ odata = os.read(of, 8192)
+ out.write(odata)
+ sys.stdout.buffer.write(odata)
+
+ edata = None
+ if ef in r:
+ edata = os.read(ef, 8192)
+ err.write(edata)
+ sys.stderr.buffer.write(edata)
+
+ status = p.poll()
+ if status is not None and odata == b'' and edata == b'':
+ break
+ e = err.getvalue().decode('utf8')
+ o = out.getvalue().decode('utf8')
+ return o, e, status
+
def execcmd(*cmd, **kwargs):
cmdstr = " ".join(cmd)
if kwargs.get('info'):
@@ -32,35 +53,12 @@ def execcmd(*cmd, **kwargs):
prefix='LANG=C LANGUAGE=C LC_ALL=C '
if kwargs.get("show"):
if kwargs.get("geterr"):
- err = BytesIO()
- pstdin = kwargs.get("stdin") if kwargs.get("stdin") else None
- p = subprocess.Popen(prefix + cmdstr, shell=True,
- stdout=subprocess.PIPE, stderr=subprocess.PIPE,
- stdin=pstdin)
- of = p.stdout.fileno()
- ef = p.stderr.fileno()
- while True:
- r,w,x = select.select((of,ef), (), ())
- odata = None
- if of in r:
- odata = os.read(of, 8192)
- sys.stdout.buffer.write(odata)
-
- edata = None
- if ef in r:
- edata = os.read(ef, 8192)
- err.write(edata)
- sys.stderr.buffer.write(edata)
-
- status = p.poll()
- if status is not None and odata == b'' and edata == b'':
- break
- output = err.getvalue()
+ o, output, status = commands_exec(prefix + cmdstr)
else:
status = os.system(prefix + cmdstr)
output = ""
else:
- status, output = commands_getstatusoutput(prefix + cmdstr)
+ output, e, status = commands_exec(prefix + cmdstr)
verbose = config.getbool("global", "verbose", 0)
if status != 0 and not kwargs.get("noerror"):
if kwargs.get("cleanerr") and not verbose: