[PATCH 15 of 17 RFC] clfilter: set "unserved" filter on all repo used as server XXX

pierre-yves.david at logilab.fr pierre-yves.david at logilab.fr
Mon Sep 3 07:58:39 CDT 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1346676894 -7200
# Node ID 5b6019fa5d4acfa530feb351b0c4d2a6abc5acf4
# Parent  e7aed7d06e04a6b30e0c00bc6de16cd89377258b
clfilter: set "unserved" filter on all repo used as server XXX

This changeset installs a wide filtering on all repo used as a server. This
remove the need to use `visiblehead`/`visiblebranchmap` function and ensures that
changesets we should not serve are actually never served.

As a bonus side effect, hgweb now properly hides secret and hidden changesets.

XXX: this changeset unexpectedly break `test-hup.t`

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -5157,10 +5157,15 @@ def serve(ui, repo, **opts):
     def checkrepo():
         if repo is None:
             raise error.RepoError(_("there is no Mercurial repository here"
                               " (.hg not found)"))
 
+
+    if not opts["cmdserver"]:
+        if repo is not None:
+            repo.revsfilter.set('unserved')
+
     if opts["stdio"]:
         checkrepo()
         s = sshserver.sshserver(ui, repo)
         s.serve_forever()
 
diff --git a/mercurial/discovery.py b/mercurial/discovery.py
--- a/mercurial/discovery.py
+++ b/mercurial/discovery.py
@@ -333,14 +333,5 @@ def visibleheads(repo):
     refilter = repo.revsfilter.set('unserved')
     try:
         return repo.heads()
     finally:
         refilter()
-
-
-def visiblebranchmap(repo):
-    """return a branchmap for the visible set"""
-    refilter = repo.revsfilter.set('unserved')
-    try:
-        return repo.branchmap()
-    finally:
-        refilter()
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
@@ -33,10 +33,11 @@ class hgweb(object):
                 u = ui.ui()
             self.repo = hg.repository(u, repo)
         else:
             self.repo = repo
 
+        self.repo.revsfilter.set('unserved')
         self.repo.ui.setconfig('ui', 'report_untrusted', 'off')
         self.repo.ui.setconfig('ui', 'nontty', 'true')
         hook.redirect(True)
         self.mtime = -1
         self.size = -1
@@ -69,10 +70,11 @@ 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.revsfilter.set('unserved')
             self.maxchanges = int(self.config("web", "maxchanges", 10))
             self.stripecount = int(self.config("web", "stripes", 1))
             self.maxshortchanges = int(self.config("web", "maxshortchanges",
                                                    60))
             self.maxfiles = int(self.config("web", "maxfiles", 10))
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -30,17 +30,19 @@ class localpeer(peer.peerrepository):
     '''peer for a local repo; reflects only the most recent API'''
 
     def __init__(self, repo, caps=MODERNCAPS):
         peer.peerrepository.__init__(self)
         self._repo = repo
+        self._refilter = repo.revsfilter.set('unserved')
         self.ui = repo.ui
         self._caps = repo._restrictcapabilities(caps)
         self.requirements = repo.requirements
         self.supportedformats = repo.supportedformats
 
     def close(self):
         self._repo.close()
+        self._refilter()
 
     def _capabilities(self):
         return self._caps
 
     def local(self):
@@ -54,14 +56,14 @@ class localpeer(peer.peerrepository):
 
     def lookup(self, key):
         return self._repo.lookup(key)
 
     def branchmap(self):
-        return discovery.visiblebranchmap(self._repo)
+        return self._repo.branchmap()
 
     def heads(self):
-        return discovery.visibleheads(self._repo)
+        return self._repo.heads()
 
     def known(self, nodes):
         return self._repo.known(nodes)
 
     def getbundle(self, source, heads=None, common=None):
diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
--- a/mercurial/wireproto.py
+++ b/mercurial/wireproto.py
@@ -8,11 +8,11 @@
 import urllib, tempfile, os, sys
 from i18n import _
 from node import bin, hex
 import changegroup as changegroupmod
 import peer, error, encoding, util, store
-import discovery, phases
+import phases
 
 # abstract batching support
 
 class future(object):
     '''placeholder for a value to be set later'''
@@ -397,11 +397,12 @@ def between(repo, proto, pairs):
     for b in repo.between(pairs):
         r.append(encodelist(b) + "\n")
     return "".join(r)
 
 def branchmap(repo, proto):
-    branchmap = discovery.visiblebranchmap(repo)
+    assert repo.revsfilter._name == 'unserved'
+    branchmap = repo.branchmap()
     heads = []
     for branch, nodes in branchmap.iteritems():
         branchname = urllib.quote(encoding.fromlocal(branch))
         branchnodes = encodelist(nodes)
         heads.append('%s %s' % (branchname, branchnodes))
@@ -453,11 +454,12 @@ def getbundle(repo, proto, others):
         opts[k] = decodelist(v)
     cg = repo.getbundle('serve', **opts)
     return streamres(proto.groupchunks(cg))
 
 def heads(repo, proto):
-    h = discovery.visibleheads(repo)
+    assert repo.revsfilter._name == 'unserved'
+    h = repo.heads()
     return encodelist(h) + "\n"
 
 def hello(repo, proto):
     '''the hello command returns a set of lines describing various
     interesting things about the server, in an RFC822-like format.
@@ -556,11 +558,12 @@ def stream(repo, proto):
 
 def unbundle(repo, proto, heads):
     their_heads = decodelist(heads)
 
     def check_heads():
-        heads = discovery.visibleheads(repo)
+        assert repo.revsfilter._name == 'unserved'
+        heads = repo.heads()
         heads_hash = util.sha1(''.join(sorted(heads))).digest()
         return (their_heads == ['force'] or their_heads == heads or
                 their_heads == ['hashed', heads_hash])
 
     proto.redirect()
diff --git a/tests/test-hup.t b/tests/test-hup.t
--- a/tests/test-hup.t
+++ b/tests/test-hup.t
@@ -23,6 +23,8 @@ Do test while holding fifo open
   transaction abort!
   rollback completed
   killed!
 
   $ echo .hg/* .hg/store/*
-  .hg/00changelog.i .hg/journal.bookmarks .hg/journal.branch .hg/journal.desc .hg/journal.dirstate .hg/requires .hg/store .hg/store/00changelog.i .hg/store/00changelog.i.a .hg/store/journal.phaseroots
+  .hg/00changelog.i .hg/journal.bookmarks .hg/journal.branch .hg/journal.desc .hg/journal.dirstate .hg/requires .hg/store .hg/store/00changelog.i .hg/store/00changelog.i.a .hg/store/journal.phaseroots .hg/store/phaseroots
+
+XXX suspicious addition of empty phaseroots
diff --git a/tests/test-phases-exchange.t b/tests/test-phases-exchange.t
--- a/tests/test-phases-exchange.t
+++ b/tests/test-phases-exchange.t
@@ -850,11 +850,11 @@ appear on the remote side.
   pushing to ../mu
   searching for changes
   adding changesets
   adding manifests
   adding file changes
-  added 0 changesets with 0 changes to 2 files
+  added 0 changesets with 0 changes to 2 files (+1 heads)
   $ hgph -R ../mu
   o  10 draft A-secret - 435b5d83910c
   |
   o  9 public a-H - 967b449fbc94
   |


More information about the Mercurial-devel mailing list