D4939: logtoprocess: use new runbgcommand from procutil
durin42 (Augie Fackler)
phabricator at mercurial-scm.org
Thu Oct 11 12:21:32 UTC 2018
durin42 created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D4939
AFFECTED FILES
hgext/logtoprocess.py
CHANGE DETAILS
diff --git a/hgext/logtoprocess.py b/hgext/logtoprocess.py
--- a/hgext/logtoprocess.py
+++ b/hgext/logtoprocess.py
@@ -36,12 +36,6 @@
import itertools
import os
-import subprocess
-import sys
-
-from mercurial import (
- pycompat,
-)
from mercurial.utils import (
procutil,
@@ -54,51 +48,6 @@
testedwith = 'ships-with-hg-core'
def uisetup(ui):
- if pycompat.iswindows:
- # no fork on Windows, but we can create a detached process
- # https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863.aspx
- # No stdlib constant exists for this value
- DETACHED_PROCESS = 0x00000008
- _creationflags = DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP
-
- def runshellcommand(script, env):
- # we can't use close_fds *and* redirect stdin. I'm not sure that we
- # need to because the detached process has no console connection.
- subprocess.Popen(
- procutil.tonativestr(script),
- shell=True, env=procutil.tonativeenv(env), close_fds=True,
- creationflags=_creationflags)
- else:
- def runshellcommand(script, env):
- # double-fork to completely detach from the parent process
- # based on http://code.activestate.com/recipes/278731
- pid = os.fork()
- if pid:
- # parent
- return
- # subprocess.Popen() forks again, all we need to add is
- # flag the new process as a new session.
- if sys.version_info < (3, 2):
- newsession = {'preexec_fn': os.setsid}
- else:
- newsession = {'start_new_session': True}
- try:
- # connect std* to devnull to make sure the subprocess can't
- # muck up these stream for mercurial.
- # Connect all the streams to be more close to Windows behavior
- # and pager will wait for scripts to end if we don't do that
- nullrfd = open(os.devnull, 'r')
- nullwfd = open(os.devnull, 'w')
- subprocess.Popen(
- procutil.tonativestr(script),
- shell=True, stdin=nullrfd,
- stdout=nullwfd, stderr=nullwfd,
- env=procutil.tonativeenv(env),
- close_fds=True, **newsession)
- finally:
- # mission accomplished, this child needs to exit and not
- # continue the hg process here.
- os._exit(0)
class logtoprocessui(ui.__class__):
def log(self, event, *msg, **opts):
@@ -135,7 +84,7 @@
env = dict(itertools.chain(procutil.shellenviron().items(),
msgpairs, optpairs),
EVENT=event, HGPID=str(os.getpid()))
- runshellcommand(script, env)
+ procutil.runbgcommand(script, env, shell=True)
return super(logtoprocessui, self).log(event, *msg, **opts)
# Replace the class for this instance and all clones created from it:
To: durin42, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list