@@ -24,8 +24,8 @@ def wraprepo(repo):
dirstate = super(narrowrepository, self)._makedirstate()
return narrowdirstate.wrapdirstate(self, dirstate)
- def peer(self):
- peer = super(narrowrepository, self).peer()
+ def peer(self, *args, **kwds):
+ peer = super(narrowrepository, self).peer(*args, **kwds)
peer._caps.add(wireprototypes.NARROWCAP)
peer._caps.add(wireprototypes.ELLIPSESCAP)
return peer
@@ -78,10 +78,12 @@ class ShortRepository(object):
def __repr__(self):
return '<ShortRepository: %s>' % self.scheme
- def instance(self, ui, url, create, intents=None, createopts=None):
+ def instance(self, ui, url, create, intents=None, createopts=None,
+ remotehidden=False):
url = self.resolve(url)
return hg._peerlookup(url).instance(ui, url, create, intents=intents,
- createopts=createopts)
+ createopts=createopts,
+ remotehidden=remotehidden)
def resolve(self, url):
# Should this use the util.url class, or is manual parsing better?
@@ -430,7 +430,13 @@ class bundlerepository(object):
def cancopy(self):
return False
- def peer(self):
+ def peer(self, remotehidden=False):
+ if remotehidden:
+
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for bundle repo peers not "
+ "supported yet)\n")
+ self.ui.warn(msg)
return bundlepeer(self)
def getcwd(self):
@@ -447,7 +453,8 @@ class bundlerepository(object):
self.ui.warn(msg % nodemod.hex(p2))
return super(bundlerepository, self).setparents(p1, p2)
-def instance(ui, path, create, intents=None, createopts=None):
+def instance(ui, path, create, intents=None, createopts=None,
+ remotehidden=False):
if create:
raise error.Abort(_('cannot create new bundle repository'))
# internal config: bundle.mainreporoot
@@ -4390,6 +4390,8 @@ def postincoming(ui, repo, modheads, opt
('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')),
('b', 'branch', [], _('a specific branch you would like to pull'),
_('BRANCH')),
+ ('', 'remote-hidden', False,
+ _("include changeset hidden remotely (EXPERIMENTAL)")),
] + remoteopts,
_('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'),
helpcategory=command.CATEGORY_REMOTE_REPO_MANAGEMENT,
@@ -4421,6 +4423,14 @@ def pull(ui, repo, source="default", **o
Specifying bookmark as ``.`` is equivalent to specifying the active
bookmark's name.
+ .. container:: verbose
+
+ One can use the `--remote-hidden` flag to pull changesets
+ remotely hidden. This flag is "best effort", and will only work
+ if the server supports the feature and is configured to allow
+ the user to access hidden changesets. This option is
+ experimental and backward compatibility is not garanteed.
+
Returns 0 on success, 1 if an update had unresolved files.
"""
@@ -4432,10 +4442,11 @@ def pull(ui, repo, source="default", **o
source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
ui.status(_('pulling from %s\n') % util.hidepassword(source))
- other = hg.peer(repo, opts, source)
+ other = hg.peer(repo, opts, source, remotehidden=opts['remote_hidden'])
try:
revs, checkout = hg.addbranchrevs(repo, other, branches,
- opts.get('rev'))
+ opts.get('rev'),
+ remotehidden=opts['remote_hidden'])
pullopargs = {}
@@ -68,8 +68,9 @@ def _local(path):
return isfile and bundlerepo or localrepo
-def addbranchrevs(lrepo, other, branches, revs):
- peer = other.peer() # a courtesy to callers using a localrepo for other
+def addbranchrevs(lrepo, other, branches, revs, remotehidden=False):
+ # a courtesy to callers using a localrepo for other
+ peer = other.peer(remotehidden=remotehidden)
hashbranch, branches = branches
if not hashbranch and not branches:
x = revs or None
@@ -165,10 +166,11 @@ def openpath(ui, path, sendaccept=True):
wirepeersetupfuncs = []
def _peerorrepo(ui, path, create=False, presetupfuncs=None,
- intents=None, createopts=None):
+ intents=None, createopts=None, remotehidden=False):
"""return a repository object for the specified path"""
obj = _peerlookup(path).instance(ui, path, create, intents=intents,
- createopts=createopts)
+ createopts=createopts,
+ remotehidden=remotehidden)
ui = getattr(obj, "ui", ui)
for f in presetupfuncs or []:
f(ui, obj)
@@ -199,11 +201,13 @@ def repository(ui, path='', create=False
(path or peer.url()))
return repo.filtered('visible')
-def peer(uiorrepo, opts, path, create=False, intents=None, createopts=None):
+def peer(uiorrepo, opts, path, create=False, intents=None, createopts=None,
+ remotehidden=False):
'''return a repository peer for the specified path'''
rui = remoteui(uiorrepo, opts)
- return _peerorrepo(rui, path, create, intents=intents,
- createopts=createopts).peer()
+ peerorrepo = _peerorrepo(rui, path, create, intents=intents,
+ createopts=createopts, remotehidden=remotehidden)
+ return peerorrepo.peer(remotehidden=remotehidden)
def defaultdest(source):
'''return default destination of clone if none is given
@@ -398,7 +398,12 @@ class httppeer(wireprotov1peer.wirepeer)
def local(self):
return None
- def peer(self):
+ def peer(self, remotehidden=False):
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for http peers not "
+ "supported yet)\n")
+ self.ui.warn(msg)
return self
def canpush(self):
@@ -774,7 +779,12 @@ class httpv2peer(object):
def local(self):
return None
- def peer(self):
+ def peer(self, remotehidden=False):
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for http peers not "
+ "supported yet)\n")
+ self.ui.warn(msg)
return self
def canpush(self):
@@ -938,7 +948,8 @@ def performhandshake(ui, url, opener, re
return respurl, info
-def makepeer(ui, path, opener=None, requestbuilder=urlreq.request):
+def makepeer(ui, path, opener=None, requestbuilder=urlreq.request,
+ remotehidden=False):
"""Construct an appropriate HTTP peer instance.
``opener`` is an ``url.opener`` that should be used to establish
@@ -947,6 +958,11 @@ def makepeer(ui, path, opener=None, requ
``requestbuilder`` is the type used for constructing HTTP requests.
It exists as an argument so extensions can override the default.
"""
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for http peers not "
+ "supported yet)\n")
+ ui.warn(msg)
u = util.url(path)
if u.query or u.fragment:
raise error.Abort(_('unsupported URL component: "%s"') %
@@ -986,7 +1002,8 @@ def makepeer(ui, path, opener=None, requ
return httppeer(ui, path, respurl, opener, requestbuilder,
info['v1capabilities'])
-def instance(ui, path, create, intents=None, createopts=None):
+def instance(ui, path, create, intents=None, createopts=None,
+ remotehidden=False):
if create:
raise error.Abort(_('cannot create new http repository'))
try:
@@ -994,7 +1011,7 @@ def instance(ui, path, create, intents=N
raise error.Abort(_('Python support for SSL and HTTPS '
'is not installed'))
- inst = makepeer(ui, path)
+ inst = makepeer(ui, path, remotehidden=remotehidden)
return inst
except error.RepoError as httpexception:
@@ -226,7 +226,12 @@ class localpeer(repository.peer):
def local(self):
return self._repo
- def peer(self):
+ def peer(self, remotehidden=False):
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for local peers not "
+ "supported yet)\n")
+ self.ui.warn(msg)
return self
def canpush(self):
@@ -338,7 +343,7 @@ class locallegacypeer(localpeer):
'''peer extension which implements legacy methods too; used for tests with
restricted capabilities'''
- def __init__(self, repo):
+ def __init__(self, repo, remotehidden=False):
super(locallegacypeer, self).__init__(repo, caps=legacycaps)
# Begin of baselegacywirecommands interface.
@@ -1169,7 +1174,12 @@ class localrepository(object):
parts.pop()
return False
- def peer(self):
+ def peer(self, remotehidden=False):
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for local peers not "
+ "supported yet)\n")
+ self.ui.warn(msg)
return localpeer(self) # not cached to avoid reference cycle
def unfiltered(self):
@@ -2877,7 +2887,8 @@ def undoname(fn):
assert name.startswith('journal')
return os.path.join(base, name.replace('journal', 'undo', 1))
-def instance(ui, path, create, intents=None, createopts=None):
+def instance(ui, path, create, intents=None, createopts=None,
+ remotehidden=False):
localpath = util.urllocalpath(path)
if create:
createrepository(ui, localpath, createopts=createopts)
@@ -407,7 +407,12 @@ class sshv1peer(wireprotov1peer.wirepeer
def local(self):
return None
- def peer(self):
+ def peer(self, remotehidden=False):
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for ssh peers not supported "
+ "yet)\n")
+ self.ui.warn(msg)
return self
def canpush(self):
@@ -566,7 +571,8 @@ class sshv2peer(sshv1peer):
# And handshake is performed before the peer is instantiated. So
# we need no custom code.
-def makepeer(ui, path, proc, stdin, stdout, stderr, autoreadstderr=True):
+def makepeer(ui, path, proc, stdin, stdout, stderr, autoreadstderr=True,
+ remotehidden=False):
"""Make a peer instance from existing pipes.
``path`` and ``proc`` are stored on the eventual peer instance and may
@@ -580,6 +586,11 @@ def makepeer(ui, path, proc, stdin, stdo
servers and clients via non-standard means, which can be useful for
testing.
"""
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for ssh peers not supported "
+ "yet)\n")
+ ui.warn(msg)
try:
protoname, caps = _performhandshake(ui, stdin, stdout, stderr)
except Exception:
@@ -597,7 +608,8 @@ def makepeer(ui, path, proc, stdin, stdo
raise error.RepoError(_('unknown version of SSH protocol: %s') %
protoname)
-def instance(ui, path, create, intents=None, createopts=None):
+def instance(ui, path, create, intents=None, createopts=None,
+ remotehidden=False):
"""Create an SSH peer.
The returned object conforms to the ``wireprotov1peer.wirepeer`` interface.
@@ -639,7 +651,8 @@ def instance(ui, path, create, intents=N
proc, stdin, stdout, stderr = _makeconnection(ui, sshcmd, args, remotecmd,
remotepath, sshenv)
- peer = makepeer(ui, path, proc, stdin, stdout, stderr)
+ peer = makepeer(ui, path, proc, stdin, stdout, stderr,
+ remotehidden=remotehidden)
# Finally, if supported by the server, notify it about our own
# capabilities.
@@ -210,7 +210,12 @@ class statichttprepository(localrepo.loc
def local(self):
return False
- def peer(self):
+ def peer(self, remotehidden=False):
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for ssh peers not supported "
+ "yet)\n")
+ self.ui.warn(msg)
return statichttppeer(self)
def wlock(self, wait=True):
@@ -223,7 +228,13 @@ class statichttprepository(localrepo.loc
def _writecaches(self):
pass # statichttprepository are read only
-def instance(ui, path, create, intents=None, createopts=None):
+def instance(ui, path, create, intents=None, createopts=None,
+ remotehidden=False):
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for ssh peers not supported "
+ "yet)\n")
+ ui.warn(msg)
if create:
raise error.Abort(_('cannot create new static-http repository'))
return statichttprepository(ui, path[7:])
@@ -233,13 +233,19 @@ class unionrepository(object):
def cancopy(self):
return False
- def peer(self):
+ def peer(self, remotehidden=False):
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for union repo peers not "
+ "supported yet)\n")
+ self.ui.warn(msg)
return unionpeer(self)
def getcwd(self):
return encoding.getcwd() # always outside the repo
-def instance(ui, path, create, intents=None, createopts=None):
+def instance(ui, path, create, intents=None, createopts=None,
+ remotehidden=False):
if create:
raise error.Abort(_('cannot create new union repository'))
parentpath = ui.config("bundle", "mainreporoot")
@@ -267,10 +273,16 @@ def instance(ui, path, create, intents=N
else:
repopath, repopath2 = parentpath, path
- return makeunionrepository(ui, repopath, repopath2)
+ return makeunionrepository(ui, repopath, repopath2,
+ remotehidden=remotehidden)
-def makeunionrepository(ui, repopath1, repopath2):
+def makeunionrepository(ui, repopath1, repopath2, remotehidden=False):
"""Make a union repository object from 2 local repo paths."""
+ if remotehidden:
+ msg = _("ignoring `--remote-hidden` request\n"
+ "(access to hidden changeset for union repo peers not "
+ "supported yet)\n")
+ ui.warn(msg)
repo1 = localrepo.instance(ui, repopath1, create=False)
repo2 = localrepo.instance(ui, repopath2, create=False)
@@ -14,10 +14,10 @@ def wrapcapable(orig, self, name, *args,
if name in b'$CAP'.split(b' '):
return False
return orig(self, name, *args, **kwargs)
-def wrappeer(orig, self):
+def wrappeer(orig, self, *args, **kwargs):
# Since we're disabling some newer features, we need to make sure local
# repos add in the legacy features again.
- return localrepo.locallegacypeer(self)
+ return localrepo.locallegacypeer(self, *args, **kwargs)
EOF
echo '[extensions]' >> $HGRCPATH
@@ -330,7 +330,7 @@ Show all commands + options
parents: rev, style, template
paths: template
phase: public, draft, secret, force, rev
- pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure
+ pull: update, force, rev, bookmark, branch, remote-hidden, ssh, remotecmd, insecure
push: force, rev, bookmark, branch, new-branch, pushvars, publish, ssh, remotecmd, insecure
recover:
remove: after, force, subrepos, include, exclude, dry-run