Patchwork D1746: repoview: add visibilityexceptions as an optional argument to repo.filtered()

login
register
mail settings
Submitter phabricator
Date Dec. 22, 2017, 5:56 p.m.
Message ID <differential-rev-PHID-DREV-nd7whvshtyl46jbzb26b-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/26406/
State Superseded
Headers show

Comments

phabricator - Dec. 22, 2017, 5:56 p.m.
pulkit created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This will help us in having an API where we can pass the filtername and the
  visibilityexceptions to get a new repo object.
  
  Visibility exceptions are the revs which must be visible even they should in
  theory belong to the hidden set. They are required as there has been desire to
  have a functionality to access hidden changesets using certain commands without
  passing --hidden. After this patch we can make those changesets visibility
  exceptions so that we can access them without requiring a unfiltered repo.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1746

AFFECTED FILES
  mercurial/localrepo.py
  mercurial/repoview.py

CHANGE DETAILS




To: pulkit, #hg-reviewers
Cc: mercurial-devel
phabricator - Dec. 25, 2017, 12:49 p.m.
yuja requested changes to this revision.
yuja added inline comments.
This revision now requires changes to proceed.

INLINE COMMENTS

> repoview.py:196
> +        # revs which are exceptions and must not be hidden
> +        self._visibilityexceptions = visibilityexceptions
>  

We have to use `object.__setattr__()` because `__setattr__()` is
proxied to the unfilteredrepo.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D1746

To: pulkit, #hg-reviewers, yuja
Cc: yuja, mercurial-devel

Patch

diff --git a/mercurial/repoview.py b/mercurial/repoview.py
--- a/mercurial/repoview.py
+++ b/mercurial/repoview.py
@@ -187,11 +187,13 @@ 
     subclasses of `localrepo`. Eg: `bundlerepo` or `statichttprepo`.
     """
 
-    def __init__(self, repo, filtername):
+    def __init__(self, repo, filtername, visibilityexceptions=None):
         object.__setattr__(self, r'_unfilteredrepo', repo)
         object.__setattr__(self, r'filtername', filtername)
         object.__setattr__(self, r'_clcachekey', None)
         object.__setattr__(self, r'_clcache', None)
+        # revs which are exceptions and must not be hidden
+        self._visibilityexceptions = visibilityexceptions
 
     # not a propertycache on purpose we shall implement a proper cache later
     @property
@@ -227,11 +229,11 @@ 
         """Return an unfiltered version of a repo"""
         return self._unfilteredrepo
 
-    def filtered(self, name):
+    def filtered(self, name, visibilityexceptions=None):
         """Return a filtered version of a repository"""
-        if name == self.filtername:
+        if name == self.filtername and not visibilityexceptions:
             return self
-        return self.unfiltered().filtered(name)
+        return self.unfiltered().filtered(name, visibilityexceptions)
 
     def __repr__(self):
         return r'<%s:%s %r>' % (self.__class__.__name__,
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -675,10 +675,10 @@ 
         Intended to be overwritten by filtered repo."""
         return self
 
-    def filtered(self, name):
+    def filtered(self, name, visibilityexceptions=None):
         """Return a filtered version of a repository"""
         cls = repoview.newtype(self.unfiltered().__class__)
-        return cls(self, name)
+        return cls(self, name, visibilityexceptions)
 
     @repofilecache('bookmarks', 'bookmarks.current')
     def _bookmarks(self):