##// END OF EJS Templates
perf: import newer modules separately for earlier Mercurial...
perf: import newer modules separately for earlier Mercurial demandimport of early Mercurial loads an imported module immediately, if a module is imported absolutely by "from a import b" style. Recent perf.py satisfies this condition, because it does: - have "from __future__ import absolute_import" line - use "from a import b" style for modules in "mercurial" package Before this patch, importing modules below prevents perf.py from being loaded by earlier Mercurial, because these aren't available in such Mercurial, even though there are some code paths for Mercurial earlier than 1.9. - branchmap 2.5 (or bcee63733aad) - repoview 2.5 (or 3a6ddacb7198) - obsolete 2.3 (or ad0d6c2b3279) - scmutil 1.9 (or 8b252e826c68) For example, setting "_prereadsize" attribute in perfindex() and perfnodelookup() is effective only with Mercurial earlier than 1.8 (or 61c9bc3da402). After this patch, "mercurial.error" is the only blocker in "from mercurial import" statement for loading perf.py with Mercurial earlier than 1.2. This patch ignores it, because just importing it separately isn't enough.

File last commit:

r29389:98e8313d default
r29567:7e2b3894 default
Show More
bundlerepo.py
542 lines | 19.2 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.
"""
Gregory Szorc
bundlerepo: use absolute_import
r25920 from __future__ import absolute_import
import os
import shutil
import tempfile
from .i18n import _
from .node import nullid
from . import (
bundle2,
changegroup,
changelog,
cmdutil,
discovery,
error,
exchange,
filelog,
localrepo,
manifest,
mdiff,
liscju
bundle: warn when update to revision existing only in a bundle (issue5004)...
r28714 node as nodemod,
Gregory Szorc
bundlerepo: use absolute_import
r25920 pathutil,
phases,
revlog,
scmutil,
util,
)
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:
Mads Kiilerich
bundlerepo: fix outdated comment...
r18410 # To retrieve a revision, we need to know the offset of the revision in
# the bundle (an unbundle object). We store this offset in the index
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 # (start). The base of the delta is stored in the base field.
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 #
Mads Kiilerich
bundlerepo: fix outdated comment...
r18410 # To differentiate a rev in the bundle from a rev in the revlog, we
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 # check revision against repotiprev.
Pierre-Yves David
bundlerepo: enforce reading from core repo only...
r18215 opener = scmutil.readonlyvfs(opener)
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
Matt Mackall
add __len__ and __iter__ methods to repo and revlog
r6750 n = len(self)
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 self.repotiprev = n - 1
Benoit Boissinot
bundlerepo: port to new bundle API
r14142 chain = None
Mads Kiilerich
bundlerepo: improve performance for bundle() revset expression...
r18411 self.bundlerevs = set() # used by 'bundle()' revset expression
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)
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
Mads Kiilerich
bundlerepo: improve performance for bundle() revset expression...
r18411 self.bundlerevs.add(self.nodemap[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"))
Mads Kiilerich
bundlerepo: store validated deltabase rev in basemap instead of node...
r18416
if deltabase not in self.nodemap:
raise LookupError(deltabase, self.indexfile,
_('unknown delta base'))
baserev = self.rev(deltabase)
Benoit Boissinot
fix bundlerepo broken by 4205f626dc05...
r5167 # start, size, full unc. size, base (unused), link, p1, p2, node
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 e = (revlog.offset_type(start, 0), size, -1, baserev, link,
Matt Mackall
revlog: add a magic null revision to our index...
r4979 self.rev(p1), self.rev(p2), node)
self.index.insert(-1, e)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 self.nodemap[node] = n
Mads Kiilerich
bundlerepo: improve performance for bundle() revset expression...
r18411 self.bundlerevs.add(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
Benoit Boissinot
bundlerepo: keep the bundlerevlog interface in sync with revlog
r9676 def _chunk(self, rev):
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 # Warning: in case of bundle, the diff is against what we stored as
# delta base, not against rev - 1
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 # XXX: could use some caching
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 if rev <= self.repotiprev:
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"""
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 if rev1 > self.repotiprev and rev2 > self.repotiprev:
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 # hot path for bundle
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 revb = self.index[rev2][3]
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 if revb == rev1:
Benoit Boissinot
bundlerepo: keep the bundlerevlog interface in sync with revlog
r9676 return self._chunk(rev2)
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 elif rev1 <= self.repotiprev and rev2 <= self.repotiprev:
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)),
Mads Kiilerich
bundlerepo: drop bundlebase wrapper function for basemap
r18413 self.revision(self.node(rev2)))
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
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 = []
Mads Kiilerich
bundlerepo: use rev instead of node for iteration in revision()...
r18415 iterrev = rev
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 # reconstruct the revision if it is from a changegroup
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 while iterrev > self.repotiprev:
Mads Kiilerich
bundlerepo: use rev instead of node for iteration in revision()...
r18415 if self._cache and self._cache[1] == iterrev:
Matt Mackall
revlog: mark cache private
r4984 text = self._cache[2]
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 break
Mads Kiilerich
bundlerepo: use rev instead of node for iteration in revision()...
r18415 chain.append(iterrev)
Mads Kiilerich
bundlerepo: replace basemap with the base field in the index...
r18643 iterrev = self.index[iterrev][3]
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 if text is None:
Wojciech Lopata
bundlerevlog: extract 'baserevision' method...
r19629 text = self.baserevision(iterrev)
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
Mads Kiilerich
bundlerepo: use revlog._checkhash...
r18417 self._checkhash(text, node, rev)
Mads Kiilerich
bundlerepo: use rev instead of node for iteration in revision()...
r18415 self._cache = (node, rev, text)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 return text
Wojciech Lopata
bundlerevlog: extract 'baserevision' method...
r19629 def baserevision(self, nodeorrev):
# Revlog subclasses may override 'revision' method to modify format of
# content retrieved from revlog. To use bundlerevlog with such class one
# needs to override 'baserevision' and make more specific call here.
return revlog.revlog.revision(self, nodeorrev)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 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
Wojciech Lopata
bundlerevlog: extract 'baserevision' method...
r19629 def baserevision(self, nodeorrev):
# Although changelog doesn't override 'revision' method, some extensions
# may replace this class with another that does. Same story with
# manifest and filelog classes.
Yuya Nishihara
bundlerepo: disable filtering of changelog while constructing revision text...
r24882
# This bypasses filtering on changelog.node() and rev() because we need
# revision text of the bundle base even if it is hidden.
oldfilter = self.filteredrevs
try:
self.filteredrevs = ()
return changelog.changelog.revision(self, nodeorrev)
finally:
self.filteredrevs = oldfilter
Wojciech Lopata
bundlerevlog: extract 'baserevision' method...
r19629
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
Wojciech Lopata
bundlerevlog: extract 'baserevision' method...
r19629 def baserevision(self, nodeorrev):
Durham Goode
bundlerepo: let bundle repo look in the _mancache...
r26399 node = nodeorrev
if isinstance(node, int):
node = self.node(node)
if node in self._mancache:
result = self._mancache[node][0].text()
else:
result = manifest.manifest.revision(self, nodeorrev)
return result
Wojciech Lopata
bundlerevlog: extract 'baserevision' method...
r19629
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 class bundlefilelog(bundlerevlog, filelog.filelog):
Martin von Zweigbergk
bundlerepo: remove unused 'repo' parameter...
r24921 def __init__(self, opener, path, bundle, linkmapper):
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
Wojciech Lopata
bundlerevlog: extract 'baserevision' method...
r19629 def baserevision(self, nodeorrev):
return filelog.filelog.revision(self, nodeorrev)
Sune Foldager
peer: introduce canpush and improve error message
r17193 class bundlepeer(localrepo.localpeer):
def canpush(self):
return False
Eric Sumner
bundlerepo: implement safe phasecache...
r23631 class bundlephasecache(phases.phasecache):
def __init__(self, *args, **kwargs):
super(bundlephasecache, self).__init__(*args, **kwargs)
if util.safehasattr(self, 'opener'):
self.opener = scmutil.readonlyvfs(self.opener)
def write(self):
raise NotImplementedError
def _write(self, fp):
raise NotImplementedError
def _updateroots(self, phase, newroots, tr):
self.phaseroots[phase] = newroots
self.invalidate()
self.dirty = True
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):
Pierre-Yves David
bundlerepo: move temp-bundle writing logic into a closure...
r26800 def _writetempbundle(read, suffix, header=''):
"""Write a temporary file to disk
This is closure because we need to make sure this tracked by
self.tempfile for cleanup purposes."""
fdtemp, temp = self.vfs.mkstemp(prefix="hg-bundle-",
suffix=".hg10un")
self.tempfile = temp
Bryan O'Sullivan
bundlerepo: use context manager for file I/O in _writetempbundle
r27776 with os.fdopen(fdtemp, 'wb') as fptemp:
Pierre-Yves David
bundlerepo: move temp-bundle writing logic into a closure...
r26800 fptemp.write(header)
while True:
chunk = read(2**18)
if not chunk:
break
fptemp.write(chunk)
return self.vfs.open(self.tempfile, mode="rb")
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)
Mads Kiilerich
config: set a 'source' in most cases where config don't come from file but code...
r20790 self.ui.setconfig('phases', 'publish', False, 'bundlerepo')
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")
Eric Sumner
bundlerepo: keep track of the original bundle object...
r24072 self.bundlefile = self.bundle = exchange.readbundle(ui, f, bundlename)
Matt Mackall
bundlerepo: remove duplication of bundle decompressors
r12044
Eric Sumner
bundlerepo: basic bundle2 support...
r24073 if isinstance(self.bundle, bundle2.unbundle20):
Pierre-Yves David
bundlerepo: properly extract compressed changegroup from bundle2...
r26803 cgstream = None
for part in self.bundle.iterparts():
if part.type == 'changegroup':
if cgstream is not None:
raise NotImplementedError("can't process "
"multiple changegroups")
cgstream = part
version = part.params.get('version', '01')
Martin von Zweigbergk
changegroup: fix pulling to treemanifest repo from flat repo (issue5066)...
r27953 if version not in changegroup.allsupportedversions(ui):
Pierre-Yves David
bundlerepo: properly extract compressed changegroup from bundle2...
r26803 msg = _('Unsupported changegroup version: %s')
raise error.Abort(msg % version)
if self.bundle.compressed():
cgstream = _writetempbundle(part.read,
".cg%sun" % version)
Eric Sumner
bundlerepo: basic bundle2 support...
r24073
Pierre-Yves David
bundlerepo: properly extract compressed changegroup from bundle2...
r26803 if cgstream is None:
liscju
i18n: translate abort messages...
r29389 raise error.Abort(_('No changegroups found'))
Pierre-Yves David
bundlerepo: properly extract compressed changegroup from bundle2...
r26803 cgstream.seek(0)
Eric Sumner
bundlerepo: basic bundle2 support...
r24073
Martin von Zweigbergk
changegroup: hide packermap behind methods...
r27751 self.bundle = changegroup.getunbundler(version, cgstream, 'UN')
Eric Sumner
bundlerepo: basic bundle2 support...
r24073
Pierre-Yves David
bundlerepo: uncompress changegroup in bundle1 case only...
r26801 elif self.bundle.compressed():
f = _writetempbundle(self.bundle.read, '.hg10un', header='HG10UN')
self.bundlefile = self.bundle = exchange.readbundle(ui, f,
bundlename,
self.vfs)
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
Eric Sumner
bundlerepo: retract phase boundary...
r23632 self.firstnewrev = self.changelog.repotiprev + 1
phases.retractboundary(self, None, phases.draft,
[ctx.node() for ctx in self[self.firstnewrev:]])
Pierre-Yves David
clfilter: ensure that filecache on localrepo is unfiltered...
r18014 @localrepo.unfilteredpropertycache
Eric Sumner
bundlerepo: implement safe phasecache...
r23631 def _phasecache(self):
return bundlephasecache(self, self._phasedefaults)
@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()
Angel Ezquerra
localrepo: remove all external users of localrepo.sopener...
r23878 c = bundlechangelog(self.svfs, self.bundle)
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 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()
Pierre-Yves David
bundlerepo: properly handle hidden linkrev in manifestlog (issue4945)...
r28221 linkmapper = self.unfiltered().changelog.rev
m = bundlemanifest(self.svfs, self.bundle, linkmapper)
Martin von Zweigbergk
changegroup3: add empty chunk separating directories and files...
r27753 # XXX: hack to work with changegroup3, but we still don't handle
# tree manifests correctly
if self.bundle.version == "03":
self.bundle.filelogheader()
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 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 in self.bundlefilespos:
Matt Mackall
bundlerepo: use bundle objects everywhere
r12332 self.bundle.seek(self.bundlefilespos[f])
Pierre-Yves David
bundlerepo: properly handle hidden linkrev in filelog (issue4945)...
r28186 linkmapper = self.unfiltered().changelog.rev
return bundlefilelog(self.svfs, f, self.bundle, linkmapper)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 else:
Angel Ezquerra
localrepo: remove all external users of localrepo.sopener...
r23878 return filelog.filelog(self.svfs, 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."""
Eric Sumner
bundlerepo: keep track of the original bundle object...
r24072 self.bundlefile.close()
Klaus Koch
bundlerepository: get rid of temporary bundle files (issue2478)...
r12962 if self.tempfile is not None:
FUJIWARA Katsunori
bundlerepo: treat temporarily extracted bundle file via vfs
r20981 self.vfs.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
liscju
bundle: warn when update to revision existing only in a bundle (issue5004)...
r28714 # Check if parents exist in localrepo before setting
def setparents(self, p1, p2=nullid):
p1rev = self.changelog.rev(p1)
p2rev = self.changelog.rev(p2)
msg = _("setting parent to node %s that only exists in the bundle\n")
if self.changelog.repotiprev < p1rev:
self.ui.warn(msg % nodemod.hex(p1))
if self.changelog.repotiprev < p2rev:
self.ui.warn(msg % nodemod.hex(p2))
return super(bundlerepository, self).setparents(p1, p2)
Sune Foldager
bundlerepo: don't write branch cache to disk...
r15597
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 def instance(ui, path, create):
if create:
Pierre-Yves David
error: get Abort from 'error' instead of 'util'...
r26587 raise error.Abort(_('cannot create new bundle repository'))
Matt Mackall
bundlerepo: mark internal-only config variable
r25830 # internal config: bundle.mainreporoot
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:
FUJIWARA Katsunori
bundlerepo: use pathutil.normasprefix to ensure os.sep at the end of cwd...
r24834 cwd = pathutil.normasprefix(cwd)
Peter Arrenbrecht
Fix income/pull with bundle and -R (issue 820)....
r5664 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
Eric Sumner
incoming: handle phases the same as pull...
r23633 class bundletransactionmanager(object):
def transaction(self):
return None
def close(self):
raise NotImplementedError
def release(self):
raise NotImplementedError
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:
Matt Mackall
bundlerepo: backout dbf292f65b09...
r21694 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
Mads Kiilerich
bundlerepo: don't return the peer without bundlerepo from getremotechanges...
r18138 return repo, [], other.close
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734
Mads Kiilerich
incoming: don't request heads that already are common...
r22182 commonset = set(common)
rheads = [x for x in rheads if x not in commonset]
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)
Pierre-Yves David
incoming: request a bundle2 when possible (BC)...
r26544 canbundle2 = (ui.configbool('experimental', 'bundle2-exp', True)
and other.capable('getbundle')
and other.capable('bundle2'))
if canbundle2:
kwargs = {}
kwargs['common'] = common
kwargs['heads'] = rheads
kwargs['bundlecaps'] = exchange.caps20to10(repo)
kwargs['cg'] = True
b2 = other.getbundle('incoming', **kwargs)
fname = bundle = changegroup.writechunks(ui, b2._forwardchunks(),
bundlename)
else:
Pierre-Yves David
bundlerepo: indent some code to prepare next patch...
r26543 if other.capable('getbundle'):
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
cg = other.changegroup(incoming, "incoming")
rheads = None
else:
cg = other.changegroupsubset(incoming, rheads, 'incoming')
if localrepo:
bundletype = "HG10BZ"
else:
bundletype = "HG10UN"
Martin von Zweigbergk
bundle: move writebundle() from changegroup.py to bundle2.py (API)...
r28666 fname = bundle = bundle2.writebundle(ui, cg, bundlename,
Pierre-Yves David
bundlerepo: indent some code to prepare next patch...
r26543 bundletype)
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734 # 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
Simon Heimberg
repo: repo isolation, do not pass on repo.ui for creating new repos...
r18825 localrepo = bundlerepo = bundlerepository(repo.baseui, repo.root,
fname)
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 # this repo contains local and other now, so filter out local again
common = repo.heads()
Pierre-Yves David
incoming: fix incoming when a local head is remotely filtered (issue3805)...
r18568 if localrepo:
# Part of common may be remotely filtered
# So use an unfiltered version
# The discovery process probably need cleanup to avoid that
localrepo = localrepo.unfiltered()
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161
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
Eric Sumner
incoming: handle phases the same as pull...
r23633 if bundlerepo:
reponodes = [ctx.node() for ctx in bundlerepo[bundlerepo.firstnewrev:]]
remotephases = other.listkeys('phases')
pullop = exchange.pulloperation(bundlerepo, other, heads=reponodes)
pullop.trmanager = bundletransactionmanager()
exchange._pullapplyphases(pullop, remotephases)
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 def cleanup():
if bundlerepo:
bundlerepo.close()
if bundle:
Matt Mackall
bundlerepo: backout dbf292f65b09...
r21694 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)