mercurial/bundlerepo.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 16 Feb 2023 04:04:40 +0100
changeset 50137 a66926099c0f
parent 50032 562f7da122b5
child 50235 2a7e8471782c
permissions -rw-r--r--
localrepo: enforce a clean dirstate when the transaction open This is important to simplify the backup process. This also seems like a quite reasonable expectation. See inline documentation for details.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     1
# bundlerepo.py - repository class for viewing uncompressed bundles
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     2
#
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     3
# Copyright 2006, 2007 Benoit Boissinot <bboissin@gmail.com>
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     4
#
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9676
diff changeset
     6
# GNU General Public License version 2 or any later version.
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
     7
8227
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
     8
"""Repository class for viewing uncompressed bundles.
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
     9
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
    10
This provides a read-only repository interface to bundles as if they
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
    11
were part of the actual repository.
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
    12
"""
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
    13
25920
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    14
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    15
import os
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    16
import shutil
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    17
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    18
from .i18n import _
46114
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
    19
from .node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
    20
    hex,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
    21
    nullrev,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
    22
)
25920
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    23
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    24
from . import (
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    25
    bundle2,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    26
    changegroup,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    27
    changelog,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    28
    cmdutil,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    29
    discovery,
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39779
diff changeset
    30
    encoding,
25920
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    31
    error,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    32
    exchange,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    33
    filelog,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    34
    localrepo,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    35
    manifest,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    36
    mdiff,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    37
    pathutil,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    38
    phases,
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30385
diff changeset
    39
    pycompat,
25920
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    40
    revlog,
47400
ac60a1366a49 revlog: move `offset_type` to `revlogutils`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47267
diff changeset
    41
    revlogutils,
25920
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    42
    util,
31250
5f68e7341ada vfs: use 'vfs' module directly in 'mercurial.bundlerepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30944
diff changeset
    43
    vfs as vfsmod,
25920
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    44
)
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46793
diff changeset
    45
from .utils import (
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46793
diff changeset
    46
    urlutil,
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46793
diff changeset
    47
)
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    48
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
    49
from .revlogutils import (
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
    50
    constants as revlog_constants,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
    51
)
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
    52
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
    53
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
    54
class bundlerevlog(revlog.revlog):
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
    55
    def __init__(self, opener, target, radix, cgunpacker, linkmapper):
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    56
        # How it works:
18410
de7dac2a58e8 bundlerepo: fix outdated comment
Mads Kiilerich <madski@unity3d.com>
parents: 18216
diff changeset
    57
        # To retrieve a revision, we need to know the offset of the revision in
de7dac2a58e8 bundlerepo: fix outdated comment
Mads Kiilerich <madski@unity3d.com>
parents: 18216
diff changeset
    58
        # the bundle (an unbundle object). We store this offset in the index
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
    59
        # (start). The base of the delta is stored in the base field.
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    60
        #
18410
de7dac2a58e8 bundlerepo: fix outdated comment
Mads Kiilerich <madski@unity3d.com>
parents: 18216
diff changeset
    61
        # To differentiate a rev in the bundle from a rev in the revlog, we
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
    62
        # check revision against repotiprev.
31250
5f68e7341ada vfs: use 'vfs' module directly in 'mercurial.bundlerepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30944
diff changeset
    63
        opener = vfsmod.readonlyvfs(opener)
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
    64
        revlog.revlog.__init__(self, opener, target=target, radix=radix)
35099
90609be10891 bundlerepo: rename "bundle" arguments to "cgunpacker"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35098
diff changeset
    65
        self.bundle = cgunpacker
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6647
diff changeset
    66
        n = len(self)
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
    67
        self.repotiprev = n - 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
    68
        self.bundlerevs = set()  # used by 'bundle()' revset expression
35099
90609be10891 bundlerepo: rename "bundle" arguments to "cgunpacker"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35098
diff changeset
    69
        for deltadata in cgunpacker.deltaiter():
46724
a41565bef69f changegroup: add v4 changegroup for revlog v2 exchange
Raphaël Gomès <rgomes@octobus.net>
parents: 46114
diff changeset
    70
            node, p1, p2, cs, deltabase, delta, flags, sidedata = deltadata
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    71
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    72
            size = len(delta)
35099
90609be10891 bundlerepo: rename "bundle" arguments to "cgunpacker"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35098
diff changeset
    73
            start = cgunpacker.tell() - size
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    74
43590
5f347567589b index: use `index.has_node` in `bundlerepo.bundlerevlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43581
diff changeset
    75
            if self.index.has_node(node):
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    76
                # this can happen if two branches make the same change
43612
698e11f7be6a index: use `index.rev` in `bundlerepo.bundlerevlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43590
diff changeset
    77
                self.bundlerevs.add(self.index.rev(node))
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    78
                continue
45833
88d5abec8f61 bundlerepo: don't insert index tuples with full nodes as linkrev
Joerg Sonnenberger <joerg@bec.de>
parents: 43612
diff changeset
    79
            if cs == node:
88d5abec8f61 bundlerepo: don't insert index tuples with full nodes as linkrev
Joerg Sonnenberger <joerg@bec.de>
parents: 43612
diff changeset
    80
                linkrev = nullrev
88d5abec8f61 bundlerepo: don't insert index tuples with full nodes as linkrev
Joerg Sonnenberger <joerg@bec.de>
parents: 43612
diff changeset
    81
            else:
88d5abec8f61 bundlerepo: don't insert index tuples with full nodes as linkrev
Joerg Sonnenberger <joerg@bec.de>
parents: 43612
diff changeset
    82
                linkrev = linkmapper(cs)
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    83
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    84
            for p in (p1, p2):
43590
5f347567589b index: use `index.has_node` in `bundlerepo.bundlerevlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43581
diff changeset
    85
                if not self.index.has_node(p):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
    86
                    raise error.LookupError(
47169
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47164
diff changeset
    87
                        p, self.display_id, _(b"unknown parent")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
    88
                    )
18416
87f370c5fef5 bundlerepo: store validated deltabase rev in basemap instead of node
Mads Kiilerich <madski@unity3d.com>
parents: 18415
diff changeset
    89
43590
5f347567589b index: use `index.has_node` in `bundlerepo.bundlerevlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43581
diff changeset
    90
            if not self.index.has_node(deltabase):
50032
562f7da122b5 bundlerepo: raise `error.LookupError` instead of `LookupError`
Matt Harbison <matt_harbison@yahoo.com>
parents: 50030
diff changeset
    91
                raise error.LookupError(
47169
96ee8ca99f5a revlog: use revlog.display_id in LookupError
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47164
diff changeset
    92
                    deltabase, self.display_id, _(b'unknown delta base')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
    93
                )
18416
87f370c5fef5 bundlerepo: store validated deltabase rev in basemap instead of node
Mads Kiilerich <madski@unity3d.com>
parents: 18415
diff changeset
    94
87f370c5fef5 bundlerepo: store validated deltabase rev in basemap instead of node
Mads Kiilerich <madski@unity3d.com>
parents: 18415
diff changeset
    95
            baserev = self.rev(deltabase)
47157
47ffc754989a revlog: always "append" full size tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47089
diff changeset
    96
            # start, size, full unc. size, base (unused), link, p1, p2, node, sidedata_offset (unused), sidedata_size (unused)
47404
53289d02037a revlog: use the `entry` function in bundlerepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47400
diff changeset
    97
            e = revlogutils.entry(
53289d02037a revlog: use the `entry` function in bundlerepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47400
diff changeset
    98
                flags=flags,
53289d02037a revlog: use the `entry` function in bundlerepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47400
diff changeset
    99
                data_offset=start,
53289d02037a revlog: use the `entry` function in bundlerepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47400
diff changeset
   100
                data_compressed_length=size,
53289d02037a revlog: use the `entry` function in bundlerepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47400
diff changeset
   101
                data_delta_base=baserev,
53289d02037a revlog: use the `entry` function in bundlerepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47400
diff changeset
   102
                link_rev=linkrev,
53289d02037a revlog: use the `entry` function in bundlerepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47400
diff changeset
   103
                parent_rev_1=self.rev(p1),
53289d02037a revlog: use the `entry` function in bundlerepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47400
diff changeset
   104
                parent_rev_2=self.rev(p2),
53289d02037a revlog: use the `entry` function in bundlerepo
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47400
diff changeset
   105
                node_id=node,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   106
            )
38889
6104b203bec8 index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38198
diff changeset
   107
            self.index.append(e)
18411
8b0f0dd56cec bundlerepo: improve performance for bundle() revset expression
Mads Kiilerich <madski@unity3d.com>
parents: 18410
diff changeset
   108
            self.bundlerevs.add(n)
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   109
            n += 1
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   110
35070
32d079f37207 bundlerepo: make methods agree with base class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35050
diff changeset
   111
    def _chunk(self, rev, df=None):
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
   112
        # Warning: in case of bundle, the diff is against what we stored as
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
   113
        # delta base, not against rev - 1
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   114
        # XXX: could use some caching
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
   115
        if rev <= self.repotiprev:
9676
48bf28d3c8dd bundlerepo: keep the bundlerevlog interface in sync with revlog
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9650
diff changeset
   116
            return revlog.revlog._chunk(self, rev)
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   117
        self.bundle.seek(self.start(rev))
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   118
        return self.bundle.read(self.length(rev))
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   119
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   120
    def revdiff(self, rev1, rev2):
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   121
        """return or calculate a delta between two revisions"""
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
   122
        if rev1 > self.repotiprev and rev2 > self.repotiprev:
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   123
            # hot path for bundle
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
   124
            revb = self.index[rev2][3]
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   125
            if revb == rev1:
9676
48bf28d3c8dd bundlerepo: keep the bundlerevlog interface in sync with revlog
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9650
diff changeset
   126
                return self._chunk(rev2)
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
   127
        elif rev1 <= self.repotiprev and rev2 <= self.repotiprev:
4028
540d1059c802 bundlerepo: it was meant to be revdiff() instead of chunk()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3791
diff changeset
   128
            return revlog.revlog.revdiff(self, rev1, rev2)
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   129
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   130
        return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2))
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   131
42831
c070ca6ed86d bundlerepo: simplify code to take advantage of `_rawtext`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42786
diff changeset
   132
    def _rawtext(self, node, rev, _df=None):
c070ca6ed86d bundlerepo: simplify code to take advantage of `_rawtext`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42786
diff changeset
   133
        if rev is None:
16375
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16195
diff changeset
   134
            rev = self.rev(node)
42831
c070ca6ed86d bundlerepo: simplify code to take advantage of `_rawtext`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42786
diff changeset
   135
        validated = False
31836
4598e8f43e20 bundlerepo: fix raw handling in revision()
Jun Wu <quark@fb.com>
parents: 31835
diff changeset
   136
        rawtext = None
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   137
        chain = []
18415
95b8629fd2de bundlerepo: use rev instead of node for iteration in revision()
Mads Kiilerich <madski@unity3d.com>
parents: 18414
diff changeset
   138
        iterrev = rev
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   139
        # reconstruct the revision if it is from a changegroup
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
   140
        while iterrev > self.repotiprev:
40053
55db747a21ad revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39945
diff changeset
   141
            if self._revisioncache and self._revisioncache[1] == iterrev:
55db747a21ad revlog: rename _cache to _revisioncache
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39945
diff changeset
   142
                rawtext = self._revisioncache[2]
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   143
                break
18415
95b8629fd2de bundlerepo: use rev instead of node for iteration in revision()
Mads Kiilerich <madski@unity3d.com>
parents: 18414
diff changeset
   144
            chain.append(iterrev)
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
   145
            iterrev = self.index[iterrev][3]
42831
c070ca6ed86d bundlerepo: simplify code to take advantage of `_rawtext`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42786
diff changeset
   146
        if iterrev == nullrev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   147
            rawtext = b''
42831
c070ca6ed86d bundlerepo: simplify code to take advantage of `_rawtext`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42786
diff changeset
   148
        elif rawtext is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   149
            r = super(bundlerevlog, self)._rawtext(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   150
                self.node(iterrev), iterrev, _df=_df
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   151
            )
42831
c070ca6ed86d bundlerepo: simplify code to take advantage of `_rawtext`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42786
diff changeset
   152
            __, rawtext, validated = r
c070ca6ed86d bundlerepo: simplify code to take advantage of `_rawtext`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42786
diff changeset
   153
        if chain:
c070ca6ed86d bundlerepo: simplify code to take advantage of `_rawtext`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42786
diff changeset
   154
            validated = False
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   155
        while chain:
9676
48bf28d3c8dd bundlerepo: keep the bundlerevlog interface in sync with revlog
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9650
diff changeset
   156
            delta = self._chunk(chain.pop())
31836
4598e8f43e20 bundlerepo: fix raw handling in revision()
Jun Wu <quark@fb.com>
parents: 31835
diff changeset
   157
            rawtext = mdiff.patches(rawtext, [delta])
42831
c070ca6ed86d bundlerepo: simplify code to take advantage of `_rawtext`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42786
diff changeset
   158
        return rev, rawtext, validated
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   159
35070
32d079f37207 bundlerepo: make methods agree with base class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35050
diff changeset
   160
    def addrevision(self, *args, **kwargs):
32d079f37207 bundlerepo: make methods agree with base class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35050
diff changeset
   161
        raise NotImplementedError
32d079f37207 bundlerepo: make methods agree with base class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35050
diff changeset
   162
32d079f37207 bundlerepo: make methods agree with base class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35050
diff changeset
   163
    def addgroup(self, *args, **kwargs):
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   164
        raise NotImplementedError
35070
32d079f37207 bundlerepo: make methods agree with base class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35050
diff changeset
   165
32d079f37207 bundlerepo: make methods agree with base class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35050
diff changeset
   166
    def strip(self, *args, **kwargs):
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   167
        raise NotImplementedError
35070
32d079f37207 bundlerepo: make methods agree with base class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35050
diff changeset
   168
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   169
    def checksize(self):
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   170
        raise NotImplementedError
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   171
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   172
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
   173
class bundlechangelog(bundlerevlog, changelog.changelog):
35099
90609be10891 bundlerepo: rename "bundle" arguments to "cgunpacker"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35098
diff changeset
   174
    def __init__(self, opener, cgunpacker):
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
   175
        changelog.changelog.__init__(self, opener)
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
   176
        linkmapper = lambda x: x
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   177
        bundlerevlog.__init__(
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   178
            self,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   179
            opener,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   180
            (revlog_constants.KIND_CHANGELOG, None),
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
   181
            self.radix,
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   182
            cgunpacker,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   183
            linkmapper,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   184
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   185
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   186
30383
31de088945cd manifest: add bundlemanifestlog support
Durham Goode <durham@fb.com>
parents: 30218
diff changeset
   187
class bundlemanifest(bundlerevlog, manifest.manifestrevlog):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   188
    def __init__(
46793
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   189
        self,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   190
        nodeconstants,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   191
        opener,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   192
        cgunpacker,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   193
        linkmapper,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   194
        dirlogstarts=None,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   195
        dir=b'',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   196
    ):
46793
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   197
        manifest.manifestrevlog.__init__(self, nodeconstants, opener, tree=dir)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   198
        bundlerevlog.__init__(
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   199
            self,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   200
            opener,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   201
            (revlog_constants.KIND_MANIFESTLOG, dir),
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
   202
            self._revlog.radix,
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   203
            cgunpacker,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   204
            linkmapper,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   205
        )
29728
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   206
        if dirlogstarts is None:
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   207
            dirlogstarts = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   208
            if self.bundle.version == b"03":
29728
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   209
                dirlogstarts = _getfilestarts(self.bundle)
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   210
        self._dirlogstarts = dirlogstarts
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   211
        self._linkmapper = linkmapper
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   212
29728
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   213
    def dirlog(self, d):
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   214
        if d in self._dirlogstarts:
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   215
            self.bundle.seek(self._dirlogstarts[d])
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   216
            return bundlemanifest(
46793
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   217
                self.nodeconstants,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   218
                self.opener,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   219
                self.bundle,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   220
                self._linkmapper,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   221
                self._dirlogstarts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   222
                dir=d,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   223
            )
29728
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   224
        return super(bundlemanifest, self).dirlog(d)
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   225
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   226
37497
1541e1a8e87d filelog: wrap revlog instead of inheriting it (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37331
diff changeset
   227
class bundlefilelog(filelog.filelog):
35099
90609be10891 bundlerepo: rename "bundle" arguments to "cgunpacker"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35098
diff changeset
   228
    def __init__(self, opener, path, cgunpacker, linkmapper):
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
   229
        filelog.filelog.__init__(self, opener, path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   230
        self._revlog = bundlerevlog(
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   231
            opener,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   232
            # XXX should use the unencoded path
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   233
            target=(revlog_constants.KIND_FILELOG, path),
47164
8d3c2f9d4af7 revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47162
diff changeset
   234
            radix=self._revlog.radix,
47089
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   235
            cgunpacker=cgunpacker,
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47055
diff changeset
   236
            linkmapper=linkmapper,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   237
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   238
14287
7c231754a621 filelog: add file function to open other filelogs
Sune Foldager <cryo@cyanite.org>
parents: 14190
diff changeset
   239
17193
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   240
class bundlepeer(localrepo.localpeer):
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   241
    def canpush(self):
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   242
        return False
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   243
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   244
23631
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   245
class bundlephasecache(phases.phasecache):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   246
    def __init__(self, *args, **kwargs):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   247
        super(bundlephasecache, self).__init__(*args, **kwargs)
43115
4aa72cdf616f py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents: 43077
diff changeset
   248
        if util.safehasattr(self, 'opener'):
31250
5f68e7341ada vfs: use 'vfs' module directly in 'mercurial.bundlerepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30944
diff changeset
   249
            self.opener = vfsmod.readonlyvfs(self.opener)
23631
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   250
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   251
    def write(self):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   252
        raise NotImplementedError
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   253
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   254
    def _write(self, fp):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   255
        raise NotImplementedError
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   256
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   257
    def _updateroots(self, phase, newroots, tr):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   258
        self.phaseroots[phase] = newroots
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   259
        self.invalidate()
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   260
        self.dirty = True
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   261
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   262
35099
90609be10891 bundlerepo: rename "bundle" arguments to "cgunpacker"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35098
diff changeset
   263
def _getfilestarts(cgunpacker):
35100
cd4cd7b94ff1 bundlerepo: rename "bundlefilespos" variable and attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35099
diff changeset
   264
    filespos = {}
35099
90609be10891 bundlerepo: rename "bundle" arguments to "cgunpacker"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35098
diff changeset
   265
    for chunkdata in iter(cgunpacker.filelogheader, {}):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   266
        fname = chunkdata[b'filename']
35100
cd4cd7b94ff1 bundlerepo: rename "bundlefilespos" variable and attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35099
diff changeset
   267
        filespos[fname] = cgunpacker.tell()
35099
90609be10891 bundlerepo: rename "bundle" arguments to "cgunpacker"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35098
diff changeset
   268
        for chunk in iter(lambda: cgunpacker.deltachunk(None), {}):
29725
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   269
            pass
35100
cd4cd7b94ff1 bundlerepo: rename "bundlefilespos" variable and attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35099
diff changeset
   270
    return filespos
29725
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   271
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   272
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
   273
class bundlerepository:
35073
d2458ba810c5 bundlerepo: add docstring for bundlerepository class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35072
diff changeset
   274
    """A repository instance that is a union of a local repo and a bundle.
d2458ba810c5 bundlerepo: add docstring for bundlerepository class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35072
diff changeset
   275
d2458ba810c5 bundlerepo: add docstring for bundlerepository class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35072
diff changeset
   276
    Instances represent a read-only repository composed of a local repository
d2458ba810c5 bundlerepo: add docstring for bundlerepository class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35072
diff changeset
   277
    with the contents of a bundle file applied. The repository instance is
d2458ba810c5 bundlerepo: add docstring for bundlerepository class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35072
diff changeset
   278
    conceptually similar to the state of a repository after an
d2458ba810c5 bundlerepo: add docstring for bundlerepository class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35072
diff changeset
   279
    ``hg unbundle`` operation. However, the contents of the bundle are never
d2458ba810c5 bundlerepo: add docstring for bundlerepository class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35072
diff changeset
   280
    applied to the actual base repository.
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   281
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   282
    Instances constructed directly are not usable as repository objects.
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   283
    Use instance() or makebundlerepository() to create instances.
35073
d2458ba810c5 bundlerepo: add docstring for bundlerepository class
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35072
diff changeset
   284
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   285
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   286
    def __init__(self, bundlepath, url, tempparent):
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   287
        self._tempparent = tempparent
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   288
        self._url = url
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   289
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   290
        self.ui.setconfig(b'phases', b'publish', False, b'bundlerepo')
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2273
diff changeset
   291
2273
f116ddea537f add support for compressed bundle repositories
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2257
diff changeset
   292
        self.tempfile = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   293
        f = util.posixfile(bundlepath, b"rb")
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   294
        bundle = exchange.readbundle(self.ui, f, bundlepath)
12044
bcc7139521b7 bundlerepo: remove duplication of bundle decompressors
Matt Mackall <mpm@selenic.com>
parents: 11154
diff changeset
   295
35076
495fcff10124 bundlerepo: assign bundle attributes in bundle type blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35075
diff changeset
   296
        if isinstance(bundle, bundle2.unbundle20):
495fcff10124 bundlerepo: assign bundle attributes in bundle type blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35075
diff changeset
   297
            self._bundlefile = bundle
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   298
            self._cgunpacker = None
35076
495fcff10124 bundlerepo: assign bundle attributes in bundle type blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35075
diff changeset
   299
35136
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   300
            cgpart = None
35137
da91e7309daf bundle2: don't use seekable bundle2 parts by default (issue5691)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35136
diff changeset
   301
            for part in bundle.iterparts(seekable=True):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   302
                if part.type == b'changegroup':
35136
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   303
                    if cgpart:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   304
                        raise NotImplementedError(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43115
diff changeset
   305
                            b"can't process multiple changegroups"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   306
                        )
35136
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   307
                    cgpart = part
24073
ff5caa8dfd99 bundlerepo: basic bundle2 support
Eric Sumner <ericsumner@fb.com>
parents: 24072
diff changeset
   308
35076
495fcff10124 bundlerepo: assign bundle attributes in bundle type blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35075
diff changeset
   309
                self._handlebundle2part(bundle, part)
24073
ff5caa8dfd99 bundlerepo: basic bundle2 support
Eric Sumner <ericsumner@fb.com>
parents: 24072
diff changeset
   310
35136
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   311
            if not cgpart:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   312
                raise error.Abort(_(b"No changegroups found"))
35136
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   313
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   314
            # This is required to placate a later consumer, which expects
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   315
            # the payload offset to be at the beginning of the changegroup.
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   316
            # We need to do this after the iterparts() generator advances
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   317
            # because iterparts() will seek to end of payload after the
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   318
            # generator returns control to iterparts().
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   319
            cgpart.seek(0, os.SEEK_SET)
2b72bc88043f bundle2: only seek to beginning of part in bundlerepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35100
diff changeset
   320
35076
495fcff10124 bundlerepo: assign bundle attributes in bundle type blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35075
diff changeset
   321
        elif isinstance(bundle, changegroup.cg1unpacker):
495fcff10124 bundlerepo: assign bundle attributes in bundle type blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35075
diff changeset
   322
            if bundle.compressed():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   323
                f = self._writetempbundle(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   324
                    bundle.read, b'.hg10un', header=b'HG10UN'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   325
                )
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   326
                bundle = exchange.readbundle(self.ui, f, bundlepath, self.vfs)
35076
495fcff10124 bundlerepo: assign bundle attributes in bundle type blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35075
diff changeset
   327
495fcff10124 bundlerepo: assign bundle attributes in bundle type blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35075
diff changeset
   328
            self._bundlefile = bundle
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   329
            self._cgunpacker = bundle
35074
4f04c9207a76 bundlerepo: don't assume there are only two bundle classes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35073
diff changeset
   330
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   331
            raise error.Abort(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   332
                _(b'bundle type %s cannot be read') % type(bundle)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   333
            )
26801
73bf76bf6f14 bundlerepo: uncompress changegroup in bundle1 case only
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26800
diff changeset
   334
35100
cd4cd7b94ff1 bundlerepo: rename "bundlefilespos" variable and attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35099
diff changeset
   335
        # dict with the mapping 'filename' -> position in the changegroup.
cd4cd7b94ff1 bundlerepo: rename "bundlefilespos" variable and attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35099
diff changeset
   336
        self._cgfilespos = {}
5262
a35756389ef4 Make bundlerepo lazier
Brendan Cully <brendan@kublai.com>
parents: 5167
diff changeset
   337
23632
e7fcf58acd71 bundlerepo: retract phase boundary
Eric Sumner <ericsumner@fb.com>
parents: 23631
diff changeset
   338
        self.firstnewrev = self.changelog.repotiprev + 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   339
        phases.retractboundary(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   340
            self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   341
            None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   342
            phases.draft,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   343
            [ctx.node() for ctx in self[self.firstnewrev :]],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   344
        )
23632
e7fcf58acd71 bundlerepo: retract phase boundary
Eric Sumner <ericsumner@fb.com>
parents: 23631
diff changeset
   345
35076
495fcff10124 bundlerepo: assign bundle attributes in bundle type blocks
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35075
diff changeset
   346
    def _handlebundle2part(self, bundle, part):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   347
        if part.type != b'changegroup':
35098
3eeb0a3eeaed bundlerepo: use early return
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35077
diff changeset
   348
            return
33907
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   349
35098
3eeb0a3eeaed bundlerepo: use early return
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35077
diff changeset
   350
        cgstream = part
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   351
        version = part.params.get(b'version', b'01')
35098
3eeb0a3eeaed bundlerepo: use early return
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35077
diff changeset
   352
        legalcgvers = changegroup.supportedincomingversions(self)
3eeb0a3eeaed bundlerepo: use early return
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35077
diff changeset
   353
        if version not in legalcgvers:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   354
            msg = _(b'Unsupported changegroup version: %s')
35098
3eeb0a3eeaed bundlerepo: use early return
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35077
diff changeset
   355
            raise error.Abort(msg % version)
3eeb0a3eeaed bundlerepo: use early return
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35077
diff changeset
   356
        if bundle.compressed():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   357
            cgstream = self._writetempbundle(part.read, b'.cg%sun' % version)
35098
3eeb0a3eeaed bundlerepo: use early return
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35077
diff changeset
   358
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   359
        self._cgunpacker = changegroup.getunbundler(version, cgstream, b'UN')
33907
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   360
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   361
    def _writetempbundle(self, readfn, suffix, header=b''):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   362
        """Write a temporary file to disk"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   363
        fdtemp, temp = self.vfs.mkstemp(prefix=b"hg-bundle-", suffix=suffix)
33905
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   364
        self.tempfile = temp
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   365
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   366
        with os.fdopen(fdtemp, 'wb') as fptemp:
33905
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   367
            fptemp.write(header)
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   368
            while True:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   369
                chunk = readfn(2 ** 18)
33905
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   370
                if not chunk:
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   371
                    break
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   372
                fptemp.write(chunk)
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   373
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   374
        return self.vfs.open(self.tempfile, mode=b"rb")
33905
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   375
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17913
diff changeset
   376
    @localrepo.unfilteredpropertycache
23631
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   377
    def _phasecache(self):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   378
        return bundlephasecache(self, self._phasedefaults)
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   379
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   380
    @localrepo.unfilteredpropertycache
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   381
    def changelog(self):
14144
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14142
diff changeset
   382
        # consume the header if it exists
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   383
        self._cgunpacker.changelogheader()
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   384
        c = bundlechangelog(self.svfs, self._cgunpacker)
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   385
        self.manstart = self._cgunpacker.tell()
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   386
        return c
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   387
42182
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41041
diff changeset
   388
    def _refreshchangelog(self):
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41041
diff changeset
   389
        # changelog for bundle repo are not filecache, this method is not
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41041
diff changeset
   390
        # applicable.
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41041
diff changeset
   391
        pass
3472a3f9d785 localrepo: introduce a `_refreshchangelog` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 41041
diff changeset
   392
39779
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39620
diff changeset
   393
    @localrepo.unfilteredpropertycache
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39620
diff changeset
   394
    def manifestlog(self):
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   395
        self._cgunpacker.seek(self.manstart)
14144
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14142
diff changeset
   396
        # consume the header if it exists
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   397
        self._cgunpacker.manifestheader()
28221
7a8c44844f57 bundlerepo: properly handle hidden linkrev in manifestlog (issue4945)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28186
diff changeset
   398
        linkmapper = self.unfiltered().changelog.rev
46793
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   399
        rootstore = bundlemanifest(
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   400
            self.nodeconstants, self.svfs, self._cgunpacker, linkmapper
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46724
diff changeset
   401
        )
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   402
        self.filestart = self._cgunpacker.tell()
39779
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39620
diff changeset
   403
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   404
        return manifest.manifestlog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   405
            self.svfs, self, rootstore, self.narrowmatch()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   406
        )
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   407
35050
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   408
    def _consumemanifest(self):
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   409
        """Consumes the manifest portion of the bundle, setting filestart so the
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   410
        file portion can be read."""
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   411
        self._cgunpacker.seek(self.manstart)
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   412
        self._cgunpacker.manifestheader()
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   413
        for delta in self._cgunpacker.deltaiter():
35050
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   414
            pass
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   415
        self.filestart = self._cgunpacker.tell()
35050
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   416
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17913
diff changeset
   417
    @localrepo.unfilteredpropertycache
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   418
    def manstart(self):
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   419
        self.changelog
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   420
        return self.manstart
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   421
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17913
diff changeset
   422
    @localrepo.unfilteredpropertycache
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   423
    def filestart(self):
30385
11b8b740d54a manifest: remove last uses of repo.manifest
Durham Goode <durham@fb.com>
parents: 30383
diff changeset
   424
        self.manifestlog
35050
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   425
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   426
        # If filestart was not set by self.manifestlog, that means the
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   427
        # manifestlog implementation did not consume the manifests from the
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   428
        # changegroup (ex: it might be consuming trees from a separate bundle2
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   429
        # part instead). So we need to manually consume it.
43554
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   430
        if 'filestart' not in self.__dict__:
35050
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   431
            self._consumemanifest()
a2dfc723b6b5 bundle: allow bundlerepo to support alternative manifest implementations
Durham Goode <durham@fb.com>
parents: 34300
diff changeset
   432
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   433
        return self.filestart
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   434
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2273
diff changeset
   435
    def url(self):
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2273
diff changeset
   436
        return self._url
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2273
diff changeset
   437
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   438
    def file(self, f):
35100
cd4cd7b94ff1 bundlerepo: rename "bundlefilespos" variable and attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35099
diff changeset
   439
        if not self._cgfilespos:
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   440
            self._cgunpacker.seek(self.filestart)
35100
cd4cd7b94ff1 bundlerepo: rename "bundlefilespos" variable and attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35099
diff changeset
   441
            self._cgfilespos = _getfilestarts(self._cgunpacker)
5262
a35756389ef4 Make bundlerepo lazier
Brendan Cully <brendan@kublai.com>
parents: 5167
diff changeset
   442
35100
cd4cd7b94ff1 bundlerepo: rename "bundlefilespos" variable and attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35099
diff changeset
   443
        if f in self._cgfilespos:
cd4cd7b94ff1 bundlerepo: rename "bundlefilespos" variable and attribute
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35099
diff changeset
   444
            self._cgunpacker.seek(self._cgfilespos[f])
28186
5ab6f0fde75f bundlerepo: properly handle hidden linkrev in filelog (issue4945)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27953
diff changeset
   445
            linkmapper = self.unfiltered().changelog.rev
35077
3f393e4593f2 bundlerepo: rename _bundle to _cgunpacker
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35076
diff changeset
   446
            return bundlefilelog(self.svfs, f, self._cgunpacker, linkmapper)
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   447
        else:
37331
c68262401c8c bundlerepo: use super() when calling file()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36843
diff changeset
   448
            return super(bundlerepository, self).file(f)
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   449
12347
6277a9469dff bundlerepo: restore close() method
Matt Mackall <mpm@selenic.com>
parents: 12335
diff changeset
   450
    def close(self):
6277a9469dff bundlerepo: restore close() method
Matt Mackall <mpm@selenic.com>
parents: 12335
diff changeset
   451
        """Close assigned bundle file immediately."""
35075
df2a676a2e9e bundlerepo: make bundle and bundlefile attributes private
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35074
diff changeset
   452
        self._bundlefile.close()
12962
ff083040a555 bundlerepository: get rid of temporary bundle files (issue2478)
Klaus Koch <kuk42@gmx.net>
parents: 12961
diff changeset
   453
        if self.tempfile is not None:
20981
4fdd1172d37e bundlerepo: treat temporarily extracted bundle file via vfs
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20790
diff changeset
   454
            self.vfs.unlink(self.tempfile)
6314
9a1c59283ad3 Add ability to directly clone from all-history bundles
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 6312
diff changeset
   455
        if self._tempparent:
9a1c59283ad3 Add ability to directly clone from all-history bundles
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 6312
diff changeset
   456
            shutil.rmtree(self._tempparent, True)
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   457
6315
5c96a4bca66b clone: use cancopy
Matt Mackall <mpm@selenic.com>
parents: 6314
diff changeset
   458
    def cancopy(self):
5c96a4bca66b clone: use cancopy
Matt Mackall <mpm@selenic.com>
parents: 6314
diff changeset
   459
        return False
5c96a4bca66b clone: use cancopy
Matt Mackall <mpm@selenic.com>
parents: 6314
diff changeset
   460
49865
ff7134e03629 peer: have `repo.peer` take an optional `path` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
   461
    def peer(self, path=None):
ff7134e03629 peer: have `repo.peer` take an optional `path` argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49037
diff changeset
   462
        return bundlepeer(self, path=path)
17193
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   463
7435
5e13df32fb74 bundlerepo doesn't really have a dirstate, throw AttributeError if requested
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6953
diff changeset
   464
    def getcwd(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   465
        return encoding.getcwd()  # always outside the repo
7435
5e13df32fb74 bundlerepo doesn't really have a dirstate, throw AttributeError if requested
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6953
diff changeset
   466
28714
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   467
    # Check if parents exist in localrepo before setting
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
   468
    def setparents(self, p1, p2=None):
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
   469
        if p2 is None:
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46907
diff changeset
   470
            p2 = self.nullid
28714
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   471
        p1rev = self.changelog.rev(p1)
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   472
        p2rev = self.changelog.rev(p2)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   473
        msg = _(b"setting parent to node %s that only exists in the bundle\n")
28714
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   474
        if self.changelog.repotiprev < p1rev:
46114
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
   475
            self.ui.warn(msg % hex(p1))
28714
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   476
        if self.changelog.repotiprev < p2rev:
46114
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
   477
            self.ui.warn(msg % hex(p2))
28714
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   478
        return super(bundlerepository, self).setparents(p1, p2)
15597
bc0778f5619a bundlerepo: don't write branch cache to disk
Sune Foldager <cryo@cyanite.org>
parents: 15091
diff changeset
   479
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   480
39565
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39271
diff changeset
   481
def instance(ui, path, create, intents=None, createopts=None):
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   482
    if create:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   483
        raise error.Abort(_(b'cannot create new bundle repository'))
25830
5418dd5be8ac bundlerepo: mark internal-only config variable
Matt Mackall <mpm@selenic.com>
parents: 24921
diff changeset
   484
    # internal config: bundle.mainreporoot
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   485
    parentpath = ui.config(b"bundle", b"mainreporoot")
16042
4b7aa1c899dc bundlerepo: try to find containing repo on creation (issue1812)
Matt Mackall <mpm@selenic.com>
parents: 15597
diff changeset
   486
    if not parentpath:
4b7aa1c899dc bundlerepo: try to find containing repo on creation (issue1812)
Matt Mackall <mpm@selenic.com>
parents: 15597
diff changeset
   487
        # try to find the correct path to the working directory repo
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39779
diff changeset
   488
        parentpath = cmdutil.findrepo(encoding.getcwd())
16042
4b7aa1c899dc bundlerepo: try to find containing repo on creation (issue1812)
Matt Mackall <mpm@selenic.com>
parents: 15597
diff changeset
   489
        if parentpath is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   490
            parentpath = b''
5664
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   491
    if parentpath:
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   492
        # Try to make the full path relative so we get a nice, short URL.
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   493
        # In particular, we don't want temp dir names in test outputs.
39823
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39779
diff changeset
   494
        cwd = encoding.getcwd()
5664
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   495
        if parentpath == cwd:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   496
            parentpath = b''
5664
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   497
        else:
24834
6e31e1274080 bundlerepo: use pathutil.normasprefix to ensure os.sep at the end of cwd
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24686
diff changeset
   498
            cwd = pathutil.normasprefix(cwd)
5664
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   499
            if parentpath.startswith(cwd):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   500
                parentpath = parentpath[len(cwd) :]
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46793
diff changeset
   501
    u = urlutil.url(path)
13826
e574207e3bcd url: refactor util.drop_scheme() and hg.localpath() into url.localpath()
Brodie Rao <brodie@bitheap.org>
parents: 13742
diff changeset
   502
    path = u.localpath()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   503
    if u.scheme == b'bundle':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   504
        s = path.split(b"+", 1)
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   505
        if len(s) == 1:
5664
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   506
            repopath, bundlename = parentpath, s[0]
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   507
        else:
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   508
            repopath, bundlename = s
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   509
    else:
5664
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   510
        repopath, bundlename = parentpath, path
39619
a8d2faeca49e bundlerepo: factor out code for instantiating a bundle repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39618
diff changeset
   511
a8d2faeca49e bundlerepo: factor out code for instantiating a bundle repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39618
diff changeset
   512
    return makebundlerepository(ui, repopath, bundlename)
a8d2faeca49e bundlerepo: factor out code for instantiating a bundle repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39618
diff changeset
   513
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   514
39619
a8d2faeca49e bundlerepo: factor out code for instantiating a bundle repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39618
diff changeset
   515
def makebundlerepository(ui, repopath, bundlepath):
a8d2faeca49e bundlerepo: factor out code for instantiating a bundle repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39618
diff changeset
   516
    """Make a bundle repository object based on repo and bundle paths."""
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   517
    if repopath:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   518
        url = b'bundle:%s+%s' % (util.expandpath(repopath), bundlepath)
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   519
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   520
        url = b'bundle:%s' % bundlepath
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   521
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   522
    # Because we can't make any guarantees about the type of the base
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   523
    # repository, we can't have a static class representing the bundle
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   524
    # repository. We also can't make any guarantees about how to even
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   525
    # call the base repository's constructor!
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   526
    #
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   527
    # So, our strategy is to go through ``localrepo.instance()`` to construct
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   528
    # a repo instance. Then, we dynamically create a new type derived from
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   529
    # both it and our ``bundlerepository`` class which overrides some
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   530
    # functionality. We then change the type of the constructed repository
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   531
    # to this new type and initialize the bundle-specific bits of it.
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   532
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   533
    try:
39945
75b53b809e87 bundlerepo: remove a variable alias
Martin von Zweigbergk <martinvonz@google.com>
parents: 39823
diff changeset
   534
        repo = localrepo.instance(ui, repopath, create=False)
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   535
        tempparent = None
49648
84680c003d44 bundlerepo: enforce the requirements declared by the underlying repository
Matt Harbison <matt_harbison@yahoo.com>
parents: 49037
diff changeset
   536
    except error.RequirementError:
84680c003d44 bundlerepo: enforce the requirements declared by the underlying repository
Matt Harbison <matt_harbison@yahoo.com>
parents: 49037
diff changeset
   537
        raise  # no fallback if the backing repo is unsupported
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   538
    except error.RepoError:
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   539
        tempparent = pycompat.mkdtemp()
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   540
        try:
39945
75b53b809e87 bundlerepo: remove a variable alias
Martin von Zweigbergk <martinvonz@google.com>
parents: 39823
diff changeset
   541
            repo = localrepo.instance(ui, tempparent, create=True)
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   542
        except Exception:
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   543
            shutil.rmtree(tempparent)
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   544
            raise
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   545
39945
75b53b809e87 bundlerepo: remove a variable alias
Martin von Zweigbergk <martinvonz@google.com>
parents: 39823
diff changeset
   546
    class derivedbundlerepository(bundlerepository, repo.__class__):
39620
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   547
        pass
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   548
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   549
    repo.__class__ = derivedbundlerepository
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   550
    bundlerepository.__init__(repo, bundlepath, url, tempparent)
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   551
335ae4d0a552 bundlerepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39619
diff changeset
   552
    return repo
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   553
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   554
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
   555
class bundletransactionmanager:
23633
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   556
    def transaction(self):
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   557
        return None
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   558
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   559
    def close(self):
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   560
        raise NotImplementedError
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   561
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   562
    def release(self):
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   563
        raise NotImplementedError
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   564
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   565
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   566
def getremotechanges(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   567
    ui, repo, peer, onlyheads=None, bundlename=None, force=False
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   568
):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   569
    """obtains a bundle of changes incoming from peer
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   570
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   571
    "onlyheads" restricts the returned changes to those reachable from the
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   572
      specified heads.
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   573
    "bundlename", if given, stores the bundle to this file path permanently;
14190
8aab5a82685f bundlerepo: fix closing and docstring of getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14161
diff changeset
   574
      otherwise it's stored to a temp file and gets deleted again when you call
8aab5a82685f bundlerepo: fix closing and docstring of getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14161
diff changeset
   575
      the returned "cleanupfn".
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   576
    "force" indicates whether to proceed on unrelated repos.
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   577
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   578
    Returns a tuple (local, csets, cleanupfn):
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   579
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   580
    "local" is a local repo from which to obtain the actual incoming
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   581
      changesets; it is a bundlerepo for the obtained bundle when the
37642
d959277ff1b5 bundlerepo: rename "other" to "peer"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   582
      original "peer" is remote.
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   583
    "csets" lists the incoming changeset node ids.
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   584
    "cleanupfn" must be called without arguments when you're done processing
37642
d959277ff1b5 bundlerepo: rename "other" to "peer"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   585
      the changes; it closes both the original "peer" and the one returned
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   586
      here.
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   587
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   588
    tmp = discovery.findcommonincoming(repo, peer, heads=onlyheads, force=force)
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   589
    common, incoming, rheads = tmp
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   590
    if not incoming:
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   591
        try:
15091
106f89299da6 bundlerepo: add argument check before unlink
Sune Foldager <cryo@cyanite.org>
parents: 14494
diff changeset
   592
            if bundlename:
21694
c08a22bfa16e bundlerepo: backout dbf292f65b09
Matt Mackall <mpm@selenic.com>
parents: 21562
diff changeset
   593
                os.unlink(bundlename)
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13826
diff changeset
   594
        except OSError:
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   595
            pass
37642
d959277ff1b5 bundlerepo: rename "other" to "peer"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   596
        return repo, [], peer.close
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   597
22182
510cafe72004 incoming: don't request heads that already are common
Mads Kiilerich <madski@unity3d.com>
parents: 21694
diff changeset
   598
    commonset = set(common)
510cafe72004 incoming: don't request heads that already are common
Mads Kiilerich <madski@unity3d.com>
parents: 21694
diff changeset
   599
    rheads = [x for x in rheads if x not in commonset]
510cafe72004 incoming: don't request heads that already are common
Mads Kiilerich <madski@unity3d.com>
parents: 21694
diff changeset
   600
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   601
    bundle = None
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   602
    bundlerepo = None
37642
d959277ff1b5 bundlerepo: rename "other" to "peer"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   603
    localrepo = peer.local()
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 16686
diff changeset
   604
    if bundlename or not localrepo:
37642
d959277ff1b5 bundlerepo: rename "other" to "peer"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   605
        # create a bundle (uncompressed if peer repo is not local)
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   606
29698
ff5d5751fc1b bundlerepo: also read the 'devel.legacy.exchange' config
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
   607
        # developer config: devel.legacy.exchange
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   608
        legexc = ui.configlist(b'devel', b'legacy.exchange')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   609
        forcebundle1 = b'bundle2' not in legexc and b'bundle1' in legexc
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   610
        canbundle2 = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   611
            not forcebundle1
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   612
            and peer.capable(b'getbundle')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   613
            and peer.capable(b'bundle2')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   614
        )
26544
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   615
        if canbundle2:
37643
1aa4d646d0de bundlerepo: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37642
diff changeset
   616
            with peer.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   617
                b2 = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   618
                    b'getbundle',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   619
                    {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   620
                        b'source': b'incoming',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   621
                        b'common': common,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   622
                        b'heads': rheads,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   623
                        b'bundlecaps': exchange.caps20to10(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   624
                            repo, role=b'client'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   625
                        ),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   626
                        b'cg': True,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   627
                    },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   628
                ).result()
37643
1aa4d646d0de bundlerepo: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37642
diff changeset
   629
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   630
                fname = bundle = changegroup.writechunks(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   631
                    ui, b2._forwardchunks(), bundlename
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   632
                )
26544
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   633
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   634
            if peer.capable(b'getbundle'):
37643
1aa4d646d0de bundlerepo: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37642
diff changeset
   635
                with peer.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   636
                    cg = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   637
                        b'getbundle',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   638
                        {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   639
                            b'source': b'incoming',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   640
                            b'common': common,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   641
                            b'heads': rheads,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   642
                        },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   643
                    ).result()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   644
            elif onlyheads is None and not peer.capable(b'changegroupsubset'):
26543
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   645
                # compat with older servers when pulling all remote heads
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37497
diff changeset
   646
37642
d959277ff1b5 bundlerepo: rename "other" to "peer"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   647
                with peer.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   648
                    cg = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   649
                        b'changegroup',
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   650
                        {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   651
                            b'nodes': incoming,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   652
                            b'source': b'incoming',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   653
                        },
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   654
                    ).result()
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37497
diff changeset
   655
26543
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   656
                rheads = None
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   657
            else:
37642
d959277ff1b5 bundlerepo: rename "other" to "peer"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   658
                with peer.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   659
                    cg = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   660
                        b'changegroupsubset',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   661
                        {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   662
                            b'bases': incoming,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   663
                            b'heads': rheads,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   664
                            b'source': b'incoming',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   665
                        },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   666
                    ).result()
37635
cc8c06835097 wireproto: convert legacy commands to command executor
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37497
diff changeset
   667
26543
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   668
            if localrepo:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   669
                bundletype = b"HG10BZ"
26543
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   670
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   671
                bundletype = b"HG10UN"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   672
            fname = bundle = bundle2.writebundle(ui, cg, bundlename, bundletype)
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   673
        # keep written bundle?
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   674
        if bundlename:
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   675
            bundle = None
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 16686
diff changeset
   676
        if not localrepo:
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   677
            # use the created uncompressed bundlerepo
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   678
            localrepo = bundlerepo = makebundlerepository(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   679
                repo.baseui, repo.root, fname
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   680
            )
39619
a8d2faeca49e bundlerepo: factor out code for instantiating a bundle repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39618
diff changeset
   681
37642
d959277ff1b5 bundlerepo: rename "other" to "peer"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   682
            # this repo contains local and peer now, so filter out local again
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   683
            common = repo.heads()
18568
cd403d6d96ef incoming: fix incoming when a local head is remotely filtered (issue3805)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18418
diff changeset
   684
    if localrepo:
cd403d6d96ef incoming: fix incoming when a local head is remotely filtered (issue3805)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18418
diff changeset
   685
        # Part of common may be remotely filtered
cd403d6d96ef incoming: fix incoming when a local head is remotely filtered (issue3805)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18418
diff changeset
   686
        # So use an unfiltered version
cd403d6d96ef incoming: fix incoming when a local head is remotely filtered (issue3805)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18418
diff changeset
   687
        # The discovery process probably need cleanup to avoid that
cd403d6d96ef incoming: fix incoming when a local head is remotely filtered (issue3805)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18418
diff changeset
   688
        localrepo = localrepo.unfiltered()
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   689
14412
9ac479758d3b bundlerepo: make getremotechanges support filtering of incoming
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14287
diff changeset
   690
    csets = localrepo.changelog.findmissing(common, rheads)
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   691
23633
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   692
    if bundlerepo:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   693
        reponodes = [ctx.node() for ctx in bundlerepo[bundlerepo.firstnewrev :]]
37643
1aa4d646d0de bundlerepo: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37642
diff changeset
   694
1aa4d646d0de bundlerepo: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37642
diff changeset
   695
        with peer.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   696
            remotephases = e.callcommand(
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   697
                b'listkeys',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   698
                {
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   699
                    b'namespace': b'phases',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45833
diff changeset
   700
                },
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42833
diff changeset
   701
            ).result()
23633
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   702
48253
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47404
diff changeset
   703
        pullop = exchange.pulloperation(
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47404
diff changeset
   704
            bundlerepo, peer, path=None, heads=reponodes
7d1e60244561 path: keep the path instance in the `pulloperation`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47404
diff changeset
   705
        )
23633
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   706
        pullop.trmanager = bundletransactionmanager()
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   707
        exchange._pullapplyphases(pullop, remotephases)
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   708
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   709
    def cleanup():
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   710
        if bundlerepo:
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   711
            bundlerepo.close()
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   712
        if bundle:
21694
c08a22bfa16e bundlerepo: backout dbf292f65b09
Matt Mackall <mpm@selenic.com>
parents: 21562
diff changeset
   713
            os.unlink(bundle)
37642
d959277ff1b5 bundlerepo: rename "other" to "peer"
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37635
diff changeset
   714
        peer.close()
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   715
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   716
    return (localrepo, csets, cleanup)