Mercurial > hg
annotate hgext/transplant.py @ 31237:1b08aca7870a
vfs: use 'vfs' module directly in 'mercurial.cmdutil'
Now that the 'vfs' classes moved in their own module, lets use the new module
directly. We update code iteratively to help with possible bisect needs in the
future.
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Thu, 02 Mar 2017 13:30:47 +0100 |
parents | 21fa3d3688f3 |
children | c1ebe18d5156 |
rev | line source |
---|---|
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] |