annotate mercurial/subrepoutil.py @ 51099:eba138890c64

revlog: move entry writing in the inner object This is the second big piece of API we want to live on the inner object. With this the inner object have freedom it needs to implement things internally. (except for the delayed write feature of the changelog, that will be migrated in coming changesets)
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 19 Oct 2023 05:19:55 +0200
parents 18c8c18993f0
children 9d3721552b6c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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