# HG changeset patch # User Patrick Mezard # Date 2007-11-01 11:05:14 # Node ID 003d1f174fe1ad254a334b58faf4441a069a817a # Parent 81bef3c355c55b6ac5945c99f81fbd33ea1f61e6 Fix Windows os.popen bug with interleaved stdout/stderr output See python bug 1366 "popen spawned process may not write to stdout under windows" for more details. diff --git a/hgext/convert/cvs.py b/hgext/convert/cvs.py --- a/hgext/convert/cvs.py +++ b/hgext/convert/cvs.py @@ -43,14 +43,13 @@ class convert_cvs(converter_source): cmd = '%s -d "1970/01/01 00:00:01" -d "%s"' % (cmd, self.rev) except util.Abort: raise util.Abort('revision %s is not a patchset number or date' % self.rev) - cmd += " 2>&1" d = os.getcwd() try: os.chdir(self.path) id = None state = 0 - for l in os.popen(cmd): + for l in util.popen(cmd): if state == 0: # header if l.startswith("PatchSet"): id = l[9:-2] diff --git a/hgext/convert/darcs.py b/hgext/convert/darcs.py --- a/hgext/convert/darcs.py +++ b/hgext/convert/darcs.py @@ -65,9 +65,9 @@ class darcs_source(converter_source): cmdline += args cmdline = [util.shellquote(arg) for arg in cmdline] cmdline += ['<', util.nulldev] - cmdline = util.quotecommand(' '.join(cmdline)) + cmdline = ' '.join(cmdline) self.ui.debug(cmdline, '\n') - return os.popen(cmdline, 'r') + return util.popen(cmdline) def run(self, cmd, *args, **kwargs): fp = self._run(cmd, *args, **kwargs) diff --git a/hgext/convert/git.py b/hgext/convert/git.py --- a/hgext/convert/git.py +++ b/hgext/convert/git.py @@ -14,7 +14,7 @@ class convert_git(converter_source): prevgitdir = os.environ.get('GIT_DIR') os.environ['GIT_DIR'] = self.path try: - return os.popen(s) + return util.popen(s) finally: if prevgitdir is None: del os.environ['GIT_DIR'] @@ -22,7 +22,7 @@ class convert_git(converter_source): os.environ['GIT_DIR'] = prevgitdir else: def gitcmd(self, s): - return os.popen('GIT_DIR=%s %s' % (self.path, s)) + return util.popen('GIT_DIR=%s %s' % (self.path, s)) def __init__(self, ui, path, rev=None): super(convert_git, self).__init__(ui, path, rev=rev) @@ -42,8 +42,7 @@ class convert_git(converter_source): def catfile(self, rev, type): if rev == "0" * 40: raise IOError() - fh = self.gitcmd("git-cat-file %s %s 2>%s" % (type, rev, - util.nulldev)) + fh = self.gitcmd("git-cat-file %s %s" % (type, rev)) return fh.read() def getfile(self, name, rev): @@ -108,8 +107,7 @@ class convert_git(converter_source): def gettags(self): tags = {} - fh = self.gitcmd('git-ls-remote --tags "%s" 2>%s' % (self.path, - util.nulldev)) + fh = self.gitcmd('git-ls-remote --tags "%s"' % self.path) prefix = 'refs/tags/' for line in fh: line = line.strip() diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -249,7 +249,7 @@ def externalpatch(patcher, args, patchna fuzz = False if cwd: args.append('-d %s' % util.shellquote(cwd)) - fp = os.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip, + fp = util.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip, util.shellquote(patchname))) for line in fp: diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -1011,6 +1011,13 @@ if os.name == 'nt': # through the current COMSPEC. cmd.exe suppress enclosing quotes. return '"' + cmd + '"' + def popen(command): + # Work around "popen spawned process may not write to stdout + # under windows" + # http://bugs.python.org/issue1366 + command += " 2> %s" % nulldev + return os.popen(quotecommand(command)) + def explain_exit(code): return _("exited with status %d") % code, code @@ -1168,6 +1175,9 @@ else: def quotecommand(cmd): return cmd + def popen(command): + return os.popen(command) + def testpid(pid): '''return False if pid dead, True if running or not sure''' if os.sys.platform == 'OpenVMS': diff --git a/mercurial/version.py b/mercurial/version.py --- a/mercurial/version.py +++ b/mercurial/version.py @@ -50,7 +50,7 @@ def remember_version(version=None): """Store version information.""" global remembered_version if not version and os.path.isdir(".hg"): - f = os.popen("hg identify 2> %s" % util.nulldev) # use real hg installation + f = util.popen("hg identify") # use real hg installation ident = f.read()[:-1] if not f.close() and ident: ids = ident.split(' ', 1)