mercurial/unionrepo.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 03 May 2021 12:21:15 +0200
changeset 47142 4292bed8da7c
parent 47072 4c041c71ec01
child 47143 47ffc754989a
permissions -rw-r--r--
revlog: make the index always return the same tuple It is simpler to manage the diferrence in on disk format in the internal index code itself and lets the rest of the code always handle the same object. This will become even more important when the data we store will be entirely different (for example the changelog does not need the "linkrev" field. We start with item reading, we will deal with item writing in the next changesets. Differential Revision: https://phab.mercurial-scm.org/D10568
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)
47072
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46780
diff changeset
    44
        target = getattr(revlog2, 'target', None)
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46780
diff changeset
    45
        if target is None:
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46780
diff changeset
    46
            # a revlog wrapper, eg: the manifestlog that is not an actual revlog
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46780
diff changeset
    47
            target = revlog2._revlog.target
4c041c71ec01 revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46780
diff changeset
    48
        revlog.revlog.__init__(self, opener, target=target, indexfile=indexfile)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    49
        self.revlog2 = revlog2
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    50
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    51
        n = len(self)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    52
        self.repotiprev = n - 1
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    53
        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
    54
        for rev2 in self.revlog2:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    55
            rev = self.revlog2.index[rev2]
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    56
            # rev numbers - in revlog2, very different from self.rev
47142
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    57
            (
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    58
                _start,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    59
                _csize,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    60
                rsize,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    61
                base,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    62
                linkrev,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    63
                p1rev,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    64
                p2rev,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    65
                node,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    66
                _sdo,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    67
                _sds,
4292bed8da7c revlog: make the index always return the same tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47072
diff changeset
    68
            ) = rev
27433
12f727a5b434 changegroup: add flags field to cg3 delta header
Mike Edgar <adgar@google.com>
parents: 26587
diff changeset
    69
            flags = _start & 0xFFFF
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    70
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    71
            if linkmapper is None:  # link is to same revlog
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    72
                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
    73
                link = n
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    74
            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
    75
                link = linkmapper(linkrev)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    76
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    77
            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
    78
                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
    79
43565
f212cc5ffceb index: use `index.get_rev` in `unionrepo.unionrevlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43533
diff changeset
    80
            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
    81
            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
    82
                # 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
    83
                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
    84
                continue
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    85
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    86
            p1node = self.revlog2.node(p1rev)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    87
            p2node = self.revlog2.node(p2rev)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
    88
45815
b6f4a1df91bd unionrepo: don't insert index tuples with None as int field
Joerg Sonnenberger <joerg@bec.de>
parents: 45788
diff changeset
    89
            # 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
    90
            # 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
    91
            e = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    92
                flags,
45815
b6f4a1df91bd unionrepo: don't insert index tuples with None as int field
Joerg Sonnenberger <joerg@bec.de>
parents: 45788
diff changeset
    93
                -1,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    94
                rsize,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    95
                base,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    96
                link,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    97
                self.rev(p1node),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    98
                self.rev(p2node),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
    99
                node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   100
            )
38850
6104b203bec8 index: replace insert(-1, e) method by append(e) method
Martin von Zweigbergk <martinvonz@google.com>
parents: 38176
diff changeset
   101
            self.index.append(e)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   102
            self.bundlerevs.add(n)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   103
            n += 1
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   104
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   105
    def _chunk(self, rev):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   106
        if rev <= self.repotiprev:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   107
            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
   108
        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
   109
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   110
    def revdiff(self, rev1, rev2):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   111
        """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
   112
        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
   113
            return self.revlog2.revdiff(
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   114
                self.revlog2.rev(self.node(rev1)),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   115
                self.revlog2.rev(self.node(rev2)),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   116
            )
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   117
        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
   118
            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
   119
42826
3e2520acf17b unionrepo: fix `revdiff` implementation to use `rawdata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42825
diff changeset
   120
        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
   121
42824
64c3db458d08 unionrepo: use a lower level overide in unionrepo too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42726
diff changeset
   122
    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
   123
        if isinstance(nodeorrev, int):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   124
            rev = nodeorrev
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   125
            node = self.node(rev)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   126
        else:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   127
            node = nodeorrev
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   128
            rev = self.rev(node)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   129
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   130
        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
   131
            # 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
   132
            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
   133
            func = revlog2._revisiondata
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   134
        else:
42824
64c3db458d08 unionrepo: use a lower level overide in unionrepo too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42726
diff changeset
   135
            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
   136
        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
   137
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   138
    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
   139
        raise NotImplementedError
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   140
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   141
    def addgroup(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   142
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   143
        deltas,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   144
        linkmapper,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   145
        transaction,
46373
711ba0f1057e revlog: decouple caching from addrevision callback for addgroup
Joerg Sonnenberger <joerg@bec.de>
parents: 45815
diff changeset
   146
        alwayscache=False,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   147
        addrevisioncb=None,
45788
a5206e71c536 revlog: extend addgroup() with callback for duplicates
Joerg Sonnenberger <joerg@bec.de>
parents: 43565
diff changeset
   148
        duplicaterevisioncb=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   149
        maybemissingparents=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   150
    ):
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   151
        raise NotImplementedError
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   152
42196
94e2f8437f6b unionrepo: sync with repository API
Joerg Sonnenberger <joerg@bec.de>
parents: 41038
diff changeset
   153
    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
   154
        raise NotImplementedError
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   155
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   156
    def checksize(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   157
        raise NotImplementedError
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   158
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   159
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   160
class unionchangelog(unionrevlog, changelog.changelog):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   161
    def __init__(self, opener, opener2):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   162
        changelog.changelog.__init__(self, opener)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   163
        linkmapper = None
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   164
        changelog2 = changelog.changelog(opener2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   165
        unionrevlog.__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   166
            self, opener, self.indexfile, changelog2, linkmapper
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   167
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   168
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   169
30374
f2d146d1e8d6 manifest: add unionmanifestlog support
Durham Goode <durham@fb.com>
parents: 30218
diff changeset
   170
class unionmanifest(unionrevlog, manifest.manifestrevlog):
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46373
diff changeset
   171
    def __init__(self, nodeconstants, opener, opener2, linkmapper):
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46373
diff changeset
   172
        manifest.manifestrevlog.__init__(self, nodeconstants, opener)
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46373
diff changeset
   173
        manifest2 = manifest.manifestrevlog(nodeconstants, opener2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   174
        unionrevlog.__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   175
            self, opener, self.indexfile, manifest2, linkmapper
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   176
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   177
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   178
37497
1541e1a8e87d filelog: wrap revlog instead of inheriting it (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34219
diff changeset
   179
class unionfilelog(filelog.filelog):
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   180
    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
   181
        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
   182
        filelog2 = filelog.filelog(opener2, path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   183
        self._revlog = unionrevlog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   184
            opener, self.indexfile, filelog2._revlog, linkmapper
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   185
        )
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   186
        self._repo = repo
37497
1541e1a8e87d filelog: wrap revlog instead of inheriting it (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34219
diff changeset
   187
        self.repotiprev = self._revlog.repotiprev
1541e1a8e87d filelog: wrap revlog instead of inheriting it (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34219
diff changeset
   188
        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
   189
24118
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24003
diff changeset
   190
    def iscensored(self, rev):
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24003
diff changeset
   191
        """Check if a revision is censored."""
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24003
diff changeset
   192
        if rev <= self.repotiprev:
76f6ae06ddf5 revlog: add "iscensored()" to revlog public API
Mike Edgar <adgar@google.com>
parents: 24003
diff changeset
   193
            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
   194
        node = self.node(rev)
bf86e3e87123 unionrepo: fix wrong rev being checked in iscensored (issue5024)
Sean Farley <sean@farley.io>
parents: 26587
diff changeset
   195
        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
   196
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   197
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   198
class unionpeer(localrepo.localpeer):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   199
    def canpush(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   200
        return False
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   201
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   202
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   203
class unionrepository(object):
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   204
    """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
   205
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   206
    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
   207
    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
   208
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   209
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   210
    def __init__(self, repo2, url):
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   211
        self.repo2 = repo2
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   212
        self._url = url
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   213
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   214
        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
   215
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   216
    @localrepo.unfilteredpropertycache
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   217
    def changelog(self):
23878
37a92908a382 localrepo: remove all external users of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 20790
diff changeset
   218
        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
   219
39763
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39605
diff changeset
   220
    @localrepo.unfilteredpropertycache
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39605
diff changeset
   221
    def manifestlog(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   222
        rootstore = unionmanifest(
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46373
diff changeset
   223
            self.nodeconstants,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46373
diff changeset
   224
            self.svfs,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46373
diff changeset
   225
            self.repo2.svfs,
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46373
diff changeset
   226
            self.unfiltered()._clrev,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   227
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   228
        return manifest.manifestlog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   229
            self.svfs, self, rootstore, self.narrowmatch()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   230
        )
39763
5ccd791344f3 localrepo: pass root manifest into manifestlog.__init__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39605
diff changeset
   231
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   232
    def _clrev(self, rev2):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   233
        """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
   234
        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
   235
        return self.changelog.rev(node)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   236
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   237
    def url(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   238
        return self._url
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   239
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   240
    def file(self, f):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   241
        return unionfilelog(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   242
            self.svfs, f, self.repo2.svfs, self.unfiltered()._clrev, self
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   243
        )
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   244
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   245
    def close(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   246
        self.repo2.close()
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   247
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   248
    def cancopy(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   249
        return False
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   250
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   251
    def peer(self):
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   252
        return unionpeer(self)
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   253
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   254
    def getcwd(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   255
        return encoding.getcwd()  # always outside the repo
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   256
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   257
39549
089fc0db0954 hg: allow extra arguments to be passed to repo creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38850
diff changeset
   258
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
   259
    if create:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   260
        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
   261
    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
   262
    if not parentpath:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   263
        # 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
   264
        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
   265
        if parentpath is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   266
            parentpath = b''
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   267
    if parentpath:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   268
        # 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
   269
        # 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
   270
        cwd = encoding.getcwd()
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   271
        if parentpath == cwd:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   272
            parentpath = b''
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   273
        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
   274
            cwd = pathutil.normasprefix(cwd)
18944
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   275
            if parentpath.startswith(cwd):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   276
                parentpath = parentpath[len(cwd) :]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   277
    if path.startswith(b'union:'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   278
        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
   279
        if len(s) == 1:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   280
            repopath, repopath2 = parentpath, s[0]
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   281
        else:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   282
            repopath, repopath2 = s
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   283
    else:
a9c443b3b240 unionrepo: read-only operations on a union of two localrepos
Mads Kiilerich <madski@unity3d.com>
parents:
diff changeset
   284
        repopath, repopath2 = parentpath, path
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   285
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   286
    return makeunionrepository(ui, repopath, repopath2)
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   287
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   288
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   289
def makeunionrepository(ui, repopath1, repopath2):
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   290
    """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
   291
    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
   292
    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
   293
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   294
    url = b'union:%s+%s' % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   295
        util.expandpath(repopath1),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   296
        util.expandpath(repopath2),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42829
diff changeset
   297
    )
39605
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   298
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   299
    class derivedunionrepository(unionrepository, repo1.__class__):
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   300
        pass
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   301
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   302
    repo = repo1
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   303
    repo.__class__ = derivedunionrepository
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   304
    unionrepository.__init__(repo1, repo2, url)
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   305
23f2299e9e53 unionrepo: dynamically create repository type from base repository
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39549
diff changeset
   306
    return repo