diff -r 9823e2f50a93 -r d9e5b0aeeb90 mercurial/util.py --- a/mercurial/util.py Sun Jan 08 00:52:54 2017 +0800 +++ b/mercurial/util.py Tue Jan 10 06:58:02 2017 +0800 @@ -974,6 +974,21 @@ fileno = getattr(f, 'fileno', None) return fileno and fileno() == sys.__stdout__.fileno() +def shellenviron(environ=None): + """return environ with optional override, useful for shelling out""" + def py2shell(val): + 'convert python object into string that is useful to shell' + if val is None or val is False: + return '0' + if val is True: + return '1' + return str(val) + env = dict(encoding.environ) + if environ: + env.update((k, py2shell(v)) for k, v in environ.iteritems()) + env['HG'] = hgexecutable() + return env + def system(cmd, environ=None, cwd=None, onerr=None, errprefix=None, out=None): '''enhanced shell command execution. run with environment maybe modified, maybe in different dir. @@ -983,19 +998,10 @@ 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.''' - if environ is None: - environ = {} try: stdout.flush() except Exception: pass - def py2shell(val): - 'convert python object into string that is useful to shell' - if val is None or val is False: - return '0' - if val is True: - return '1' - return str(val) origcmd = cmd cmd = quotecommand(cmd) if pycompat.sysplatform == 'plan9' and (sys.version_info[0] == 2 @@ -1006,9 +1012,7 @@ os.chdir(cwd) rc = os.system(cmd) else: - env = dict(encoding.environ) - env.update((k, py2shell(v)) for k, v in environ.iteritems()) - env['HG'] = hgexecutable() + env = shellenviron(environ) if out is None or _isstdout(out): rc = subprocess.call(cmd, shell=True, close_fds=closefds, env=env, cwd=cwd)