[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