[PATCH STABLE] hgweb: add a `web.view` to control filtering

Pierre-Yves David pierre-yves.david at ens-lyon.org
Thu Jan 31 13:48:25 CST 2013


On 31 janv. 2013, at 20:10, Kevin Bullock wrote:

> On Jan 31, 2013, at 12:57 PM, pierre-yves.david at logilab.fr wrote:
> 
>> # HG changeset patch
>> # User Pierre-Yves David <pierre-yves.david at logilab.fr>
>> # Date 1359658615 -3600
>> # Branch stable
>> # Node ID 4a841ef7813f99bc7f091110e2f0dc8db82dfb86
>> # Parent  2a1fac3650a5b4d650198604c82ab59969500374
>> hgweb: add a `web.view` to control filtering
>> 
>> This options add a new `web.view` to control filter level of hgweb.
>> 
>> This option have two purposes:
>> 
>> 1) Allow fall back to unfiltered version in case a yet undetected by critical
>>  bug is found in filtering after 2.5 release
>> 
>> 2) People use hgweb as a local repoviewer. When they have secret changesets,
>>  they wants to use "visible" filter not "served"
> 
> As far as I can glean, the argument for this patch going in before tomorrow is:
> 
> 2.5 introduces filtering: hgweb now hides secret changesets. This causes a known regression for one use case, and maybe possibly some other as-yet-unknown regressions. So we should provide an option to turn it off.
> 
> I don't buy this argument as regards (1) (unknown regressions); I might buy it as regards (2) (known regression).
> 
>> diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt
>> --- a/mercurial/help/config.txt
>> +++ b/mercurial/help/config.txt
>> @@ -1457,5 +1457,11 @@ The full set of options is:
>> ``style``
>>    Which template map style to use.
>> 
>> ``templates``
>>    Where to find the HTML templates. Default is install path.
>> +
>> +``view``
>> +    Controls Changesets filter to hgweb. Possible values are ``served``,
>> +    ``visible`` and ``all``. Default is ``served``. The ``served`` filter only
>> +    shows changesets that can be pulled from the hgweb instance. The``visible``
>> +    filter includes secret changesets but still excludes "hidden" one.
>> 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
>> @@ -5,11 +5,11 @@
>> #
>> # This software may be used and distributed according to the terms of the
>> # GNU General Public License version 2 or any later version.
>> 
>> import os
>> -from mercurial import ui, hg, hook, error, encoding, templater, util
>> +from mercurial import ui, hg, hook, error, encoding, templater, util, repoview
>> from common import get_stat, ErrorResponse, permhooks, caching
>> from common import HTTP_OK, HTTP_NOT_MODIFIED, HTTP_BAD_REQUEST
>> from common import HTTP_NOT_FOUND, HTTP_SERVER_ERROR
>> from request import wsgirequest
>> import webcommands, protocol, webutil
>> @@ -57,11 +57,18 @@ class hgweb(object):
>>                u = ui.ui()
>>            self.repo = hg.repository(u, repo)
>>        else:
>>            self.repo = repo
>> 
>> -        self.repo =  self.repo.filtered('served')
>> +        viewconfig = self.config('web', 'view', 'served')
>> +        if viewconfig == 'all':
>> +            self.repo = self.repo.unfiltered()
>> +        elif viewconfig in repoview.filtertable:
>> +            self.repo = self.repo.filtered(viewconfig)
>> +        else:
>> +            self.repo = self.repo.filtered('served')
>> +
>>        self.repo.ui.setconfig('ui', 'report_untrusted', 'off')
>>        self.repo.ui.setconfig('ui', 'nontty', 'true')
>>        hook.redirect(True)
>>        self.mtime = -1
>>        self.size = -1
>> @@ -94,11 +101,17 @@ class hgweb(object):
>>        # rollbacks made less than a second ago
>>        if st.st_mtime != self.mtime or st.st_size != self.size:
>>            self.mtime = st.st_mtime
>>            self.size = st.st_size
>>            self.repo = hg.repository(self.repo.ui, self.repo.root)
>> -            self.repo =  self.repo.filtered('served')
>> +            viewconfig = self.config('web', 'view', 'served')
>> +            if viewconfig == 'all':
>> +                self.repo = self.repo.unfiltered()
>> +            elif viewconfig in repoview.filtertable:
>> +                self.repo = self.repo.filtered(viewconfig)
>> +            else:
>> +                self.repo = self.repo.filtered('served')
> 
> 1. Why do we have to do this twice?

Because there is two place where repo are created

> 2. If we have to do it twice, why on earth wouldn't you wrap it in a function?

Simpler patch for stable. I plan a follow up changeset for default that includes the (conditional) hg.repository call and the filtering switch.

> Before bringing up a code-churn argument, observe that you would be adding less lines of code (and half as much opportunity for a logic error!) if you added a new function.

The diff is bigger but simpler.

-- 
Pierre-Yves David


More information about the Mercurial-devel mailing list