mercurial/unionrepo.py
author Joerg Sonnenberger <joerg@bec.de>
Wed, 20 Jan 2021 14:47:13 +0100
changeset 46373 711ba0f1057e
parent 45815 b6f4a1df91bd
child 46780 6266d19556ad
permissions -rw-r--r--
revlog: decouple caching from addrevision callback for addgroup For changesets, it is useful to cache the content as it will almost always be processed afterwards. For manifests on the other hand, the content is often not used directly as there is a fast path for deltas. Explicitly disable the cache in exchangev2's manifest handling for that reason. Differential Revision: https://phab.mercurial-scm.org/D9847
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
     1
# unionrepo.py - repository class for viewing union of repository changesets
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
     2
#
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
     3
# Derived from bundlerepo.py
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
     4
# Copyright 2006, 2007 Benoit Boissinot <bboissin@gmail.com>
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
     5
# Copyright 2013 Unity Technologies, Mads Kiilerich <madski@unity3d.com>
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
     6
#
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
     7
# This software may be used and distributed according to the terms of the
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
     8
# GNU General Public License version 2 or any later version.
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
     9
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    10
"""Repository class for "in-memory pull" of one local repository to another,
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    11
allowing operations like diff and log with revsets.
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    12
"""
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    13
25988
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    14
from __future__ import absolute_import
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    15
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    16
from .i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    17
from .pycompat import getattr
25988
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    18
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    19
from . import (
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    20
    changelog,
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    21
    cmdutil,
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39763
diff changeset
    22
    encoding,
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26230
diff changeset
    23
    error,
25988
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    24
    filelog,
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    25
    localrepo,
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    26
    manifest,
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    27
    mdiff,
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    28
    pathutil,
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    29
    revlog,
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    30
    util,
31242
854f9188e354 vfs: use 'vfs' module directly in 'mercurial.unionrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30743
diff changeset
    31
    vfs as vfsmod,
25988
83f220c7d6f0 unionrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24835
diff changeset
    32
)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    33
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    34
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    35
class unionrevlog(revlog.revlog):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    36
    def __init__(self, opener, indexfile, revlog2, linkmapper):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    37
        # How it works:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    38
        # To retrieve a revision, we just need to know the node id so we can
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    39
        # look it up in revlog2.
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    40
        #
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    41
        # To differentiate a rev in the second revlog from a rev in the revlog,
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    42
        # we check revision against repotiprev.
31242
854f9188e354 vfs: use 'vfs' module directly in 'mercurial.unionrepo'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30743
diff changeset
    43
        opener = vfsmod.readonlyvfs(opener)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    44
        revlog.revlog.__init__(self, opener, indexfile)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    45
        self.revlog2 = revlog2
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    46
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    47
        n = len(self)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    48
        self.repotiprev = n - 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    49
        self.bundlerevs = set()  # used by 'bundle()' revset expression
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    50
        for rev2 in self.revlog2:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    51
            rev = self.revlog2.index[rev2]
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    52
            # rev numbers - in revlog2, very different from self.rev
38176
df5f6881cebd unionrepo: fill in uncompressed length of revlog entry
Yuya Nishihara <yuya@tcha.org>
parents: 37717
diff changeset
    53
            _start, _csize, rsize, base, linkrev, p1rev, p2rev, node = rev
27433
12f727a5b434 changegroup: add flags field to cg3 delta header
Mike Edgar <adgar@google.com>
parents: 26587
diff changeset
    54
            flags = _start & 0xFFFF
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    55
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    56
            if linkmapper is None:  # link is to same revlog
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    57
                assert linkrev == rev2  # we never link back
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    58
                link = n
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    59
            else:  # rev must be mapped from repo2 cl to unified cl by linkmapper
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    60
                link = linkmapper(linkrev)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    61
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    62
            if linkmapper is not None:  # link is to same revlog
26230
6b16a3538c20 unionrepo: take delta base in account with building unified revlog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25988
diff changeset
    63
                base = linkmapper(base)
6b16a3538c20 unionrepo: take delta base in account with building unified revlog
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25988
diff changeset
    64
43565
f212cc5ffceb index: use `index.get_rev` in `unionrepo.unionrevlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43533
diff changeset
    65
            this_rev = self.index.get_rev(node)
f212cc5ffceb index: use `index.get_rev` in `unionrepo.unionrevlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43533
diff changeset
    66
            if this_rev is not None:
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    67
                # this happens for the common revlog revisions
43565
f212cc5ffceb index: use `index.get_rev` in `unionrepo.unionrevlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43533
diff changeset
    68
                self.bundlerevs.add(this_rev)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    69
                continue
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    70
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    71
            p1node = self.revlog2.node(p1rev)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    72
            p2node = self.revlog2.node(p2rev)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    73
45815
b6f4a1df91bd unionrepo: don't insert index tuples with None as int field
Joerg Sonnenberger <joerg@bec.de>
parents: 45788
diff changeset
    74
            # TODO: it's probably wrong to set compressed length to -1, but
38176
df5f6881cebd unionrepo: fill in uncompressed length of revlog entry
Yuya Nishihara <yuya@tcha.org>
parents: 37717
diff changeset
    75
            # I have no idea if csize is valid in the base revlog context.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    76
            e = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    77
                flags,
45815
b6f4a1df91bd unionrepo: don't insert index tuples with None as int field
Joerg Sonnenberger <joerg@bec.de>
parents: 45788
diff changeset
    78
                -1,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    79
                rsize,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    80
                base,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    81
                link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    82
                self.rev(p1node),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    83
                self.rev(p2node),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    84
                node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    85
            )
38850
6104b203bec8 index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38176
diff changeset
    86
            self.index.append(e)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    87
            self.bundlerevs.add(n)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    88
            n += 1
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    89
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    90
    def _chunk(self, rev):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    91
        if rev <= self.repotiprev:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    92
            return revlog.revlog._chunk(self, rev)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    93
        return self.revlog2._chunk(self.node(rev))
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    94
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    95
    def revdiff(self, rev1, rev2):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    96
        """return or calculate a delta between two revisions"""
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    97
        if rev1 > self.repotiprev and rev2 > self.repotiprev:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    98
            return self.revlog2.revdiff(
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    99
                self.revlog2.rev(self.node(rev1)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   100
                self.revlog2.rev(self.node(rev2)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   101
            )
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   102
        elif rev1 <= self.repotiprev and rev2 <= self.repotiprev:
42827
a61a8f78da28 unionrepo: use normal inheritance scheme to call revdiff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42826
diff changeset
   103
            return super(unionrevlog, self).revdiff(rev1, rev2)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   104
42826
3e2520acf17b unionrepo: fix `revdiff` implementation to use `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42825
diff changeset
   105
        return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2))
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   106
42824
64c3db458d08 unionrepo: use a lower level overide in unionrepo too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42726
diff changeset
   107
    def _revisiondata(self, nodeorrev, _df=None, raw=False):
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   108
        if isinstance(nodeorrev, int):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   109
            rev = nodeorrev
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   110
            node = self.node(rev)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   111
        else:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   112
            node = nodeorrev
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   113
            rev = self.rev(node)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   114
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   115
        if rev > self.repotiprev:
42824
64c3db458d08 unionrepo: use a lower level overide in unionrepo too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42726
diff changeset
   116
            # work around manifestrevlog NOT being a revlog
64c3db458d08 unionrepo: use a lower level overide in unionrepo too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42726
diff changeset
   117
            revlog2 = getattr(self.revlog2, '_revlog', self.revlog2)
64c3db458d08 unionrepo: use a lower level overide in unionrepo too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42726
diff changeset
   118
            func = revlog2._revisiondata
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   119
        else:
42824
64c3db458d08 unionrepo: use a lower level overide in unionrepo too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42726
diff changeset
   120
            func = super(unionrevlog, self)._revisiondata
64c3db458d08 unionrepo: use a lower level overide in unionrepo too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42726
diff changeset
   121
        return func(node, _df=_df, raw=raw)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   122
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   123
    def addrevision(self, text, transaction, link, p1=None, p2=None, d=None):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   124
        raise NotImplementedError
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   125
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   126
    def addgroup(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   127
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   128
        deltas,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   129
        linkmapper,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   130
        transaction,
46373
711ba0f1057e revlog: decouple caching from addrevision callback for addgroup
Joerg Sonnenberger <joerg@bec.de>
parents: 45815
diff changeset
   131
        alwayscache=False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   132
        addrevisioncb=None,
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 43565
diff changeset
   133
        duplicaterevisioncb=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   134
        maybemissingparents=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   135
    ):
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   136
        raise NotImplementedError
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   137
42196
94e2f8437f6b unionrepo: sync with repository API
Joerg Sonnenberger <joerg@bec.de>
parents: 41038
diff changeset
   138
    def strip(self, minlink, transaction):
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   139
        raise NotImplementedError
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   140
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   141
    def checksize(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   142
        raise NotImplementedError
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   143
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   144
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   145
class unionchangelog(unionrevlog, changelog.changelog):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   146
    def __init__(self, opener, opener2):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   147
        changelog.changelog.__init__(self, opener)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   148
        linkmapper = None
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   149
        changelog2 = changelog.changelog(opener2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   150
        unionrevlog.__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   151
            self, opener, self.indexfile, changelog2, linkmapper
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   152
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   153
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   154
30374
f2d146d1e8d6 manifest: add unionmanifestlog support
Durham Goode <durham@fb.com>
parents: 30218
diff changeset
   155
class unionmanifest(unionrevlog, manifest.manifestrevlog):
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   156
    def __init__(self, opener, opener2, linkmapper):
30374
f2d146d1e8d6 manifest: add unionmanifestlog support
Durham Goode <durham@fb.com>
parents: 30218
diff changeset
   157
        manifest.manifestrevlog.__init__(self, opener)
f2d146d1e8d6 manifest: add unionmanifestlog support
Durham Goode <durham@fb.com>
parents: 30218
diff changeset
   158
        manifest2 = manifest.manifestrevlog(opener2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   159
        unionrevlog.__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   160
            self, opener, self.indexfile, manifest2, linkmapper
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   161
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   162
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   163
37497
1541e1a8e87d filelog: wrap revlog instead of inheriting it (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34219
diff changeset
   164
class unionfilelog(filelog.filelog):
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   165
    def __init__(self, opener, path, opener2, linkmapper, repo):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   166
        filelog.filelog.__init__(self, opener, path)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   167
        filelog2 = filelog.filelog(opener2, path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   168
        self._revlog = unionrevlog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   169
            opener, self.indexfile, filelog2._revlog, linkmapper
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   170
        )
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   171
        self._repo = repo
37497
1541e1a8e87d filelog: wrap revlog instead of inheriting it (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34219
diff changeset
   172
        self.repotiprev = self._revlog.repotiprev
1541e1a8e87d filelog: wrap revlog instead of inheriting it (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34219
diff changeset
   173
        self.revlog2 = self._revlog.revlog2
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   174
24118
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24003
diff changeset
   175
    def iscensored(self, rev):
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24003
diff changeset
   176
        """Check if a revision is censored."""
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24003
diff changeset
   177
        if rev <= self.repotiprev:
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24003
diff changeset
   178
            return filelog.filelog.iscensored(self, rev)
27723
bf86e3e87123 unionrepo: fix wrong rev being checked in iscensored (issue5024)
Sean Farley <sean@farley.io>
parents: 26587
diff changeset
   179
        node = self.node(rev)
bf86e3e87123 unionrepo: fix wrong rev being checked in iscensored (issue5024)
Sean Farley <sean@farley.io>
parents: 26587
diff changeset
   180
        return self.revlog2.iscensored(self.revlog2.rev(node))
24118
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24003
diff changeset
   181
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   182
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   183
class unionpeer(localrepo.localpeer):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   184
    def canpush(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   185
        return False
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   186
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   187
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   188
class unionrepository(object):
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   189
    """Represents the union of data in 2 repositories.
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   190
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   191
    Instances are not usable if constructed directly. Use ``instance()``
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   192
    or ``makeunionrepository()`` to create a usable instance.
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   193
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   194
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   195
    def __init__(self, repo2, url):
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   196
        self.repo2 = repo2
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   197
        self._url = url
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   198
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   199
        self.ui.setconfig(b'phases', b'publish', False, b'unionrepo')
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   200
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   201
    @localrepo.unfilteredpropertycache
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   202
    def changelog(self):
23878
37a92908a382 localrepo: remove all external users of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20790
diff changeset
   203
        return unionchangelog(self.svfs, self.repo2.svfs)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   204
39763
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39605
diff changeset
   205
    @localrepo.unfilteredpropertycache
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39605
diff changeset
   206
    def manifestlog(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   207
        rootstore = unionmanifest(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   208
            self.svfs, self.repo2.svfs, self.unfiltered()._clrev
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   209
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   210
        return manifest.manifestlog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   211
            self.svfs, self, rootstore, self.narrowmatch()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   212
        )
39763
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39605
diff changeset
   213
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   214
    def _clrev(self, rev2):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   215
        """map from repo2 changelog rev to temporary rev in self.changelog"""
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   216
        node = self.repo2.changelog.node(rev2)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   217
        return self.changelog.rev(node)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   218
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   219
    def url(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   220
        return self._url
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   221
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   222
    def file(self, f):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   223
        return unionfilelog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   224
            self.svfs, f, self.repo2.svfs, self.unfiltered()._clrev, self
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   225
        )
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   226
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   227
    def close(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   228
        self.repo2.close()
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   229
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   230
    def cancopy(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   231
        return False
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   232
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   233
    def peer(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   234
        return unionpeer(self)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   235
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   236
    def getcwd(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   237
        return encoding.getcwd()  # always outside the repo
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   238
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   239
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38850
diff changeset
   240
def instance(ui, path, create, intents=None, createopts=None):
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   241
    if create:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   242
        raise error.Abort(_(b'cannot create new union repository'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   243
    parentpath = ui.config(b"bundle", b"mainreporoot")
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   244
    if not parentpath:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   245
        # try to find the correct path to the working directory repo
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39763
diff changeset
   246
        parentpath = cmdutil.findrepo(encoding.getcwd())
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   247
        if parentpath is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   248
            parentpath = b''
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   249
    if parentpath:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   250
        # Try to make the full path relative so we get a nice, short URL.
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   251
        # In particular, we don't want temp dir names in test outputs.
39818
24e493ec2229 py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 39763
diff changeset
   252
        cwd = encoding.getcwd()
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   253
        if parentpath == cwd:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   254
            parentpath = b''
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   255
        else:
24835
e4f75c93f073 unionrepo: use pathutil.normasprefix to ensure os.sep at the end of cwd
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24118
diff changeset
   256
            cwd = pathutil.normasprefix(cwd)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   257
            if parentpath.startswith(cwd):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   258
                parentpath = parentpath[len(cwd) :]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   259
    if path.startswith(b'union:'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   260
        s = path.split(b":", 1)[1].split(b"+", 1)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   261
        if len(s) == 1:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   262
            repopath, repopath2 = parentpath, s[0]
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   263
        else:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   264
            repopath, repopath2 = s
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   265
    else:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   266
        repopath, repopath2 = parentpath, path
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   267
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   268
    return makeunionrepository(ui, repopath, repopath2)
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   269
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   270
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   271
def makeunionrepository(ui, repopath1, repopath2):
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   272
    """Make a union repository object from 2 local repo paths."""
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   273
    repo1 = localrepo.instance(ui, repopath1, create=False)
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   274
    repo2 = localrepo.instance(ui, repopath2, create=False)
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   275
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   276
    url = b'union:%s+%s' % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   277
        util.expandpath(repopath1),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   278
        util.expandpath(repopath2),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   279
    )
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   280
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   281
    class derivedunionrepository(unionrepository, repo1.__class__):
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   282
        pass
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   283
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   284
    repo = repo1
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   285
    repo.__class__ = derivedunionrepository
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   286
    unionrepository.__init__(repo1, repo2, url)
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   287
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   288
    return repo