comparison mercurial/hgweb/hgweb_mod.py @ 26160:952e0564b46e

hgweb: move additional state setting outside of refresh We want refresh() to only be about refreshing repository instances. This state doesn't belong in requestcontext because it is shared across multiple threads.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 22 Aug 2015 15:30:39 -0700
parents fd9b1262f0e4
children 16d54bbdbf89
comparison
equal deleted inserted replaced
26159:f3b467aca485 26160:952e0564b46e
193 elif viewconfig in repoview.filtertable: 193 elif viewconfig in repoview.filtertable:
194 return repo.filtered(viewconfig) 194 return repo.filtered(viewconfig)
195 else: 195 else:
196 return repo.filtered('served') 196 return repo.filtered('served')
197 197
198 def refresh(self, request): 198 def refresh(self):
199 repostate = [] 199 repostate = []
200 # file of interrests mtime and size 200 # file of interrests mtime and size
201 for meth, fname in foi: 201 for meth, fname in foi:
202 prefix = getattr(self.repo, meth) 202 prefix = getattr(self.repo, meth)
203 st = get_stat(prefix, fname) 203 st = get_stat(prefix, fname)
206 # we need to compare file size in addition to mtime to catch 206 # we need to compare file size in addition to mtime to catch
207 # changes made less than a second ago 207 # changes made less than a second ago
208 if repostate != self.repostate: 208 if repostate != self.repostate:
209 r = hg.repository(self.repo.baseui, self.repo.url()) 209 r = hg.repository(self.repo.baseui, self.repo.url())
210 self.repo = self._getview(r) 210 self.repo = self._getview(r)
211 encoding.encoding = self.config("web", "encoding",
212 encoding.encoding)
213 # update these last to avoid threads seeing empty settings 211 # update these last to avoid threads seeing empty settings
214 self.repostate = repostate 212 self.repostate = repostate
215 # mtime is needed for ETag 213 # mtime is needed for ETag
216 self.mtime = st.st_mtime 214 self.mtime = st.st_mtime
217
218 self.repo.ui.environ = request.env
219 215
220 def run(self): 216 def run(self):
221 """Start a server from CGI environment. 217 """Start a server from CGI environment.
222 218
223 Modern servers should be using WSGI and should avoid this 219 Modern servers should be using WSGI and should avoid this
241 """Internal method to run the WSGI application. 237 """Internal method to run the WSGI application.
242 238
243 This is typically only called by Mercurial. External consumers 239 This is typically only called by Mercurial. External consumers
244 should be using instances of this class as the WSGI application. 240 should be using instances of this class as the WSGI application.
245 """ 241 """
246 self.refresh(req) 242 self.refresh()
247 rctx = requestcontext(self) 243 rctx = requestcontext(self)
244
245 # This state is global across all threads.
246 encoding.encoding = rctx.config('web', 'encoding', encoding.encoding)
247 rctx.repo.ui.environ = req.env
248 248
249 # work with CGI variables to create coherent structure 249 # work with CGI variables to create coherent structure
250 # use SCRIPT_NAME, PATH_INFO and QUERY_STRING as well as our REPO_NAME 250 # use SCRIPT_NAME, PATH_INFO and QUERY_STRING as well as our REPO_NAME
251 251
252 req.url = req.env['SCRIPT_NAME'] 252 req.url = req.env['SCRIPT_NAME']