diff -r 73a60281a861 -r d2bd29dffc6c mercurial/server.py --- a/mercurial/server.py Fri Mar 30 23:21:46 2018 -0400 +++ b/mercurial/server.py Fri Mar 30 23:32:06 2018 -0400 @@ -55,8 +55,8 @@ fd = os.open(postexecargs['unlink'], os.O_WRONLY | os.O_APPEND | os.O_BINARY) try: - os.dup2(fd, 1) - os.dup2(fd, 2) + os.dup2(fd, procutil.stdout.fileno()) + os.dup2(fd, procutil.stderr.fileno()) finally: os.close(fd) @@ -94,7 +94,7 @@ # If the daemonized process managed to write out an error msg, # report it. if pycompat.iswindows and os.path.exists(lockpath): - with open(lockpath) as log: + with open(lockpath, 'rb') as log: for line in log: procutil.stderr.write(line) raise error.Abort(_('child process failed to start')) @@ -129,12 +129,14 @@ if logfile: logfilefd = os.open(logfile, os.O_RDWR | os.O_CREAT | os.O_APPEND, 0o666) - os.dup2(nullfd, 0) - os.dup2(logfilefd, 1) - os.dup2(logfilefd, 2) - if nullfd not in (0, 1, 2): + os.dup2(nullfd, procutil.stdin.fileno()) + os.dup2(logfilefd, procutil.stdout.fileno()) + os.dup2(logfilefd, procutil.stderr.fileno()) + stdio = (procutil.stdin.fileno(), procutil.stdout.fileno(), + procutil.stderr.fileno()) + if nullfd not in stdio: os.close(nullfd) - if logfile and logfilefd not in (0, 1, 2): + if logfile and logfilefd not in stdio: os.close(logfilefd) # Only unlink after redirecting stdout/stderr, so Windows doesn't