# HG changeset patch # User Matt Harbison # Date 1522466506 14400 # Node ID 73a60281a861e31d1d55df91f5cf44b72f30fbd5 # Parent 3bc609bcfe774d83f588b1e3dee5ad2e457bf6ae server: refactor 'daemon_postexec' instructions into a dictionary diff -r 3bc609bcfe77 -r 73a60281a861 mercurial/server.py --- a/mercurial/server.py Wed Mar 28 13:37:19 2018 -0700 +++ b/mercurial/server.py Fri Mar 30 23:21:46 2018 -0400 @@ -30,26 +30,35 @@ runargs=None, appendpid=False): '''Run a command as a service.''' + postexecargs = {} + + if opts['daemon_postexec']: + for inst in opts['daemon_postexec']: + if inst.startswith('unlink:'): + postexecargs['unlink'] = inst[7:] + elif inst.startswith('chdir:'): + postexecargs['chdir'] = inst[6:] + elif inst != 'none': + raise error.Abort(_('invalid value for --daemon-postexec: %s') + % inst) + # When daemonized on Windows, redirect stdout/stderr to the lockfile (which # gets cleaned up after the child is up and running), so that the parent can # read and print the error if this child dies early. See 594dd384803c. On # other platforms, the child can write to the parent's stdio directly, until # it is redirected prior to runfn(). if pycompat.iswindows and opts['daemon_postexec']: - for inst in opts['daemon_postexec']: - if inst.startswith('unlink:'): - lockpath = inst[7:] - if os.path.exists(lockpath): - procutil.stdout.flush() - procutil.stderr.flush() + if 'unlink' in postexecargs and os.path.exists(postexecargs['unlink']): + procutil.stdout.flush() + procutil.stderr.flush() - fd = os.open(lockpath, - os.O_WRONLY | os.O_APPEND | os.O_BINARY) - try: - os.dup2(fd, 1) - os.dup2(fd, 2) - finally: - os.close(fd) + fd = os.open(postexecargs['unlink'], + os.O_WRONLY | os.O_APPEND | os.O_BINARY) + try: + os.dup2(fd, 1) + os.dup2(fd, 2) + finally: + os.close(fd) def writepid(pid): if opts['pid_file']: @@ -109,15 +118,8 @@ except AttributeError: pass - lockpath = None - for inst in opts['daemon_postexec']: - if inst.startswith('unlink:'): - lockpath = inst[7:] - elif inst.startswith('chdir:'): - os.chdir(inst[6:]) - elif inst != 'none': - raise error.Abort(_('invalid value for --daemon-postexec: %s') - % inst) + if 'chdir' in postexecargs: + os.chdir(postexecargs['chdir']) procutil.hidewindow() procutil.stdout.flush() procutil.stderr.flush() @@ -137,8 +139,8 @@ # Only unlink after redirecting stdout/stderr, so Windows doesn't # complain about a sharing violation. - if lockpath: - os.unlink(lockpath) + if 'unlink' in postexecargs: + os.unlink(postexecargs['unlink']) if runfn: return runfn()