# HG changeset patch # User Yuya Nishihara # Date 1487434605 -32400 # Node ID 3f8f53190d6afed0aca6c6527236edad28ce785c # Parent fbce78c58f1e43f5ab1947260dcd25bfaa7ca1c4 chg: deduplicate error handling of ui.system() This moves 'onerr' handling from low-level util.system() to higher level, which seems better API separation. diff -r fbce78c58f1e -r 3f8f53190d6a mercurial/chgserver.py --- 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', diff -r fbce78c58f1e -r 3f8f53190d6a mercurial/ui.py --- 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. diff -r fbce78c58f1e -r 3f8f53190d6a mercurial/util.py --- 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): diff -r fbce78c58f1e -r 3f8f53190d6a tests/test-config.t --- 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]