mercurial/subrepoutil.py
author Anton Shestakov <av6@dwimlabs.net>
Sat, 02 Dec 2023 15:02:03 -0300
branchstable
changeset 51167 b79f13d6ef25
parent 50929 18c8c18993f0
child 51285 9d3721552b6c
permissions -rw-r--r--
zeroconf: give inet_aton() str instead of bytes All other uses of this function in this extension are already fixed (i.e. use strings instead of bytes). This was caught by pytype 2023.11.21 on Python 3.11.2.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36009
55e8efa2451a subrepo: split non-core functions to new module
Yuya Nishihara <yuya@tcha.org>
parents: 35925
diff changeset
     1
# subrepoutil.py - sub-repository operations and substate handling
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     2
#
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46643
diff changeset
     3
# Copyright 2009-2010 Olivia Mackall <olivia@selenic.com>
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     4
#
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10251
diff changeset
     6
# GNU General Public License version 2 or any later version.
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
     7
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
     8
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
     9
import os
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    10
import posixpath
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    11
import re
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    12
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    13
from .i18n import _
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    14
from . import (
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    15
    config,
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    16
    error,
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
    17
    filemerge,
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    18
    pathutil,
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    19
    phases,
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
    20
    pycompat,
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    21
    util,
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    22
)
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
    23
from .utils import (
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
    24
    stringutil,
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
    25
    urlutil,
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
    26
)
25980
38c585c2f8cc subrepo: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25848
diff changeset
    27
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    28
nullstate = (b'', b'', b'empty')
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    29
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    30
if pycompat.TYPE_CHECKING:
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    31
    from typing import (
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    32
        Any,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    33
        Dict,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    34
        List,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    35
        Optional,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    36
        Set,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    37
        Tuple,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    38
    )
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    39
    from . import (
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    40
        context,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    41
        localrepo,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    42
        match as matchmod,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    43
        scmutil,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    44
        subrepo,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    45
        ui as uimod,
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    46
    )
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    47
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    48
    Substate = Dict[bytes, Tuple[bytes, bytes, bytes]]
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    49
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    50
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
    51
def state(ctx, ui):
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
    52
    # type: (context.changectx, uimod.ui) -> Substate
11571
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
    53
    """return a state dict, mapping subrepo paths configured in .hgsub
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
    54
    to tuple: (source from .hgsub, revision from .hgsubstate, kind
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
    55
    (key in types dict))
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
    56
    """
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    57
    p = config.config()
25768
7a9ef8608a1d subrepo: prefetch ctx.repo() for efficiency and centralization
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25660
diff changeset
    58
    repo = ctx.repo()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    59
45257
668af67bfd18 config: remove now-unused `abs` argument from `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 45255
diff changeset
    60
    def read(f, sections=None, remap=None):
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    61
        if f in ctx:
13017
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    62
            try:
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    63
                data = ctx[f].data()
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48913
diff changeset
    64
            except FileNotFoundError:
13017
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    65
                # handle missing subrepo spec files as removed
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    66
                ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    67
                    _(b"warning: subrepo spec file \'%s\' not found\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    68
                    % repo.pathto(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    69
                )
13017
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    70
                return
d0e21c5fde41 subrepo: handle missing subrepo spec file as removed
Patrick Mezard <pmezard@gmail.com>
parents: 13015
diff changeset
    71
            p.parse(f, data, sections, remap, read)
10174
65b6dc44cdbf subrepo: fix includes support in .hgsub
Matt Mackall <mpm@selenic.com>
parents: 10069
diff changeset
    72
        else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    73
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    74
                _(b"subrepo spec file \'%s\' not found") % repo.pathto(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    75
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    76
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    77
    if b'.hgsub' in ctx:
45257
668af67bfd18 config: remove now-unused `abs` argument from `include` callback
Martin von Zweigbergk <martinvonz@google.com>
parents: 45255
diff changeset
    78
        read(b'.hgsub')
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    79
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    80
    for path, src in ui.configitems(b'subpaths'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    81
        p.set(b'subpaths', path, src, ui.configsource(b'subpaths', path))
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
    82
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    83
    rev = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    84
    if b'.hgsubstate' in ctx:
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
    85
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    86
            for i, l in enumerate(ctx[b'.hgsubstate'].data().splitlines()):
16595
2de6ac4ac17c subrepo: ignore blank lines in .hgsubstate (issue3424)
Patrick Mezard <patrick@mezard.eu>
parents: 16555
diff changeset
    87
                l = l.lstrip()
2de6ac4ac17c subrepo: ignore blank lines in .hgsubstate (issue3424)
Patrick Mezard <patrick@mezard.eu>
parents: 16555
diff changeset
    88
                if not l:
2de6ac4ac17c subrepo: ignore blank lines in .hgsubstate (issue3424)
Patrick Mezard <patrick@mezard.eu>
parents: 16555
diff changeset
    89
                    continue
16596
95ca6c8b38da subrepo: do not traceback on .hgsubstate parsing errors
Patrick Mezard <patrick@mezard.eu>
parents: 16595
diff changeset
    90
                try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    91
                    revision, path = l.split(b" ", 1)
16596
95ca6c8b38da subrepo: do not traceback on .hgsubstate parsing errors
Patrick Mezard <patrick@mezard.eu>
parents: 16595
diff changeset
    92
                except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    93
                    raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    94
                        _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    95
                            b"invalid subrepository revision "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    96
                            b"specifier in \'%s\' line %d"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    97
                        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    98
                        % (repo.pathto(b'.hgsubstate'), (i + 1))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
    99
                    )
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   100
                rev[path] = revision
49306
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48913
diff changeset
   101
        except FileNotFoundError:
2e726c934fcd py3: catch FileNotFoundError instead of checking errno == ENOENT
Manuel Jacob <me@manueljacob.de>
parents: 48913
diff changeset
   102
            pass
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   103
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   104
    def remap(src):
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   105
        # type: (bytes) -> bytes
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   106
        for pattern, repl in p.items(b'subpaths'):
11961
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   107
            # Turn r'C:\foo\bar' into r'C:\\foo\\bar' since re.sub
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   108
            # does a string decode.
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36690
diff changeset
   109
            repl = stringutil.escapestr(repl)
11961
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   110
            # However, we still want to allow back references to go
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   111
            # through unharmed, so we turn r'\\1' into r'\1'. Again,
f3075ffa6b30 subrepos: handle backslashes in subpaths
Martin Geisler <mg@lazybytes.net>
parents: 11775
diff changeset
   112
            # extra escapes are needed because re.sub string decodes.
34068
6d21737c35bf py3: fix type of regex literals in subrepo.py
Yuya Nishihara <yuya@tcha.org>
parents: 34022
diff changeset
   113
            repl = re.sub(br'\\\\([0-9]+)', br'\\\1', repl)
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   114
            try:
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   115
                src = re.sub(pattern, repl, src, 1)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
   116
            except re.error as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   117
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   118
                    _(b"bad subrepository pattern in %s: %s")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   119
                    % (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   120
                        p.source(b'subpaths', pattern),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   121
                        stringutil.forcebytestr(e),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   122
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   123
                )
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   124
        return src
11775
a8614c5a5e9a subrepos: support remapping of .hgsub source paths
Martin Geisler <mg@lazybytes.net>
parents: 11572
diff changeset
   125
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   126
    state = {}
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   127
    for path, src in p.items(b''):  # type: bytes
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   128
        kind = b'hg'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   129
        if src.startswith(b'['):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   130
            if b']' not in src:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   131
                raise error.Abort(_(b'missing ] in subrepository source'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   132
            kind, src = src.split(b']', 1)
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   133
            kind = kind[1:]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   134
            src = src.lstrip()  # strip any extra whitespace after ']'
15150
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   135
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
   136
        if not urlutil.url(src).isabs():
25768
7a9ef8608a1d subrepo: prefetch ctx.repo() for efficiency and centralization
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 25660
diff changeset
   137
            parent = _abssource(repo, abort=False)
15150
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   138
            if parent:
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
   139
                parent = urlutil.url(parent)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   140
                parent.path = posixpath.join(parent.path or b'', src)
15150
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   141
                parent.path = posixpath.normpath(parent.path)
37586
b94fecf4cd8c py3: use bytes() instead of str() on util.url()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37585
diff changeset
   142
                joined = bytes(parent)
15150
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   143
                # Remap the full joined path and use it if it changes,
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   144
                # else remap the original source.
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   145
                remapped = remap(joined)
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   146
                if remapped == joined:
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   147
                    src = remap(src)
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   148
                else:
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   149
                    src = remapped
91dc8878f888 subrepo: try remapping subpaths using the "final" path
Martin Geisler <mg@aragost.com>
parents: 15149
diff changeset
   150
15149
eaec9cf91aea subrepo: refactor state function
Martin Geisler <mg@aragost.com>
parents: 15061
diff changeset
   151
        src = remap(src)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   152
        state[util.pconvert(path)] = (src.strip(), rev.get(path, b''), kind)
8812
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   153
859f841937d0 subrepo: introduce basic state parsing
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
   154
    return state
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   155
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   156
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   157
def writestate(repo, state):
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   158
    # type: (localrepo.localrepository, Substate) -> None
11571
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
   159
    """rewrite .hgsubstate in (outer) repo with these subrepo states"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   160
    lines = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   161
        b'%s %s\n' % (state[s][1], s)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   162
        for s in sorted(state)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   163
        if state[s][1] != nullstate[1]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   164
    ]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   165
    repo.wwrite(b'.hgsubstate', b''.join(lines), b'')
8813
db3c1ab0e632 commit: recurse into subrepositories
Matt Mackall <mpm@selenic.com>
parents: 8812
diff changeset
   166
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   167
30060
a145161debed merge: use labels in subrepo merge
Simon Farnsworth <simonfar@fb.com>
parents: 29510
diff changeset
   168
def submerge(repo, wctx, mctx, actx, overwrite, labels=None):
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   169
    # type: (localrepo.localrepository, context.workingctx, context.changectx, context.changectx, bool, Optional[Any]) -> Substate
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   170
    # TODO: type the `labels` arg
11571
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
   171
    """delegated from merge.applyupdates: merging of .hgsubstate file
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
   172
    in working context, merging context and ancestor context"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   173
    if mctx == actx:  # backwards?
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   174
        actx = wctx.p1()
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   175
    s1 = wctx.substate
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   176
    s2 = mctx.substate
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   177
    sa = actx.substate
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   178
    sm = {}
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   179
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   180
    repo.ui.debug(b"subrepo merge %s %s %s\n" % (wctx, mctx, actx))
9782
c1c40511c276 subrepo: add more debugging output, lose _ markers
Matt Mackall <mpm@selenic.com>
parents: 9781
diff changeset
   181
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   182
    def debug(s, msg, r=b""):
9779
58a6f3f4d553 subrepo: add some debug output to submerge
Matt Mackall <mpm@selenic.com>
parents: 9752
diff changeset
   183
        if r:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   184
            r = b"%s:%s:%s" % r
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   185
        repo.ui.debug(b"  subrepo %s: %s %s\n" % (s, msg, r))
9779
58a6f3f4d553 subrepo: add some debug output to submerge
Matt Mackall <mpm@selenic.com>
parents: 9752
diff changeset
   186
31516
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   187
    promptssrc = filemerge.partextras(labels)
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   188
    for s, l in sorted(s1.items()):
11470
34e33d50c26b subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents: 11463
diff changeset
   189
        a = sa.get(s, nullstate)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   190
        ld = l  # local state with possible dirty flag for compares
11470
34e33d50c26b subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents: 11463
diff changeset
   191
        if wctx.sub(s).dirty():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   192
            ld = (l[0], l[1] + b"+")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   193
        if wctx == actx:  # overwrite
11470
34e33d50c26b subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents: 11463
diff changeset
   194
            a = ld
11463
f0ea93557133 subrepo: fix recording of + in .hgsubstate (issue2217)
Matt Mackall <mpm@selenic.com>
parents: 11455
diff changeset
   195
31516
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   196
        prompts = promptssrc.copy()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   197
        prompts[b's'] = s
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   198
        if s in s2:
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   199
            r = s2[s]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   200
            if ld == r or r == a:  # no change or local is newer
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   201
                sm[s] = l
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   202
                continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   203
            elif ld == a:  # other side changed
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   204
                debug(s, b"other changed, get", r)
13322
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
   205
                wctx.sub(s).get(r, overwrite)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   206
                sm[s] = r
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   207
            elif ld[0] != r[0]:  # sources differ
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   208
                prompts[b'lo'] = l[0]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   209
                prompts[b'ro'] = r[0]
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8997
diff changeset
   210
                if repo.ui.promptchoice(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   211
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   212
                        b' subrepository sources for %(s)s differ\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   213
                        b'you can use (l)ocal%(l)s source (%(lo)s)'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   214
                        b' or (r)emote%(o)s source (%(ro)s).\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   215
                        b'what do you want to do?'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   216
                        b'$$ &Local $$ &Remote'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   217
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   218
                    % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   219
                    0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   220
                ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   221
                    debug(s, b"prompt changed, get", r)
13322
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
   222
                    wctx.sub(s).get(r, overwrite)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   223
                    sm[s] = r
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   224
            elif ld[1] == a[1]:  # local side is unchanged
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   225
                debug(s, b"other side changed, get", r)
13322
c19b9282d3a7 subrepo: make update -C clean the working directory for svn subrepos
Erik Zielke <ez@aragost.com>
parents: 13287
diff changeset
   226
                wctx.sub(s).get(r, overwrite)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   227
                sm[s] = r
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   228
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   229
                debug(s, b"both sides changed")
21401
2c364f7801c8 subrepo: use subrepo shortid method to generate subrepo diverged promptchoice
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 21400
diff changeset
   230
                srepo = wctx.sub(s)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   231
                prompts[b'sl'] = srepo.shortid(l[1])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   232
                prompts[b'sr'] = srepo.shortid(r[1])
19811
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   233
                option = repo.ui.promptchoice(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   234
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   235
                        b' subrepository %(s)s diverged (local revision: %(sl)s, '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
                        b'remote revision: %(sr)s)\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
                        b'you can (m)erge, keep (l)ocal%(l)s or keep '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   238
                        b'(r)emote%(o)s.\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   239
                        b'what do you want to do?'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   240
                        b'$$ &Merge $$ &Local $$ &Remote'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   241
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   242
                    % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   243
                    0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   244
                )
19811
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   245
                if option == 0:
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   246
                    wctx.sub(s).merge(r)
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   247
                    sm[s] = l
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   248
                    debug(s, b"merge with", r)
19811
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   249
                elif option == 1:
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   250
                    sm[s] = l
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   251
                    debug(s, b"keep local subrepo revision", l)
19811
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   252
                else:
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   253
                    wctx.sub(s).get(r, overwrite)
5e10d41e7b9c merge: let the user choose to merge, keep local or keep remote subrepo revisions
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19788
diff changeset
   254
                    sm[s] = r
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   255
                    debug(s, b"get remote subrepo revision", r)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   256
        elif ld == a:  # remote removed, local unchanged
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   257
            debug(s, b"remote removed, remove")
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   258
            wctx.sub(s).remove()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   259
        elif a == nullstate:  # not present in remote or ancestor
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   260
            debug(s, b"local added, keep")
14417
25137d99a5ed subrepo: handle local added subrepo case correctly
Matt Mackall <mpm@selenic.com>
parents: 14316
diff changeset
   261
            sm[s] = l
25137d99a5ed subrepo: handle local added subrepo case correctly
Matt Mackall <mpm@selenic.com>
parents: 14316
diff changeset
   262
            continue
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   263
        else:
9048
86b4a9b0ddda ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents: 8997
diff changeset
   264
            if repo.ui.promptchoice(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   265
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   266
                    b' local%(l)s changed subrepository %(s)s'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   267
                    b' which remote%(o)s removed\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   268
                    b'use (c)hanged version or (d)elete?'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   269
                    b'$$ &Changed $$ &Delete'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   270
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   271
                % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   272
                0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   273
            ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   274
                debug(s, b"prompt remove")
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   275
                wctx.sub(s).remove()
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   276
13857
ba1f98f877ec subrepo: process merge substate in sorted order in submerge()
Adrian Buehlmann <adrian@cadifra.com>
parents: 13771
diff changeset
   277
    for s, r in sorted(s2.items()):
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   278
        if s in s1:
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   279
            continue
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   280
        elif s not in sa:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   281
            debug(s, b"remote added, get", r)
10175
fc32b2fc468e subrepo: load from a context where the subrepo exists
Augie Fackler <durin42@gmail.com>
parents: 10174
diff changeset
   282
            mctx.sub(s).get(r)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   283
            sm[s] = r
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   284
        elif r != sa[s]:
31516
2915cc1d3429 subrepo: move prompts out of the if (issue5505)
Simon Farnsworth <simonfar@fb.com>
parents: 30755
diff changeset
   285
            prompts = promptssrc.copy()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   286
            prompts[b's'] = s
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   287
            if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   288
                repo.ui.promptchoice(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   289
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   290
                        b' remote%(o)s changed subrepository %(s)s'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   291
                        b' which local%(l)s removed\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   292
                        b'use (c)hanged version or (d)elete?'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   293
                        b'$$ &Changed $$ &Delete'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   294
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   295
                    % prompts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   296
                    0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   297
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   298
                == 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   299
            ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   300
                debug(s, b"prompt recreate", r)
24110
756c5c8331b0 subrepo: add tests for change/remove conflicts
Martin von Zweigbergk <martinvonz@google.com>
parents: 23963
diff changeset
   301
                mctx.sub(s).get(r)
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   302
                sm[s] = r
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   303
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   304
    # record merged .hgsubstate
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   305
    writestate(repo, sm)
19637
cc338115d3b2 subrepo: make submerge() return the merged substate
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 19226
diff changeset
   306
    return sm
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   307
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   308
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   309
def precommit(ui, wctx, status, match, force=False):
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   310
    # type: (uimod.ui, context.workingcommitctx, scmutil.status, matchmod.basematcher, bool) -> Tuple[List[bytes], Set[bytes], Substate]
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   311
    """Calculate .hgsubstate changes that should be applied before committing
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   312
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   313
    Returns (subs, commitsubs, newstate) where
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   314
    - subs: changed subrepos (including dirty ones)
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   315
    - commitsubs: dirty subrepos which the caller needs to commit recursively
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   316
    - newstate: new state dict which the caller must write to .hgsubstate
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   317
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   318
    This also updates the given status argument.
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   319
    """
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   320
    subs = []
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   321
    commitsubs = set()
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   322
    newstate = wctx.substate.copy()
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   323
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   324
    # only manage subrepos and .hgsubstate if .hgsub is present
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   325
    if b'.hgsub' in wctx:
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   326
        # we'll decide whether to track this ourselves, thanks
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   327
        for c in status.modified, status.added, status.removed:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   328
            if b'.hgsubstate' in c:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   329
                c.remove(b'.hgsubstate')
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   330
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   331
        # compare current state to last committed state
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   332
        # build new substate based on last committed state
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   333
        oldstate = wctx.p1().substate
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   334
        for s in sorted(newstate.keys()):
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   335
            if not match(s):
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   336
                # ignore working copy, use old state if present
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   337
                if s in oldstate:
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   338
                    newstate[s] = oldstate[s]
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   339
                    continue
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   340
                if not force:
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   341
                    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   342
                        _(b"commit with new subrepo %s excluded") % s
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   343
                    )
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   344
            dirtyreason = wctx.sub(s).dirtyreason(True)
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   345
            if dirtyreason:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   346
                if not ui.configbool(b'ui', b'commitsubrepos'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   347
                    raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   348
                        dirtyreason,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   349
                        hint=_(b"use --subrepos for recursive commit"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   350
                    )
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   351
                subs.append(s)
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   352
                commitsubs.add(s)
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   353
            else:
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   354
                bs = wctx.sub(s).basestate()
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   355
                newstate[s] = (newstate[s][0], bs, newstate[s][2])
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   356
                if oldstate.get(s, (None, None, None))[1] != bs:
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   357
                    subs.append(s)
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   358
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   359
        # check for removed subrepos
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   360
        for p in wctx.parents():
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   361
            r = [s for s in p.substate if s not in newstate]
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   362
            subs += [s for s in r if match(s)]
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   363
        if subs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   364
            if not match(b'.hgsub') and b'.hgsub' in (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   365
                wctx.modified() + wctx.added()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   366
            ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   367
                raise error.Abort(_(b"can't commit subrepos without .hgsub"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   368
            status.modified.insert(0, b'.hgsubstate')
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   369
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   370
    elif b'.hgsub' in status.removed:
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   371
        # clean up .hgsubstate when .hgsub is removed
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   372
        if b'.hgsubstate' in wctx and b'.hgsubstate' not in (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   373
            status.modified + status.added + status.removed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   374
        ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   375
            status.removed.insert(0, b'.hgsubstate')
35025
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   376
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   377
    return subs, commitsubs, newstate
5c6b96b832c2 subrepo: extract preprocess of repo.commit() to free function
Yuya Nishihara <yuya@tcha.org>
parents: 34989
diff changeset
   378
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   379
46929
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   380
def repo_rel_or_abs_source(repo):
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   381
    """return the source of this repo
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   382
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   383
    Either absolute or relative the outermost repo"""
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   384
    parent = repo
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   385
    chunks = []
50928
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50607
diff changeset
   386
    while hasattr(parent, '_subparent'):
46929
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   387
        source = urlutil.url(parent._subsource)
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   388
        chunks.append(bytes(source))
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   389
        if source.isabs():
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   390
            break
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   391
        parent = parent._subparent
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   392
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   393
    chunks.reverse()
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   394
    path = posixpath.join(*chunks)
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   395
    return posixpath.normpath(path)
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   396
5a59a0ed0a37 subrepo: introduce a `repo_rel_or_abs_source` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46907
diff changeset
   397
24785
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   398
def reporelpath(repo):
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   399
    # type: (localrepo.localrepository) -> bytes
24785
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   400
    """return path to this (sub)repo as seen from outermost repo"""
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   401
    parent = repo
50928
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50607
diff changeset
   402
    while hasattr(parent, '_subparent'):
24785
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   403
        parent = parent._subparent
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   404
    return repo.root[len(pathutil.normasprefix(parent.root)) :]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   405
24785
39f519be5e65 subrepo: backout 93b0e0db7929 to restore reporelpath()
Matt Harbison <matt_harbison@yahoo.com>
parents: 24778
diff changeset
   406
12752
18b5b6392fcf subrepo: rename relpath to subrelpath and introduce reporelpath
Mads Kiilerich <mads@kiilerich.com>
parents: 12506
diff changeset
   407
def subrelpath(sub):
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   408
    # type: (subrepo.abstractsubrepo) -> bytes
11571
636554d58665 subrepo: docstrings
Mads Kiilerich <mads@kiilerich.com>
parents: 11470
diff changeset
   409
    """return path to this subrepo as seen from outermost repo"""
24673
105758d1b37b subrepo: add _relpath field to centralize subrelpath logic
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24672
diff changeset
   410
    return sub._relpath
11112
4a9bee613737 subrepo: print paths relative to upper repo root for push/pull/commit
Edouard Gomez <ed.gomez@free.fr>
parents: 11111
diff changeset
   411
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   412
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   413
def _abssource(repo, push=False, abort=True):
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   414
    # type: (localrepo.localrepository, bool, bool) -> Optional[bytes]
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   415
    """return pull/push path of repo - either based on parent repo .hgsub info
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   416
    or on the top repo config. Abort or return None if no source found."""
50928
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50607
diff changeset
   417
    if hasattr(repo, '_subparent'):
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
   418
        source = urlutil.url(repo._subsource)
14766
4f56b7530eab subrepos: be smarter about what's an absolute path (issue2808)
Matt Mackall <mpm@selenic.com>
parents: 14664
diff changeset
   419
        if source.isabs():
35613
991f0be9dc39 py3: use bytes instead of pycompat.bytestr
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35587
diff changeset
   420
            return bytes(source)
13771
ce6227306c9a subrepos: use url.url when normalizing repo paths
Brodie Rao <brodie@bitheap.org>
parents: 13753
diff changeset
   421
        source.path = posixpath.normpath(source.path)
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   422
        parent = _abssource(repo._subparent, push, abort=False)
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   423
        if parent:
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
   424
            parent = urlutil.url(util.pconvert(parent))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   425
            parent.path = posixpath.join(parent.path or b'', source.path)
13771
ce6227306c9a subrepos: use url.url when normalizing repo paths
Brodie Rao <brodie@bitheap.org>
parents: 13753
diff changeset
   426
            parent.path = posixpath.normpath(parent.path)
35613
991f0be9dc39 py3: use bytes instead of pycompat.bytestr
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35587
diff changeset
   427
            return bytes(parent)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   428
    else:  # recursion reached top repo
35777
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   429
        path = None
50928
d718eddf01d9 safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50607
diff changeset
   430
        if hasattr(repo, '_subtoppath'):
35777
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   431
            path = repo._subtoppath
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   432
        elif push and repo.ui.config(b'paths', b'default-push'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   433
            path = repo.ui.config(b'paths', b'default-push')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   434
        elif repo.ui.config(b'paths', b'default'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   435
            path = repo.ui.config(b'paths', b'default')
35777
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   436
        elif repo.shared():
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   437
            # chop off the .hg component to get the default path form.  This has
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   438
            # already run through vfsmod.vfs(..., realpath=True), so it doesn't
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   439
            # have problems with 'C:'
18510
f254ab6207ae subrepo: use sharepath if available when locating the source repo
Matt Harbison <matt_harbison@yahoo.com>
parents: 18364
diff changeset
   440
            return os.path.dirname(repo.sharedpath)
35777
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   441
        if path:
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   442
            # issue5770: 'C:\' and 'C:' are not equivalent paths.  The former is
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   443
            # as expected: an absolute path to the root of the C: drive.  The
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   444
            # latter is a relative path, and works like so:
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   445
            #
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   446
            #   C:\>cd C:\some\path
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   447
            #   C:\>D:
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   448
            #   D:\>python -c "import os; print os.path.abspath('C:')"
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   449
            #   C:\some\path
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   450
            #
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   451
            #   D:\>python -c "import os; print os.path.abspath('C:relative')"
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   452
            #   C:\some\path\relative
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
   453
            if urlutil.hasdriveletter(path):
35777
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   454
                if len(path) == 2 or path[2:3] not in br'\/':
47629
5cf2059d2647 windows: use abspath in subrepoutil
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46929
diff changeset
   455
                    path = util.abspath(path)
35777
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   456
            return path
0c0689a7565e subrepo: handle 'C:' style paths on the command line (issue5770)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35676
diff changeset
   457
12753
ef5eaf53f4f7 subrepo: abort instead of pushing/pulling to the repo itself
Mads Kiilerich <mads@kiilerich.com>
parents: 12752
diff changeset
   458
    if abort:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   459
        raise error.Abort(_(b"default path for subrepository not found"))
8814
ab668c92a036 subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents: 8813
diff changeset
   460
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   461
20176
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   462
def newcommitphase(ui, ctx):
46643
eef13b940887 typing: add type annotations to the public methods of mercurial/subrepoutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 46423
diff changeset
   463
    # type: (uimod.ui, context.changectx) -> int
20176
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   464
    commitphase = phases.newcommitphase(ui)
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   465
    substate = getattr(ctx, "substate", None)
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   466
    if not substate:
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   467
        return commitphase
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   468
    check = ui.config(b'phases', b'checksubrepos')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   469
    if check not in (b'ignore', b'follow', b'abort'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   470
        raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   471
            _(b'invalid phases.checksubrepos configuration: %s') % check
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   472
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   473
    if check == b'ignore':
20176
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   474
        return commitphase
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   475
    maxphase = phases.public
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   476
    maxsub = None
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   477
    for s in sorted(substate):
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   478
        sub = ctx.sub(s)
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   479
        subphase = sub.phase(substate[s][1])
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   480
        if maxphase < subphase:
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   481
            maxphase = subphase
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   482
            maxsub = s
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   483
    if commitphase < maxphase:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   484
        if check == b'abort':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   485
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   486
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   487
                    b"can't commit in %s phase"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   488
                    b" conflicting %s from subrepository %s"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   489
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   490
                % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   491
                    phases.phasenames[commitphase],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   492
                    phases.phasenames[maxphase],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   493
                    maxsub,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   494
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   495
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   496
        ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   497
            _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   498
                b"warning: changes are committed in"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   499
                b" %s phase from subrepository %s\n"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   500
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   501
            % (phases.phasenames[maxphase], maxsub)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42588
diff changeset
   502
        )
20176
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   503
        return maxphase
4c96c50ef937 subrepo: check phase of state in each subrepositories before committing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20108
diff changeset
   504
    return commitphase