##// END OF EJS Templates
clfilter: ensure that filecache on localrepo is unfiltered...
clfilter: ensure that filecache on localrepo is unfiltered All filecache usage on repo is for logic that should be unfiltered. The caches should be common to all filtered instances, and computation must be done unfiltered. A dedicated storecache subclass is created for this purpose.

File last commit:

r18014:a39fe76c default
r18014:a39fe76c default
Show More
bundlerepo.py
389 lines | 13.5 KiB | text/x-python | PythonLexer
Martin Geisler
put license and copyright info into comment blocks
r8226 # bundlerepo.py - repository class for viewing uncompressed bundles
#
# Copyright 2006, 2007 Benoit Boissinot <bboissin@gmail.com>
#
# This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Martin Geisler
turn some comments back into module docstrings
r8227 """Repository class for viewing uncompressed bundles.
This provides a read-only repository interface to bundles as if they
were part of the actual repository.
"""
Peter Arrenbrecht
cleanup: drop unused imports
r7873 from node import nullid
Matt Mackall
Simplify i18n imports
r3891 from i18n import _
Matt Mackall
bundlerepo: drop struct
r14158 import os, tempfile, shutil
Matt Mackall
bundlerepo: try to find containing repo on creation (issue1812)
r16042 import changegroup, util, mdiff, discovery, cmdutil
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 import localrepo, changelog, manifest, filelog, revlog, error
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 class bundlerevlog(revlog.revlog):
Benoit Boissinot
bundlerepo: port to new bundle API
r14142 def __init__(self, opener, indexfile, bundle, linkmapper):
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 # How it works:
# to retrieve a revision, we need to know the offset of
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 # the revision in the bundle (an unbundle object).
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 #
# We store this offset in the index (start), to differentiate a
# rev in the bundle and from a rev in the revlog, we check
# len(index[r]). If the tuple is bigger than 7, it is a bundle
# (it is bigger since we store the node to which the delta is)
#
Matt Mackall
revlog: don't pass datafile as an argument
r4257 revlog.revlog.__init__(self, opener, indexfile)
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 self.bundle = bundle
mason@suse.com
Fix bundle repos to use an index tuple consistent with revlogng...
r2074 self.basemap = {}
Matt Mackall
add __len__ and __iter__ methods to repo and revlog
r6750 n = len(self)
Benoit Boissinot
bundlerepo: port to new bundle API
r14142 chain = None
Tomasz Kleczek
bundle: add revset expression to show bundle contents (issue3487)...
r17913 self.bundlenodes = []
Martin Geisler
check-code: flag 0/1 used as constant Boolean expression
r14494 while True:
Benoit Boissinot
unbundler: separate delta and header parsing...
r14144 chunkdata = bundle.deltachunk(chain)
Benoit Boissinot
bundlerepo: port to new bundle API
r14142 if not chunkdata:
break
node = chunkdata['node']
p1 = chunkdata['p1']
p2 = chunkdata['p2']
cs = chunkdata['cs']
deltabase = chunkdata['deltabase']
delta = chunkdata['delta']
size = len(delta)
start = bundle.tell() - size
link = linkmapper(cs)
Tomasz Kleczek
bundle: add revset expression to show bundle contents (issue3487)...
r17913 self.bundlenodes.append(node)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 if node in self.nodemap:
Benoit Boissinot
bundlerepo: port to new bundle API
r14142 # this can happen if two branches make the same change
chain = node
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 continue
Benoit Boissinot
bundlerepo: port to new bundle API
r14142
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 for p in (p1, p2):
Brodie Rao
cleanup: "not x in y" -> "x not in y"
r16686 if p not in self.nodemap:
Sune Foldager
bundlerepo: fix small bug in exception raising
r9650 raise error.LookupError(p, self.indexfile,
Matt Mackall
errors: move revlog errors...
r7633 _("unknown parent"))
Benoit Boissinot
fix bundlerepo broken by 4205f626dc05...
r5167 # start, size, full unc. size, base (unused), link, p1, p2, node
e = (revlog.offset_type(start, 0), size, -1, -1, link,
Matt Mackall
revlog: add a magic null revision to our index...
r4979 self.rev(p1), self.rev(p2), node)
Benoit Boissinot
bundlerepo: port to new bundle API
r14142 self.basemap[n] = deltabase
Matt Mackall
revlog: add a magic null revision to our index...
r4979 self.index.insert(-1, e)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 self.nodemap[node] = n
Benoit Boissinot
bundlerepo: port to new bundle API
r14142 chain = node
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 n += 1
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 def inbundle(self, rev):
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 """is rev from the bundle"""
if rev < 0:
return False
mason@suse.com
Fix bundle repos to use an index tuple consistent with revlogng...
r2074 return rev in self.basemap
Matt Mackall
many, many trivial check-code fixups
r10282 def bundlebase(self, rev):
return self.basemap[rev]
Benoit Boissinot
bundlerepo: keep the bundlerevlog interface in sync with revlog
r9676 def _chunk(self, rev):
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 # Warning: in case of bundle, the diff is against bundlebase,
# not against rev - 1
# XXX: could use some caching
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 if not self.inbundle(rev):
Benoit Boissinot
bundlerepo: keep the bundlerevlog interface in sync with revlog
r9676 return revlog.revlog._chunk(self, rev)
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 self.bundle.seek(self.start(rev))
return self.bundle.read(self.length(rev))
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
def revdiff(self, rev1, rev2):
"""return or calculate a delta between two revisions"""
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 if self.inbundle(rev1) and self.inbundle(rev2):
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 # hot path for bundle
revb = self.rev(self.bundlebase(rev2))
if revb == rev1:
Benoit Boissinot
bundlerepo: keep the bundlerevlog interface in sync with revlog
r9676 return self._chunk(rev2)
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 elif not self.inbundle(rev1) and not self.inbundle(rev2):
Benoit Boissinot
bundlerepo: it was meant to be revdiff() instead of chunk()
r4028 return revlog.revlog.revdiff(self, rev1, rev2)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Matt Mackall
revlog: eliminate diff and patches functions...
r4989 return mdiff.textdiff(self.revision(self.node(rev1)),
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 self.revision(self.node(rev2)))
Matt Mackall
revlog: allow retrieving contents by revision number
r16375 def revision(self, nodeorrev):
Patrick Mezard
revlog: fix partial revision() docstring (from d7d64b89a65c)
r16435 """return an uncompressed revision of a given node or revision
number.
"""
Matt Mackall
revlog: allow retrieving contents by revision number
r16375 if isinstance(nodeorrev, int):
rev = nodeorrev
node = self.node(rev)
else:
node = nodeorrev
rev = self.rev(node)
Matt Mackall
many, many trivial check-code fixups
r10282 if node == nullid:
return ""
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
text = None
chain = []
iter_node = node
# reconstruct the revision if it is from a changegroup
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 while self.inbundle(rev):
Matt Mackall
revlog: mark cache private
r4984 if self._cache and self._cache[0] == iter_node:
text = self._cache[2]
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 break
chain.append(rev)
iter_node = self.bundlebase(rev)
rev = self.rev(iter_node)
if text is None:
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 text = revlog.revlog.revision(self, iter_node)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
while chain:
Benoit Boissinot
bundlerepo: keep the bundlerevlog interface in sync with revlog
r9676 delta = self._chunk(chain.pop())
Matt Mackall
revlog: eliminate diff and patches functions...
r4989 text = mdiff.patches(text, [delta])
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
p1, p2 = self.parents(node)
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 if node != revlog.hash(text, p1, p2):
Matt Mackall
errors: move revlog errors...
r7633 raise error.RevlogError(_("integrity check failed on %s:%d")
Benoit Boissinot
indent: fix alignment
r2257 % (self.datafile, self.rev(node)))
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Matt Mackall
revlog: mark cache private
r4984 self._cache = (node, self.rev(node), text)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 return text
def addrevision(self, text, transaction, link, p1=None, p2=None, d=None):
raise NotImplementedError
Peter Arrenbrecht
drop superfluous param from revlog.addgroup()
r6647 def addgroup(self, revs, linkmapper, transaction):
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 raise NotImplementedError
def strip(self, rev, minlink):
raise NotImplementedError
def checksize(self):
raise NotImplementedError
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 class bundlechangelog(bundlerevlog, changelog.changelog):
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 def __init__(self, opener, bundle):
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 changelog.changelog.__init__(self, opener)
Benoit Boissinot
bundlerepo: port to new bundle API
r14142 linkmapper = lambda x: x
bundlerevlog.__init__(self, opener, self.indexfile, bundle,
linkmapper)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 class bundlemanifest(bundlerevlog, manifest.manifest):
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 def __init__(self, opener, bundle, linkmapper):
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 manifest.manifest.__init__(self, opener)
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
Matt Mackall
revlog: don't pass datafile as an argument
r4257 linkmapper)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 class bundlefilelog(bundlerevlog, filelog.filelog):
Sune Foldager
filelog: add file function to open other filelogs
r14287 def __init__(self, opener, path, bundle, linkmapper, repo):
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 filelog.filelog.__init__(self, opener, path)
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 bundlerevlog.__init__(self, opener, self.indexfile, bundle,
Matt Mackall
revlog: don't pass datafile as an argument
r4257 linkmapper)
Sune Foldager
filelog: add file function to open other filelogs
r14287 self._repo = repo
def _file(self, f):
self._repo.file(f)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Sune Foldager
peer: introduce canpush and improve error message
r17193 class bundlepeer(localrepo.localpeer):
def canpush(self):
return False
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 class bundlerepository(localrepo.localrepository):
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 def __init__(self, ui, path, bundlename):
John Mulligan
Add ability to directly clone from all-history bundles...
r6314 self._tempparent = None
try:
localrepo.localrepository.__init__(self, ui, path)
Matt Mackall
error: move repo errors...
r7637 except error.RepoError:
John Mulligan
Add ability to directly clone from all-history bundles...
r6314 self._tempparent = tempfile.mkdtemp()
Martin Geisler
coding style: use a space after comma...
r9198 localrepo.instance(ui, self._tempparent, 1)
John Mulligan
Add ability to directly clone from all-history bundles...
r6314 localrepo.localrepository.__init__(self, ui, self._tempparent)
Pierre-Yves David
bundlerepo: bundle repos should be non-publishing (issue3266)...
r16195 self.ui.setconfig('phases', 'publish', False)
Vadim Gelfer
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks...
r2673
Peter Arrenbrecht
bundlerepo: fix inconsistency of parsed and internal name (issue #821)
r6129 if path:
Alexander Solovyov
expand paths to local repository or bundle in appropriate classes...
r11154 self._url = 'bundle:' + util.expandpath(path) + '+' + bundlename
Peter Arrenbrecht
bundlerepo: fix inconsistency of parsed and internal name (issue #821)
r6129 else:
self._url = 'bundle:' + bundlename
Vadim Gelfer
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks...
r2673
Benoit Boissinot
add support for compressed bundle repositories...
r2273 self.tempfile = None
Adrian Buehlmann
bundlerepo: use less intrusive util.posixfile to open bundle
r13274 f = util.posixfile(bundlename, "rb")
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 self.bundle = changegroup.readbundle(f, bundlename)
if self.bundle.compressed():
Benoit Boissinot
add support for compressed bundle repositories...
r2273 fdtemp, temp = tempfile.mkstemp(prefix="hg-bundle-",
suffix=".hg10un", dir=self.path)
self.tempfile = temp
fptemp = os.fdopen(fdtemp, 'wb')
try:
fptemp.write("HG10UN")
Martin Geisler
check-code: flag 0/1 used as constant Boolean expression
r14494 while True:
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 chunk = self.bundle.read(2**18)
Matt Mackall
bundlerepo: remove duplication of bundle decompressors
r12044 if not chunk:
break
Benoit Boissinot
add support for compressed bundle repositories...
r2273 fptemp.write(chunk)
finally:
fptemp.close()
Adrian Buehlmann
bundlerepo: use less intrusive util.posixfile to open bundle
r13274 f = util.posixfile(self.tempfile, "rb")
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 self.bundle = changegroup.readbundle(f, bundlename)
Matt Mackall
bundlerepo: remove duplication of bundle decompressors
r12044
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 # dict with the mapping 'filename' -> position in the bundle
self.bundlefilespos = {}
Brendan Cully
Make bundlerepo lazier...
r5262
Pierre-Yves David
clfilter: ensure that filecache on localrepo is unfiltered...
r18014 @localrepo.unfilteredpropertycache
Matt Mackall
localrepo: use propertycache
r8260 def changelog(self):
Benoit Boissinot
unbundler: separate delta and header parsing...
r14144 # consume the header if it exists
self.bundle.changelogheader()
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 c = bundlechangelog(self.sopener, self.bundle)
self.manstart = self.bundle.tell()
Matt Mackall
localrepo: use propertycache
r8260 return c
Pierre-Yves David
clfilter: ensure that filecache on localrepo is unfiltered...
r18014 @localrepo.unfilteredpropertycache
Matt Mackall
localrepo: use propertycache
r8260 def manifest(self):
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 self.bundle.seek(self.manstart)
Benoit Boissinot
unbundler: separate delta and header parsing...
r14144 # consume the header if it exists
self.bundle.manifestheader()
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 m = bundlemanifest(self.sopener, self.bundle, self.changelog.rev)
self.filestart = self.bundle.tell()
Matt Mackall
localrepo: use propertycache
r8260 return m
Pierre-Yves David
clfilter: ensure that filecache on localrepo is unfiltered...
r18014 @localrepo.unfilteredpropertycache
Matt Mackall
localrepo: use propertycache
r8260 def manstart(self):
self.changelog
return self.manstart
Pierre-Yves David
clfilter: ensure that filecache on localrepo is unfiltered...
r18014 @localrepo.unfilteredpropertycache
Matt Mackall
localrepo: use propertycache
r8260 def filestart(self):
self.manifest
return self.filestart
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Vadim Gelfer
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks...
r2673 def url(self):
return self._url
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 def file(self, f):
Brendan Cully
Make bundlerepo lazier...
r5262 if not self.bundlefilespos:
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 self.bundle.seek(self.filestart)
Martin Geisler
check-code: flag 0/1 used as constant Boolean expression
r14494 while True:
Benoit Boissinot
unbundler: separate delta and header parsing...
r14144 chunkdata = self.bundle.filelogheader()
if not chunkdata:
Brendan Cully
Make bundlerepo lazier...
r5262 break
Benoit Boissinot
unbundler: separate delta and header parsing...
r14144 fname = chunkdata['filename']
self.bundlefilespos[fname] = self.bundle.tell()
Martin Geisler
check-code: flag 0/1 used as constant Boolean expression
r14494 while True:
Benoit Boissinot
unbundler: separate delta and header parsing...
r14144 c = self.bundle.deltachunk(None)
Matt Mackall
bundle: get rid of chunkiter
r12335 if not c:
break
Brendan Cully
Make bundlerepo lazier...
r5262
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 if f[0] == '/':
f = f[1:]
if f in self.bundlefilespos:
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 self.bundle.seek(self.bundlefilespos[f])
return bundlefilelog(self.sopener, f, self.bundle,
Sune Foldager
filelog: add file function to open other filelogs
r14287 self.changelog.rev, self)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 else:
Benoit Boissinot
introduce localrepo.spath for the store path, sopener fixes
r3791 return filelog.filelog(self.sopener, f)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Matt Mackall
bundlerepo: restore close() method
r12347 def close(self):
"""Close assigned bundle file immediately."""
self.bundle.close()
Klaus Koch
bundlerepository: get rid of temporary bundle files (issue2478)...
r12962 if self.tempfile is not None:
os.unlink(self.tempfile)
John Mulligan
Add ability to directly clone from all-history bundles...
r6314 if self._tempparent:
shutil.rmtree(self._tempparent, True)
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740
Matt Mackall
clone: use cancopy
r6315 def cancopy(self):
return False
Sune Foldager
peer: introduce canpush and improve error message
r17193 def peer(self):
return bundlepeer(self)
Dirkjan Ochtman
bundlerepo doesn't really have a dirstate, throw AttributeError if requested
r7435 def getcwd(self):
return os.getcwd() # always outside the repo
Sune Foldager
bundlerepo: don't write branch cache to disk...
r15597 def _writebranchcache(self, branches, tip, tiprev):
# don't overwrite the disk cache with bundle-augmented data
pass
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 def instance(ui, path, create):
if create:
raise util.Abort(_('cannot create new bundle repository'))
Peter Arrenbrecht
Fix income/pull with bundle and -R (issue 820)....
r5664 parentpath = ui.config("bundle", "mainreporoot", "")
Matt Mackall
bundlerepo: try to find containing repo on creation (issue1812)
r16042 if not parentpath:
# try to find the correct path to the working directory repo
parentpath = cmdutil.findrepo(os.getcwd())
if parentpath is None:
parentpath = ''
Peter Arrenbrecht
Fix income/pull with bundle and -R (issue 820)....
r5664 if parentpath:
# Try to make the full path relative so we get a nice, short URL.
# In particular, we don't want temp dir names in test outputs.
cwd = os.getcwd()
if parentpath == cwd:
parentpath = ''
else:
cwd = os.path.join(cwd,'')
if parentpath.startswith(cwd):
parentpath = parentpath[len(cwd):]
Brodie Rao
url: move URL parsing functions into util to improve startup time...
r14076 u = util.url(path)
Brodie Rao
url: refactor util.drop_scheme() and hg.localpath() into url.localpath()...
r13826 path = u.localpath()
if u.scheme == 'bundle':
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 s = path.split("+", 1)
if len(s) == 1:
Peter Arrenbrecht
Fix income/pull with bundle and -R (issue 820)....
r5664 repopath, bundlename = parentpath, s[0]
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 else:
repopath, bundlename = s
else:
Peter Arrenbrecht
Fix income/pull with bundle and -R (issue 820)....
r5664 repopath, bundlename = parentpath, path
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 return bundlerepository(ui, repopath, bundlename)
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 def getremotechanges(ui, repo, other, onlyheads=None, bundlename=None,
Peter Arrenbrecht
discovery: drop findoutgoing and simplify findcommonincoming's api...
r14073 force=False):
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 '''obtains a bundle of changes incoming from other
"onlyheads" restricts the returned changes to those reachable from the
specified heads.
"bundlename", if given, stores the bundle to this file path permanently;
Peter Arrenbrecht
bundlerepo: fix closing and docstring of getremotechanges...
r14190 otherwise it's stored to a temp file and gets deleted again when you call
the returned "cleanupfn".
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 "force" indicates whether to proceed on unrelated repos.
Returns a tuple (local, csets, cleanupfn):
Brodie Rao
cleanup: eradicate long lines
r16683 "local" is a local repo from which to obtain the actual incoming
changesets; it is a bundlerepo for the obtained bundle when the
original "other" is remote.
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 "csets" lists the incoming changeset node ids.
Brodie Rao
cleanup: eradicate long lines
r16683 "cleanupfn" must be called without arguments when you're done processing
the changes; it closes both the original "other" and the one returned
here.
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 '''
Brodie Rao
cleanup: eradicate long lines
r16683 tmp = discovery.findcommonincoming(repo, other, heads=onlyheads,
force=force)
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 common, incoming, rheads = tmp
if not incoming:
try:
Sune Foldager
bundlerepo: add argument check before unlink...
r15091 if bundlename:
os.unlink(bundlename)
Idan Kamara
eliminate various naked except clauses
r14004 except OSError:
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 pass
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 return other, [], other.close
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734
bundle = None
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 bundlerepo = None
Sune Foldager
peer: introduce peer methods to prepare for peer classes...
r17191 localrepo = other.local()
if bundlename or not localrepo:
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 # create a bundle (uncompressed if other repo is not local)
Peter Arrenbrecht
discovery: drop findoutgoing and simplify findcommonincoming's api...
r14073 if other.capable('getbundle'):
Peter Arrenbrecht
bundlerepo: make getremotechanges support filtering of incoming...
r14412 cg = other.getbundle('incoming', common=common, heads=rheads)
elif onlyheads is None and not other.capable('changegroupsubset'):
# compat with older servers when pulling all remote heads
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 cg = other.changegroup(incoming, "incoming")
Peter Arrenbrecht
bundlerepo: make getremotechanges support filtering of incoming...
r14412 rheads = None
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 else:
Peter Arrenbrecht
bundlerepo: make getremotechanges support filtering of incoming...
r14412 cg = other.changegroupsubset(incoming, rheads, 'incoming')
Sune Foldager
peer: introduce peer methods to prepare for peer classes...
r17191 bundletype = localrepo and "HG10BZ" or "HG10UN"
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 fname = bundle = changegroup.writebundle(cg, bundlename, bundletype)
# keep written bundle?
if bundlename:
bundle = None
Sune Foldager
peer: introduce peer methods to prepare for peer classes...
r17191 if not localrepo:
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 # use the created uncompressed bundlerepo
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 localrepo = bundlerepo = bundlerepository(ui, repo.root, fname)
# this repo contains local and other now, so filter out local again
common = repo.heads()
Peter Arrenbrecht
bundlerepo: make getremotechanges support filtering of incoming...
r14412 csets = localrepo.changelog.findmissing(common, rheads)
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 def cleanup():
if bundlerepo:
bundlerepo.close()
if bundle:
os.unlink(bundle)
Peter Arrenbrecht
bundlerepo: fix closing and docstring of getremotechanges...
r14190 other.close()
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161
return (localrepo, csets, cleanup)