mercurial/bundlerepo.py
author Boris Feld <boris.feld@octobus.net>
Tue, 26 Sep 2017 15:55:01 +0200
changeset 34330 6c7aaf59b21e
parent 34300 0fe62d8bdd50
child 35050 a2dfc723b6b5
permissions -rw-r--r--
pull: remove inadequate use of operations records to update stepdone The 'stepdone' set is design to be a client side mechanism. If the client used some advanced capabilities to request necessary information (changeset, obsmarkers, phases, etc). It marks the steps as done to avoid having a less advanced mechanism issue a duplicated request. So, the "stepdone.add('phases')" should be the result of a client choice, because only the client can know it has requested all it needed to request. In 4a08cf1a2cfe this principle was broken because any phase-heads part sent by the server to the client would declare the phases retrieval complete. Now that there is an official phases related capability and code associated to it. We do not need the change in 4a08cf1a2cfe anymore and we can back it out. This brings back 'stepdone' management for 'phases' in line with the rest of the code (including other phases handing). Here is an example of potential misbehavior that 4a08cf1a2cfe introduced: Imagine a server that pre-computes bundles. The bundles contains a changegroup part and an (advisory) 'phase-heads' part. When a pull occurs, precomputed bundled are reused if available. As the phase part is advisory it can be sent to all clients. However they could be relevant changesets without phase information. Either because they are already common or because they had no precomputed bundle for them yet. If receiving any 'phase-heads' parts disable subsequent phases re-trivial parts, the client will not request phase data for all relevant changesets. For example common changesets will not turn public.
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
from __future__ import absolute_import
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    15
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    16
import os
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    17
import shutil
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    18
import tempfile
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    19
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    20
from .i18n import _
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    21
from .node import nullid
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    22
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    23
from . import (
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    24
    bundle2,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    25
    changegroup,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    26
    changelog,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    27
    cmdutil,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    28
    discovery,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    29
    error,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    30
    exchange,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    31
    filelog,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    32
    localrepo,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    33
    manifest,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    34
    mdiff,
28714
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
    35
    node as nodemod,
25920
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    36
    pathutil,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    37
    phases,
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30385
diff changeset
    38
    pycompat,
25920
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    39
    revlog,
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    40
    util,
31250
5f68e7341ada vfs: use 'vfs' module directly in 'mercurial.bundlerepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30944
diff changeset
    41
    vfs as vfsmod,
25920
5aaf51c14fea bundlerepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25830
diff changeset
    42
)
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    43
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
    44
class bundlerevlog(revlog.revlog):
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    45
    def __init__(self, opener, indexfile, bundle, 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
    46
        # How it works:
18410
de7dac2a58e8 bundlerepo: fix outdated comment
Mads Kiilerich <madski@unity3d.com>
parents: 18216
diff changeset
    47
        # 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
    48
        # 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
    49
        # (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
    50
        #
18410
de7dac2a58e8 bundlerepo: fix outdated comment
Mads Kiilerich <madski@unity3d.com>
parents: 18216
diff changeset
    51
        # 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
    52
        # 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
    53
        opener = vfsmod.readonlyvfs(opener)
4257
1b5c38e9d7aa revlog: don't pass datafile as an argument
Matt Mackall <mpm@selenic.com>
parents: 4029
diff changeset
    54
        revlog.revlog.__init__(self, opener, indexfile)
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
    55
        self.bundle = bundle
6750
fb42030d79d6 add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents: 6647
diff changeset
    56
        n = len(self)
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
    57
        self.repotiprev = n - 1
18411
8b0f0dd56cec bundlerepo: improve performance for bundle() revset expression
Mads Kiilerich <madski@unity3d.com>
parents: 18410
diff changeset
    58
        self.bundlerevs = set() # used by 'bundle()' revset expression
34300
0fe62d8bdd50 bundlerepo: update to use new deltaiter api
Durham Goode <durham@fb.com>
parents: 34226
diff changeset
    59
        for deltadata in bundle.deltaiter():
0fe62d8bdd50 bundlerepo: update to use new deltaiter api
Durham Goode <durham@fb.com>
parents: 34226
diff changeset
    60
            node, p1, p2, cs, deltabase, delta, flags = deltadata
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    61
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    62
            size = len(delta)
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    63
            start = bundle.tell() - size
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    64
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    65
            link = linkmapper(cs)
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    66
            if node in self.nodemap:
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    67
                # this can happen if two branches make the same change
18411
8b0f0dd56cec bundlerepo: improve performance for bundle() revset expression
Mads Kiilerich <madski@unity3d.com>
parents: 18410
diff changeset
    68
                self.bundlerevs.add(self.nodemap[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
    69
                continue
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
    70
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    71
            for p in (p1, p2):
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
    72
                if p not in self.nodemap:
9650
1ad02c04356c bundlerepo: fix small bug in exception raising
Sune Foldager <cryo@cyanite.org>
parents: 9198
diff changeset
    73
                    raise error.LookupError(p, self.indexfile,
7633
08cabecfa8a8 errors: move revlog errors
Matt Mackall <mpm@selenic.com>
parents: 7435
diff changeset
    74
                                            _("unknown parent"))
18416
87f370c5fef5 bundlerepo: store validated deltabase rev in basemap instead of node
Mads Kiilerich <madski@unity3d.com>
parents: 18415
diff changeset
    75
87f370c5fef5 bundlerepo: store validated deltabase rev in basemap instead of node
Mads Kiilerich <madski@unity3d.com>
parents: 18415
diff changeset
    76
            if deltabase not in self.nodemap:
87f370c5fef5 bundlerepo: store validated deltabase rev in basemap instead of node
Mads Kiilerich <madski@unity3d.com>
parents: 18415
diff changeset
    77
                raise LookupError(deltabase, self.indexfile,
87f370c5fef5 bundlerepo: store validated deltabase rev in basemap instead of node
Mads Kiilerich <madski@unity3d.com>
parents: 18415
diff changeset
    78
                                  _('unknown delta base'))
87f370c5fef5 bundlerepo: store validated deltabase rev in basemap instead of node
Mads Kiilerich <madski@unity3d.com>
parents: 18415
diff changeset
    79
87f370c5fef5 bundlerepo: store validated deltabase rev in basemap instead of node
Mads Kiilerich <madski@unity3d.com>
parents: 18415
diff changeset
    80
            baserev = self.rev(deltabase)
5167
aba624d2301d fix bundlerepo broken by 4205f626dc05
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 4989
diff changeset
    81
            # start, size, full unc. size, base (unused), link, p1, p2, node
31835
4bafc80f827e bundlerepo: build revlog index with flags
Jun Wu <quark@fb.com>
parents: 31834
diff changeset
    82
            e = (revlog.offset_type(start, flags), size, -1, baserev, link,
4979
06abdaf78788 revlog: add a magic null revision to our index
Matt Mackall <mpm@selenic.com>
parents: 4918
diff changeset
    83
                 self.rev(p1), self.rev(p2), node)
06abdaf78788 revlog: add a magic null revision to our index
Matt Mackall <mpm@selenic.com>
parents: 4918
diff changeset
    84
            self.index.insert(-1, e)
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    85
            self.nodemap[node] = n
18411
8b0f0dd56cec bundlerepo: improve performance for bundle() revset expression
Mads Kiilerich <madski@unity3d.com>
parents: 18410
diff changeset
    86
            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
    87
            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
    88
9676
48bf28d3c8dd bundlerepo: keep the bundlerevlog interface in sync with revlog
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9650
diff changeset
    89
    def _chunk(self, rev):
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
    90
        # 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
    91
        # 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
    92
        # 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
    93
        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
    94
            return revlog.revlog._chunk(self, rev)
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
    95
        self.bundle.seek(self.start(rev))
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
    96
        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
    97
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    98
    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
    99
        """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
   100
        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
   101
            # 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
   102
            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
   103
            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
   104
                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
   105
        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
   106
            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
   107
31837
37e793918c07 bundlerepo: use raw revision in revdiff()
Jun Wu <quark@fb.com>
parents: 31836
diff changeset
   108
        return mdiff.textdiff(self.revision(rev1, raw=True),
37e793918c07 bundlerepo: use raw revision in revdiff()
Jun Wu <quark@fb.com>
parents: 31836
diff changeset
   109
                              self.revision(rev2, raw=True))
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   110
30743
2df983125d37 revlog: add 'raw' argument to revision and _addrevision
Remi Chaintron <remi@fb.com>
parents: 30589
diff changeset
   111
    def revision(self, nodeorrev, raw=False):
16435
df347129305d revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents: 16375
diff changeset
   112
        """return an uncompressed revision of a given node or revision
df347129305d revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents: 16375
diff changeset
   113
        number.
df347129305d revlog: fix partial revision() docstring (from d7d64b89a65c)
Patrick Mezard <patrick@mezard.eu>
parents: 16375
diff changeset
   114
        """
16375
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16195
diff changeset
   115
        if isinstance(nodeorrev, int):
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16195
diff changeset
   116
            rev = nodeorrev
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16195
diff changeset
   117
            node = self.node(rev)
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16195
diff changeset
   118
        else:
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16195
diff changeset
   119
            node = nodeorrev
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16195
diff changeset
   120
            rev = self.rev(node)
d7d64b89a65c revlog: allow retrieving contents by revision number
Matt Mackall <mpm@selenic.com>
parents: 16195
diff changeset
   121
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   122
        if node == nullid:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   123
            return ""
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   124
31836
4598e8f43e20 bundlerepo: fix raw handling in revision()
Jun Wu <quark@fb.com>
parents: 31835
diff changeset
   125
        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
   126
        chain = []
18415
95b8629fd2de bundlerepo: use rev instead of node for iteration in revision()
Mads Kiilerich <madski@unity3d.com>
parents: 18414
diff changeset
   127
        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
   128
        # 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
   129
        while iterrev > self.repotiprev:
18415
95b8629fd2de bundlerepo: use rev instead of node for iteration in revision()
Mads Kiilerich <madski@unity3d.com>
parents: 18414
diff changeset
   130
            if self._cache and self._cache[1] == iterrev:
31836
4598e8f43e20 bundlerepo: fix raw handling in revision()
Jun Wu <quark@fb.com>
parents: 31835
diff changeset
   131
                rawtext = self._cache[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
   132
                break
18415
95b8629fd2de bundlerepo: use rev instead of node for iteration in revision()
Mads Kiilerich <madski@unity3d.com>
parents: 18414
diff changeset
   133
            chain.append(iterrev)
18643
cc28a84db8c9 bundlerepo: replace basemap with the base field in the index
Mads Kiilerich <mads@kiilerich.com>
parents: 18568
diff changeset
   134
            iterrev = self.index[iterrev][3]
31836
4598e8f43e20 bundlerepo: fix raw handling in revision()
Jun Wu <quark@fb.com>
parents: 31835
diff changeset
   135
        if rawtext is None:
4598e8f43e20 bundlerepo: fix raw handling in revision()
Jun Wu <quark@fb.com>
parents: 31835
diff changeset
   136
            rawtext = self.baserevision(iterrev)
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
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   138
        while chain:
9676
48bf28d3c8dd bundlerepo: keep the bundlerevlog interface in sync with revlog
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 9650
diff changeset
   139
            delta = self._chunk(chain.pop())
31836
4598e8f43e20 bundlerepo: fix raw handling in revision()
Jun Wu <quark@fb.com>
parents: 31835
diff changeset
   140
            rawtext = mdiff.patches(rawtext, [delta])
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   141
31836
4598e8f43e20 bundlerepo: fix raw handling in revision()
Jun Wu <quark@fb.com>
parents: 31835
diff changeset
   142
        text, validatehash = self._processflags(rawtext, self.flags(rev),
30745
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30743
diff changeset
   143
                                                'read', raw=raw)
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30743
diff changeset
   144
        if validatehash:
c1b7b2285522 revlog: flag processor
Remi Chaintron <remi@fb.com>
parents: 30743
diff changeset
   145
            self.checkhash(text, node, rev=rev)
31836
4598e8f43e20 bundlerepo: fix raw handling in revision()
Jun Wu <quark@fb.com>
parents: 31835
diff changeset
   146
        self._cache = (node, rev, rawtext)
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   147
        return text
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   148
19629
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   149
    def baserevision(self, nodeorrev):
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   150
        # Revlog subclasses may override 'revision' method to modify format of
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   151
        # content retrieved from revlog. To use bundlerevlog with such class one
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   152
        # needs to override 'baserevision' and make more specific call here.
31834
433ab46f6bb4 bundlerepo: make baserevision return raw text
Jun Wu <quark@fb.com>
parents: 31728
diff changeset
   153
        return revlog.revlog.revision(self, nodeorrev, raw=True)
19629
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   154
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
    def addrevision(self, text, transaction, link, p1=None, p2=None, d=None):
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   156
        raise NotImplementedError
34226
21fc747e1bc5 revlog: update signature of dummy addgroup() in bundlerepo and unionrepo
Yuya Nishihara <yuya@tcha.org>
parents: 33907
diff changeset
   157
    def addgroup(self, deltas, transaction, addrevisioncb=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
   158
        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
   159
    def strip(self, rev, minlink):
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   160
        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
   161
    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
   162
        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
   163
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
   164
class bundlechangelog(bundlerevlog, changelog.changelog):
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   165
    def __init__(self, opener, bundle):
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
   166
        changelog.changelog.__init__(self, opener)
14142
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
   167
        linkmapper = lambda x: x
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
   168
        bundlerevlog.__init__(self, opener, self.indexfile, bundle,
cb91ea6af733 bundlerepo: port to new bundle API
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14076
diff changeset
   169
                              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
   170
19629
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   171
    def baserevision(self, nodeorrev):
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   172
        # Although changelog doesn't override 'revision' method, some extensions
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   173
        # may replace this class with another that does. Same story with
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   174
        # manifest and filelog classes.
24882
995003a324da bundlerepo: disable filtering of changelog while constructing revision text
Yuya Nishihara <yuya@tcha.org>
parents: 24834
diff changeset
   175
995003a324da bundlerepo: disable filtering of changelog while constructing revision text
Yuya Nishihara <yuya@tcha.org>
parents: 24834
diff changeset
   176
        # This bypasses filtering on changelog.node() and rev() because we need
995003a324da bundlerepo: disable filtering of changelog while constructing revision text
Yuya Nishihara <yuya@tcha.org>
parents: 24834
diff changeset
   177
        # revision text of the bundle base even if it is hidden.
995003a324da bundlerepo: disable filtering of changelog while constructing revision text
Yuya Nishihara <yuya@tcha.org>
parents: 24834
diff changeset
   178
        oldfilter = self.filteredrevs
995003a324da bundlerepo: disable filtering of changelog while constructing revision text
Yuya Nishihara <yuya@tcha.org>
parents: 24834
diff changeset
   179
        try:
995003a324da bundlerepo: disable filtering of changelog while constructing revision text
Yuya Nishihara <yuya@tcha.org>
parents: 24834
diff changeset
   180
            self.filteredrevs = ()
31834
433ab46f6bb4 bundlerepo: make baserevision return raw text
Jun Wu <quark@fb.com>
parents: 31728
diff changeset
   181
            return changelog.changelog.revision(self, nodeorrev, raw=True)
24882
995003a324da bundlerepo: disable filtering of changelog while constructing revision text
Yuya Nishihara <yuya@tcha.org>
parents: 24834
diff changeset
   182
        finally:
995003a324da bundlerepo: disable filtering of changelog while constructing revision text
Yuya Nishihara <yuya@tcha.org>
parents: 24834
diff changeset
   183
            self.filteredrevs = oldfilter
19629
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   184
30383
31de088945cd manifest: add bundlemanifestlog support
Durham Goode <durham@fb.com>
parents: 30218
diff changeset
   185
class bundlemanifest(bundlerevlog, manifest.manifestrevlog):
29728
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   186
    def __init__(self, opener, bundle, linkmapper, dirlogstarts=None, dir=''):
30383
31de088945cd manifest: add bundlemanifestlog support
Durham Goode <durham@fb.com>
parents: 30218
diff changeset
   187
        manifest.manifestrevlog.__init__(self, opener, dir=dir)
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   188
        bundlerevlog.__init__(self, opener, self.indexfile, bundle,
4257
1b5c38e9d7aa revlog: don't pass datafile as an argument
Matt Mackall <mpm@selenic.com>
parents: 4029
diff changeset
   189
                              linkmapper)
29728
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   190
        if dirlogstarts is None:
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   191
            dirlogstarts = {}
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   192
            if self.bundle.version == "03":
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   193
                dirlogstarts = _getfilestarts(self.bundle)
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   194
        self._dirlogstarts = dirlogstarts
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   195
        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
   196
19629
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   197
    def baserevision(self, nodeorrev):
26399
1f0e78f8f55f bundlerepo: let bundle repo look in the _mancache
Durham Goode <durham@fb.com>
parents: 25920
diff changeset
   198
        node = nodeorrev
1f0e78f8f55f bundlerepo: let bundle repo look in the _mancache
Durham Goode <durham@fb.com>
parents: 25920
diff changeset
   199
        if isinstance(node, int):
1f0e78f8f55f bundlerepo: let bundle repo look in the _mancache
Durham Goode <durham@fb.com>
parents: 25920
diff changeset
   200
            node = self.node(node)
1f0e78f8f55f bundlerepo: let bundle repo look in the _mancache
Durham Goode <durham@fb.com>
parents: 25920
diff changeset
   201
29929
1619efcde9a4 manifest: make one use of _mancache avoid manifestctxs
Durham Goode <durham@fb.com>
parents: 29920
diff changeset
   202
        if node in self.fulltextcache:
31355
2a18e9e6ca43 py3: use bytearray() instead of array('c', ...) constructions
Augie Fackler <augie@google.com>
parents: 31250
diff changeset
   203
            result = '%s' % self.fulltextcache[node]
26399
1f0e78f8f55f bundlerepo: let bundle repo look in the _mancache
Durham Goode <durham@fb.com>
parents: 25920
diff changeset
   204
        else:
31834
433ab46f6bb4 bundlerepo: make baserevision return raw text
Jun Wu <quark@fb.com>
parents: 31728
diff changeset
   205
            result = manifest.manifestrevlog.revision(self, nodeorrev, raw=True)
26399
1f0e78f8f55f bundlerepo: let bundle repo look in the _mancache
Durham Goode <durham@fb.com>
parents: 25920
diff changeset
   206
        return result
19629
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   207
29728
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   208
    def dirlog(self, d):
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   209
        if d in self._dirlogstarts:
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   210
            self.bundle.seek(self._dirlogstarts[d])
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   211
            return bundlemanifest(
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   212
                self.opener, self.bundle, self._linkmapper,
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   213
                self._dirlogstarts, dir=d)
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   214
        return super(bundlemanifest, self).dirlog(d)
55d341877316 bundlerepo: add support for treemanifests in cg3 bundles
Augie Fackler <augie@google.com>
parents: 29726
diff changeset
   215
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
   216
class bundlefilelog(bundlerevlog, filelog.filelog):
24921
86c0b5c09ee6 bundlerepo: remove unused 'repo' parameter
Martin von Zweigbergk <martinvonz@google.com>
parents: 24882
diff changeset
   217
    def __init__(self, opener, path, bundle, linkmapper):
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
   218
        filelog.filelog.__init__(self, opener, path)
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   219
        bundlerevlog.__init__(self, opener, self.indexfile, bundle,
4257
1b5c38e9d7aa revlog: don't pass datafile as an argument
Matt Mackall <mpm@selenic.com>
parents: 4029
diff changeset
   220
                              linkmapper)
14287
7c231754a621 filelog: add file function to open other filelogs
Sune Foldager <cryo@cyanite.org>
parents: 14190
diff changeset
   221
19629
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   222
    def baserevision(self, nodeorrev):
31834
433ab46f6bb4 bundlerepo: make baserevision return raw text
Jun Wu <quark@fb.com>
parents: 31728
diff changeset
   223
        return filelog.filelog.revision(self, nodeorrev, raw=True)
19629
81241f978fd2 bundlerevlog: extract 'baserevision' method
Wojciech Lopata <lopek@fb.com>
parents: 18825
diff changeset
   224
17193
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   225
class bundlepeer(localrepo.localpeer):
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   226
    def canpush(self):
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   227
        return False
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   228
23631
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   229
class bundlephasecache(phases.phasecache):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   230
    def __init__(self, *args, **kwargs):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   231
        super(bundlephasecache, self).__init__(*args, **kwargs)
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   232
        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
   233
            self.opener = vfsmod.readonlyvfs(self.opener)
23631
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   234
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   235
    def write(self):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   236
        raise NotImplementedError
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   237
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   238
    def _write(self, fp):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   239
        raise NotImplementedError
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   240
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   241
    def _updateroots(self, phase, newroots, tr):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   242
        self.phaseroots[phase] = newroots
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   243
        self.invalidate()
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   244
        self.dirty = True
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   245
29725
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   246
def _getfilestarts(bundle):
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   247
    bundlefilespos = {}
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   248
    for chunkdata in iter(bundle.filelogheader, {}):
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   249
        fname = chunkdata['filename']
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   250
        bundlefilespos[fname] = bundle.tell()
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   251
        for chunk in iter(lambda: bundle.deltachunk(None), {}):
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   252
            pass
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   253
    return bundlefilespos
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   254
1946
9fee186f7f0d bundlerepo: remove relative import, fix a comment
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1942
diff changeset
   255
class bundlerepository(localrepo.localrepository):
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   256
    def __init__(self, ui, path, bundlename):
6314
9a1c59283ad3 Add ability to directly clone from all-history bundles
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 6312
diff changeset
   257
        self._tempparent = None
9a1c59283ad3 Add ability to directly clone from all-history bundles
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 6312
diff changeset
   258
        try:
9a1c59283ad3 Add ability to directly clone from all-history bundles
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 6312
diff changeset
   259
            localrepo.localrepository.__init__(self, ui, path)
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
   260
        except error.RepoError:
6314
9a1c59283ad3 Add ability to directly clone from all-history bundles
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 6312
diff changeset
   261
            self._tempparent = tempfile.mkdtemp()
9198
061eeb602354 coding style: use a space after comma
Martin Geisler <mg@lazybytes.net>
parents: 8312
diff changeset
   262
            localrepo.instance(ui, self._tempparent, 1)
6314
9a1c59283ad3 Add ability to directly clone from all-history bundles
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 6312
diff changeset
   263
            localrepo.localrepository.__init__(self, ui, self._tempparent)
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 19629
diff changeset
   264
        self.ui.setconfig('phases', 'publish', False, 'bundlerepo')
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2273
diff changeset
   265
6129
3d666e8e6398 bundlerepo: fix inconsistency of parsed and internal name (issue #821)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5664
diff changeset
   266
        if path:
11154
17031fea4e95 expand paths to local repository or bundle in appropriate classes
Alexander Solovyov <piranha@piranha.org.ua>
parents: 10282
diff changeset
   267
            self._url = 'bundle:' + util.expandpath(path) + '+' + bundlename
6129
3d666e8e6398 bundlerepo: fix inconsistency of parsed and internal name (issue #821)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5664
diff changeset
   268
        else:
3d666e8e6398 bundlerepo: fix inconsistency of parsed and internal name (issue #821)
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5664
diff changeset
   269
            self._url = 'bundle:' + bundlename
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2273
diff changeset
   270
2273
f116ddea537f add support for compressed bundle repositories
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2257
diff changeset
   271
        self.tempfile = None
13274
57d433f632b7 bundlerepo: use less intrusive util.posixfile to open bundle
Adrian Buehlmann <adrian@cadifra.com>
parents: 12962
diff changeset
   272
        f = util.posixfile(bundlename, "rb")
24072
145b823f5ce7 bundlerepo: keep track of the original bundle object
Eric Sumner <ericsumner@fb.com>
parents: 24003
diff changeset
   273
        self.bundlefile = self.bundle = exchange.readbundle(ui, f, bundlename)
12044
bcc7139521b7 bundlerepo: remove duplication of bundle decompressors
Matt Mackall <mpm@selenic.com>
parents: 11154
diff changeset
   274
24073
ff5caa8dfd99 bundlerepo: basic bundle2 support
Eric Sumner <ericsumner@fb.com>
parents: 24072
diff changeset
   275
        if isinstance(self.bundle, bundle2.unbundle20):
33907
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   276
            hadchangegroup = False
26803
ed41ce89822d bundlerepo: properly extract compressed changegroup from bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26801
diff changeset
   277
            for part in self.bundle.iterparts():
ed41ce89822d bundlerepo: properly extract compressed changegroup from bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26801
diff changeset
   278
                if part.type == 'changegroup':
33907
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   279
                    if hadchangegroup:
26803
ed41ce89822d bundlerepo: properly extract compressed changegroup from bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26801
diff changeset
   280
                        raise NotImplementedError("can't process "
ed41ce89822d bundlerepo: properly extract compressed changegroup from bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26801
diff changeset
   281
                                                  "multiple changegroups")
33907
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   282
                    hadchangegroup = True
24073
ff5caa8dfd99 bundlerepo: basic bundle2 support
Eric Sumner <ericsumner@fb.com>
parents: 24072
diff changeset
   283
33907
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   284
                self._handlebundle2part(part)
24073
ff5caa8dfd99 bundlerepo: basic bundle2 support
Eric Sumner <ericsumner@fb.com>
parents: 24072
diff changeset
   285
33907
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   286
            if not hadchangegroup:
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   287
                raise error.Abort(_("No changegroups found"))
24073
ff5caa8dfd99 bundlerepo: basic bundle2 support
Eric Sumner <ericsumner@fb.com>
parents: 24072
diff changeset
   288
26801
73bf76bf6f14 bundlerepo: uncompress changegroup in bundle1 case only
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26800
diff changeset
   289
        elif self.bundle.compressed():
33905
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   290
            f = self._writetempbundle(self.bundle.read, '.hg10un',
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   291
                                      header='HG10UN')
26801
73bf76bf6f14 bundlerepo: uncompress changegroup in bundle1 case only
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26800
diff changeset
   292
            self.bundlefile = self.bundle = exchange.readbundle(ui, f,
73bf76bf6f14 bundlerepo: uncompress changegroup in bundle1 case only
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26800
diff changeset
   293
                                                                bundlename,
73bf76bf6f14 bundlerepo: uncompress changegroup in bundle1 case only
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26800
diff changeset
   294
                                                                self.vfs)
73bf76bf6f14 bundlerepo: uncompress changegroup in bundle1 case only
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26800
diff changeset
   295
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   296
        # dict with the mapping 'filename' -> position in the bundle
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   297
        self.bundlefilespos = {}
5262
a35756389ef4 Make bundlerepo lazier
Brendan Cully <brendan@kublai.com>
parents: 5167
diff changeset
   298
23632
e7fcf58acd71 bundlerepo: retract phase boundary
Eric Sumner <ericsumner@fb.com>
parents: 23631
diff changeset
   299
        self.firstnewrev = self.changelog.repotiprev + 1
e7fcf58acd71 bundlerepo: retract phase boundary
Eric Sumner <ericsumner@fb.com>
parents: 23631
diff changeset
   300
        phases.retractboundary(self, None, phases.draft,
e7fcf58acd71 bundlerepo: retract phase boundary
Eric Sumner <ericsumner@fb.com>
parents: 23631
diff changeset
   301
                               [ctx.node() for ctx in self[self.firstnewrev:]])
e7fcf58acd71 bundlerepo: retract phase boundary
Eric Sumner <ericsumner@fb.com>
parents: 23631
diff changeset
   302
33907
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   303
    def _handlebundle2part(self, part):
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   304
        if part.type == 'changegroup':
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   305
            cgstream = part
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   306
            version = part.params.get('version', '01')
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   307
            legalcgvers = changegroup.supportedincomingversions(self)
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   308
            if version not in legalcgvers:
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   309
                msg = _('Unsupported changegroup version: %s')
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   310
                raise error.Abort(msg % version)
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   311
            if self.bundle.compressed():
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   312
                cgstream = self._writetempbundle(part.read,
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   313
                                                 ".cg%sun" % version)
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   314
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   315
            self.bundle = changegroup.getunbundler(version, cgstream, 'UN')
f672d060a931 bundlerepo: move bundle2 part handling out to a function
Durham Goode <durham@fb.com>
parents: 33906
diff changeset
   316
33905
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   317
    def _writetempbundle(self, readfn, suffix, header=''):
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   318
        """Write a temporary file to disk
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   319
        """
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   320
        fdtemp, temp = self.vfs.mkstemp(prefix="hg-bundle-",
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   321
                                        suffix=".hg10un")
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   322
        self.tempfile = temp
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   323
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   324
        with os.fdopen(fdtemp, pycompat.sysstr('wb')) as fptemp:
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   325
            fptemp.write(header)
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   326
            while True:
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   327
                chunk = readfn(2**18)
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   328
                if not chunk:
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   329
                    break
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   330
                fptemp.write(chunk)
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   331
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   332
        return self.vfs.open(self.tempfile, mode="rb")
702a26fec3e2 bundlerepo: move temp bundle creation to a separate function
Durham Goode <durham@fb.com>
parents: 33184
diff changeset
   333
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17913
diff changeset
   334
    @localrepo.unfilteredpropertycache
23631
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   335
    def _phasecache(self):
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   336
        return bundlephasecache(self, self._phasedefaults)
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   337
b8260abfeb7d bundlerepo: implement safe phasecache
Eric Sumner <ericsumner@fb.com>
parents: 22182
diff changeset
   338
    @localrepo.unfilteredpropertycache
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   339
    def changelog(self):
14144
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14142
diff changeset
   340
        # consume the header if it exists
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14142
diff changeset
   341
        self.bundle.changelogheader()
23878
37a92908a382 localrepo: remove all external users of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23633
diff changeset
   342
        c = bundlechangelog(self.svfs, self.bundle)
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   343
        self.manstart = self.bundle.tell()
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   344
        return c
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   345
30218
1767723f71cf manifest: move manifest creation to a helper function
Durham Goode <durham@fb.com>
parents: 29929
diff changeset
   346
    def _constructmanifest(self):
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   347
        self.bundle.seek(self.manstart)
14144
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14142
diff changeset
   348
        # consume the header if it exists
3c3c53d8343a unbundler: separate delta and header parsing
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 14142
diff changeset
   349
        self.bundle.manifestheader()
28221
7a8c44844f57 bundlerepo: properly handle hidden linkrev in manifestlog (issue4945)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28186
diff changeset
   350
        linkmapper = self.unfiltered().changelog.rev
7a8c44844f57 bundlerepo: properly handle hidden linkrev in manifestlog (issue4945)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28186
diff changeset
   351
        m = bundlemanifest(self.svfs, self.bundle, linkmapper)
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   352
        self.filestart = self.bundle.tell()
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   353
        return m
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   354
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17913
diff changeset
   355
    @localrepo.unfilteredpropertycache
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   356
    def manstart(self):
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   357
        self.changelog
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   358
        return self.manstart
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   359
18014
a39fe76c4c65 clfilter: ensure that filecache on localrepo is unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17913
diff changeset
   360
    @localrepo.unfilteredpropertycache
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   361
    def filestart(self):
30385
11b8b740d54a manifest: remove last uses of repo.manifest
Durham Goode <durham@fb.com>
parents: 30383
diff changeset
   362
        self.manifestlog
8260
54a4b520bd7d localrepo: use propertycache
Matt Mackall <mpm@selenic.com>
parents: 8227
diff changeset
   363
        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
   364
2673
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2273
diff changeset
   365
    def url(self):
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2273
diff changeset
   366
        return self._url
109a22f5434a hooks: add url to changegroup, incoming, prechangegroup, pretxnchangegroup hooks
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2273
diff changeset
   367
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   368
    def file(self, f):
5262
a35756389ef4 Make bundlerepo lazier
Brendan Cully <brendan@kublai.com>
parents: 5167
diff changeset
   369
        if not self.bundlefilespos:
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   370
            self.bundle.seek(self.filestart)
29725
9e88077f972c bundlerepo: introduce method to find file starts and use it
Augie Fackler <augie@google.com>
parents: 29724
diff changeset
   371
            self.bundlefilespos = _getfilestarts(self.bundle)
5262
a35756389ef4 Make bundlerepo lazier
Brendan Cully <brendan@kublai.com>
parents: 5167
diff changeset
   372
1942
9da45de3118d add bundlerepo.py: a read-only repo that can use uncompressed bundles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   373
        if f in self.bundlefilespos:
12332
680fe77ab5b8 bundlerepo: use bundle objects everywhere
Matt Mackall <mpm@selenic.com>
parents: 12331
diff changeset
   374
            self.bundle.seek(self.bundlefilespos[f])
28186
5ab6f0fde75f bundlerepo: properly handle hidden linkrev in filelog (issue4945)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27953
diff changeset
   375
            linkmapper = self.unfiltered().changelog.rev
5ab6f0fde75f bundlerepo: properly handle hidden linkrev in filelog (issue4945)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27953
diff changeset
   376
            return bundlefilelog(self.svfs, f, self.bundle, 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
   377
        else:
23878
37a92908a382 localrepo: remove all external users of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23633
diff changeset
   378
            return filelog.filelog(self.svfs, 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
   379
12347
6277a9469dff bundlerepo: restore close() method
Matt Mackall <mpm@selenic.com>
parents: 12335
diff changeset
   380
    def close(self):
6277a9469dff bundlerepo: restore close() method
Matt Mackall <mpm@selenic.com>
parents: 12335
diff changeset
   381
        """Close assigned bundle file immediately."""
24072
145b823f5ce7 bundlerepo: keep track of the original bundle object
Eric Sumner <ericsumner@fb.com>
parents: 24003
diff changeset
   382
        self.bundlefile.close()
12962
ff083040a555 bundlerepository: get rid of temporary bundle files (issue2478)
Klaus Koch <kuk42@gmx.net>
parents: 12961
diff changeset
   383
        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
   384
            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
   385
        if self._tempparent:
9a1c59283ad3 Add ability to directly clone from all-history bundles
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 6312
diff changeset
   386
            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
   387
6315
5c96a4bca66b clone: use cancopy
Matt Mackall <mpm@selenic.com>
parents: 6314
diff changeset
   388
    def cancopy(self):
5c96a4bca66b clone: use cancopy
Matt Mackall <mpm@selenic.com>
parents: 6314
diff changeset
   389
        return False
5c96a4bca66b clone: use cancopy
Matt Mackall <mpm@selenic.com>
parents: 6314
diff changeset
   390
17193
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   391
    def peer(self):
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   392
        return bundlepeer(self)
1d710fe5ee0e peer: introduce canpush and improve error message
Sune Foldager <cryo@cyanite.org>
parents: 17191
diff changeset
   393
7435
5e13df32fb74 bundlerepo doesn't really have a dirstate, throw AttributeError if requested
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6953
diff changeset
   394
    def getcwd(self):
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30385
diff changeset
   395
        return pycompat.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
   396
28714
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   397
    # Check if parents exist in localrepo before setting
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   398
    def setparents(self, p1, p2=nullid):
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   399
        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
   400
        p2rev = self.changelog.rev(p2)
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   401
        msg = _("setting parent to node %s that only exists in the bundle\n")
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   402
        if self.changelog.repotiprev < p1rev:
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   403
            self.ui.warn(msg % nodemod.hex(p1))
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   404
        if self.changelog.repotiprev < p2rev:
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   405
            self.ui.warn(msg % nodemod.hex(p2))
dac81729fea4 bundle: warn when update to revision existing only in a bundle (issue5004)
liscju <piotr.listkiewicz@gmail.com>
parents: 28666
diff changeset
   406
        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
   407
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   408
def instance(ui, path, create):
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   409
    if create:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26544
diff changeset
   410
        raise error.Abort(_('cannot create new bundle repository'))
25830
5418dd5be8ac bundlerepo: mark internal-only config variable
Matt Mackall <mpm@selenic.com>
parents: 24921
diff changeset
   411
    # internal config: bundle.mainreporoot
33184
634997248c97 configitems: register the 'bundle.mainreporoot' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31837
diff changeset
   412
    parentpath = ui.config("bundle", "mainreporoot")
16042
4b7aa1c899dc bundlerepo: try to find containing repo on creation (issue1812)
Matt Mackall <mpm@selenic.com>
parents: 15597
diff changeset
   413
    if not parentpath:
4b7aa1c899dc bundlerepo: try to find containing repo on creation (issue1812)
Matt Mackall <mpm@selenic.com>
parents: 15597
diff changeset
   414
        # try to find the correct path to the working directory repo
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30385
diff changeset
   415
        parentpath = cmdutil.findrepo(pycompat.getcwd())
16042
4b7aa1c899dc bundlerepo: try to find containing repo on creation (issue1812)
Matt Mackall <mpm@selenic.com>
parents: 15597
diff changeset
   416
        if parentpath is None:
4b7aa1c899dc bundlerepo: try to find containing repo on creation (issue1812)
Matt Mackall <mpm@selenic.com>
parents: 15597
diff changeset
   417
            parentpath = ''
5664
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   418
    if parentpath:
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   419
        # 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
   420
        # In particular, we don't want temp dir names in test outputs.
30528
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30385
diff changeset
   421
        cwd = pycompat.getcwd()
5664
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   422
        if parentpath == cwd:
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   423
            parentpath = ''
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   424
        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
   425
            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
   426
            if parentpath.startswith(cwd):
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   427
                parentpath = parentpath[len(cwd):]
14076
924c82157d46 url: move URL parsing functions into util to improve startup time
Brodie Rao <brodie@bitheap.org>
parents: 14073
diff changeset
   428
    u = util.url(path)
13826
e574207e3bcd url: refactor util.drop_scheme() and hg.localpath() into url.localpath()
Brodie Rao <brodie@bitheap.org>
parents: 13742
diff changeset
   429
    path = u.localpath()
e574207e3bcd url: refactor util.drop_scheme() and hg.localpath() into url.localpath()
Brodie Rao <brodie@bitheap.org>
parents: 13742
diff changeset
   430
    if u.scheme == 'bundle':
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   431
        s = path.split("+", 1)
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   432
        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
   433
            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
   434
        else:
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   435
            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
   436
    else:
5664
da72b4d24797 Fix income/pull with bundle and -R (issue 820).
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5558
diff changeset
   437
        repopath, bundlename = parentpath, path
2740
386f04d6ecb3 clean up hg.py: move repo constructor code into each repo module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2673
diff changeset
   438
    return bundlerepository(ui, repopath, bundlename)
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   439
23633
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   440
class bundletransactionmanager(object):
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   441
    def transaction(self):
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   442
        return None
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   443
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   444
    def close(self):
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   445
        raise NotImplementedError
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   446
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   447
    def release(self):
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   448
        raise NotImplementedError
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   449
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   450
def getremotechanges(ui, repo, other, onlyheads=None, bundlename=None,
14073
72c84f24b420 discovery: drop findoutgoing and simplify findcommonincoming's api
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14004
diff changeset
   451
                     force=False):
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   452
    '''obtains a bundle of changes incoming from other
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   453
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   454
    "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
   455
      specified heads.
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   456
    "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
   457
      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
   458
      the returned "cleanupfn".
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   459
    "force" indicates whether to proceed on unrelated repos.
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   460
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   461
    Returns a tuple (local, csets, cleanupfn):
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   462
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   463
    "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
   464
      changesets; it is a bundlerepo for the obtained bundle when the
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   465
      original "other" is remote.
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   466
    "csets" lists the incoming changeset node ids.
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   467
    "cleanupfn" must be called without arguments when you're done processing
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   468
      the changes; it closes both the original "other" and the one returned
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   469
      here.
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   470
    '''
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   471
    tmp = discovery.findcommonincoming(repo, other, heads=onlyheads,
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16435
diff changeset
   472
                                       force=force)
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   473
    common, incoming, rheads = tmp
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   474
    if not incoming:
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   475
        try:
15091
106f89299da6 bundlerepo: add argument check before unlink
Sune Foldager <cryo@cyanite.org>
parents: 14494
diff changeset
   476
            if bundlename:
21694
c08a22bfa16e bundlerepo: backout dbf292f65b09
Matt Mackall <mpm@selenic.com>
parents: 21562
diff changeset
   477
                os.unlink(bundlename)
14004
97ed99d1f419 eliminate various naked except clauses
Idan Kamara <idankk86@gmail.com>
parents: 13826
diff changeset
   478
        except OSError:
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   479
            pass
18138
8ab0640c3090 bundlerepo: don't return the peer without bundlerepo from getremotechanges
Mads Kiilerich <madski@unity3d.com>
parents: 17193
diff changeset
   480
        return repo, [], other.close
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   481
22182
510cafe72004 incoming: don't request heads that already are common
Mads Kiilerich <madski@unity3d.com>
parents: 21694
diff changeset
   482
    commonset = set(common)
510cafe72004 incoming: don't request heads that already are common
Mads Kiilerich <madski@unity3d.com>
parents: 21694
diff changeset
   483
    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
   484
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   485
    bundle = None
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   486
    bundlerepo = None
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 16686
diff changeset
   487
    localrepo = other.local()
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 16686
diff changeset
   488
    if bundlename or not localrepo:
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   489
        # create a bundle (uncompressed if other repo is not local)
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   490
29698
ff5d5751fc1b bundlerepo: also read the 'devel.legacy.exchange' config
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
   491
        # developer config: devel.legacy.exchange
ff5d5751fc1b bundlerepo: also read the 'devel.legacy.exchange' config
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
   492
        legexc = ui.configlist('devel', 'legacy.exchange')
29703
39537bc64442 bundle2: remove 'experimental.bundle2-exp' boolean config (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29698
diff changeset
   493
        forcebundle1 = 'bundle2' not in legexc and 'bundle1' in legexc
29698
ff5d5751fc1b bundlerepo: also read the 'devel.legacy.exchange' config
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 29389
diff changeset
   494
        canbundle2 = (not forcebundle1
26544
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   495
                      and other.capable('getbundle')
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   496
                      and other.capable('bundle2'))
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   497
        if canbundle2:
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   498
            kwargs = {}
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   499
            kwargs['common'] = common
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   500
            kwargs['heads'] = rheads
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   501
            kwargs['bundlecaps'] = exchange.caps20to10(repo)
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   502
            kwargs['cg'] = True
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   503
            b2 = other.getbundle('incoming', **kwargs)
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   504
            fname = bundle = changegroup.writechunks(ui, b2._forwardchunks(),
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   505
                                                     bundlename)
1e8e0b01faba incoming: request a bundle2 when possible (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26543
diff changeset
   506
        else:
26543
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   507
            if other.capable('getbundle'):
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   508
                cg = other.getbundle('incoming', common=common, heads=rheads)
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   509
            elif onlyheads is None and not other.capable('changegroupsubset'):
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   510
                # compat with older servers when pulling all remote heads
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   511
                cg = other.changegroup(incoming, "incoming")
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   512
                rheads = None
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   513
            else:
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   514
                cg = other.changegroupsubset(incoming, rheads, 'incoming')
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   515
            if localrepo:
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   516
                bundletype = "HG10BZ"
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   517
            else:
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   518
                bundletype = "HG10UN"
28666
ae53ecc47414 bundle: move writebundle() from changegroup.py to bundle2.py (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 28221
diff changeset
   519
            fname = bundle = bundle2.writebundle(ui, cg, bundlename,
26543
a018cbabdb51 bundlerepo: indent some code to prepare next patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26399
diff changeset
   520
                                                     bundletype)
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   521
        # keep written bundle?
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   522
        if bundlename:
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   523
            bundle = None
17191
5884812686f7 peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents: 16686
diff changeset
   524
        if not localrepo:
12734
5dfd1c49dcc5 bundlerepo: unify common code into a new getremotechanges
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12347
diff changeset
   525
            # use the created uncompressed bundlerepo
18825
f0564402d059 repo: repo isolation, do not pass on repo.ui for creating new repos
Simon Heimberg <simohe@besonet.ch>
parents: 18643
diff changeset
   526
            localrepo = bundlerepo = bundlerepository(repo.baseui, repo.root,
f0564402d059 repo: repo isolation, do not pass on repo.ui for creating new repos
Simon Heimberg <simohe@besonet.ch>
parents: 18643
diff changeset
   527
                                                      fname)
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   528
            # this repo contains local and other now, so filter out local again
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   529
            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
   530
    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
   531
        # 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
   532
        # 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
   533
        # 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
   534
        localrepo = localrepo.unfiltered()
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   535
14412
9ac479758d3b bundlerepo: make getremotechanges support filtering of incoming
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14287
diff changeset
   536
    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
   537
23633
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   538
    if bundlerepo:
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   539
        reponodes = [ctx.node() for ctx in bundlerepo[bundlerepo.firstnewrev:]]
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   540
        remotephases = other.listkeys('phases')
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   541
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   542
        pullop = exchange.pulloperation(bundlerepo, other, heads=reponodes)
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   543
        pullop.trmanager = bundletransactionmanager()
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   544
        exchange._pullapplyphases(pullop, remotephases)
96c3cbec006f incoming: handle phases the same as pull
Eric Sumner <ericsumner@fb.com>
parents: 23632
diff changeset
   545
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   546
    def cleanup():
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   547
        if bundlerepo:
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   548
            bundlerepo.close()
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   549
        if bundle:
21694
c08a22bfa16e bundlerepo: backout dbf292f65b09
Matt Mackall <mpm@selenic.com>
parents: 21562
diff changeset
   550
            os.unlink(bundle)
14190
8aab5a82685f bundlerepo: fix closing and docstring of getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14161
diff changeset
   551
        other.close()
14161
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   552
8a0fca925992 bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14158
diff changeset
   553
    return (localrepo, csets, cleanup)