[PATCH V2 STABLE] hgweb: refresh hgweb.repo on phase change (issue4061)

Augie Fackler raf at durin42.com
Tue Oct 7 12:26:50 CDT 2014


On Sun, Sep 28, 2014 at 07:55:15PM +0900, Anton Shestakov wrote:
> # HG changeset patch
> # User Anton Shestakov <engored at ya.ru>
> # Date 1411822795 -32400
> #      Sat Sep 27 21:59:55 2014 +0900
> # Branch stable
> # Node ID ba0f310dff74d469c1449337f76b2d0898ef48d1
> # Parent  6e1fbcb18a75e9cc7d3a88ec9461aa31fac6e3ad
> hgweb: refresh hgweb.repo on phase change (issue4061)

This was pushed as a111e460318a.

>
> 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))
> +        # 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
>
> diff --git a/tests/test-hgweb.t b/tests/test-hgweb.t
> --- a/tests/test-hgweb.t
> +++ b/tests/test-hgweb.t
> @@ -531,6 +531,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


More information about the Mercurial-devel mailing list