468 # Following creation flags might create a console GUI window. |
468 # Following creation flags might create a console GUI window. |
469 # Using subprocess.CREATE_NEW_CONSOLE might helps. |
469 # Using subprocess.CREATE_NEW_CONSOLE might helps. |
470 # See https://phab.mercurial-scm.org/D1701 for discussion |
470 # See https://phab.mercurial-scm.org/D1701 for discussion |
471 _creationflags = DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP |
471 _creationflags = DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP |
472 |
472 |
473 def runbgcommand(script, env, shell=False, stdout=None, stderr=None): |
473 def runbgcommand( |
|
474 script, env, shell=False, stdout=None, stderr=None, ensurestart=True): |
474 '''Spawn a command without waiting for it to finish.''' |
475 '''Spawn a command without waiting for it to finish.''' |
475 # we can't use close_fds *and* redirect stdin. I'm not sure that we |
476 # we can't use close_fds *and* redirect stdin. I'm not sure that we |
476 # need to because the detached process has no console connection. |
477 # need to because the detached process has no console connection. |
477 subprocess.Popen( |
478 subprocess.Popen( |
478 tonativestr(script), |
479 tonativestr(script), |
479 shell=shell, env=tonativeenv(env), close_fds=True, |
480 shell=shell, env=tonativeenv(env), close_fds=True, |
480 creationflags=_creationflags, stdout=stdout, |
481 creationflags=_creationflags, stdout=stdout, |
481 stderr=stderr) |
482 stderr=stderr) |
482 else: |
483 else: |
483 def runbgcommand(cmd, env, shell=False, stdout=None, stderr=None): |
484 def runbgcommand( |
|
485 cmd, env, shell=False, stdout=None, stderr=None, ensurestart=True): |
484 '''Spawn a command without waiting for it to finish.''' |
486 '''Spawn a command without waiting for it to finish.''' |
485 # double-fork to completely detach from the parent process |
487 # double-fork to completely detach from the parent process |
486 # based on http://code.activestate.com/recipes/278731 |
488 # based on http://code.activestate.com/recipes/278731 |
487 pid = os.fork() |
489 pid = os.fork() |
488 if pid: |
490 if pid: |
|
491 if not ensurestart: |
|
492 return |
489 # Parent process |
493 # Parent process |
490 (_pid, status) = os.waitpid(pid, 0) |
494 (_pid, status) = os.waitpid(pid, 0) |
491 if os.WIFEXITED(status): |
495 if os.WIFEXITED(status): |
492 returncode = os.WEXITSTATUS(status) |
496 returncode = os.WEXITSTATUS(status) |
493 else: |
497 else: |