comparison mercurial/hgweb/hgweb_mod.py @ 22577:a111e460318a stable

hgweb: refresh hgweb.repo on phase change (issue4061) Make hgweb.refresh() also look at phaseroots file (in addition to 00changelog.i file) and reload the repo when os.stat returns different mtime or size than cached, signifying the file was modified. This way if user changes phase of a changeset (secret <-> draft), there's no need to restart hg serve to see the change.
author Anton Shestakov <engored@ya.ru>
date Sat, 27 Sep 2014 21:59:55 +0900
parents 6e1fbcb18a75
children 939ce500c92a
comparison
equal deleted inserted replaced
22576:c712238c4f9b 22577:a111e460318a
69 r.baseui.setconfig('ui', 'report_untrusted', 'off', 'hgweb') 69 r.baseui.setconfig('ui', 'report_untrusted', 'off', 'hgweb')
70 r.ui.setconfig('ui', 'nontty', 'true', 'hgweb') 70 r.ui.setconfig('ui', 'nontty', 'true', 'hgweb')
71 r.baseui.setconfig('ui', 'nontty', 'true', 'hgweb') 71 r.baseui.setconfig('ui', 'nontty', 'true', 'hgweb')
72 self.repo = r 72 self.repo = r
73 hook.redirect(True) 73 hook.redirect(True)
74 self.repostate = ((-1, -1), (-1, -1))
74 self.mtime = -1 75 self.mtime = -1
75 self.size = -1
76 self.reponame = name 76 self.reponame = name
77 self.archives = 'zip', 'gz', 'bz2' 77 self.archives = 'zip', 'gz', 'bz2'
78 self.stripecount = 1 78 self.stripecount = 1
79 # a repo owner may set web.templates in .hg/hgrc to get any file 79 # a repo owner may set web.templates in .hg/hgrc to get any file
80 # readable by the user running the CGI script 80 # readable by the user running the CGI script
105 else: 105 else:
106 return repo.filtered('served') 106 return repo.filtered('served')
107 107
108 def refresh(self, request=None): 108 def refresh(self, request=None):
109 st = get_stat(self.repo.spath) 109 st = get_stat(self.repo.spath)
110 # compare changelog size in addition to mtime to catch 110 pst = get_stat(self.repo.spath, 'phaseroots')
111 # rollbacks made less than a second ago 111 # changelog mtime and size, phaseroots mtime and size
112 if st.st_mtime != self.mtime or st.st_size != self.size: 112 repostate = ((st.st_mtime, st.st_size), (pst.st_mtime, pst.st_size))
113 # we need to compare file size in addition to mtime to catch
114 # changes made less than a second ago
115 if repostate != self.repostate:
113 r = hg.repository(self.repo.baseui, self.repo.root) 116 r = hg.repository(self.repo.baseui, self.repo.root)
114 self.repo = self._getview(r) 117 self.repo = self._getview(r)
115 self.maxchanges = int(self.config("web", "maxchanges", 10)) 118 self.maxchanges = int(self.config("web", "maxchanges", 10))
116 self.stripecount = int(self.config("web", "stripes", 1)) 119 self.stripecount = int(self.config("web", "stripes", 1))
117 self.maxshortchanges = int(self.config("web", "maxshortchanges", 120 self.maxshortchanges = int(self.config("web", "maxshortchanges",
119 self.maxfiles = int(self.config("web", "maxfiles", 10)) 122 self.maxfiles = int(self.config("web", "maxfiles", 10))
120 self.allowpull = self.configbool("web", "allowpull", True) 123 self.allowpull = self.configbool("web", "allowpull", True)
121 encoding.encoding = self.config("web", "encoding", 124 encoding.encoding = self.config("web", "encoding",
122 encoding.encoding) 125 encoding.encoding)
123 # update these last to avoid threads seeing empty settings 126 # update these last to avoid threads seeing empty settings
127 self.repostate = repostate
128 # mtime is needed for ETag
124 self.mtime = st.st_mtime 129 self.mtime = st.st_mtime
125 self.size = st.st_size
126 if request: 130 if request:
127 self.repo.ui.environ = request.env 131 self.repo.ui.environ = request.env
128 132
129 def run(self): 133 def run(self):
130 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."): 134 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."):