##// END OF EJS Templates
revlog: linearize created changegroups in generaldelta revlogs...
revlog: linearize created changegroups in generaldelta revlogs This greatly improves the speed of the bundling process, and often reduces the bundle size considerably. (Although if the repository is already ordered, this has little effect on both time and bundle size.) For non-generaldelta clients, the reduced bundle size translates to a reduced repository size, similar to shrinking the revlogs (which uses the exact same algorithm). For generaldelta clients the difference is minor. When the new bundle format comes, reordering will not be necessary since we can then store the deltaparent relationsships directly. The eventual default behavior for clients and servers is presented in the table below, where "new" implies support for GD as well as the new bundle format: old client new client old server old bundle, no reorder old bundle, no reorder new server, non-GD old bundle, no reorder[1] old bundle, no reorder[2] new server, GD old bundle, reorder[3] new bundle, no reorder[4] [1] reordering is expensive on the server in this case, skip it [2] client can choose to do its own redelta here [3] reordering is needed because otherwise the pull does a lot of extra work on the server [4] reordering isn't needed because client can get deltabase in bundle format Currently, the default is to reorder on GD-servers, and not otherwise. A new setting, bundle.reorder, has been added to override the default reordering behavior. It can be set to either 'auto' (the default), or any true or false value as a standard boolean setting, to either force the reordering on or off regardless of generaldelta. Some timing data from a relatively branch test repository follows. All bundling is done with --all --type none options. Non-generaldelta, non-shrunk repo: ----------------------------------- Size: 276M Without reorder (default): Bundle time: 14.4 seconds Bundle size: 939M With reorder: Bundle time: 1 minute, 29.3 seconds Bundle size: 381M Generaldelta, non-shrunk repo: ----------------------------------- Size: 87M Without reorder: Bundle time: 2 minutes, 1.4 seconds Bundle size: 939M With reorder (default): Bundle time: 25.5 seconds Bundle size: 381M

File last commit:

r14287:7c231754 default
r14365:a8e3931e default
Show More
bundlerepo.py
359 lines | 12.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
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 import changegroup, util, mdiff, discovery
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
while 1:
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)
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):
if not p 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)))
def revision(self, node):
"""return an uncompressed revision of a given"""
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
rev = self.rev(iter_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
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)
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")
Matt Mackall
bundlerepo: remove duplication of bundle decompressors
r12044 while 1:
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
Matt Mackall
localrepo: use propertycache
r8260 @util.propertycache
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
@util.propertycache
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
@util.propertycache
def manstart(self):
self.changelog
return self.manstart
@util.propertycache
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)
Brendan Cully
Make bundlerepo lazier...
r5262 while 1:
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()
Matt Mackall
bundle: get rid of chunkiter
r12335 while 1:
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
Dirkjan Ochtman
bundlerepo doesn't really have a dirstate, throw AttributeError if requested
r7435 def getcwd(self):
return os.getcwd() # always outside the repo
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", "")
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):
"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.
"csets" lists the incoming changeset node ids.
"cleanupfn" must be called without arguments when you're done processing the
changes; it closes both the original "other" and the one returned here.
'''
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:
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
localrepo = other
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 if bundlename or not other.local():
# create a bundle (uncompressed if other repo is not local)
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 if onlyheads is None and other.capable('changegroupsubset'):
onlyheads = rheads
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734
Peter Arrenbrecht
discovery: drop findoutgoing and simplify findcommonincoming's api...
r14073 if other.capable('getbundle'):
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 cg = other.getbundle('incoming', common=common, heads=onlyheads)
elif onlyheads is None:
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 cg = other.changegroup(incoming, "incoming")
else:
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 cg = other.changegroupsubset(incoming, onlyheads, 'incoming')
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 bundletype = other.local() and "HG10BZ" or "HG10UN"
fname = bundle = changegroup.writebundle(cg, bundlename, bundletype)
# keep written bundle?
if bundlename:
bundle = None
if not other.local():
# 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()
csets = localrepo.changelog.findmissing(common, onlyheads)
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)