[PATCH] hgweb: refresh hgweb.repo on phase change (issue4061)
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Sat Sep 27 17:50:50 CDT 2014
On 09/27/2014 10:28 AM, Anton Shestakov wrote:
> # HG changeset patch
> # User Anton Shestakov <engored at ya.ru>
> # Date 1411822795 -32400
> # Sat Sep 27 21:59:55 2014 +0900
> # Node ID 9927c91e31140e9e529473073768912745cfb9cc
> # Parent e6e7ef68c879b55c1b2c0ebe00d8cbdbc929dbed
> hgweb: refresh hgweb.repo on phase change (issue4061)
This seems to belong on stable but does not apply there.
Can you send a version rebased on stable (with a STABLE flag?)
> 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.
>
> diff --git a/mercurial/hgweb/common.py b/mercurial/hgweb/common.py
> --- a/mercurial/hgweb/common.py
> +++ b/mercurial/hgweb/common.py
> @@ -112,9 +112,9 @@
> def statusmessage(code, message=None):
> return '%d %s' % (code, message or _statusmessage(code))
>
> -def get_stat(spath):
> - """stat changelog if it exists, spath otherwise"""
> - cl_path = os.path.join(spath, "00changelog.i")
> +def get_stat(spath, fn="00changelog.i"):
> + """stat fn (00changelog.i by default) if it exists, spath otherwise"""
> + cl_path = os.path.join(spath, fn)
> if os.path.exists(cl_path):
> return os.stat(cl_path)
> else:
> diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
> --- a/mercurial/hgweb/hgweb_mod.py
> +++ b/mercurial/hgweb/hgweb_mod.py
> @@ -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)
Can we get the mtime and st_size to be grouped in pari instead?
((time, size), (time, 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.url())
> 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
>
> diff --git a/tests/test-hgweb.t b/tests/test-hgweb.t
> --- a/tests/test-hgweb.t
> +++ b/tests/test-hgweb.t
> @@ -513,6 +513,50 @@
> 304 Not Modified
>
>
> +phase changes are refreshed (issue4061)
> +
> + $ echo bar >> foo
> + $ hg ci -msecret --secret
> + $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'log?style=raw'
> + 200 Script output follows
> +
> +
> + # HG changelog
> + # Node ID 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
> +
> + changeset: 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
> + revision: 0
> + user: test
> + date: Thu, 01 Jan 1970 00:00:00 +0000
> + summary: base
> + branch: default
> + tag: tip
> +
> +
> + $ hg phase --draft tip
> + $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'log?style=raw'
> + 200 Script output follows
> +
> +
> + # HG changelog
> + # Node ID a084749e708a9c4c0a5b652a2a446322ce290e04
> +
> + changeset: a084749e708a9c4c0a5b652a2a446322ce290e04
> + revision: 1
> + user: test
> + date: Thu, 01 Jan 1970 00:00:00 +0000
> + summary: secret
> + branch: default
> + tag: tip
> +
> + changeset: 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
> + revision: 0
> + user: test
> + date: Thu, 01 Jan 1970 00:00:00 +0000
> + summary: base
> +
> +
> +
> errors
>
> $ cat errors.log
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
>
--
Pierre-Yves David
More information about the Mercurial-devel
mailing list