author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
Thu, 02 Mar 2017 13:27:42 +0100 | |
changeset 31218 | 4cc3797aa59c |
parent 31216 | 21fa3d3688f3 |
child 31245 | c1ebe18d5156 |
permissions | -rw-r--r-- |
3714 | 1 |
# Patch transplanting extension for Mercurial |
2 |
# |
|
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4516
diff
changeset
|
3 |
# Copyright 2006, 2007 Brendan Cully <brendan@kublai.com> |
3714 | 4 |
# |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8209
diff
changeset
|
5 |
# This software may be used and distributed according to the terms of the |
10263 | 6 |
# GNU General Public License version 2 or any later version. |
3714 | 7 |
|
8934
9dda4c73fc3b
extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8894
diff
changeset
|
8 |
'''command to transplant changesets from another branch |
3714 | 9 |
|
19028
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
10 |
This extension allows you to transplant changes to another parent revision, |
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
11 |
possibly in another repository. The transplant is done using 'diff' patches. |
3714 | 12 |
|
8000
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
13 |
Transplanted patches are recorded in .hg/transplant/transplants, as a |
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
14 |
map from a changeset hash to its hash in the source repository. |
3714 | 15 |
''' |
28481
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
16 |
from __future__ import absolute_import |
3714 | 17 |
|
28481
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
18 |
import os |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
19 |
import tempfile |
7629
97253bcb44a8
transplant: move docstrings before imports (see issue1466)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7415
diff
changeset
|
20 |
from mercurial.i18n import _ |
28481
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
21 |
from mercurial import ( |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
22 |
bundlerepo, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
23 |
cmdutil, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
24 |
error, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
25 |
exchange, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
26 |
hg, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
27 |
match, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
28 |
merge, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
29 |
node as nodemod, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
30 |
patch, |
30925
82f1ef8b4477
py3: convert the mode argument of os.fdopen to unicodes (2 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29841
diff
changeset
|
31 |
pycompat, |
28481
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
32 |
registrar, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
33 |
revlog, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
34 |
revset, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
35 |
scmutil, |
31023
aea06029919e
revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents:
30925
diff
changeset
|
36 |
smartset, |
28481
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
37 |
util, |
ec75c94262a5
transplant: use absolute_import
timeless <timeless@mozdev.org>
parents:
28480
diff
changeset
|
38 |
) |
7629
97253bcb44a8
transplant: move docstrings before imports (see issue1466)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7415
diff
changeset
|
39 |
|
16507
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
40 |
class TransplantError(error.Abort): |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
41 |
pass |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
42 |
|
14308
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
43 |
cmdtable = {} |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
44 |
command = cmdutil.command(cmdtable) |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
28540
diff
changeset
|
45 |
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
25186
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24365
diff
changeset
|
46 |
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24365
diff
changeset
|
47 |
# be specifying the version(s) of Mercurial they are tested with, or |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24365
diff
changeset
|
48 |
# leave the attribute unspecified. |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
28540
diff
changeset
|
49 |
testedwith = 'ships-with-hg-core' |
14308
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
50 |
|
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8706
diff
changeset
|
51 |
class transplantentry(object): |
3714 | 52 |
def __init__(self, lnode, rnode): |
53 |
self.lnode = lnode |
|
54 |
self.rnode = rnode |
|
55 |
||
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8706
diff
changeset
|
56 |
class transplants(object): |
3714 | 57 |
def __init__(self, path=None, transplantfile=None, opener=None): |
58 |
self.path = path |
|
59 |
self.transplantfile = transplantfile |
|
60 |
self.opener = opener |
|
61 |
||
62 |
if not opener: |
|
31216
21fa3d3688f3
vfs: replace 'scmutil.opener' usage with 'scmutil.vfs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31202
diff
changeset
|
63 |
self.opener = scmutil.vfs(self.path) |
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
64 |
self.transplants = {} |
3714 | 65 |
self.dirty = False |
66 |
self.read() |
|
67 |
||
68 |
def read(self): |
|
69 |
abspath = os.path.join(self.path, self.transplantfile) |
|
70 |
if self.transplantfile and os.path.exists(abspath): |
|
14168
135e244776f0
prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14161
diff
changeset
|
71 |
for line in self.opener.read(self.transplantfile).splitlines(): |
3714 | 72 |
lnode, rnode = map(revlog.bin, line.split(':')) |
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
73 |
list = self.transplants.setdefault(rnode, []) |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
74 |
list.append(transplantentry(lnode, rnode)) |
3714 | 75 |
|
76 |
def write(self): |
|
77 |
if self.dirty and self.transplantfile: |
|
78 |
if not os.path.isdir(self.path): |
|
79 |
os.mkdir(self.path) |
|
80 |
fp = self.opener(self.transplantfile, 'w') |
|
12349
7340b0fa049a
transplant: fix var name conflict introduced by 2912881c2a98
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12347
diff
changeset
|
81 |
for list in self.transplants.itervalues(): |
7340b0fa049a
transplant: fix var name conflict introduced by 2912881c2a98
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12347
diff
changeset
|
82 |
for t in list: |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
83 |
l, r = map(nodemod.hex, (t.lnode, t.rnode)) |
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
84 |
fp.write(l + ':' + r + '\n') |
3714 | 85 |
fp.close() |
86 |
self.dirty = False |
|
87 |
||
88 |
def get(self, rnode): |
|
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
89 |
return self.transplants.get(rnode) or [] |
3714 | 90 |
|
91 |
def set(self, lnode, rnode): |
|
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
92 |
list = self.transplants.setdefault(rnode, []) |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
93 |
list.append(transplantentry(lnode, rnode)) |
3714 | 94 |
self.dirty = True |
95 |
||
96 |
def remove(self, transplant): |
|
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
97 |
list = self.transplants.get(transplant.rnode) |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
98 |
if list: |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
99 |
del list[list.index(transplant)] |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
100 |
self.dirty = True |
3714 | 101 |
|
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8706
diff
changeset
|
102 |
class transplanter(object): |
21411
afff78be4361
transplant: use "getcommiteditor()" instead of explicit editor choice
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20988
diff
changeset
|
103 |
def __init__(self, ui, repo, opts): |
3714 | 104 |
self.ui = ui |
105 |
self.path = repo.join('transplant') |
|
31216
21fa3d3688f3
vfs: replace 'scmutil.opener' usage with 'scmutil.vfs'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31202
diff
changeset
|
106 |
self.opener = scmutil.vfs(self.path) |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
107 |
self.transplants = transplants(self.path, 'transplants', |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
108 |
opener=self.opener) |
22252
de783f2403c4
transplant: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22006
diff
changeset
|
109 |
def getcommiteditor(): |
de783f2403c4
transplant: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22006
diff
changeset
|
110 |
editform = cmdutil.mergeeditform(repo[None], 'transplant') |
de783f2403c4
transplant: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22006
diff
changeset
|
111 |
return cmdutil.getcommiteditor(editform=editform, **opts) |
de783f2403c4
transplant: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22006
diff
changeset
|
112 |
self.getcommiteditor = getcommiteditor |
3714 | 113 |
|
114 |
def applied(self, repo, node, parent): |
|
115 |
'''returns True if a node is already an ancestor of parent |
|
17010
a6c64211acdb
transplant: convert applied() algorithm from nodes to revs
Joshua Redstone <joshua.redstone@fb.com>
parents:
17009
diff
changeset
|
116 |
or is parent or has already been transplanted''' |
a6c64211acdb
transplant: convert applied() algorithm from nodes to revs
Joshua Redstone <joshua.redstone@fb.com>
parents:
17009
diff
changeset
|
117 |
if hasnode(repo, parent): |
a6c64211acdb
transplant: convert applied() algorithm from nodes to revs
Joshua Redstone <joshua.redstone@fb.com>
parents:
17009
diff
changeset
|
118 |
parentrev = repo.changelog.rev(parent) |
3714 | 119 |
if hasnode(repo, node): |
17010
a6c64211acdb
transplant: convert applied() algorithm from nodes to revs
Joshua Redstone <joshua.redstone@fb.com>
parents:
17009
diff
changeset
|
120 |
rev = repo.changelog.rev(node) |
18082
40f0c0748cfc
transplant: replace incancestors uses with ancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17874
diff
changeset
|
121 |
reachable = repo.changelog.ancestors([parentrev], rev, |
40f0c0748cfc
transplant: replace incancestors uses with ancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17874
diff
changeset
|
122 |
inclusive=True) |
17010
a6c64211acdb
transplant: convert applied() algorithm from nodes to revs
Joshua Redstone <joshua.redstone@fb.com>
parents:
17009
diff
changeset
|
123 |
if rev in reachable: |
3714 | 124 |
return True |
125 |
for t in self.transplants.get(node): |
|
126 |
# it might have been stripped |
|
127 |
if not hasnode(repo, t.lnode): |
|
128 |
self.transplants.remove(t) |
|
129 |
return False |
|
17010
a6c64211acdb
transplant: convert applied() algorithm from nodes to revs
Joshua Redstone <joshua.redstone@fb.com>
parents:
17009
diff
changeset
|
130 |
lnoderev = repo.changelog.rev(t.lnode) |
18082
40f0c0748cfc
transplant: replace incancestors uses with ancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17874
diff
changeset
|
131 |
if lnoderev in repo.changelog.ancestors([parentrev], lnoderev, |
40f0c0748cfc
transplant: replace incancestors uses with ancestors
Siddharth Agarwal <sid0@fb.com>
parents:
17874
diff
changeset
|
132 |
inclusive=True): |
3714 | 133 |
return True |
134 |
return False |
|
135 |
||
26346
2449a0a6ebda
transplant: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25879
diff
changeset
|
136 |
def apply(self, repo, source, revmap, merges, opts=None): |
3714 | 137 |
'''apply the revisions in revmap one by one in revision order''' |
26346
2449a0a6ebda
transplant: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25879
diff
changeset
|
138 |
if opts is None: |
2449a0a6ebda
transplant: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25879
diff
changeset
|
139 |
opts = {} |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8176
diff
changeset
|
140 |
revs = sorted(revmap) |
3714 | 141 |
p1, p2 = repo.dirstate.parents() |
142 |
pulls = [] |
|
23452
86c0d8c1484f
transplant: don't honor whitespace and format-changing diffopts
Siddharth Agarwal <sid0@fb.com>
parents:
23270
diff
changeset
|
143 |
diffopts = patch.difffeatureopts(self.ui, opts) |
3714 | 144 |
diffopts.git = True |
145 |
||
27289
ee33e677f0ac
transplant: widen wlock scope of transplant for consitency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
146 |
lock = tr = None |
3714 | 147 |
try: |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
148 |
lock = repo.lock() |
15204
3ce9b1a7538b
transplant: wrap a transaction around the whole command
Greg Ward <greg@gerg.ca>
parents:
14741
diff
changeset
|
149 |
tr = repo.transaction('transplant') |
3714 | 150 |
for rev in revs: |
151 |
node = revmap[rev] |
|
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
152 |
revstr = '%s:%s' % (rev, nodemod.short(node)) |
3714 | 153 |
|
154 |
if self.applied(repo, node, p1): |
|
155 |
self.ui.warn(_('skipping already applied revision %s\n') % |
|
156 |
revstr) |
|
157 |
continue |
|
158 |
||
159 |
parents = source.changelog.parents(node) |
|
16627
38c45a99be0b
transplant: manually transplant pullable changesets with --log
Levi Bard <levi@unity3d.com>
parents:
16551
diff
changeset
|
160 |
if not (opts.get('filter') or opts.get('log')): |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
161 |
# If the changeset parent is the same as the |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
162 |
# wdir's parent, just pull it. |
3714 | 163 |
if parents[0] == p1: |
164 |
pulls.append(node) |
|
165 |
p1 = node |
|
166 |
continue |
|
167 |
if pulls: |
|
168 |
if source != repo: |
|
22699
74da54e52d7c
transplant: use exchange.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22252
diff
changeset
|
169 |
exchange.pull(repo, source.peer(), heads=pulls) |
27344
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27322
diff
changeset
|
170 |
merge.update(repo, pulls[-1], False, False) |
3714 | 171 |
p1, p2 = repo.dirstate.parents() |
172 |
pulls = [] |
|
173 |
||
174 |
domerge = False |
|
175 |
if node in merges: |
|
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
176 |
# pulling all the merge revs at once would mean we |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
177 |
# couldn't transplant after the latest even if |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
178 |
# transplants before them fail. |
3714 | 179 |
domerge = True |
180 |
if not hasnode(repo, node): |
|
22699
74da54e52d7c
transplant: use exchange.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22252
diff
changeset
|
181 |
exchange.pull(repo, source.peer(), heads=[node]) |
3714 | 182 |
|
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
183 |
skipmerge = False |
3714 | 184 |
if parents[1] != revlog.nullid: |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
185 |
if not opts.get('parent'): |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
186 |
self.ui.note(_('skipping merge changeset %s:%s\n') |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
187 |
% (rev, nodemod.short(node))) |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
188 |
skipmerge = True |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
189 |
else: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
190 |
parent = source.lookup(opts['parent']) |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
191 |
if parent not in parents: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
192 |
raise error.Abort(_('%s is not a parent of %s') % |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
193 |
(nodemod.short(parent), |
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
194 |
nodemod.short(node))) |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
195 |
else: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
196 |
parent = parents[0] |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
197 |
|
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
198 |
if skipmerge: |
3714 | 199 |
patchfile = None |
200 |
else: |
|
201 |
fd, patchfile = tempfile.mkstemp(prefix='hg-transplant-') |
|
30925
82f1ef8b4477
py3: convert the mode argument of os.fdopen to unicodes (2 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29841
diff
changeset
|
202 |
fp = os.fdopen(fd, pycompat.sysstr('w')) |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
203 |
gen = patch.diff(source, parent, node, opts=diffopts) |
7308
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7280
diff
changeset
|
204 |
for chunk in gen: |
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7280
diff
changeset
|
205 |
fp.write(chunk) |
3714 | 206 |
fp.close() |
207 |
||
208 |
del revmap[rev] |
|
209 |
if patchfile or domerge: |
|
210 |
try: |
|
16507
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
211 |
try: |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
212 |
n = self.applyone(repo, node, |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
213 |
source.changelog.read(node), |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
214 |
patchfile, merge=domerge, |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
215 |
log=opts.get('log'), |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
216 |
filter=opts.get('filter')) |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
217 |
except TransplantError: |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
218 |
# Do not rollback, it is up to the user to |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
219 |
# fix the merge or cancel everything |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
220 |
tr.close() |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
221 |
raise |
4251
e76e52145c3d
transplant: fix ignoring empty changesets (eg after filter)
Brendan Cully <brendan@kublai.com>
parents:
4072
diff
changeset
|
222 |
if n and domerge: |
3714 | 223 |
self.ui.status(_('%s merged at %s\n') % (revstr, |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
224 |
nodemod.short(n))) |
4251
e76e52145c3d
transplant: fix ignoring empty changesets (eg after filter)
Brendan Cully <brendan@kublai.com>
parents:
4072
diff
changeset
|
225 |
elif n: |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
226 |
self.ui.status(_('%s transplanted to %s\n') |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
227 |
% (nodemod.short(node), |
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
228 |
nodemod.short(n))) |
3714 | 229 |
finally: |
230 |
if patchfile: |
|
231 |
os.unlink(patchfile) |
|
15204
3ce9b1a7538b
transplant: wrap a transaction around the whole command
Greg Ward <greg@gerg.ca>
parents:
14741
diff
changeset
|
232 |
tr.close() |
3714 | 233 |
if pulls: |
22699
74da54e52d7c
transplant: use exchange.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22252
diff
changeset
|
234 |
exchange.pull(repo, source.peer(), heads=pulls) |
27344
43c00ca887d1
merge: have merge.update use a matcher instead of partial fn
Augie Fackler <augie@google.com>
parents:
27322
diff
changeset
|
235 |
merge.update(repo, pulls[-1], False, False) |
3714 | 236 |
finally: |
237 |
self.saveseries(revmap, merges) |
|
238 |
self.transplants.write() |
|
15204
3ce9b1a7538b
transplant: wrap a transaction around the whole command
Greg Ward <greg@gerg.ca>
parents:
14741
diff
changeset
|
239 |
if tr: |
3ce9b1a7538b
transplant: wrap a transaction around the whole command
Greg Ward <greg@gerg.ca>
parents:
14741
diff
changeset
|
240 |
tr.release() |
25879
99e88320d665
transplant: restore dirstate correctly at unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25828
diff
changeset
|
241 |
if lock: |
99e88320d665
transplant: restore dirstate correctly at unexpected failure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
25828
diff
changeset
|
242 |
lock.release() |
3714 | 243 |
|
13579
3cbb3c57a50e
transplant: added 'HGREVISION' variable to the environment passed to the 'filter' command
Luke Plant <L.Plant.98@cantab.net>
parents:
13031
diff
changeset
|
244 |
def filter(self, filter, node, changelog, patchfile): |
3714 | 245 |
'''arbitrarily rewrite changeset before applying it''' |
246 |
||
6966
057ced2b8543
i18n: mark strings for translation in transplant extension
Martin Geisler <mg@daimi.au.dk>
parents:
6762
diff
changeset
|
247 |
self.ui.status(_('filtering %s\n') % patchfile) |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
248 |
user, date, msg = (changelog[1], changelog[2], changelog[4]) |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
249 |
fd, headerfile = tempfile.mkstemp(prefix='hg-transplant-') |
30925
82f1ef8b4477
py3: convert the mode argument of os.fdopen to unicodes (2 of 2)
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29841
diff
changeset
|
250 |
fp = os.fdopen(fd, pycompat.sysstr('w')) |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
251 |
fp.write("# HG changeset patch\n") |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
252 |
fp.write("# User %s\n" % user) |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
253 |
fp.write("# Date %d %d\n" % date) |
9433
f01a22096f1f
transplant: Add trailing LF in tmp file for filtering
Mads Kiilerich <mads@kiilerich.com>
parents:
9183
diff
changeset
|
254 |
fp.write(msg + '\n') |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
255 |
fp.close() |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
256 |
|
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
257 |
try: |
23270
41c03b7592ed
util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org>
parents:
22699
diff
changeset
|
258 |
self.ui.system('%s %s %s' % (filter, util.shellquote(headerfile), |
41c03b7592ed
util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org>
parents:
22699
diff
changeset
|
259 |
util.shellquote(patchfile)), |
41c03b7592ed
util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org>
parents:
22699
diff
changeset
|
260 |
environ={'HGUSER': changelog[1], |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
261 |
'HGREVISION': nodemod.hex(node), |
23270
41c03b7592ed
util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org>
parents:
22699
diff
changeset
|
262 |
}, |
31202
2db38ef73ce8
transplant: set a blockedtag when invoking external filter
Simon Farnsworth <simonfar@fb.com>
parents:
31023
diff
changeset
|
263 |
onerr=error.Abort, errprefix=_('filter failed'), |
2db38ef73ce8
transplant: set a blockedtag when invoking external filter
Simon Farnsworth <simonfar@fb.com>
parents:
31023
diff
changeset
|
264 |
blockedtag='transplant_filter') |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
265 |
user, date, msg = self.parselog(file(headerfile))[1:4] |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
266 |
finally: |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
267 |
os.unlink(headerfile) |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
268 |
|
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
269 |
return (user, date, msg) |
3714 | 270 |
|
271 |
def applyone(self, repo, node, cl, patchfile, merge=False, log=False, |
|
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
272 |
filter=None): |
3714 | 273 |
'''apply the patch in patchfile to the repository as a transplant''' |
274 |
(manifest, user, (time, timezone), files, message) = cl[:5] |
|
275 |
date = "%d %d" % (time, timezone) |
|
276 |
extra = {'transplant_source': node} |
|
277 |
if filter: |
|
13579
3cbb3c57a50e
transplant: added 'HGREVISION' variable to the environment passed to the 'filter' command
Luke Plant <L.Plant.98@cantab.net>
parents:
13031
diff
changeset
|
278 |
(user, date, message) = self.filter(filter, node, cl, patchfile) |
3714 | 279 |
|
280 |
if log: |
|
9183
d0225fa2f6c4
do not translate commit messages
Martin Geisler <mg@lazybytes.net>
parents:
8934
diff
changeset
|
281 |
# we don't translate messages inserted into commits |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
282 |
message += '\n(transplanted from %s)' % nodemod.hex(node) |
3714 | 283 |
|
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
284 |
self.ui.status(_('applying %s\n') % nodemod.short(node)) |
3714 | 285 |
self.ui.note('%s %s\n%s\n' % (user, date, message)) |
286 |
||
287 |
if not patchfile and not merge: |
|
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
288 |
raise error.Abort(_('can only omit patchfile if merging')) |
3714 | 289 |
if patchfile: |
290 |
try: |
|
14564
65f4512e40e4
patch: turn patch() touched files dict into a set
Patrick Mezard <pmezard@gmail.com>
parents:
14556
diff
changeset
|
291 |
files = set() |
14382
2d16f15da7bd
patch: remove patch.patch() cwd argument
Patrick Mezard <pmezard@gmail.com>
parents:
14319
diff
changeset
|
292 |
patch.patch(self.ui, repo, patchfile, files=files, eolmode=None) |
14260
00a881581400
patch: make patch()/internalpatch() always update the dirstate
Patrick Mezard <pmezard@gmail.com>
parents:
14259
diff
changeset
|
293 |
files = list(files) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25186
diff
changeset
|
294 |
except Exception as inst: |
3757
faed44bab17b
transplant: clobber old series when transplant fails
Brendan Cully <brendan@kublai.com>
parents:
3752
diff
changeset
|
295 |
seriespath = os.path.join(self.path, 'series') |
faed44bab17b
transplant: clobber old series when transplant fails
Brendan Cully <brendan@kublai.com>
parents:
3752
diff
changeset
|
296 |
if os.path.exists(seriespath): |
faed44bab17b
transplant: clobber old series when transplant fails
Brendan Cully <brendan@kublai.com>
parents:
3752
diff
changeset
|
297 |
os.unlink(seriespath) |
13878
a8d13ee0ce68
misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents:
13790
diff
changeset
|
298 |
p1 = repo.dirstate.p1() |
3714 | 299 |
p2 = node |
3725
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
300 |
self.log(user, date, message, p1, p2, merge=merge) |
3714 | 301 |
self.ui.write(str(inst) + '\n') |
27676
1c48f348f2d0
transplant: correct language to use working directory
timeless <timeless@mozdev.org>
parents:
27586
diff
changeset
|
302 |
raise TransplantError(_('fix up the working directory and run ' |
16507
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
303 |
'hg transplant --continue')) |
3714 | 304 |
else: |
305 |
files = None |
|
306 |
if merge: |
|
307 |
p1, p2 = repo.dirstate.parents() |
|
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16507
diff
changeset
|
308 |
repo.setparents(p1, node) |
8703
8676dd819444
transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents:
8615
diff
changeset
|
309 |
m = match.always(repo.root, '') |
8676dd819444
transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents:
8615
diff
changeset
|
310 |
else: |
8676dd819444
transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents:
8615
diff
changeset
|
311 |
m = match.exact(repo.root, '', files) |
3714 | 312 |
|
15220
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
313 |
n = repo.commit(message, user, date, extra=extra, match=m, |
22252
de783f2403c4
transplant: change "editform" to distinguish merge commits from others
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22006
diff
changeset
|
314 |
editor=self.getcommiteditor()) |
11638
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
315 |
if not n: |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
316 |
self.ui.warn(_('skipping emptied changeset %s\n') % |
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
317 |
nodemod.short(node)) |
17319
a189d4470a34
transplant: handle non-empty patches doing nothing (issue2806)
Patrick Mezard <patrick@mezard.eu>
parents:
17299
diff
changeset
|
318 |
return None |
3714 | 319 |
if not merge: |
320 |
self.transplants.set(n, node) |
|
321 |
||
322 |
return n |
|
323 |
||
27677
128ef8828ed5
transplant: only use checkunfinished if not continue
timeless <timeless@mozdev.org>
parents:
27676
diff
changeset
|
324 |
def canresume(self): |
128ef8828ed5
transplant: only use checkunfinished if not continue
timeless <timeless@mozdev.org>
parents:
27676
diff
changeset
|
325 |
return os.path.exists(os.path.join(self.path, 'journal')) |
128ef8828ed5
transplant: only use checkunfinished if not continue
timeless <timeless@mozdev.org>
parents:
27676
diff
changeset
|
326 |
|
18919
cdf764a2f7a5
repoview: remove unreachable code
Bryan O'Sullivan <bryano@fb.com>
parents:
18082
diff
changeset
|
327 |
def resume(self, repo, source, opts): |
3714 | 328 |
'''recover last transaction and apply remaining changesets''' |
329 |
if os.path.exists(os.path.join(self.path, 'journal')): |
|
18926
8deaa703a622
transplant: pass source through to recover
Bryan O'Sullivan <bryano@fb.com>
parents:
18919
diff
changeset
|
330 |
n, node = self.recover(repo, source, opts) |
23781
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
331 |
if n: |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
332 |
self.ui.status(_('%s transplanted as %s\n') % |
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
333 |
(nodemod.short(node), |
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
334 |
nodemod.short(n))) |
23781
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
335 |
else: |
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
336 |
self.ui.status(_('%s skipped due to empty diff\n') |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
337 |
% (nodemod.short(node),)) |
3714 | 338 |
seriespath = os.path.join(self.path, 'series') |
339 |
if not os.path.exists(seriespath): |
|
3758
889f7e74a0d9
transplant: log source node when recovering too.
Brendan Cully <brendan@kublai.com>
parents:
3757
diff
changeset
|
340 |
self.transplants.write() |
3714 | 341 |
return |
342 |
nodes, merges = self.readseries() |
|
343 |
revmap = {} |
|
344 |
for n in nodes: |
|
345 |
revmap[source.changelog.rev(n)] = n |
|
346 |
os.unlink(seriespath) |
|
347 |
||
348 |
self.apply(repo, source, revmap, merges, opts) |
|
349 |
||
18926
8deaa703a622
transplant: pass source through to recover
Bryan O'Sullivan <bryano@fb.com>
parents:
18919
diff
changeset
|
350 |
def recover(self, repo, source, opts): |
3714 | 351 |
'''commit working directory using journal metadata''' |
352 |
node, user, date, message, parents = self.readlog() |
|
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
353 |
merge = False |
3714 | 354 |
|
355 |
if not user or not date or not message or not parents[0]: |
|
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
356 |
raise error.Abort(_('transplant log file is corrupt')) |
3714 | 357 |
|
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
358 |
parent = parents[0] |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
359 |
if len(parents) > 1: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
360 |
if opts.get('parent'): |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
361 |
parent = source.lookup(opts['parent']) |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
362 |
if parent not in parents: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
363 |
raise error.Abort(_('%s is not a parent of %s') % |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
364 |
(nodemod.short(parent), |
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
365 |
nodemod.short(node))) |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
366 |
else: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
367 |
merge = True |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
368 |
|
3758
889f7e74a0d9
transplant: log source node when recovering too.
Brendan Cully <brendan@kublai.com>
parents:
3757
diff
changeset
|
369 |
extra = {'transplant_source': node} |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
370 |
try: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
371 |
p1, p2 = repo.dirstate.parents() |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
372 |
if p1 != parent: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
373 |
raise error.Abort(_('working directory not at transplant ' |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
374 |
'parent %s') % nodemod.hex(parent)) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
375 |
if merge: |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16507
diff
changeset
|
376 |
repo.setparents(p1, parents[1]) |
23781
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
377 |
modified, added, removed, deleted = repo.status()[:4] |
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
378 |
if merge or modified or added or removed or deleted: |
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
379 |
n = repo.commit(message, user, date, extra=extra, |
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
380 |
editor=self.getcommiteditor()) |
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
381 |
if not n: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
382 |
raise error.Abort(_('commit failed')) |
23781
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
383 |
if not merge: |
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
384 |
self.transplants.set(n, node) |
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
385 |
else: |
49caef455912
transplant: properly skip empty changeset (issue4423)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23452
diff
changeset
|
386 |
n = None |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
387 |
self.unlog() |
3714 | 388 |
|
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
389 |
return n, node |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
390 |
finally: |
27289
ee33e677f0ac
transplant: widen wlock scope of transplant for consitency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
391 |
# TODO: get rid of this meaningless try/finally enclosing. |
ee33e677f0ac
transplant: widen wlock scope of transplant for consitency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
392 |
# this is kept only to reduce changes in a patch. |
ee33e677f0ac
transplant: widen wlock scope of transplant for consitency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
393 |
pass |
3714 | 394 |
|
395 |
def readseries(self): |
|
396 |
nodes = [] |
|
397 |
merges = [] |
|
398 |
cur = nodes |
|
14168
135e244776f0
prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14161
diff
changeset
|
399 |
for line in self.opener.read('series').splitlines(): |
3714 | 400 |
if line.startswith('# Merges'): |
401 |
cur = merges |
|
402 |
continue |
|
403 |
cur.append(revlog.bin(line)) |
|
404 |
||
405 |
return (nodes, merges) |
|
406 |
||
407 |
def saveseries(self, revmap, merges): |
|
408 |
if not revmap: |
|
409 |
return |
|
410 |
||
411 |
if not os.path.isdir(self.path): |
|
412 |
os.mkdir(self.path) |
|
413 |
series = self.opener('series', 'w') |
|
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8176
diff
changeset
|
414 |
for rev in sorted(revmap): |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
415 |
series.write(nodemod.hex(revmap[rev]) + '\n') |
3714 | 416 |
if merges: |
417 |
series.write('# Merges\n') |
|
418 |
for m in merges: |
|
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
419 |
series.write(nodemod.hex(m) + '\n') |
3714 | 420 |
series.close() |
421 |
||
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
422 |
def parselog(self, fp): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
423 |
parents = [] |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
424 |
message = [] |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
425 |
node = revlog.nullid |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
426 |
inmsg = False |
13789
7e5031180c0f
transplant: fix crash if filter script munges log file
Luke Plant <L.Plant.98@cantab.net>
parents:
13742
diff
changeset
|
427 |
user = None |
7e5031180c0f
transplant: fix crash if filter script munges log file
Luke Plant <L.Plant.98@cantab.net>
parents:
13742
diff
changeset
|
428 |
date = None |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
429 |
for line in fp.read().splitlines(): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
430 |
if inmsg: |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
431 |
message.append(line) |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
432 |
elif line.startswith('# User '): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
433 |
user = line[7:] |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
434 |
elif line.startswith('# Date '): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
435 |
date = line[7:] |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
436 |
elif line.startswith('# Node ID '): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
437 |
node = revlog.bin(line[10:]) |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
438 |
elif line.startswith('# Parent '): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
439 |
parents.append(revlog.bin(line[9:])) |
11411
5834e79b24f7
transplant: when reading journal, treat only lines starting with "# " special like patch.extract() does
Georg Brandl <georg@python.org>
parents:
11321
diff
changeset
|
440 |
elif not line.startswith('# '): |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
441 |
inmsg = True |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
442 |
message.append(line) |
13789
7e5031180c0f
transplant: fix crash if filter script munges log file
Luke Plant <L.Plant.98@cantab.net>
parents:
13742
diff
changeset
|
443 |
if None in (user, date): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
444 |
raise error.Abort(_("filter corrupted changeset (no user or date)")) |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
445 |
return (node, user, date, '\n'.join(message), parents) |
4516
96d8a56d4ef9
Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4251
diff
changeset
|
446 |
|
3725
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
447 |
def log(self, user, date, message, p1, p2, merge=False): |
3714 | 448 |
'''journal changelog metadata for later recover''' |
449 |
||
450 |
if not os.path.isdir(self.path): |
|
451 |
os.mkdir(self.path) |
|
452 |
fp = self.opener('journal', 'w') |
|
3725
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
453 |
fp.write('# User %s\n' % user) |
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
454 |
fp.write('# Date %s\n' % date) |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
455 |
fp.write('# Node ID %s\n' % nodemod.hex(p2)) |
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
456 |
fp.write('# Parent ' + nodemod.hex(p1) + '\n') |
3714 | 457 |
if merge: |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
458 |
fp.write('# Parent ' + nodemod.hex(p2) + '\n') |
3725
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
459 |
fp.write(message.rstrip() + '\n') |
3714 | 460 |
fp.close() |
461 |
||
462 |
def readlog(self): |
|
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
463 |
return self.parselog(self.opener('journal')) |
3714 | 464 |
|
465 |
def unlog(self): |
|
466 |
'''remove changelog journal''' |
|
467 |
absdst = os.path.join(self.path, 'journal') |
|
468 |
if os.path.exists(absdst): |
|
469 |
os.unlink(absdst) |
|
470 |
||
471 |
def transplantfilter(self, repo, source, root): |
|
472 |
def matchfn(node): |
|
473 |
if self.applied(repo, node, root): |
|
474 |
return False |
|
475 |
if source.changelog.parents(node)[1] != revlog.nullid: |
|
476 |
return False |
|
477 |
extra = source.changelog.read(node)[5] |
|
478 |
cnode = extra.get('transplant_source') |
|
479 |
if cnode and self.applied(repo, cnode, root): |
|
480 |
return False |
|
481 |
return True |
|
482 |
||
483 |
return matchfn |
|
484 |
||
485 |
def hasnode(repo, node): |
|
486 |
try: |
|
13031
3da456d0c885
code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents:
12823
diff
changeset
|
487 |
return repo.changelog.rev(node) is not None |
7633 | 488 |
except error.RevlogError: |
3714 | 489 |
return False |
490 |
||
491 |
def browserevs(ui, repo, nodes, opts): |
|
492 |
'''interactively transplant changesets''' |
|
3723
c828fca6f38a
transplant: show_changeset moved to cmdutil
Brendan Cully <brendan@kublai.com>
parents:
3714
diff
changeset
|
493 |
displayer = cmdutil.show_changeset(ui, repo, opts) |
3714 | 494 |
transplants = [] |
495 |
merges = [] |
|
20268
27d3f1fe42ac
transplant: use "ui.promptchoice()" for interactive transplant
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20020
diff
changeset
|
496 |
prompt = _('apply changeset? [ynmpcq?]:' |
27d3f1fe42ac
transplant: use "ui.promptchoice()" for interactive transplant
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20020
diff
changeset
|
497 |
'$$ &yes, transplant this changeset' |
27d3f1fe42ac
transplant: use "ui.promptchoice()" for interactive transplant
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20020
diff
changeset
|
498 |
'$$ &no, skip this changeset' |
27d3f1fe42ac
transplant: use "ui.promptchoice()" for interactive transplant
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20020
diff
changeset
|
499 |
'$$ &merge at this changeset' |
27d3f1fe42ac
transplant: use "ui.promptchoice()" for interactive transplant
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20020
diff
changeset
|
500 |
'$$ show &patch' |
27d3f1fe42ac
transplant: use "ui.promptchoice()" for interactive transplant
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20020
diff
changeset
|
501 |
'$$ &commit selected changesets' |
27d3f1fe42ac
transplant: use "ui.promptchoice()" for interactive transplant
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20020
diff
changeset
|
502 |
'$$ &quit and cancel transplant' |
27d3f1fe42ac
transplant: use "ui.promptchoice()" for interactive transplant
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20020
diff
changeset
|
503 |
'$$ &? (show this help)') |
3714 | 504 |
for node in nodes: |
7369
87158be081b8
cmdutil: use change contexts for cset-printer and cset-templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7308
diff
changeset
|
505 |
displayer.show(repo[node]) |
3714 | 506 |
action = None |
507 |
while not action: |
|
20268
27d3f1fe42ac
transplant: use "ui.promptchoice()" for interactive transplant
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20020
diff
changeset
|
508 |
action = 'ynmpcq?'[ui.promptchoice(prompt)] |
3714 | 509 |
if action == '?': |
20269
acb6cceaffd5
transplant: use "ui.extractchoices()" to show the list of available responses
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20268
diff
changeset
|
510 |
for c, t in ui.extractchoices(prompt)[1]: |
acb6cceaffd5
transplant: use "ui.extractchoices()" to show the list of available responses
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20268
diff
changeset
|
511 |
ui.write('%s: %s\n' % (c, t)) |
3714 | 512 |
action = None |
513 |
elif action == 'p': |
|
514 |
parent = repo.changelog.parents(node)[0] |
|
7308
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7280
diff
changeset
|
515 |
for chunk in patch.diff(repo, parent, node): |
8615
94ca38e63576
use ui instead of repo.ui when the former is in scope
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
516 |
ui.write(chunk) |
3714 | 517 |
action = None |
518 |
if action == 'y': |
|
519 |
transplants.append(node) |
|
520 |
elif action == 'm': |
|
521 |
merges.append(node) |
|
522 |
elif action == 'c': |
|
523 |
break |
|
524 |
elif action == 'q': |
|
525 |
transplants = () |
|
526 |
merges = () |
|
527 |
break |
|
10152
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
9995
diff
changeset
|
528 |
displayer.close() |
3714 | 529 |
return (transplants, merges) |
530 |
||
14308
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
531 |
@command('transplant', |
19028
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
532 |
[('s', 'source', '', _('transplant changesets from REPO'), _('REPO')), |
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
533 |
('b', 'branch', [], _('use this source changeset as head'), _('REV')), |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
534 |
('a', 'all', None, _('pull all changesets up to the --branch revisions')), |
14308
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
535 |
('p', 'prune', [], _('skip over REV'), _('REV')), |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
536 |
('m', 'merge', [], _('merge at REV'), _('REV')), |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
537 |
('', 'parent', '', |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
538 |
_('parent to choose when transplanting merge'), _('REV')), |
15220
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
539 |
('e', 'edit', False, _('invoke editor on commit messages')), |
14308
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
540 |
('', 'log', None, _('append transplant info to log message')), |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
541 |
('c', 'continue', None, _('continue last transplant session ' |
19028
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
542 |
'after fixing conflicts')), |
14308
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
543 |
('', 'filter', '', |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
544 |
_('filter changesets through command'), _('CMD'))], |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
545 |
_('hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] ' |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
546 |
'[-m REV] [REV]...')) |
3714 | 547 |
def transplant(ui, repo, *revs, **opts): |
548 |
'''transplant changesets from another branch |
|
549 |
||
550 |
Selected changesets will be applied on top of the current working |
|
13605
888ec2650c2d
transplant: explain that changesets are copied, not moved
Martin Geisler <mg@lazybytes.net>
parents:
13031
diff
changeset
|
551 |
directory with the log of the original changeset. The changesets |
19028
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
552 |
are copied and will thus appear twice in the history with different |
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
553 |
identities. |
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
554 |
|
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
555 |
Consider using the graft command if everything is inside the same |
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
556 |
repository - it will use merges and will usually give a better result. |
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
557 |
Use the rebase extension if the changesets are unpublished and you want |
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
558 |
to move them instead of copying them. |
13605
888ec2650c2d
transplant: explain that changesets are copied, not moved
Martin Geisler <mg@lazybytes.net>
parents:
13031
diff
changeset
|
559 |
|
888ec2650c2d
transplant: explain that changesets are copied, not moved
Martin Geisler <mg@lazybytes.net>
parents:
13031
diff
changeset
|
560 |
If --log is specified, log messages will have a comment appended |
888ec2650c2d
transplant: explain that changesets are copied, not moved
Martin Geisler <mg@lazybytes.net>
parents:
13031
diff
changeset
|
561 |
of the form:: |
3714 | 562 |
|
9200
6b4c527c3d22
transplant: better reST formatting
Martin Geisler <mg@lazybytes.net>
parents:
9196
diff
changeset
|
563 |
(transplanted from CHANGESETHASH) |
3714 | 564 |
|
565 |
You can rewrite the changelog message with the --filter option. |
|
8000
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
566 |
Its argument will be invoked with the current changelog message as |
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
567 |
$1 and the patch as $2. |
3714 | 568 |
|
19028
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
569 |
--source/-s specifies another repository to use for selecting changesets, |
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
570 |
just as if it temporarily had been pulled. |
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
571 |
If --branch/-b is specified, these revisions will be used as |
19951
d51c4d85ec23
spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents:
19496
diff
changeset
|
572 |
heads when deciding which changesets to transplant, just as if only |
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
573 |
these revisions had been pulled. |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
574 |
If --all/-a is specified, all the revisions up to the heads specified |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
575 |
with --branch will be transplanted. |
3714 | 576 |
|
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
577 |
Example: |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
578 |
|
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
579 |
- transplant all changes up to REV on top of your current revision:: |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
580 |
|
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
581 |
hg transplant --branch REV --all |
3714 | 582 |
|
8000
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
583 |
You can optionally mark selected transplanted changesets as merge |
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
584 |
changesets. You will not be prompted to transplant any ancestors |
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
585 |
of a merged transplant, and you can merge descendants of them |
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
586 |
normally instead of transplanting them. |
3714 | 587 |
|
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
588 |
Merge changesets may be transplanted directly by specifying the |
16457
91196ebcaeed
transplant: remove extraneous whitespace
Steven Stallion <sstallion@gmail.com>
parents:
16400
diff
changeset
|
589 |
proper parent changeset by calling :hg:`transplant --parent`. |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
590 |
|
11193
687c7d395f20
Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents:
10510
diff
changeset
|
591 |
If no merges or revisions are provided, :hg:`transplant` will |
687c7d395f20
Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents:
10510
diff
changeset
|
592 |
start an interactive changeset browser. |
3714 | 593 |
|
8000
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
594 |
If a changeset application fails, you can fix the merge by hand |
11193
687c7d395f20
Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents:
10510
diff
changeset
|
595 |
and then resume where you left off by calling :hg:`transplant |
687c7d395f20
Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents:
10510
diff
changeset
|
596 |
--continue/-c`. |
3714 | 597 |
''' |
27840
dc237afacbd4
with: use context manager for wlock in transplant
Bryan O'Sullivan <bryano@fb.com>
parents:
27678
diff
changeset
|
598 |
with repo.wlock(): |
27289
ee33e677f0ac
transplant: widen wlock scope of transplant for consitency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
599 |
return _dotransplant(ui, repo, *revs, **opts) |
ee33e677f0ac
transplant: widen wlock scope of transplant for consitency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
600 |
|
ee33e677f0ac
transplant: widen wlock scope of transplant for consitency while processing
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26587
diff
changeset
|
601 |
def _dotransplant(ui, repo, *revs, **opts): |
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
602 |
def incwalk(repo, csets, match=util.always): |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
603 |
for node in csets: |
3714 | 604 |
if match(node): |
605 |
yield node |
|
606 |
||
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
607 |
def transplantwalk(repo, dest, heads, match=util.always): |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
608 |
'''Yield all nodes that are ancestors of a head but not ancestors |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
609 |
of dest. |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
610 |
If no heads are specified, the heads of repo will be used.''' |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
611 |
if not heads: |
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
612 |
heads = repo.heads() |
3714 | 613 |
ancestors = [] |
20988
8c2f1e2a11ff
transplant: use context ancestor instead of changelog ancestor
Mads Kiilerich <madski@unity3d.com>
parents:
20442
diff
changeset
|
614 |
ctx = repo[dest] |
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
615 |
for head in heads: |
20988
8c2f1e2a11ff
transplant: use context ancestor instead of changelog ancestor
Mads Kiilerich <madski@unity3d.com>
parents:
20442
diff
changeset
|
616 |
ancestors.append(ctx.ancestor(repo[head]).node()) |
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
617 |
for node in repo.changelog.nodesbetween(ancestors, heads)[0]: |
3714 | 618 |
if match(node): |
619 |
yield node |
|
620 |
||
621 |
def checkopts(opts, revs): |
|
622 |
if opts.get('continue'): |
|
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
623 |
if opts.get('branch') or opts.get('all') or opts.get('merge'): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
624 |
raise error.Abort(_('--continue is incompatible with ' |
19028
b512934988d4
transplant: improve documentation
Mads Kiilerich <madski@unity3d.com>
parents:
19027
diff
changeset
|
625 |
'--branch, --all and --merge')) |
3714 | 626 |
return |
627 |
if not (opts.get('source') or revs or |
|
628 |
opts.get('merge') or opts.get('branch')): |
|
27322
84e85f461b79
transplant: use Oxford comma
timeless <timeless@mozdev.org>
parents:
27289
diff
changeset
|
629 |
raise error.Abort(_('no source URL, branch revision, or revision ' |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
630 |
'list provided')) |
3714 | 631 |
if opts.get('all'): |
632 |
if not opts.get('branch'): |
|
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
633 |
raise error.Abort(_('--all requires a branch revision')) |
3714 | 634 |
if revs: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
635 |
raise error.Abort(_('--all is incompatible with a ' |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
636 |
'revision list')) |
3714 | 637 |
|
638 |
checkopts(opts, revs) |
|
639 |
||
640 |
if not opts.get('log'): |
|
25828
5ae4b128a291
transplant: mark some undocumented options deprecated
Matt Mackall <mpm@selenic.com>
parents:
25695
diff
changeset
|
641 |
# deprecated config: transplant.log |
3714 | 642 |
opts['log'] = ui.config('transplant', 'log') |
643 |
if not opts.get('filter'): |
|
25828
5ae4b128a291
transplant: mark some undocumented options deprecated
Matt Mackall <mpm@selenic.com>
parents:
25695
diff
changeset
|
644 |
# deprecated config: transplant.filter |
3714 | 645 |
opts['filter'] = ui.config('transplant', 'filter') |
646 |
||
21411
afff78be4361
transplant: use "getcommiteditor()" instead of explicit editor choice
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
20988
diff
changeset
|
647 |
tp = transplanter(ui, repo, opts) |
3714 | 648 |
|
649 |
p1, p2 = repo.dirstate.parents() |
|
8176
2660e7002413
transplant: forbid transplant to nonempty repositories with no working directory.
Brendan Cully <brendan@kublai.com>
parents:
8173
diff
changeset
|
650 |
if len(repo) > 0 and p1 == revlog.nullid: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
651 |
raise error.Abort(_('no revision checked out')) |
27677
128ef8828ed5
transplant: only use checkunfinished if not continue
timeless <timeless@mozdev.org>
parents:
27676
diff
changeset
|
652 |
if opts.get('continue'): |
128ef8828ed5
transplant: only use checkunfinished if not continue
timeless <timeless@mozdev.org>
parents:
27676
diff
changeset
|
653 |
if not tp.canresume(): |
128ef8828ed5
transplant: only use checkunfinished if not continue
timeless <timeless@mozdev.org>
parents:
27676
diff
changeset
|
654 |
raise error.Abort(_('no transplant to continue')) |
128ef8828ed5
transplant: only use checkunfinished if not continue
timeless <timeless@mozdev.org>
parents:
27676
diff
changeset
|
655 |
else: |
128ef8828ed5
transplant: only use checkunfinished if not continue
timeless <timeless@mozdev.org>
parents:
27676
diff
changeset
|
656 |
cmdutil.checkunfinished(repo) |
3714 | 657 |
if p2 != revlog.nullid: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
658 |
raise error.Abort(_('outstanding uncommitted merges')) |
3714 | 659 |
m, a, r, d = repo.status()[:4] |
660 |
if m or a or r or d: |
|
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26578
diff
changeset
|
661 |
raise error.Abort(_('outstanding local changes')) |
3714 | 662 |
|
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
663 |
sourcerepo = opts.get('source') |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
664 |
if sourcerepo: |
17874
2ba70eec1cf0
peer: subrepo isolation, pass repo instead of repo.ui to hg.peer
Simon Heimberg <simohe@besonet.ch>
parents:
17320
diff
changeset
|
665 |
peer = hg.peer(repo, opts, ui.expandpath(sourcerepo)) |
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
666 |
heads = map(peer.lookup, opts.get('branch', ())) |
25679
540cd0ddac49
transplant: only pull the transplanted revision (issue4692)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24365
diff
changeset
|
667 |
target = set(heads) |
540cd0ddac49
transplant: only pull the transplanted revision (issue4692)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24365
diff
changeset
|
668 |
for r in revs: |
540cd0ddac49
transplant: only pull the transplanted revision (issue4692)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24365
diff
changeset
|
669 |
try: |
540cd0ddac49
transplant: only pull the transplanted revision (issue4692)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24365
diff
changeset
|
670 |
target.add(peer.lookup(r)) |
540cd0ddac49
transplant: only pull the transplanted revision (issue4692)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24365
diff
changeset
|
671 |
except error.RepoError: |
540cd0ddac49
transplant: only pull the transplanted revision (issue4692)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24365
diff
changeset
|
672 |
pass |
17191
5884812686f7
peer: introduce peer methods to prepare for peer classes
Sune Foldager <cryo@cyanite.org>
parents:
17010
diff
changeset
|
673 |
source, csets, cleanupfn = bundlerepo.getremotechanges(ui, repo, peer, |
25679
540cd0ddac49
transplant: only pull the transplanted revision (issue4692)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
24365
diff
changeset
|
674 |
onlyheads=sorted(target), force=True) |
3714 | 675 |
else: |
676 |
source = repo |
|
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
677 |
heads = map(source.lookup, opts.get('branch', ())) |
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
678 |
cleanupfn = None |
3714 | 679 |
|
680 |
try: |
|
681 |
if opts.get('continue'): |
|
3724
ea523d6f5f1a
transplant: fix --continue; add --continue test
Brendan Cully <brendan@kublai.com>
parents:
3723
diff
changeset
|
682 |
tp.resume(repo, source, opts) |
3714 | 683 |
return |
684 |
||
10394
4612cded5176
fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10282
diff
changeset
|
685 |
tf = tp.transplantfilter(repo, source, p1) |
3714 | 686 |
if opts.get('prune'): |
19055
0fc41f88f148
transplant: use set for prune lookup
Mads Kiilerich <madski@unity3d.com>
parents:
19028
diff
changeset
|
687 |
prune = set(source.lookup(r) |
0fc41f88f148
transplant: use set for prune lookup
Mads Kiilerich <madski@unity3d.com>
parents:
19028
diff
changeset
|
688 |
for r in scmutil.revrange(source, opts.get('prune'))) |
3714 | 689 |
matchfn = lambda x: tf(x) and x not in prune |
690 |
else: |
|
691 |
matchfn = tf |
|
692 |
merges = map(source.lookup, opts.get('merge', ())) |
|
693 |
revmap = {} |
|
694 |
if revs: |
|
14319
b33f3e35efb0
scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14308
diff
changeset
|
695 |
for r in scmutil.revrange(source, revs): |
3714 | 696 |
revmap[int(r)] = source.lookup(r) |
697 |
elif opts.get('all') or not merges: |
|
698 |
if source != repo: |
|
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
699 |
alltransplants = incwalk(source, csets, match=matchfn) |
3714 | 700 |
else: |
19027
3f5fac4b1cfa
transplant: clarify what --branch do - it has nothing to do with branches
Mads Kiilerich <madski@unity3d.com>
parents:
18926
diff
changeset
|
701 |
alltransplants = transplantwalk(source, p1, heads, |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
702 |
match=matchfn) |
3714 | 703 |
if opts.get('all'): |
704 |
revs = alltransplants |
|
705 |
else: |
|
706 |
revs, newmerges = browserevs(ui, source, alltransplants, opts) |
|
707 |
merges.extend(newmerges) |
|
708 |
for r in revs: |
|
709 |
revmap[source.changelog.rev(r)] = r |
|
710 |
for r in merges: |
|
711 |
revmap[source.changelog.rev(r)] = r |
|
712 |
||
713 |
tp.apply(repo, source, revmap, merges, opts) |
|
714 |
finally: |
|
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
715 |
if cleanupfn: |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
716 |
cleanupfn() |
3714 | 717 |
|
28394
dcb4209bd30d
revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27840
diff
changeset
|
718 |
revsetpredicate = registrar.revsetpredicate() |
27586
42910f9fffeb
revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27344
diff
changeset
|
719 |
|
42910f9fffeb
revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27344
diff
changeset
|
720 |
@revsetpredicate('transplanted([set])') |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
721 |
def revsettransplanted(repo, subset, x): |
27586
42910f9fffeb
revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27344
diff
changeset
|
722 |
"""Transplanted changesets in set, or all transplanted changesets. |
12822
f13acb96b2a7
Fix and unify transplant and bookmarks revsets doc registration
Patrick Mezard <pmezard@gmail.com>
parents:
12734
diff
changeset
|
723 |
""" |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
724 |
if x: |
17299
e51d4aedace9
check-code: indent 4 spaces in py files
Mads Kiilerich <mads@kiilerich.com>
parents:
17191
diff
changeset
|
725 |
s = revset.getset(repo, subset, x) |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
726 |
else: |
17299
e51d4aedace9
check-code: indent 4 spaces in py files
Mads Kiilerich <mads@kiilerich.com>
parents:
17191
diff
changeset
|
727 |
s = subset |
31023
aea06029919e
revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents:
30925
diff
changeset
|
728 |
return smartset.baseset([r for r in s if |
20442
8524cdf66a12
hgext: updated extensions to return a baseset when adding symbols
Lucas Moscovicz <lmoscovicz@fb.com>
parents:
20269
diff
changeset
|
729 |
repo[r].extra().get('transplant_source')]) |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
730 |
|
28540
012411b9940d
hgext: use templatekeyword to mark a function as template keyword
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28481
diff
changeset
|
731 |
templatekeyword = registrar.templatekeyword() |
012411b9940d
hgext: use templatekeyword to mark a function as template keyword
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28481
diff
changeset
|
732 |
|
012411b9940d
hgext: use templatekeyword to mark a function as template keyword
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28481
diff
changeset
|
733 |
@templatekeyword('transplanted') |
13689
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
734 |
def kwtransplanted(repo, ctx, **args): |
28540
012411b9940d
hgext: use templatekeyword to mark a function as template keyword
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28481
diff
changeset
|
735 |
"""String. The node identifier of the transplanted |
13689
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
736 |
changeset if any.""" |
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
737 |
n = ctx.extra().get('transplant_source') |
28480
db171c6a1697
transplant: switch to using nodemod for hex+short
timeless <timeless@mozdev.org>
parents:
28394
diff
changeset
|
738 |
return n and nodemod.hex(n) or '' |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
739 |
|
12822
f13acb96b2a7
Fix and unify transplant and bookmarks revsets doc registration
Patrick Mezard <pmezard@gmail.com>
parents:
12734
diff
changeset
|
740 |
def extsetup(ui): |
19480
7c0bb2b75aa8
transplant: add checkunfinished (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19055
diff
changeset
|
741 |
cmdutil.unfinishedstates.append( |
27678
b97004648028
transplant: specify the right file and path for unfinishedstates
timeless <timeless@mozdev.org>
parents:
27677
diff
changeset
|
742 |
['transplant/journal', True, False, _('transplant in progress'), |
19480
7c0bb2b75aa8
transplant: add checkunfinished (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19055
diff
changeset
|
743 |
_("use 'hg transplant --continue' or 'hg update' to abort")]) |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
744 |
|
12823
80deae3bc5ea
hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents:
12822
diff
changeset
|
745 |
# tell hggettext to extract docstrings from these functions: |
13698
f30ce5983896
i18n: register new template keywords for translation
Patrick Mezard <pmezard@gmail.com>
parents:
13689
diff
changeset
|
746 |
i18nfunctions = [revsettransplanted, kwtransplanted] |