##// END OF EJS Templates
manifest: subclass the new `imanifestrevisionwritable` Protocol class...
manifest: subclass the new `imanifestrevisionwritable` Protocol class This is the same transformation as 3a90a6fd710d did for dirstate, but the CamelCase naming was already cleaned up here. See 4ef6dbc27a99 for the benefits of explicit subclassing.

File last commit:

r52764:cfd30df0 default
r53378:22f97aa5 default
Show More
bundlerepo.py
770 lines | 25.1 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.
"""
Matt Harbison
typing: add `from __future__ import annotations` to most files...
r52756 from __future__ import annotations
Gregory Szorc
bundlerepo: use absolute_import
r25920
revlog: adapt the `reading` check for `bundlerepo`...
r51905 import contextlib
Gregory Szorc
bundlerepo: use absolute_import
r25920 import os
import shutil
Matt Harbison
typing: make `bundlerepository` subclass `localrepository` while type checking...
r52763 import typing
Gregory Szorc
bundlerepo: use absolute_import
r25920
from .i18n import _
Joerg Sonnenberger
node: import symbols explicitly...
r46729 from .node import (
hex,
nullrev,
)
Gregory Szorc
bundlerepo: use absolute_import
r25920
from . import (
bundle2,
changegroup,
changelog,
cmdutil,
discovery,
Matt Harbison
py3: rename pycompat.getcwd() to encoding.getcwd() (API)...
r39843 encoding,
Gregory Szorc
bundlerepo: use absolute_import
r25920 error,
exchange,
filelog,
localrepo,
manifest,
mdiff,
pathutil,
phases,
Pulkit Goyal
py3: use pycompat.getcwd() instead of os.getcwd()...
r30519 pycompat,
Gregory Szorc
bundlerepo: use absolute_import
r25920 revlog,
revlog: move `offset_type` to `revlogutils`...
r48186 revlogutils,
Gregory Szorc
bundlerepo: use absolute_import
r25920 util,
Pierre-Yves David
vfs: use 'vfs' module directly in 'mercurial.bundlerepo'...
r31240 vfs as vfsmod,
Gregory Szorc
bundlerepo: use absolute_import
r25920 )
urlutil: extract `url` related code from `util` into the new module...
r47669 from .utils import (
urlutil,
)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
revlog: introduce an explicit tracking of what the revlog is about...
r47838 from .revlogutils import (
constants as revlog_constants,
)
Augie Fackler
formatting: blacken the codebase...
r43346
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 class bundlerevlog(revlog.revlog):
Matt Harbison
bundlerepo: fix mismatches with repository and revlog classes...
r52764 def __init__(
self, opener: typing.Any, target, radix, cgunpacker, linkmapper
):
# TODO: figure out real type of opener
#
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
vfs: use 'vfs' module directly in 'mercurial.bundlerepo'...
r31240 opener = vfsmod.readonlyvfs(opener)
revlog: use a "radix" to address revlog...
r47921 revlog.revlog.__init__(self, opener, target=target, radix=radix)
Gregory Szorc
bundlerepo: rename "bundle" arguments to "cgunpacker"...
r35075 self.bundle = cgunpacker
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
Augie Fackler
formatting: blacken the codebase...
r43346 self.bundlerevs = set() # used by 'bundle()' revset expression
Gregory Szorc
bundlerepo: rename "bundle" arguments to "cgunpacker"...
r35075 for deltadata in cgunpacker.deltaiter():
Raphaël Gomès
changegroup: add v4 changegroup for revlog v2 exchange...
r47445 node, p1, p2, cs, deltabase, delta, flags, sidedata = deltadata
Benoit Boissinot
bundlerepo: port to new bundle API
r14142
size = len(delta)
Gregory Szorc
bundlerepo: rename "bundle" arguments to "cgunpacker"...
r35075 start = cgunpacker.tell() - size
Benoit Boissinot
bundlerepo: port to new bundle API
r14142
index: use `index.has_node` in `bundlerepo.bundlerevlog`...
r43942 if self.index.has_node(node):
Benoit Boissinot
bundlerepo: port to new bundle API
r14142 # this can happen if two branches make the same change
index: use `index.rev` in `bundlerepo.bundlerevlog`...
r43964 self.bundlerevs.add(self.index.rev(node))
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 continue
Joerg Sonnenberger
bundlerepo: don't insert index tuples with full nodes as linkrev...
r46418 if cs == node:
linkrev = nullrev
else:
linkrev = linkmapper(cs)
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):
index: use `index.has_node` in `bundlerepo.bundlerevlog`...
r43942 if not self.index.has_node(p):
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.LookupError(
revlog: use revlog.display_id in LookupError...
r47926 p, self.display_id, _(b"unknown parent")
Augie Fackler
formatting: blacken the codebase...
r43346 )
Mads Kiilerich
bundlerepo: store validated deltabase rev in basemap instead of node...
r18416
index: use `index.has_node` in `bundlerepo.bundlerevlog`...
r43942 if not self.index.has_node(deltabase):
Matt Harbison
bundlerepo: raise `error.LookupError` instead of `LookupError`...
r50870 raise error.LookupError(
revlog: use revlog.display_id in LookupError...
r47926 deltabase, self.display_id, _(b'unknown delta base')
Augie Fackler
formatting: blacken the codebase...
r43346 )
Mads Kiilerich
bundlerepo: store validated deltabase rev in basemap instead of node...
r18416
baserev = self.rev(deltabase)
revlog: always "append" full size tuple...
r47914 # start, size, full unc. size, base (unused), link, p1, p2, node, sidedata_offset (unused), sidedata_size (unused)
revlog: use the `entry` function in bundlerepo...
r48190 e = revlogutils.entry(
flags=flags,
data_offset=start,
data_compressed_length=size,
data_delta_base=baserev,
link_rev=linkrev,
parent_rev_1=self.rev(p1),
parent_rev_2=self.rev(p2),
node_id=node,
Augie Fackler
formatting: blacken the codebase...
r43346 )
Martin von Zweigbergk
index: replace insert(-1, e) method by append(e) method...
r38886 self.index.append(e)
Mads Kiilerich
bundlerepo: improve performance for bundle() revset expression...
r18411 self.bundlerevs.add(n)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 n += 1
revlog: adapt the `reading` check for `bundlerepo`...
r51905 @contextlib.contextmanager
def reading(self):
if self.repotiprev < 0:
yield
else:
with super().reading() as x:
yield x
revlog: drop more file description passing between private function...
r51919 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:
Matt Harbison
bundlerepo: fix mismatches with repository and revlog classes...
r52764 return super(bundlerevlog, self)._inner._chunk(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
Augie Fackler
formatting: blacken the codebase...
r43346 return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2))
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
revlog: drop more file description passing between private function...
r51919 def _rawtext(self, node, rev):
bundlerepo: simplify code to take advantage of `_rawtext`...
r43089 if rev is None:
Matt Mackall
revlog: allow retrieving contents by revision number
r16375 rev = self.rev(node)
bundlerepo: simplify code to take advantage of `_rawtext`...
r43089 validated = False
Jun Wu
bundlerepo: fix raw handling in revision()...
r31836 rawtext = None
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 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:
revlog: move the_revisioncache on the inner object...
r51989 if (
self._inner._revisioncache
and self._inner._revisioncache[1] == iterrev
):
rawtext = self._inner._revisioncache[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]
bundlerepo: simplify code to take advantage of `_rawtext`...
r43089 if iterrev == nullrev:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 rawtext = b''
bundlerepo: simplify code to take advantage of `_rawtext`...
r43089 elif rawtext is None:
Augie Fackler
formatting: blacken the codebase...
r43346 r = super(bundlerevlog, self)._rawtext(
revlog: drop more file description passing between private function...
r51919 self.node(iterrev),
iterrev,
Augie Fackler
formatting: blacken the codebase...
r43346 )
bundlerepo: simplify code to take advantage of `_rawtext`...
r43089 __, rawtext, validated = r
if chain:
validated = False
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())
Jun Wu
bundlerepo: fix raw handling in revision()...
r31836 rawtext = mdiff.patches(rawtext, [delta])
bundlerepo: simplify code to take advantage of `_rawtext`...
r43089 return rev, rawtext, validated
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Gregory Szorc
bundlerepo: make methods agree with base class...
r35038 def addrevision(self, *args, **kwargs):
raise NotImplementedError
def addgroup(self, *args, **kwargs):
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 raise NotImplementedError
Gregory Szorc
bundlerepo: make methods agree with base class...
r35038
def strip(self, *args, **kwargs):
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 raise NotImplementedError
Gregory Szorc
bundlerepo: make methods agree with base class...
r35038
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 def checksize(self):
raise NotImplementedError
Augie Fackler
formatting: blacken the codebase...
r43346
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 class bundlechangelog(bundlerevlog, changelog.changelog):
Gregory Szorc
bundlerepo: rename "bundle" arguments to "cgunpacker"...
r35075 def __init__(self, opener, cgunpacker):
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
Augie Fackler
formatting: blacken the codebase...
r43346 bundlerevlog.__init__(
revlog: introduce an explicit tracking of what the revlog is about...
r47838 self,
opener,
(revlog_constants.KIND_CHANGELOG, None),
revlog: use a "radix" to address revlog...
r47921 self.radix,
revlog: introduce an explicit tracking of what the revlog is about...
r47838 cgunpacker,
linkmapper,
Augie Fackler
formatting: blacken the codebase...
r43346 )
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Durham Goode
manifest: add bundlemanifestlog support...
r30373 class bundlemanifest(bundlerevlog, manifest.manifestrevlog):
Augie Fackler
formatting: blacken the codebase...
r43346 def __init__(
Joerg Sonnenberger
node: introduce nodeconstants class...
r47538 self,
nodeconstants,
opener,
cgunpacker,
linkmapper,
dirlogstarts=None,
dir=b'',
Augie Fackler
formatting: blacken the codebase...
r43346 ):
manifestrevlog: flag some inconsistency in bundle/union repo inheritance...
r51921 # XXX manifestrevlog is not actually a revlog , so mixing it with
# bundlerevlog is not a good idea.
Joerg Sonnenberger
node: introduce nodeconstants class...
r47538 manifest.manifestrevlog.__init__(self, nodeconstants, opener, tree=dir)
Augie Fackler
formatting: blacken the codebase...
r43346 bundlerevlog.__init__(
revlog: introduce an explicit tracking of what the revlog is about...
r47838 self,
opener,
(revlog_constants.KIND_MANIFESTLOG, dir),
revlog: use a "radix" to address revlog...
r47921 self._revlog.radix,
revlog: introduce an explicit tracking of what the revlog is about...
r47838 cgunpacker,
linkmapper,
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
bundlerepo: add support for treemanifests in cg3 bundles...
r29715 if dirlogstarts is None:
dirlogstarts = {}
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if self.bundle.version == b"03":
Augie Fackler
bundlerepo: add support for treemanifests in cg3 bundles...
r29715 dirlogstarts = _getfilestarts(self.bundle)
self._dirlogstarts = dirlogstarts
self._linkmapper = linkmapper
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Augie Fackler
bundlerepo: add support for treemanifests in cg3 bundles...
r29715 def dirlog(self, d):
if d in self._dirlogstarts:
self.bundle.seek(self._dirlogstarts[d])
return bundlemanifest(
Joerg Sonnenberger
node: introduce nodeconstants class...
r47538 self.nodeconstants,
Augie Fackler
formatting: blacken the codebase...
r43346 self.opener,
self.bundle,
self._linkmapper,
self._dirlogstarts,
dir=d,
)
Augie Fackler
bundlerepo: add support for treemanifests in cg3 bundles...
r29715 return super(bundlemanifest, self).dirlog(d)
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
filelog: wrap revlog instead of inheriting it (API)...
r37515 class bundlefilelog(filelog.filelog):
Gregory Szorc
bundlerepo: rename "bundle" arguments to "cgunpacker"...
r35075 def __init__(self, opener, path, cgunpacker, linkmapper):
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 filelog.filelog.__init__(self, opener, path)
Augie Fackler
formatting: blacken the codebase...
r43346 self._revlog = bundlerevlog(
revlog: introduce an explicit tracking of what the revlog is about...
r47838 opener,
# XXX should use the unencoded path
target=(revlog_constants.KIND_FILELOG, path),
revlog: use a "radix" to address revlog...
r47921 radix=self._revlog.radix,
revlog: introduce an explicit tracking of what the revlog is about...
r47838 cgunpacker=cgunpacker,
linkmapper=linkmapper,
Augie Fackler
formatting: blacken the codebase...
r43346 )
Sune Foldager
filelog: add file function to open other filelogs
r14287
Sune Foldager
peer: introduce canpush and improve error message
r17193 class bundlepeer(localrepo.localpeer):
def canpush(self):
return False
Augie Fackler
formatting: blacken the codebase...
r43346
Eric Sumner
bundlerepo: implement safe phasecache...
r23631 class bundlephasecache(phases.phasecache):
def __init__(self, *args, **kwargs):
super(bundlephasecache, self).__init__(*args, **kwargs)
safehasattr: drop usage in favor of hasattr...
r51821 if hasattr(self, 'opener'):
Pierre-Yves David
vfs: use 'vfs' module directly in 'mercurial.bundlerepo'...
r31240 self.opener = vfsmod.readonlyvfs(self.opener)
Eric Sumner
bundlerepo: implement safe phasecache...
r23631
Matt Harbison
bundlerepo: fix mismatches with repository and revlog classes...
r52764 def write(self, repo):
Eric Sumner
bundlerepo: implement safe phasecache...
r23631 raise NotImplementedError
Matt Harbison
bundlerepo: fix mismatches with repository and revlog classes...
r52764 def _write(self, repo, fp):
Eric Sumner
bundlerepo: implement safe phasecache...
r23631 raise NotImplementedError
phases: invalidate the phases set less often on retract boundary...
r52313 def _updateroots(self, repo, phase, newroots, tr, invalidate=True):
phases: mark `phasecache.phaseroots` private...
r52296 self._phaseroots[phase] = newroots
phases: invalidate the phases set less often on retract boundary...
r52313 if invalidate:
self.invalidate()
Eric Sumner
bundlerepo: implement safe phasecache...
r23631 self.dirty = True
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
bundlerepo: rename "bundle" arguments to "cgunpacker"...
r35075 def _getfilestarts(cgunpacker):
Gregory Szorc
bundlerepo: rename "bundlefilespos" variable and attribute...
r35076 filespos = {}
Gregory Szorc
bundlerepo: rename "bundle" arguments to "cgunpacker"...
r35075 for chunkdata in iter(cgunpacker.filelogheader, {}):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 fname = chunkdata[b'filename']
Gregory Szorc
bundlerepo: rename "bundlefilespos" variable and attribute...
r35076 filespos[fname] = cgunpacker.tell()
Gregory Szorc
bundlerepo: rename "bundle" arguments to "cgunpacker"...
r35075 for chunk in iter(lambda: cgunpacker.deltachunk(None), {}):
Augie Fackler
bundlerepo: introduce method to find file starts and use it...
r29712 pass
Gregory Szorc
bundlerepo: rename "bundlefilespos" variable and attribute...
r35076 return filespos
Augie Fackler
bundlerepo: introduce method to find file starts and use it...
r29712
Augie Fackler
formatting: blacken the codebase...
r43346
Matt Harbison
typing: make `bundlerepository` subclass `localrepository` while type checking...
r52763 _bundle_repo_baseclass = object
if typing.TYPE_CHECKING:
_bundle_repo_baseclass = localrepo.localrepository
class bundlerepository(_bundle_repo_baseclass):
Gregory Szorc
bundlerepo: add docstring for bundlerepository class...
r35041 """A repository instance that is a union of a local repo and a bundle.
Instances represent a read-only repository composed of a local repository
with the contents of a bundle file applied. The repository instance is
conceptually similar to the state of a repository after an
``hg unbundle`` operation. However, the contents of the bundle are never
applied to the actual base repository.
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640
Instances constructed directly are not usable as repository objects.
Use instance() or makebundlerepository() to create instances.
Gregory Szorc
bundlerepo: add docstring for bundlerepository class...
r35041 """
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 def __init__(self, bundlepath, url, tempparent):
self._tempparent = tempparent
self._url = url
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 self.ui.setconfig(b'phases', b'publish', False, b'bundlerepo')
Vadim Gelfer
hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks...
r2673
bundlerepo: move most attribute declaration earlier in __init__...
r51093 # dict with the mapping 'filename' -> position in the changegroup.
self._cgfilespos = {}
self._bundlefile = None
self._cgunpacker = None
Benoit Boissinot
add support for compressed bundle repositories...
r2273 self.tempfile = None
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 f = util.posixfile(bundlepath, b"rb")
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 bundle = exchange.readbundle(self.ui, f, bundlepath)
Matt Mackall
bundlerepo: remove duplication of bundle decompressors
r12044
Gregory Szorc
bundlerepo: assign bundle attributes in bundle type blocks...
r35044 if isinstance(bundle, bundle2.unbundle20):
self._bundlefile = bundle
Gregory Szorc
bundle2: only seek to beginning of part in bundlerepo...
r35112 cgpart = None
Gregory Szorc
bundle2: don't use seekable bundle2 parts by default (issue5691)...
r35113 for part in bundle.iterparts(seekable=True):
Matt Harbison , Pierre-Yves David pierre-yves.david@octobus.net
bundlerepo: apply phase data stored in the bundle instead of assuming `draft`...
r51095 if part.type == b'phase-heads':
self._handle_bundle2_phase_part(bundle, part)
elif part.type == b'changegroup':
Gregory Szorc
bundle2: only seek to beginning of part in bundlerepo...
r35112 if cgpart:
Augie Fackler
formatting: blacken the codebase...
r43346 raise NotImplementedError(
Martin von Zweigbergk
cleanup: join string literals that are already on one line...
r43387 b"can't process multiple changegroups"
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
bundle2: only seek to beginning of part in bundlerepo...
r35112 cgpart = part
bundlerepo: expliclty handing cg part from bundle2...
r51091 self._handle_bundle2_cg_part(bundle, part)
Eric Sumner
bundlerepo: basic bundle2 support...
r24073
Gregory Szorc
bundle2: only seek to beginning of part in bundlerepo...
r35112 if not cgpart:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b"No changegroups found"))
Gregory Szorc
bundle2: only seek to beginning of part in bundlerepo...
r35112
# This is required to placate a later consumer, which expects
# the payload offset to be at the beginning of the changegroup.
# We need to do this after the iterparts() generator advances
# because iterparts() will seek to end of payload after the
# generator returns control to iterparts().
cgpart.seek(0, os.SEEK_SET)
Gregory Szorc
bundlerepo: assign bundle attributes in bundle type blocks...
r35044 elif isinstance(bundle, changegroup.cg1unpacker):
bundlerepo: move the handling of bundl1 in its own method...
r51092 self._handle_bundle1(bundle, bundlepath)
Gregory Szorc
bundlerepo: don't assume there are only two bundle classes...
r35042 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(
bundlerepo: fix string interpolation...
r51096 _(b'bundle type %r cannot be read') % type(bundle)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 )
Pierre-Yves David
bundlerepo: uncompress changegroup in bundle1 case only...
r26801
bundlerepo: handle changegroup induced phase movement in the associated method...
r51094 def _handle_bundle1(self, bundle, bundlepath):
if bundle.compressed():
f = self._writetempbundle(bundle.read, b'.hg10un', header=b'HG10UN')
bundle = exchange.readbundle(self.ui, f, bundlepath, self.vfs)
self._bundlefile = bundle
self._cgunpacker = bundle
Eric Sumner
bundlerepo: retract phase boundary...
r23632 self.firstnewrev = self.changelog.repotiprev + 1
Augie Fackler
formatting: blacken the codebase...
r43346 phases.retractboundary(
self,
None,
phases.draft,
[ctx.node() for ctx in self[self.firstnewrev :]],
)
Eric Sumner
bundlerepo: retract phase boundary...
r23632
bundlerepo: expliclty handing cg part from bundle2...
r51091 def _handle_bundle2_cg_part(self, bundle, part):
assert part.type == b'changegroup'
Gregory Szorc
bundlerepo: use early return...
r35074 cgstream = part
Matt Harbison , Pierre-Yves David pierre-yves.david@octobus.net
bundlerepo: apply phase data stored in the bundle instead of assuming `draft`...
r51095 targetphase = part.params.get(b'targetphase')
try:
targetphase = int(targetphase)
except TypeError:
pass
if targetphase is None:
targetphase = phases.draft
if targetphase not in phases.allphases:
m = _(b'unsupported targetphase: %d')
m %= targetphase
raise error.Abort(m)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 version = part.params.get(b'version', b'01')
Gregory Szorc
bundlerepo: use early return...
r35074 legalcgvers = changegroup.supportedincomingversions(self)
if version not in legalcgvers:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 msg = _(b'Unsupported changegroup version: %s')
Gregory Szorc
bundlerepo: use early return...
r35074 raise error.Abort(msg % version)
if bundle.compressed():
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 cgstream = self._writetempbundle(part.read, b'.cg%sun' % version)
Gregory Szorc
bundlerepo: use early return...
r35074
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 self._cgunpacker = changegroup.getunbundler(version, cgstream, b'UN')
Durham Goode
bundlerepo: move bundle2 part handling out to a function...
r33890
bundlerepo: handle changegroup induced phase movement in the associated method...
r51094 self.firstnewrev = self.changelog.repotiprev + 1
phases.retractboundary(
self,
None,
Matt Harbison , Pierre-Yves David pierre-yves.david@octobus.net
bundlerepo: apply phase data stored in the bundle instead of assuming `draft`...
r51095 targetphase,
bundlerepo: handle changegroup induced phase movement in the associated method...
r51094 [ctx.node() for ctx in self[self.firstnewrev :]],
)
Matt Harbison , Pierre-Yves David pierre-yves.david@octobus.net
bundlerepo: apply phase data stored in the bundle instead of assuming `draft`...
r51095 def _handle_bundle2_phase_part(self, bundle, part):
assert part.type == b'phase-heads'
unfi = self.unfiltered()
headsbyphase = phases.binarydecode(part)
phases.updatephases(unfi, lambda: None, headsbyphase)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 def _writetempbundle(self, readfn, suffix, header=b''):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """Write a temporary file to disk"""
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 fdtemp, temp = self.vfs.mkstemp(prefix=b"hg-bundle-", suffix=suffix)
Durham Goode
bundlerepo: move temp bundle creation to a separate function...
r33888 self.tempfile = temp
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 with os.fdopen(fdtemp, 'wb') as fptemp:
Durham Goode
bundlerepo: move temp bundle creation to a separate function...
r33888 fptemp.write(header)
while True:
Raphaël Gomès
black: format the codebase with 23.3.0...
r52596 chunk = readfn(2**18)
Durham Goode
bundlerepo: move temp bundle creation to a separate function...
r33888 if not chunk:
break
fptemp.write(chunk)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 return self.vfs.open(self.tempfile, mode=b"rb")
Durham Goode
bundlerepo: move temp bundle creation to a separate function...
r33888
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
Gregory Szorc
bundlerepo: rename _bundle to _cgunpacker...
r35045 self._cgunpacker.changelogheader()
c = bundlechangelog(self.svfs, self._cgunpacker)
self.manstart = self._cgunpacker.tell()
Matt Mackall
localrepo: use propertycache
r8260 return c
localrepo: introduce a `_refreshchangelog` method...
r42710 def _refreshchangelog(self):
# changelog for bundle repo are not filecache, this method is not
# applicable.
pass
Gregory Szorc
localrepo: pass root manifest into manifestlog.__init__...
r39799 @localrepo.unfilteredpropertycache
def manifestlog(self):
Gregory Szorc
bundlerepo: rename _bundle to _cgunpacker...
r35045 self._cgunpacker.seek(self.manstart)
Benoit Boissinot
unbundler: separate delta and header parsing...
r14144 # consume the header if it exists
Gregory Szorc
bundlerepo: rename _bundle to _cgunpacker...
r35045 self._cgunpacker.manifestheader()
Pierre-Yves David
bundlerepo: properly handle hidden linkrev in manifestlog (issue4945)...
r28221 linkmapper = self.unfiltered().changelog.rev
Joerg Sonnenberger
node: introduce nodeconstants class...
r47538 rootstore = bundlemanifest(
self.nodeconstants, self.svfs, self._cgunpacker, linkmapper
)
Gregory Szorc
bundlerepo: rename _bundle to _cgunpacker...
r35045 self.filestart = self._cgunpacker.tell()
Gregory Szorc
localrepo: pass root manifest into manifestlog.__init__...
r39799
Augie Fackler
formatting: blacken the codebase...
r43346 return manifest.manifestlog(
self.svfs, self, rootstore, self.narrowmatch()
)
Matt Mackall
localrepo: use propertycache
r8260
Durham Goode
bundle: allow bundlerepo to support alternative manifest implementations...
r35012 def _consumemanifest(self):
"""Consumes the manifest portion of the bundle, setting filestart so the
file portion can be read."""
Gregory Szorc
bundlerepo: rename _bundle to _cgunpacker...
r35045 self._cgunpacker.seek(self.manstart)
self._cgunpacker.manifestheader()
for delta in self._cgunpacker.deltaiter():
Durham Goode
bundle: allow bundlerepo to support alternative manifest implementations...
r35012 pass
Gregory Szorc
bundlerepo: rename _bundle to _cgunpacker...
r35045 self.filestart = self._cgunpacker.tell()
Durham Goode
bundle: allow bundlerepo to support alternative manifest implementations...
r35012
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):
Durham Goode
manifest: remove last uses of repo.manifest...
r30375 self.manifestlog
Durham Goode
bundle: allow bundlerepo to support alternative manifest implementations...
r35012
# If filestart was not set by self.manifestlog, that means the
# manifestlog implementation did not consume the manifests from the
# changegroup (ex: it might be consuming trees from a separate bundle2
# part instead). So we need to manually consume it.
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 if 'filestart' not in self.__dict__:
Durham Goode
bundle: allow bundlerepo to support alternative manifest implementations...
r35012 self._consumemanifest()
Matt Mackall
localrepo: use propertycache
r8260 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):
Gregory Szorc
bundlerepo: rename "bundlefilespos" variable and attribute...
r35076 if not self._cgfilespos:
Gregory Szorc
bundlerepo: rename _bundle to _cgunpacker...
r35045 self._cgunpacker.seek(self.filestart)
Gregory Szorc
bundlerepo: rename "bundlefilespos" variable and attribute...
r35076 self._cgfilespos = _getfilestarts(self._cgunpacker)
Brendan Cully
Make bundlerepo lazier...
r5262
Gregory Szorc
bundlerepo: rename "bundlefilespos" variable and attribute...
r35076 if f in self._cgfilespos:
self._cgunpacker.seek(self._cgfilespos[f])
Pierre-Yves David
bundlerepo: properly handle hidden linkrev in filelog (issue4945)...
r28186 linkmapper = self.unfiltered().changelog.rev
Gregory Szorc
bundlerepo: rename _bundle to _cgunpacker...
r35045 return bundlefilelog(self.svfs, f, self._cgunpacker, linkmapper)
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942 else:
Gregory Szorc
bundlerepo: use super() when calling file()...
r37347 return super(bundlerepository, self).file(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."""
Gregory Szorc
bundlerepo: make bundle and bundlefile attributes private...
r35043 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
Manuel Jacob
pull: add --remote-hidden option and pass it through peer creation...
r51309 def peer(self, path=None, remotehidden=False):
return bundlepeer(self, path=path, remotehidden=remotehidden)
Sune Foldager
peer: introduce canpush and improve error message
r17193
Dirkjan Ochtman
bundlerepo doesn't really have a dirstate, throw AttributeError if requested
r7435 def getcwd(self):
Augie Fackler
formatting: blacken the codebase...
r43346 return encoding.getcwd() # always outside the repo
Dirkjan Ochtman
bundlerepo doesn't really have a dirstate, throw AttributeError if requested
r7435
liscju
bundle: warn when update to revision existing only in a bundle (issue5004)...
r28714 # Check if parents exist in localrepo before setting
Joerg Sonnenberger
node: replace nullid and friends with nodeconstants class...
r47771 def setparents(self, p1, p2=None):
if p2 is None:
p2 = self.nullid
liscju
bundle: warn when update to revision existing only in a bundle (issue5004)...
r28714 p1rev = self.changelog.rev(p1)
p2rev = self.changelog.rev(p2)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 msg = _(b"setting parent to node %s that only exists in the bundle\n")
liscju
bundle: warn when update to revision existing only in a bundle (issue5004)...
r28714 if self.changelog.repotiprev < p1rev:
Joerg Sonnenberger
node: import symbols explicitly...
r46729 self.ui.warn(msg % hex(p1))
liscju
bundle: warn when update to revision existing only in a bundle (issue5004)...
r28714 if self.changelog.repotiprev < p2rev:
Joerg Sonnenberger
node: import symbols explicitly...
r46729 self.ui.warn(msg % hex(p2))
liscju
bundle: warn when update to revision existing only in a bundle (issue5004)...
r28714 return super(bundlerepository, self).setparents(p1, p2)
Sune Foldager
bundlerepo: don't write branch cache to disk...
r15597
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
hg: allow extra arguments to be passed to repo creation (API)...
r39585 def instance(ui, path, create, intents=None, createopts=None):
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 if create:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'cannot create new bundle repository'))
Matt Mackall
bundlerepo: mark internal-only config variable
r25830 # internal config: bundle.mainreporoot
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 parentpath = ui.config(b"bundle", b"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
Matt Harbison
py3: rename pycompat.getcwd() to encoding.getcwd() (API)...
r39843 parentpath = cmdutil.findrepo(encoding.getcwd())
Matt Mackall
bundlerepo: try to find containing repo on creation (issue1812)
r16042 if parentpath is None:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 parentpath = b''
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.
Matt Harbison
py3: rename pycompat.getcwd() to encoding.getcwd() (API)...
r39843 cwd = encoding.getcwd()
Peter Arrenbrecht
Fix income/pull with bundle and -R (issue 820)....
r5664 if parentpath == cwd:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 parentpath = b''
Peter Arrenbrecht
Fix income/pull with bundle and -R (issue 820)....
r5664 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):
Augie Fackler
formatting: blacken the codebase...
r43346 parentpath = parentpath[len(cwd) :]
urlutil: extract `url` related code from `util` into the new module...
r47669 u = urlutil.url(path)
Brodie Rao
url: refactor util.drop_scheme() and hg.localpath() into url.localpath()...
r13826 path = u.localpath()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if u.scheme == b'bundle':
s = path.split(b"+", 1)
Vadim Gelfer
clean up hg.py: move repo constructor code into each repo module
r2740 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
Gregory Szorc
bundlerepo: factor out code for instantiating a bundle repository...
r39639
return makebundlerepository(ui, repopath, bundlename)
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
bundlerepo: factor out code for instantiating a bundle repository...
r39639 def makebundlerepository(ui, repopath, bundlepath):
"""Make a bundle repository object based on repo and bundle paths."""
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 if repopath:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 url = b'bundle:%s+%s' % (util.expandpath(repopath), bundlepath)
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 url = b'bundle:%s' % bundlepath
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640
# Because we can't make any guarantees about the type of the base
# repository, we can't have a static class representing the bundle
# repository. We also can't make any guarantees about how to even
# call the base repository's constructor!
#
# So, our strategy is to go through ``localrepo.instance()`` to construct
# a repo instance. Then, we dynamically create a new type derived from
# both it and our ``bundlerepository`` class which overrides some
# functionality. We then change the type of the constructed repository
# to this new type and initialize the bundle-specific bits of it.
try:
Martin von Zweigbergk
bundlerepo: remove a variable alias...
r39980 repo = localrepo.instance(ui, repopath, create=False)
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 tempparent = None
Matt Harbison
bundlerepo: enforce the requirements declared by the underlying repository...
r50864 except error.RequirementError:
raise # no fallback if the backing repo is unsupported
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 except error.RepoError:
tempparent = pycompat.mkdtemp()
try:
Martin von Zweigbergk
bundlerepo: remove a variable alias...
r39980 repo = localrepo.instance(ui, tempparent, create=True)
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 except Exception:
shutil.rmtree(tempparent)
raise
Martin von Zweigbergk
bundlerepo: remove a variable alias...
r39980 class derivedbundlerepository(bundlerepository, repo.__class__):
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 pass
repo.__class__ = derivedbundlerepository
bundlerepository.__init__(repo, bundlepath, url, tempparent)
return repo
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734
Augie Fackler
formatting: blacken the codebase...
r43346
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class bundletransactionmanager:
Eric Sumner
incoming: handle phases the same as pull...
r23633 def transaction(self):
return None
def close(self):
raise NotImplementedError
def release(self):
raise NotImplementedError
Augie Fackler
formatting: blacken the codebase...
r43346
def getremotechanges(
ui, repo, peer, onlyheads=None, bundlename=None, force=False
):
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """obtains a bundle of changes incoming from peer
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161
"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
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 original "peer" 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
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 the changes; it closes both the original "peer" and the one returned
Brodie Rao
cleanup: eradicate long lines
r16683 here.
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 """
Augie Fackler
formatting: blacken the codebase...
r43346 tmp = discovery.findcommonincoming(repo, peer, 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
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 return repo, [], peer.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
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 localrepo = peer.local()
Sune Foldager
peer: introduce peer methods to prepare for peer classes...
r17191 if bundlename or not localrepo:
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 # create a bundle (uncompressed if peer repo is not local)
Nicolas Dumazet
bundlerepo: unify common code into a new getremotechanges...
r12734
Pierre-Yves David
bundlerepo: also read the 'devel.legacy.exchange' config...
r29684 # developer config: devel.legacy.exchange
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 legexc = ui.configlist(b'devel', b'legacy.exchange')
forcebundle1 = b'bundle2' not in legexc and b'bundle1' in legexc
Augie Fackler
formatting: blacken the codebase...
r43346 canbundle2 = (
not forcebundle1
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 and peer.capable(b'getbundle')
and peer.capable(b'bundle2')
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pierre-Yves David
incoming: request a bundle2 when possible (BC)...
r26544 if canbundle2:
Gregory Szorc
bundlerepo: use command executor for wire protocol commands...
r37661 with peer.commandexecutor() as e:
Augie Fackler
formatting: blacken the codebase...
r43346 b2 = e.callcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'getbundle',
Augie Fackler
formatting: blacken the codebase...
r43346 {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'source': b'incoming',
b'common': common,
b'heads': rheads,
b'bundlecaps': exchange.caps20to10(
repo, role=b'client'
),
b'cg': True,
Augie Fackler
formatting: blacken the codebase...
r43346 },
).result()
Gregory Szorc
bundlerepo: use command executor for wire protocol commands...
r37661
Augie Fackler
formatting: blacken the codebase...
r43346 fname = bundle = changegroup.writechunks(
ui, b2._forwardchunks(), bundlename
)
Pierre-Yves David
incoming: request a bundle2 when possible (BC)...
r26544 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if peer.capable(b'getbundle'):
Gregory Szorc
bundlerepo: use command executor for wire protocol commands...
r37661 with peer.commandexecutor() as e:
Augie Fackler
formatting: blacken the codebase...
r43346 cg = e.callcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'getbundle',
Augie Fackler
formatting: blacken the codebase...
r43346 {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'source': b'incoming',
b'common': common,
b'heads': rheads,
Augie Fackler
formatting: blacken the codebase...
r43346 },
).result()
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif onlyheads is None and not peer.capable(b'changegroupsubset'):
Pierre-Yves David
bundlerepo: indent some code to prepare next patch...
r26543 # compat with older servers when pulling all remote heads
Gregory Szorc
wireproto: convert legacy commands to command executor...
r37653
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 with peer.commandexecutor() as e:
Augie Fackler
formatting: blacken the codebase...
r43346 cg = e.callcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'changegroup',
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 {
b'nodes': incoming,
b'source': b'incoming',
},
Augie Fackler
formatting: blacken the codebase...
r43346 ).result()
Gregory Szorc
wireproto: convert legacy commands to command executor...
r37653
Pierre-Yves David
bundlerepo: indent some code to prepare next patch...
r26543 rheads = None
else:
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 with peer.commandexecutor() as e:
Augie Fackler
formatting: blacken the codebase...
r43346 cg = e.callcommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'changegroupsubset',
Augie Fackler
formatting: blacken the codebase...
r43346 {
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'bases': incoming,
b'heads': rheads,
b'source': b'incoming',
Augie Fackler
formatting: blacken the codebase...
r43346 },
).result()
Gregory Szorc
wireproto: convert legacy commands to command executor...
r37653
Pierre-Yves David
bundlerepo: indent some code to prepare next patch...
r26543 if localrepo:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 bundletype = b"HG10BZ"
Pierre-Yves David
bundlerepo: indent some code to prepare next patch...
r26543 else:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 bundletype = b"HG10UN"
Augie Fackler
formatting: blacken the codebase...
r43346 fname = bundle = bundle2.writebundle(ui, cg, bundlename, 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
Augie Fackler
formatting: blacken the codebase...
r43346 localrepo = bundlerepo = makebundlerepository(
repo.baseui, repo.root, fname
)
Gregory Szorc
bundlerepo: factor out code for instantiating a bundle repository...
r39639
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 # this repo contains local and peer now, so filter out local again
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 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:
Augie Fackler
formatting: blacken the codebase...
r43346 reponodes = [ctx.node() for ctx in bundlerepo[bundlerepo.firstnewrev :]]
Gregory Szorc
bundlerepo: use command executor for wire protocol commands...
r37661
with peer.commandexecutor() as e:
Augie Fackler
formatting: blacken the codebase...
r43346 remotephases = e.callcommand(
Augie Fackler
formating: upgrade to black 20.8b1...
r46554 b'listkeys',
{
b'namespace': b'phases',
},
Augie Fackler
formatting: blacken the codebase...
r43346 ).result()
Eric Sumner
incoming: handle phases the same as pull...
r23633
path: keep the path instance in the `pulloperation`...
r49055 pullop = exchange.pulloperation(
bundlerepo, peer, path=None, heads=reponodes
)
Eric Sumner
incoming: handle phases the same as pull...
r23633 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)
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 peer.close()
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161
return (localrepo, csets, cleanup)