comparison mercurial/server.py @ 43077:687b865b95ad

formatting: byteify all mercurial/ and hgext/ string literals Done with python3.7 contrib/byteify-strings.py -i $(hg files 'set:mercurial/**.py - mercurial/thirdparty/** + hgext/**.py - hgext/fsmonitor/pywatchman/** - mercurial/__init__.py') black -l 80 -t py33 -S $(hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**" - hgext/fsmonitor/pywatchman/**') # skip-blame mass-reformatting only Differential Revision: https://phab.mercurial-scm.org/D6972
author Augie Fackler <augie@google.com>
date Sun, 06 Oct 2019 09:48:39 -0400
parents 2372284d9457
children eef9a2d67051
comparison
equal deleted inserted replaced
43076:2372284d9457 43077:687b865b95ad
35 ): 35 ):
36 '''Run a command as a service.''' 36 '''Run a command as a service.'''
37 37
38 postexecargs = {} 38 postexecargs = {}
39 39
40 if opts['daemon_postexec']: 40 if opts[b'daemon_postexec']:
41 for inst in opts['daemon_postexec']: 41 for inst in opts[b'daemon_postexec']:
42 if inst.startswith('unlink:'): 42 if inst.startswith(b'unlink:'):
43 postexecargs['unlink'] = inst[7:] 43 postexecargs[b'unlink'] = inst[7:]
44 elif inst.startswith('chdir:'): 44 elif inst.startswith(b'chdir:'):
45 postexecargs['chdir'] = inst[6:] 45 postexecargs[b'chdir'] = inst[6:]
46 elif inst != 'none': 46 elif inst != b'none':
47 raise error.Abort( 47 raise error.Abort(
48 _('invalid value for --daemon-postexec: %s') % inst 48 _(b'invalid value for --daemon-postexec: %s') % inst
49 ) 49 )
50 50
51 # When daemonized on Windows, redirect stdout/stderr to the lockfile (which 51 # When daemonized on Windows, redirect stdout/stderr to the lockfile (which
52 # gets cleaned up after the child is up and running), so that the parent can 52 # gets cleaned up after the child is up and running), so that the parent can
53 # read and print the error if this child dies early. See 594dd384803c. On 53 # read and print the error if this child dies early. See 594dd384803c. On
54 # other platforms, the child can write to the parent's stdio directly, until 54 # other platforms, the child can write to the parent's stdio directly, until
55 # it is redirected prior to runfn(). 55 # it is redirected prior to runfn().
56 if pycompat.iswindows and opts['daemon_postexec']: 56 if pycompat.iswindows and opts[b'daemon_postexec']:
57 if 'unlink' in postexecargs and os.path.exists(postexecargs['unlink']): 57 if b'unlink' in postexecargs and os.path.exists(
58 postexecargs[b'unlink']
59 ):
58 procutil.stdout.flush() 60 procutil.stdout.flush()
59 procutil.stderr.flush() 61 procutil.stderr.flush()
60 62
61 fd = os.open( 63 fd = os.open(
62 postexecargs['unlink'], os.O_WRONLY | os.O_APPEND | os.O_BINARY 64 postexecargs[b'unlink'], os.O_WRONLY | os.O_APPEND | os.O_BINARY
63 ) 65 )
64 try: 66 try:
65 os.dup2(fd, procutil.stdout.fileno()) 67 os.dup2(fd, procutil.stdout.fileno())
66 os.dup2(fd, procutil.stderr.fileno()) 68 os.dup2(fd, procutil.stderr.fileno())
67 finally: 69 finally:
68 os.close(fd) 70 os.close(fd)
69 71
70 def writepid(pid): 72 def writepid(pid):
71 if opts['pid_file']: 73 if opts[b'pid_file']:
72 if appendpid: 74 if appendpid:
73 mode = 'ab' 75 mode = b'ab'
74 else: 76 else:
75 mode = 'wb' 77 mode = b'wb'
76 fp = open(opts['pid_file'], mode) 78 fp = open(opts[b'pid_file'], mode)
77 fp.write('%d\n' % pid) 79 fp.write(b'%d\n' % pid)
78 fp.close() 80 fp.close()
79 81
80 if opts['daemon'] and not opts['daemon_postexec']: 82 if opts[b'daemon'] and not opts[b'daemon_postexec']:
81 # Signal child process startup with file removal 83 # Signal child process startup with file removal
82 lockfd, lockpath = pycompat.mkstemp(prefix='hg-service-') 84 lockfd, lockpath = pycompat.mkstemp(prefix=b'hg-service-')
83 os.close(lockfd) 85 os.close(lockfd)
84 try: 86 try:
85 if not runargs: 87 if not runargs:
86 runargs = procutil.hgcmd() + pycompat.sysargv[1:] 88 runargs = procutil.hgcmd() + pycompat.sysargv[1:]
87 runargs.append('--daemon-postexec=unlink:%s' % lockpath) 89 runargs.append(b'--daemon-postexec=unlink:%s' % lockpath)
88 # Don't pass --cwd to the child process, because we've already 90 # Don't pass --cwd to the child process, because we've already
89 # changed directory. 91 # changed directory.
90 for i in pycompat.xrange(1, len(runargs)): 92 for i in pycompat.xrange(1, len(runargs)):
91 if runargs[i].startswith('--cwd='): 93 if runargs[i].startswith(b'--cwd='):
92 del runargs[i] 94 del runargs[i]
93 break 95 break
94 elif runargs[i].startswith('--cwd'): 96 elif runargs[i].startswith(b'--cwd'):
95 del runargs[i : i + 2] 97 del runargs[i : i + 2]
96 break 98 break
97 99
98 def condfn(): 100 def condfn():
99 return not os.path.exists(lockpath) 101 return not os.path.exists(lockpath)
101 pid = procutil.rundetached(runargs, condfn) 103 pid = procutil.rundetached(runargs, condfn)
102 if pid < 0: 104 if pid < 0:
103 # If the daemonized process managed to write out an error msg, 105 # If the daemonized process managed to write out an error msg,
104 # report it. 106 # report it.
105 if pycompat.iswindows and os.path.exists(lockpath): 107 if pycompat.iswindows and os.path.exists(lockpath):
106 with open(lockpath, 'rb') as log: 108 with open(lockpath, b'rb') as log:
107 for line in log: 109 for line in log:
108 procutil.stderr.write(line) 110 procutil.stderr.write(line)
109 raise error.Abort(_('child process failed to start')) 111 raise error.Abort(_(b'child process failed to start'))
110 writepid(pid) 112 writepid(pid)
111 finally: 113 finally:
112 util.tryunlink(lockpath) 114 util.tryunlink(lockpath)
113 if parentfn: 115 if parentfn:
114 return parentfn(pid) 116 return parentfn(pid)
116 return 118 return
117 119
118 if initfn: 120 if initfn:
119 initfn() 121 initfn()
120 122
121 if not opts['daemon']: 123 if not opts[b'daemon']:
122 writepid(procutil.getpid()) 124 writepid(procutil.getpid())
123 125
124 if opts['daemon_postexec']: 126 if opts[b'daemon_postexec']:
125 try: 127 try:
126 os.setsid() 128 os.setsid()
127 except AttributeError: 129 except AttributeError:
128 pass 130 pass
129 131
130 if 'chdir' in postexecargs: 132 if b'chdir' in postexecargs:
131 os.chdir(postexecargs['chdir']) 133 os.chdir(postexecargs[b'chdir'])
132 procutil.hidewindow() 134 procutil.hidewindow()
133 procutil.stdout.flush() 135 procutil.stdout.flush()
134 procutil.stderr.flush() 136 procutil.stderr.flush()
135 137
136 nullfd = os.open(os.devnull, os.O_RDWR) 138 nullfd = os.open(os.devnull, os.O_RDWR)
152 if logfile and logfilefd not in stdio: 154 if logfile and logfilefd not in stdio:
153 os.close(logfilefd) 155 os.close(logfilefd)
154 156
155 # Only unlink after redirecting stdout/stderr, so Windows doesn't 157 # Only unlink after redirecting stdout/stderr, so Windows doesn't
156 # complain about a sharing violation. 158 # complain about a sharing violation.
157 if 'unlink' in postexecargs: 159 if b'unlink' in postexecargs:
158 os.unlink(postexecargs['unlink']) 160 os.unlink(postexecargs[b'unlink'])
159 161
160 if runfn: 162 if runfn:
161 return runfn() 163 return runfn()
162 164
163 165
164 _cmdservicemap = { 166 _cmdservicemap = {
165 'chgunix': chgserver.chgunixservice, 167 b'chgunix': chgserver.chgunixservice,
166 'pipe': commandserver.pipeservice, 168 b'pipe': commandserver.pipeservice,
167 'unix': commandserver.unixforkingservice, 169 b'unix': commandserver.unixforkingservice,
168 } 170 }
169 171
170 172
171 def _createcmdservice(ui, repo, opts): 173 def _createcmdservice(ui, repo, opts):
172 mode = opts['cmdserver'] 174 mode = opts[b'cmdserver']
173 try: 175 try:
174 servicefn = _cmdservicemap[mode] 176 servicefn = _cmdservicemap[mode]
175 except KeyError: 177 except KeyError:
176 raise error.Abort(_('unknown mode %s') % mode) 178 raise error.Abort(_(b'unknown mode %s') % mode)
177 commandserver.setuplogging(ui, repo) 179 commandserver.setuplogging(ui, repo)
178 return servicefn(ui, repo, opts) 180 return servicefn(ui, repo, opts)
179 181
180 182
181 def _createhgwebservice(ui, repo, opts): 183 def _createhgwebservice(ui, repo, opts):
182 # this way we can check if something was given in the command-line 184 # this way we can check if something was given in the command-line
183 if opts.get('port'): 185 if opts.get(b'port'):
184 opts['port'] = util.getport(opts.get('port')) 186 opts[b'port'] = util.getport(opts.get(b'port'))
185 187
186 alluis = {ui} 188 alluis = {ui}
187 if repo: 189 if repo:
188 baseui = repo.baseui 190 baseui = repo.baseui
189 alluis.update([repo.baseui, repo.ui]) 191 alluis.update([repo.baseui, repo.ui])
190 else: 192 else:
191 baseui = ui 193 baseui = ui
192 webconf = opts.get('web_conf') or opts.get('webdir_conf') 194 webconf = opts.get(b'web_conf') or opts.get(b'webdir_conf')
193 if webconf: 195 if webconf:
194 if opts.get('subrepos'): 196 if opts.get(b'subrepos'):
195 raise error.Abort(_('--web-conf cannot be used with --subrepos')) 197 raise error.Abort(_(b'--web-conf cannot be used with --subrepos'))
196 198
197 # load server settings (e.g. web.port) to "copied" ui, which allows 199 # load server settings (e.g. web.port) to "copied" ui, which allows
198 # hgwebdir to reload webconf cleanly 200 # hgwebdir to reload webconf cleanly
199 servui = ui.copy() 201 servui = ui.copy()
200 servui.readconfig(webconf, sections=['web']) 202 servui.readconfig(webconf, sections=[b'web'])
201 alluis.add(servui) 203 alluis.add(servui)
202 elif opts.get('subrepos'): 204 elif opts.get(b'subrepos'):
203 servui = ui 205 servui = ui
204 206
205 # If repo is None, hgweb.createapp() already raises a proper abort 207 # If repo is None, hgweb.createapp() already raises a proper abort
206 # message as long as webconf is None. 208 # message as long as webconf is None.
207 if repo: 209 if repo:
208 webconf = dict() 210 webconf = dict()
209 cmdutil.addwebdirpath(repo, "", webconf) 211 cmdutil.addwebdirpath(repo, b"", webconf)
210 else: 212 else:
211 servui = ui 213 servui = ui
212 214
213 optlist = ( 215 optlist = (
214 "name templates style address port prefix ipv6" 216 b"name templates style address port prefix ipv6"
215 " accesslog errorlog certificate encoding" 217 b" accesslog errorlog certificate encoding"
216 ) 218 )
217 for o in optlist.split(): 219 for o in optlist.split():
218 val = opts.get(o, '') 220 val = opts.get(o, b'')
219 if val in (None, ''): # should check against default options instead 221 if val in (None, b''): # should check against default options instead
220 continue 222 continue
221 for u in alluis: 223 for u in alluis:
222 u.setconfig("web", o, val, 'serve') 224 u.setconfig(b"web", o, val, b'serve')
223 225
224 app = hgweb.createapp(baseui, repo, webconf) 226 app = hgweb.createapp(baseui, repo, webconf)
225 return hgweb.httpservice(servui, app, opts) 227 return hgweb.httpservice(servui, app, opts)
226 228
227 229
228 def createservice(ui, repo, opts): 230 def createservice(ui, repo, opts):
229 if opts["cmdserver"]: 231 if opts[b"cmdserver"]:
230 return _createcmdservice(ui, repo, opts) 232 return _createcmdservice(ui, repo, opts)
231 else: 233 else:
232 return _createhgwebservice(ui, repo, opts) 234 return _createhgwebservice(ui, repo, opts)