##// END OF EJS Templates
pyoxidizer: produce working Python 3 Windows installers (issue6366)...
pyoxidizer: produce working Python 3 Windows installers (issue6366) While we've had code to produce Python 3 Windows installers with PyOxidizer, we haven't been advertising them on the web site due to a bug in making TLS connections and issues around resource handling. This commit upgrades our PyOxidizer install and configuration to use a recent Git commit of PyOxidizer. This new version of PyOxidizer contains a *ton* of changes, improvements, and bug fixes. Notably, Windows shared distributions now mostly "just work" and the TLS bug and random problems with Python extension modules in the standard library go away. And Python has been upgraded from 3.7 to 3.8.6. The price we pay for this upgrade is a ton of backwards incompatible changes to Starlark. I applied this commit (the overall series actually) on stable to produce Windows installers for Mercurial 5.5.2, which I published shortly before submitting this commit for review. In order to get the stable branch working, I decided to take a less aggressive approach to Python resource management. Previously, we were attempting to load all Python modules from memory and were performing some hacks to copy Mercurial's non-module resources into additional directories in Starlark. This commit implements a resource callback function in Starlark (a new feature since PyOxidizer 0.7) to dynamically assign standard library resources to in-memory loading and all other resources to filesystem loading. This means that Mercurial's files and all the other packages we ship in the Windows installers (e.g. certifi and pygments) are loaded from the filesystem instead of from memory. This avoids issues due to lack of __file__ and enables us to ship a working Python 3 installer on Windows. The end state of the install layout after this patch is not ideal for @: we still copy resource files like templates and help text to directories next to the hg.exe executable. There is code in @ to use importlib.resources to load these files and we could likely remove these copies once this lands on @. But for now, the install layout mimics what we've shipped for seemingly forever and is backwards compatible. It allows us to achieve the milestone of working Python 3 Windows installers and gets us a giant step closer to deleting Python 2. Differential Revision: https://phab.mercurial-scm.org/D9148

File last commit:

r43871:21b8c599 default
r46277:57b5452a default
Show More
bundlerepo.py
669 lines | 22.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
from .i18n import _
Augie Fackler
formatting: blacken the codebase...
r43346 from .node import nullid, 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,
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,
Pulkit Goyal
py3: use pycompat.getcwd() instead of os.getcwd()...
r30519 pycompat,
Gregory Szorc
bundlerepo: use absolute_import
r25920 revlog,
util,
Pierre-Yves David
vfs: use 'vfs' module directly in 'mercurial.bundlerepo'...
r31240 vfs as vfsmod,
Gregory Szorc
bundlerepo: use absolute_import
r25920 )
Benoit Boissinot
add bundlerepo.py: a read-only repo that can use uncompressed bundles...
r1942
Augie Fackler
formatting: blacken the codebase...
r43346
Benoit Boissinot
bundlerepo: remove relative import, fix a comment
r1946 class bundlerevlog(revlog.revlog):
Gregory Szorc
bundlerepo: rename "bundle" arguments to "cgunpacker"...
r35075 def __init__(self, opener, indexfile, cgunpacker, 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
vfs: use 'vfs' module directly in 'mercurial.bundlerepo'...
r31240 opener = vfsmod.readonlyvfs(opener)
Matt Mackall
revlog: don't pass datafile as an argument
r4257 revlog.revlog.__init__(self, opener, indexfile)
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():
Durham Goode
bundlerepo: update to use new deltaiter api...
r34294 node, p1, p2, cs, deltabase, delta, flags = 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
link = linkmapper(cs)
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
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(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 p, self.indexfile, _(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):
Augie Fackler
formatting: blacken the codebase...
r43346 raise LookupError(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 deltabase, self.indexfile, _(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)
Benoit Boissinot
fix bundlerepo broken by 4205f626dc05...
r5167 # start, size, full unc. size, base (unused), link, p1, p2, node
Augie Fackler
formatting: blacken the codebase...
r43346 e = (
revlog.offset_type(start, flags),
size,
-1,
baserev,
link,
self.rev(p1),
self.rev(p2),
node,
)
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
Gregory Szorc
bundlerepo: make methods agree with base class...
r35038 def _chunk(self, rev, df=None):
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
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
bundlerepo: simplify code to take advantage of `_rawtext`...
r43089 def _rawtext(self, node, rev, _df=None):
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:
Gregory Szorc
revlog: rename _cache to _revisioncache...
r40088 if self._revisioncache and self._revisioncache[1] == iterrev:
rawtext = self._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(
self.node(iterrev), iterrev, _df=_df
)
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__(
self, opener, self.indexfile, cgunpacker, linkmapper
)
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__(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 self, opener, cgunpacker, linkmapper, dirlogstarts=None, dir=b''
Augie Fackler
formatting: blacken the codebase...
r43346 ):
Gregory Szorc
manifest: rename dir argument and attribute to tree...
r39279 manifest.manifestrevlog.__init__(self, opener, tree=dir)
Augie Fackler
formatting: blacken the codebase...
r43346 bundlerevlog.__init__(
self, opener, self.indexfile, cgunpacker, linkmapper
)
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(
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(
opener, self.indexfile, cgunpacker, linkmapper
)
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)
Martin von Zweigbergk
py3: delete b'' prefix from safehasattr arguments...
r43385 if util.safehasattr(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
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
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
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 class bundlerepository(object):
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
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
bundlerepo: rename _bundle to _cgunpacker...
r35045 self._cgunpacker = None
Gregory Szorc
bundlerepo: assign bundle attributes in bundle type blocks...
r35044
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):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if 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
Eric Sumner
bundlerepo: basic bundle2 support...
r24073
Gregory Szorc
bundlerepo: assign bundle attributes in bundle type blocks...
r35044 self._handlebundle2part(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):
if bundle.compressed():
Augie Fackler
formatting: blacken the codebase...
r43346 f = self._writetempbundle(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 bundle.read, b'.hg10un', header=b'HG10UN'
Augie Fackler
formatting: blacken the codebase...
r43346 )
Gregory Szorc
bundlerepo: dynamically create repository type from base repository...
r39640 bundle = exchange.readbundle(self.ui, f, bundlepath, self.vfs)
Gregory Szorc
bundlerepo: assign bundle attributes in bundle type blocks...
r35044
self._bundlefile = bundle
Gregory Szorc
bundlerepo: rename _bundle to _cgunpacker...
r35045 self._cgunpacker = bundle
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(
_(b'bundle type %s cannot be read') % type(bundle)
)
Pierre-Yves David
bundlerepo: uncompress changegroup in bundle1 case only...
r26801
Gregory Szorc
bundlerepo: rename "bundlefilespos" variable and attribute...
r35076 # dict with the mapping 'filename' -> position in the changegroup.
self._cgfilespos = {}
Brendan Cully
Make bundlerepo lazier...
r5262
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
Gregory Szorc
bundlerepo: assign bundle attributes in bundle type blocks...
r35044 def _handlebundle2part(self, bundle, part):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if part.type != b'changegroup':
Gregory Szorc
bundlerepo: use early return...
r35074 return
Durham Goode
bundlerepo: move bundle2 part handling out to a function...
r33890
Gregory Szorc
bundlerepo: use early return...
r35074 cgstream = part
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
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 def _writetempbundle(self, readfn, suffix, header=b''):
Durham Goode
bundlerepo: move temp bundle creation to a separate function...
r33888 """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:
Augie Fackler
formatting: blacken the codebase...
r43346 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
Gregory Szorc
localrepo: pass root manifest into manifestlog.__init__...
r39799 rootstore = bundlemanifest(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
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):
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
def setparents(self, p1, p2=nullid):
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:
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
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) :]
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()
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
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
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
Augie Fackler
formatting: blacken the codebase...
r43346
def getremotechanges(
ui, repo, peer, onlyheads=None, bundlename=None, force=False
):
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 '''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.
Peter Arrenbrecht
bundlerepo: fix and improve getremotechanges...
r14161 '''
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',
{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
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'listkeys', {b'namespace': b'phases',}
Augie Fackler
formatting: blacken the codebase...
r43346 ).result()
Eric Sumner
incoming: handle phases the same as pull...
r23633
Gregory Szorc
bundlerepo: rename "other" to "peer"...
r37660 pullop = exchange.pulloperation(bundlerepo, peer, 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)