diff 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
line wrap: on
line diff
--- a/mercurial/hgweb/hgweb_mod.py	Mon Sep 29 16:42:12 2014 -0500
+++ b/mercurial/hgweb/hgweb_mod.py	Sat Sep 27 21:59:55 2014 +0900
@@ -71,8 +71,8 @@
         r.baseui.setconfig('ui', 'nontty', 'true', 'hgweb')
         self.repo = r
         hook.redirect(True)
+        self.repostate = ((-1, -1), (-1, -1))
         self.mtime = -1
-        self.size = -1
         self.reponame = name
         self.archives = 'zip', 'gz', 'bz2'
         self.stripecount = 1
@@ -107,9 +107,12 @@
 
     def refresh(self, request=None):
         st = get_stat(self.repo.spath)
-        # compare changelog size in addition to mtime to catch
-        # rollbacks made less than a second ago
-        if st.st_mtime != self.mtime or st.st_size != self.size:
+        pst = get_stat(self.repo.spath, 'phaseroots')
+        # changelog mtime and size, phaseroots mtime and size
+        repostate = ((st.st_mtime, st.st_size), (pst.st_mtime, pst.st_size))
+        # we need to compare file size in addition to mtime to catch
+        # changes made less than a second ago
+        if repostate != self.repostate:
             r = hg.repository(self.repo.baseui, self.repo.root)
             self.repo = self._getview(r)
             self.maxchanges = int(self.config("web", "maxchanges", 10))
@@ -121,8 +124,9 @@
             encoding.encoding = self.config("web", "encoding",
                                             encoding.encoding)
             # update these last to avoid threads seeing empty settings
+            self.repostate = repostate
+            # mtime is needed for ETag
             self.mtime = st.st_mtime
-            self.size = st.st_size
         if request:
             self.repo.ui.environ = request.env