[PATCH 1 of 3] hgweb: use an extensible list of file to check for refrash

Yuya Nishihara yuya at tcha.org
Fri Jul 3 07:08:37 CDT 2015


On Thu, 02 Jul 2015 13:35:19 -0700, Pierre-Yves David wrote:
> On 07/02/2015 07:36 AM, Yuya Nishihara wrote:
> > On Wed, 01 Jul 2015 12:26:07 -0700, Pierre-Yves David wrote:
> >> # HG changeset patch
> >> # User Pierre-Yves David <pierre-yves.david at fb.com>
> >> # Date 1435735130 25200
> >> #      Wed Jul 01 00:18:50 2015 -0700
> >> # Node ID 7e3ad479d9bda6560885f08a1df63d386639b2e1
> >> # Parent  c76e8d14383a44a740d986d87db6f58276fb57e8
> >> hgweb: use an extensible list of file to check for refrash
> >>
> >> The refresh feature was explicitly testing if '00changelog.i' and 'phasesroots'
> >> changed. This is overlooking other important information like bookmarks and
> >> obstore (bookmark have their own hack to work around it).
> >>
> >> We move to a more extensible system with a list of file of interest that will be
> >> used to build the repo state. The system should probably move in a more central
> >> place so that the command server and other system are able to use it.
> >> Extensions write will also be able to add entry to ensure that changes to
> >> extension data are properly detected.
> >>
> >> Also the current key (mtime, size) is notably weak for bookmarks and phases
> >> whose files can easily change content without effect on their size.
> >>
> >> Still, this patch seems like a valuable minimal first step.
> >>
> >> 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
> >> @@ -24,10 +24,17 @@ perms = {
> >>       'listkeys': 'pull',
> >>       'unbundle': 'push',
> >>       'pushkey': 'push',
> >>   }
> >>
> >> +## files of interrest
> >> +# used to check if the repository has changed looking at mtime and size of
> >> +# theses files.  This should probably be relocated a bit higher in core
> >> +foi = [('spath', None),
> >> +       ('spath', 'phaseroots'), # ! phase can change content at the same size
> >> +      ]
> >> +
> >>   def makebreadcrumb(url, prefix=''):
> >>       '''Return a 'URL breadcrumb' list
> >>
> >>       A 'URL breadcrumb' is a list of URL-name pairs,
> >>       corresponding to each of the path items on a URL.
> >> @@ -118,14 +125,20 @@ class hgweb(object):
> >>               return repo.filtered(viewconfig)
> >>           else:
> >>               return repo.filtered('served')
> >>
> >>       def refresh(self, request=None):
> >> -        st = get_stat(self.repo.spath)
> >> -        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))
> >> +        repostate = []
> >> +        # file of interrests mtime and size
> >> +        for meth, fname in foi:
> >> +            pathfunc = getattr(self.repo, meth)
> >
> > 'repo.spath' isn't a function.
> 
> Well, it is a callable that take a filename and absolute file name 
> value. From the user-code perspective it is indistinguishable from a 
> function.

Didn't you confuse it with repo.sjoin() ? repo.spath is a str.

> >> +            if fname is None:
> >> +                st = get_stat(pathfunc)
> >> +            else:
> >> +                st = get_stat(pathfunc, fname)
> >
> > I think the "fname is None" case is misleading because get_stat(spath) means
> > get_stat(spath, '00changelog.i'). Can we make fname a mandatory parameter?
> 
> I agree that the no-argument case is atrocious, but the final goal of 
> the series is just to get bookmark change detected in a proper way.
> I saw a deeper cleanup of this logic as a scope creep.
> I expect the whole logic to go away eventually we me move to a more 
> sensible checking mechanism.
> 
> If you think this should be fixed as part of this series, let me know, 
> and I'll do it.

Well, I don't have a strong opinion about it. I just thought it would be
more comprehensible if fname is in the table:

foi = [('spath', '00changelog.i'),
       ('spath', 'phaseroots'),


More information about the Mercurial-devel mailing list