chg: deduplicate error handling of ui.system()
This moves 'onerr' handling from low-level util.system() to higher level,
which seems better API separation.
--- a/mercurial/chgserver.py Sun Feb 19 01:00:10 2017 +0900
+++ b/mercurial/chgserver.py Sun Feb 19 01:16:45 2017 +0900
@@ -179,7 +179,7 @@
else:
self._csystem = csystem
- def _runsystem(self, cmd, environ, cwd, onerr, errprefix, out):
+ def _runsystem(self, cmd, environ, cwd, out):
# fallback to the original system method if the output needs to be
# captured (to self._buffers), or the output stream is not stdout
# (e.g. stderr, cStringIO), because the chg client is not aware of
@@ -187,17 +187,9 @@
if (out is not self.fout
or not util.safehasattr(self.fout, 'fileno')
or self.fout.fileno() != util.stdout.fileno()):
- return util.system(cmd, environ=environ, cwd=cwd, onerr=onerr,
- errprefix=errprefix, out=out)
+ return util.system(cmd, environ=environ, cwd=cwd, out=out)
self.flush()
- rc = self._csystem(cmd, util.shellenviron(environ), cwd)
- if rc and onerr:
- errmsg = '%s %s' % (os.path.basename(cmd.split(None, 1)[0]),
- util.explainexit(rc)[0])
- if errprefix:
- errmsg = '%s: %s' % (errprefix, errmsg)
- raise onerr(errmsg)
- return rc
+ return self._csystem(cmd, util.shellenviron(environ), cwd)
def _runpager(self, cmd):
self._csystem(cmd, util.shellenviron(), type='pager',
--- a/mercurial/ui.py Sun Feb 19 01:00:10 2017 +0900
+++ b/mercurial/ui.py Sun Feb 19 01:16:45 2017 +0900
@@ -1281,6 +1281,9 @@
blockedtag=None):
'''execute shell command with appropriate output stream. command
output will be redirected if fout is not stdout.
+
+ if command fails and onerr is None, return status, else raise onerr
+ object as exception.
'''
if blockedtag is None:
blockedtag = 'unknown_system_' + cmd.translate(None, _keepalnum)
@@ -1288,14 +1291,19 @@
if any(s[1] for s in self._bufferstates):
out = self
with self.timeblockedsection(blockedtag):
- return self._runsystem(cmd, environ=environ, cwd=cwd, onerr=onerr,
- errprefix=errprefix, out=out)
+ rc = self._runsystem(cmd, environ=environ, cwd=cwd, out=out)
+ if rc and onerr:
+ errmsg = '%s %s' % (os.path.basename(cmd.split(None, 1)[0]),
+ util.explainexit(rc)[0])
+ if errprefix:
+ errmsg = '%s: %s' % (errprefix, errmsg)
+ raise onerr(errmsg)
+ return rc
- def _runsystem(self, cmd, environ, cwd, onerr, errprefix, out):
+ def _runsystem(self, cmd, environ, cwd, out):
"""actually execute the given shell command (can be overridden by
extensions like chg)"""
- return util.system(cmd, environ=environ, cwd=cwd, onerr=onerr,
- errprefix=errprefix, out=out)
+ return util.system(cmd, environ=environ, cwd=cwd, out=out)
def traceback(self, exc=None, force=False):
'''print exception traceback if traceback printing enabled or forced.
--- a/mercurial/util.py Sun Feb 19 01:00:10 2017 +0900
+++ b/mercurial/util.py Sun Feb 19 01:16:45 2017 +0900
@@ -1009,20 +1009,16 @@
env['HG'] = hgexecutable()
return env
-def system(cmd, environ=None, cwd=None, onerr=None, errprefix=None, out=None):
+def system(cmd, environ=None, cwd=None, out=None):
'''enhanced shell command execution.
run with environment maybe modified, maybe in different dir.
- if command fails and onerr is None, return status, else raise onerr
- object as exception.
-
if out is specified, it is assumed to be a file-like object that has a
write() method. stdout and stderr will be redirected to out.'''
try:
stdout.flush()
except Exception:
pass
- origcmd = cmd
cmd = quotecommand(cmd)
if pycompat.sysplatform == 'plan9' and (sys.version_info[0] == 2
and sys.version_info[1] < 7):
@@ -1046,12 +1042,6 @@
rc = proc.returncode
if pycompat.sysplatform == 'OpenVMS' and rc & 1:
rc = 0
- if rc and onerr:
- errmsg = '%s %s' % (os.path.basename(origcmd.split(None, 1)[0]),
- explainexit(rc)[0])
- if errprefix:
- errmsg = '%s: %s' % (errprefix, errmsg)
- raise onerr(errmsg)
return rc
def checksignature(func):
--- a/tests/test-config.t Sun Feb 19 01:00:10 2017 +0900
+++ b/tests/test-config.t Sun Feb 19 01:16:45 2017 +0900
@@ -158,3 +158,9 @@
$ hg showconfig paths
paths.foo:suboption=~/foo
paths.foo=$TESTTMP/foo
+
+edit failure
+
+ $ HGEDITOR=false hg config --edit
+ abort: edit failed: false exited with status 1
+ [255]