Mercurial > hg
annotate hgext/transplant.py @ 16515:12dabc22de77 stable
largefiles: fix status -S reporting of subrepos (issue3231)
Wrapping the status command will only invoke overridestatus() and set
the lfstatus field for the top level repository. Wrapping the status
function is required to set the field on child repositories.
Previously, status -S would report large files in a subrepo as '?'
regardless of their actual states, and was inconsistent with what
status would report from within that subrepo.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Sun, 22 Apr 2012 03:47:34 -0400 |
parents | 1f020021adfa |
children | ebf6d38c9063 |
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 |
10 This extension allows you to transplant patches from another branch. | |
11 | |
8000
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
12 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
|
13 map from a changeset hash to its hash in the source repository. |
3714 | 14 ''' |
15 | |
7629
97253bcb44a8
transplant: move docstrings before imports (see issue1466)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7415
diff
changeset
|
16 from mercurial.i18n import _ |
97253bcb44a8
transplant: move docstrings before imports (see issue1466)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7415
diff
changeset
|
17 import os, tempfile |
14393
bdf44e63a94c
revlog: stop exporting node.short
Matt Mackall <mpm@selenic.com>
parents:
14382
diff
changeset
|
18 from mercurial.node import short |
14319
b33f3e35efb0
scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14308
diff
changeset
|
19 from mercurial import bundlerepo, hg, merge, match |
b33f3e35efb0
scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14308
diff
changeset
|
20 from mercurial import patch, revlog, scmutil, util, error, cmdutil |
13689
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
21 from mercurial import revset, templatekw |
7629
97253bcb44a8
transplant: move docstrings before imports (see issue1466)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7415
diff
changeset
|
22 |
16507
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
23 class TransplantError(error.Abort): |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
24 pass |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
25 |
14308
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
26 cmdtable = {} |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
27 command = cmdutil.command(cmdtable) |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
28 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8706
diff
changeset
|
29 class transplantentry(object): |
3714 | 30 def __init__(self, lnode, rnode): |
31 self.lnode = lnode | |
32 self.rnode = rnode | |
33 | |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8706
diff
changeset
|
34 class transplants(object): |
3714 | 35 def __init__(self, path=None, transplantfile=None, opener=None): |
36 self.path = path | |
37 self.transplantfile = transplantfile | |
38 self.opener = opener | |
39 | |
40 if not opener: | |
13970
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13878
diff
changeset
|
41 self.opener = scmutil.opener(self.path) |
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
42 self.transplants = {} |
3714 | 43 self.dirty = False |
44 self.read() | |
45 | |
46 def read(self): | |
47 abspath = os.path.join(self.path, self.transplantfile) | |
48 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
|
49 for line in self.opener.read(self.transplantfile).splitlines(): |
3714 | 50 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
|
51 list = self.transplants.setdefault(rnode, []) |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
52 list.append(transplantentry(lnode, rnode)) |
3714 | 53 |
54 def write(self): | |
55 if self.dirty and self.transplantfile: | |
56 if not os.path.isdir(self.path): | |
57 os.mkdir(self.path) | |
58 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
|
59 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
|
60 for t in list: |
7340b0fa049a
transplant: fix var name conflict introduced by 2912881c2a98
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12347
diff
changeset
|
61 l, r = map(revlog.hex, (t.lnode, t.rnode)) |
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
62 fp.write(l + ':' + r + '\n') |
3714 | 63 fp.close() |
64 self.dirty = False | |
65 | |
66 def get(self, rnode): | |
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
67 return self.transplants.get(rnode) or [] |
3714 | 68 |
69 def set(self, lnode, rnode): | |
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
70 list = self.transplants.setdefault(rnode, []) |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
71 list.append(transplantentry(lnode, rnode)) |
3714 | 72 self.dirty = True |
73 | |
74 def remove(self, transplant): | |
12313
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
75 list = self.transplants.get(transplant.rnode) |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
76 if list: |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
77 del list[list.index(transplant)] |
2912881c2a98
transplant: maintain list of transplants in dict
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12266
diff
changeset
|
78 self.dirty = True |
3714 | 79 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8706
diff
changeset
|
80 class transplanter(object): |
3714 | 81 def __init__(self, ui, repo): |
82 self.ui = ui | |
83 self.path = repo.join('transplant') | |
13970
d13913355390
move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents:
13878
diff
changeset
|
84 self.opener = scmutil.opener(self.path) |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
85 self.transplants = transplants(self.path, 'transplants', |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
86 opener=self.opener) |
15220
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
87 self.editor = None |
3714 | 88 |
89 def applied(self, repo, node, parent): | |
90 '''returns True if a node is already an ancestor of parent | |
91 or has already been transplanted''' | |
92 if hasnode(repo, node): | |
93 if node in repo.changelog.reachable(parent, stop=node): | |
94 return True | |
95 for t in self.transplants.get(node): | |
96 # it might have been stripped | |
97 if not hasnode(repo, t.lnode): | |
98 self.transplants.remove(t) | |
99 return False | |
100 if t.lnode in repo.changelog.reachable(parent, stop=t.lnode): | |
101 return True | |
102 return False | |
103 | |
104 def apply(self, repo, source, revmap, merges, opts={}): | |
105 '''apply the revisions in revmap one by one in revision order''' | |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8176
diff
changeset
|
106 revs = sorted(revmap) |
3714 | 107 p1, p2 = repo.dirstate.parents() |
108 pulls = [] | |
109 diffopts = patch.diffopts(self.ui, opts) | |
110 diffopts.git = True | |
111 | |
15204
3ce9b1a7538b
transplant: wrap a transaction around the whole command
Greg Ward <greg@gerg.ca>
parents:
14741
diff
changeset
|
112 lock = wlock = tr = None |
3714 | 113 try: |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
114 wlock = repo.wlock() |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
115 lock = repo.lock() |
15204
3ce9b1a7538b
transplant: wrap a transaction around the whole command
Greg Ward <greg@gerg.ca>
parents:
14741
diff
changeset
|
116 tr = repo.transaction('transplant') |
3714 | 117 for rev in revs: |
118 node = revmap[rev] | |
14393
bdf44e63a94c
revlog: stop exporting node.short
Matt Mackall <mpm@selenic.com>
parents:
14382
diff
changeset
|
119 revstr = '%s:%s' % (rev, short(node)) |
3714 | 120 |
121 if self.applied(repo, node, p1): | |
122 self.ui.warn(_('skipping already applied revision %s\n') % | |
123 revstr) | |
124 continue | |
125 | |
126 parents = source.changelog.parents(node) | |
127 if not opts.get('filter'): | |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
128 # If the changeset parent is the same as the |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
129 # wdir's parent, just pull it. |
3714 | 130 if parents[0] == p1: |
131 pulls.append(node) | |
132 p1 = node | |
133 continue | |
134 if pulls: | |
135 if source != repo: | |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
136 repo.pull(source, heads=pulls) |
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
137 merge.update(repo, pulls[-1], False, False, None) |
3714 | 138 p1, p2 = repo.dirstate.parents() |
139 pulls = [] | |
140 | |
141 domerge = False | |
142 if node in merges: | |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
143 # 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
|
144 # couldn't transplant after the latest even if |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
145 # transplants before them fail. |
3714 | 146 domerge = True |
147 if not hasnode(repo, node): | |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
148 repo.pull(source, heads=[node]) |
3714 | 149 |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
150 skipmerge = False |
3714 | 151 if parents[1] != revlog.nullid: |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
152 if not opts.get('parent'): |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
153 self.ui.note(_('skipping merge changeset %s:%s\n') |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
154 % (rev, short(node))) |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
155 skipmerge = True |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
156 else: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
157 parent = source.lookup(opts['parent']) |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
158 if parent not in parents: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
159 raise util.Abort(_('%s is not a parent of %s') % |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
160 (short(parent), short(node))) |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
161 else: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
162 parent = parents[0] |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
163 |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
164 if skipmerge: |
3714 | 165 patchfile = None |
166 else: | |
167 fd, patchfile = tempfile.mkstemp(prefix='hg-transplant-') | |
168 fp = os.fdopen(fd, 'w') | |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
169 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
|
170 for chunk in gen: |
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7280
diff
changeset
|
171 fp.write(chunk) |
3714 | 172 fp.close() |
173 | |
174 del revmap[rev] | |
175 if patchfile or domerge: | |
176 try: | |
16507
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
177 try: |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
178 n = self.applyone(repo, node, |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
179 source.changelog.read(node), |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
180 patchfile, merge=domerge, |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
181 log=opts.get('log'), |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
182 filter=opts.get('filter')) |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
183 except TransplantError: |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
184 # 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
|
185 # fix the merge or cancel everything |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
186 tr.close() |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
187 raise |
4251
e76e52145c3d
transplant: fix ignoring empty changesets (eg after filter)
Brendan Cully <brendan@kublai.com>
parents:
4072
diff
changeset
|
188 if n and domerge: |
3714 | 189 self.ui.status(_('%s merged at %s\n') % (revstr, |
14393
bdf44e63a94c
revlog: stop exporting node.short
Matt Mackall <mpm@selenic.com>
parents:
14382
diff
changeset
|
190 short(n))) |
4251
e76e52145c3d
transplant: fix ignoring empty changesets (eg after filter)
Brendan Cully <brendan@kublai.com>
parents:
4072
diff
changeset
|
191 elif n: |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
192 self.ui.status(_('%s transplanted to %s\n') |
14393
bdf44e63a94c
revlog: stop exporting node.short
Matt Mackall <mpm@selenic.com>
parents:
14382
diff
changeset
|
193 % (short(node), |
bdf44e63a94c
revlog: stop exporting node.short
Matt Mackall <mpm@selenic.com>
parents:
14382
diff
changeset
|
194 short(n))) |
3714 | 195 finally: |
196 if patchfile: | |
197 os.unlink(patchfile) | |
15204
3ce9b1a7538b
transplant: wrap a transaction around the whole command
Greg Ward <greg@gerg.ca>
parents:
14741
diff
changeset
|
198 tr.close() |
3714 | 199 if pulls: |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
200 repo.pull(source, heads=pulls) |
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
201 merge.update(repo, pulls[-1], False, False, None) |
3714 | 202 finally: |
203 self.saveseries(revmap, merges) | |
204 self.transplants.write() | |
15204
3ce9b1a7538b
transplant: wrap a transaction around the whole command
Greg Ward <greg@gerg.ca>
parents:
14741
diff
changeset
|
205 if tr: |
3ce9b1a7538b
transplant: wrap a transaction around the whole command
Greg Ward <greg@gerg.ca>
parents:
14741
diff
changeset
|
206 tr.release() |
8112
6ee71f78497c
switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8076
diff
changeset
|
207 lock.release() |
6ee71f78497c
switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8076
diff
changeset
|
208 wlock.release() |
3714 | 209 |
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
|
210 def filter(self, filter, node, changelog, patchfile): |
3714 | 211 '''arbitrarily rewrite changeset before applying it''' |
212 | |
6966
057ced2b8543
i18n: mark strings for translation in transplant extension
Martin Geisler <mg@daimi.au.dk>
parents:
6762
diff
changeset
|
213 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
|
214 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
|
215 fd, headerfile = tempfile.mkstemp(prefix='hg-transplant-') |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
216 fp = os.fdopen(fd, 'w') |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
217 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
|
218 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
|
219 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
|
220 fp.write(msg + '\n') |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
221 fp.close() |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
222 |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
223 try: |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
224 util.system('%s %s %s' % (filter, util.shellquote(headerfile), |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
225 util.shellquote(patchfile)), |
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
|
226 environ={'HGUSER': changelog[1], |
3cbb3c57a50e
transplant: added 'HGREVISION' variable to the environment passed to the 'filter' command
Luke Plant <L.Plant.98@cantab.net>
parents:
13031
diff
changeset
|
227 'HGREVISION': revlog.hex(node), |
3cbb3c57a50e
transplant: added 'HGREVISION' variable to the environment passed to the 'filter' command
Luke Plant <L.Plant.98@cantab.net>
parents:
13031
diff
changeset
|
228 }, |
14741
39235b398248
transplant: use ui out descriptor when calling util.system
Idan Kamara <idankk86@gmail.com>
parents:
14564
diff
changeset
|
229 onerr=util.Abort, errprefix=_('filter failed'), |
39235b398248
transplant: use ui out descriptor when calling util.system
Idan Kamara <idankk86@gmail.com>
parents:
14564
diff
changeset
|
230 out=self.ui.fout) |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
231 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
|
232 finally: |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
233 os.unlink(headerfile) |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
234 |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
235 return (user, date, msg) |
3714 | 236 |
237 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
|
238 filter=None): |
3714 | 239 '''apply the patch in patchfile to the repository as a transplant''' |
240 (manifest, user, (time, timezone), files, message) = cl[:5] | |
241 date = "%d %d" % (time, timezone) | |
242 extra = {'transplant_source': node} | |
243 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
|
244 (user, date, message) = self.filter(filter, node, cl, patchfile) |
3714 | 245 |
246 if log: | |
9183
d0225fa2f6c4
do not translate commit messages
Martin Geisler <mg@lazybytes.net>
parents:
8934
diff
changeset
|
247 # we don't translate messages inserted into commits |
3714 | 248 message += '\n(transplanted from %s)' % revlog.hex(node) |
249 | |
14393
bdf44e63a94c
revlog: stop exporting node.short
Matt Mackall <mpm@selenic.com>
parents:
14382
diff
changeset
|
250 self.ui.status(_('applying %s\n') % short(node)) |
3714 | 251 self.ui.note('%s %s\n%s\n' % (user, date, message)) |
252 | |
253 if not patchfile and not merge: | |
254 raise util.Abort(_('can only omit patchfile if merging')) | |
255 if patchfile: | |
256 try: | |
14564
65f4512e40e4
patch: turn patch() touched files dict into a set
Patrick Mezard <pmezard@gmail.com>
parents:
14556
diff
changeset
|
257 files = set() |
14382
2d16f15da7bd
patch: remove patch.patch() cwd argument
Patrick Mezard <pmezard@gmail.com>
parents:
14319
diff
changeset
|
258 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
|
259 files = list(files) |
00a881581400
patch: make patch()/internalpatch() always update the dirstate
Patrick Mezard <pmezard@gmail.com>
parents:
14259
diff
changeset
|
260 if not files: |
00a881581400
patch: make patch()/internalpatch() always update the dirstate
Patrick Mezard <pmezard@gmail.com>
parents:
14259
diff
changeset
|
261 self.ui.warn(_('%s: empty changeset') % revlog.hex(node)) |
00a881581400
patch: make patch()/internalpatch() always update the dirstate
Patrick Mezard <pmezard@gmail.com>
parents:
14259
diff
changeset
|
262 return None |
3714 | 263 except Exception, inst: |
3757
faed44bab17b
transplant: clobber old series when transplant fails
Brendan Cully <brendan@kublai.com>
parents:
3752
diff
changeset
|
264 seriespath = os.path.join(self.path, 'series') |
faed44bab17b
transplant: clobber old series when transplant fails
Brendan Cully <brendan@kublai.com>
parents:
3752
diff
changeset
|
265 if os.path.exists(seriespath): |
faed44bab17b
transplant: clobber old series when transplant fails
Brendan Cully <brendan@kublai.com>
parents:
3752
diff
changeset
|
266 os.unlink(seriespath) |
13878
a8d13ee0ce68
misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents:
13790
diff
changeset
|
267 p1 = repo.dirstate.p1() |
3714 | 268 p2 = node |
3725
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
269 self.log(user, date, message, p1, p2, merge=merge) |
3714 | 270 self.ui.write(str(inst) + '\n') |
16507
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
271 raise TransplantError(_('fix up the merge and run ' |
1f020021adfa
transplant: do not rollback on patching error (issue3379)
Patrick Mezard <patrick@mezard.eu>
parents:
16457
diff
changeset
|
272 'hg transplant --continue')) |
3714 | 273 else: |
274 files = None | |
275 if merge: | |
276 p1, p2 = repo.dirstate.parents() | |
277 repo.dirstate.setparents(p1, node) | |
8703
8676dd819444
transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents:
8615
diff
changeset
|
278 m = match.always(repo.root, '') |
8676dd819444
transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents:
8615
diff
changeset
|
279 else: |
8676dd819444
transplant: use match object rather than files for commit
Matt Mackall <mpm@selenic.com>
parents:
8615
diff
changeset
|
280 m = match.exact(repo.root, '', files) |
3714 | 281 |
15220
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
282 n = repo.commit(message, user, date, extra=extra, match=m, |
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
283 editor=self.editor) |
11638
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
284 if not n: |
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
285 # Crash here to prevent an unclear crash later, in |
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
286 # transplants.write(). This can happen if patch.patch() |
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
287 # does nothing but claims success or if repo.status() fails |
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
288 # to report changes done by patch.patch(). These both |
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
289 # appear to be bugs in other parts of Mercurial, but dying |
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
290 # here, as soon as we can detect the problem, is preferable |
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
291 # to silently dropping changesets on the floor. |
79231258503b
transplant: crash if repo.commit() finds nothing to commit
Greg Ward <greg-hg@gerg.ca>
parents:
11411
diff
changeset
|
292 raise RuntimeError('nothing committed after transplant') |
3714 | 293 if not merge: |
294 self.transplants.set(n, node) | |
295 | |
296 return n | |
297 | |
298 def resume(self, repo, source, opts=None): | |
299 '''recover last transaction and apply remaining changesets''' | |
300 if os.path.exists(os.path.join(self.path, 'journal')): | |
301 n, node = self.recover(repo) | |
14393
bdf44e63a94c
revlog: stop exporting node.short
Matt Mackall <mpm@selenic.com>
parents:
14382
diff
changeset
|
302 self.ui.status(_('%s transplanted as %s\n') % (short(node), |
bdf44e63a94c
revlog: stop exporting node.short
Matt Mackall <mpm@selenic.com>
parents:
14382
diff
changeset
|
303 short(n))) |
3714 | 304 seriespath = os.path.join(self.path, 'series') |
305 if not os.path.exists(seriespath): | |
3758
889f7e74a0d9
transplant: log source node when recovering too.
Brendan Cully <brendan@kublai.com>
parents:
3757
diff
changeset
|
306 self.transplants.write() |
3714 | 307 return |
308 nodes, merges = self.readseries() | |
309 revmap = {} | |
310 for n in nodes: | |
311 revmap[source.changelog.rev(n)] = n | |
312 os.unlink(seriespath) | |
313 | |
314 self.apply(repo, source, revmap, merges, opts) | |
315 | |
316 def recover(self, repo): | |
317 '''commit working directory using journal metadata''' | |
318 node, user, date, message, parents = self.readlog() | |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
319 merge = False |
3714 | 320 |
321 if not user or not date or not message or not parents[0]: | |
322 raise util.Abort(_('transplant log file is corrupt')) | |
323 | |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
324 parent = parents[0] |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
325 if len(parents) > 1: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
326 if opts.get('parent'): |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
327 parent = source.lookup(opts['parent']) |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
328 if parent not in parents: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
329 raise util.Abort(_('%s is not a parent of %s') % |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
330 (short(parent), short(node))) |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
331 else: |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
332 merge = True |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
333 |
3758
889f7e74a0d9
transplant: log source node when recovering too.
Brendan Cully <brendan@kublai.com>
parents:
3757
diff
changeset
|
334 extra = {'transplant_source': node} |
3714 | 335 wlock = repo.wlock() |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
336 try: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
337 p1, p2 = repo.dirstate.parents() |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
338 if p1 != parent: |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
339 raise util.Abort( |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
340 _('working dir not at transplant parent %s') % |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
341 revlog.hex(parent)) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
342 if merge: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
343 repo.dirstate.setparents(p1, parents[1]) |
15220
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
344 n = repo.commit(message, user, date, extra=extra, |
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
345 editor=self.editor) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
346 if not n: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
347 raise util.Abort(_('commit failed')) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
348 if not merge: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
349 self.transplants.set(n, node) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
350 self.unlog() |
3714 | 351 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
352 return n, node |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4680
diff
changeset
|
353 finally: |
8112
6ee71f78497c
switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
8076
diff
changeset
|
354 wlock.release() |
3714 | 355 |
356 def readseries(self): | |
357 nodes = [] | |
358 merges = [] | |
359 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
|
360 for line in self.opener.read('series').splitlines(): |
3714 | 361 if line.startswith('# Merges'): |
362 cur = merges | |
363 continue | |
364 cur.append(revlog.bin(line)) | |
365 | |
366 return (nodes, merges) | |
367 | |
368 def saveseries(self, revmap, merges): | |
369 if not revmap: | |
370 return | |
371 | |
372 if not os.path.isdir(self.path): | |
373 os.mkdir(self.path) | |
374 series = self.opener('series', 'w') | |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
8176
diff
changeset
|
375 for rev in sorted(revmap): |
3714 | 376 series.write(revlog.hex(revmap[rev]) + '\n') |
377 if merges: | |
378 series.write('# Merges\n') | |
379 for m in merges: | |
380 series.write(revlog.hex(m) + '\n') | |
381 series.close() | |
382 | |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
383 def parselog(self, fp): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
384 parents = [] |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
385 message = [] |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
386 node = revlog.nullid |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
387 inmsg = False |
13789
7e5031180c0f
transplant: fix crash if filter script munges log file
Luke Plant <L.Plant.98@cantab.net>
parents:
13742
diff
changeset
|
388 user = None |
7e5031180c0f
transplant: fix crash if filter script munges log file
Luke Plant <L.Plant.98@cantab.net>
parents:
13742
diff
changeset
|
389 date = None |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
390 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
|
391 if inmsg: |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
392 message.append(line) |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
393 elif line.startswith('# User '): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
394 user = line[7:] |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
395 elif line.startswith('# Date '): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
396 date = line[7:] |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
397 elif line.startswith('# Node ID '): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
398 node = revlog.bin(line[10:]) |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
399 elif line.startswith('# Parent '): |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
400 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
|
401 elif not line.startswith('# '): |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
402 inmsg = True |
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
403 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
|
404 if None in (user, date): |
13790
c0ed76b5056d
Fix transplant error message to correspond with test
Brendan Cully <brendan@kublai.com>
parents:
13789
diff
changeset
|
405 raise util.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
|
406 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
|
407 |
3725
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
408 def log(self, user, date, message, p1, p2, merge=False): |
3714 | 409 '''journal changelog metadata for later recover''' |
410 | |
411 if not os.path.isdir(self.path): | |
412 os.mkdir(self.path) | |
413 fp = self.opener('journal', 'w') | |
3725
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
414 fp.write('# User %s\n' % user) |
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
415 fp.write('# Date %s\n' % date) |
3714 | 416 fp.write('# Node ID %s\n' % revlog.hex(p2)) |
417 fp.write('# Parent ' + revlog.hex(p1) + '\n') | |
418 if merge: | |
419 fp.write('# Parent ' + revlog.hex(p2) + '\n') | |
3725
ccc7a9eb0e5e
transplant: preserve filter changes in --continue log
Brendan Cully <brendan@kublai.com>
parents:
3724
diff
changeset
|
420 fp.write(message.rstrip() + '\n') |
3714 | 421 fp.close() |
422 | |
423 def readlog(self): | |
3759
e96f97ca0358
transplant: split filter args into changelog entry and patch
Brendan Cully <brendan@kublai.com>
parents:
3758
diff
changeset
|
424 return self.parselog(self.opener('journal')) |
3714 | 425 |
426 def unlog(self): | |
427 '''remove changelog journal''' | |
428 absdst = os.path.join(self.path, 'journal') | |
429 if os.path.exists(absdst): | |
430 os.unlink(absdst) | |
431 | |
432 def transplantfilter(self, repo, source, root): | |
433 def matchfn(node): | |
434 if self.applied(repo, node, root): | |
435 return False | |
436 if source.changelog.parents(node)[1] != revlog.nullid: | |
437 return False | |
438 extra = source.changelog.read(node)[5] | |
439 cnode = extra.get('transplant_source') | |
440 if cnode and self.applied(repo, cnode, root): | |
441 return False | |
442 return True | |
443 | |
444 return matchfn | |
445 | |
446 def hasnode(repo, node): | |
447 try: | |
13031
3da456d0c885
code style: prefer 'is' and 'is not' tests with singletons
Martin Geisler <mg@aragost.com>
parents:
12823
diff
changeset
|
448 return repo.changelog.rev(node) is not None |
7633 | 449 except error.RevlogError: |
3714 | 450 return False |
451 | |
452 def browserevs(ui, repo, nodes, opts): | |
453 '''interactively transplant changesets''' | |
454 def browsehelp(ui): | |
10510
f77f3383c666
i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
455 ui.write(_('y: transplant this changeset\n' |
f77f3383c666
i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
456 'n: skip this changeset\n' |
f77f3383c666
i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
457 'm: merge at this changeset\n' |
f77f3383c666
i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
458 'p: show patch\n' |
f77f3383c666
i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
459 'c: commit selected changesets\n' |
f77f3383c666
i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
460 'q: cancel transplant\n' |
f77f3383c666
i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
461 '?: show this help\n')) |
3714 | 462 |
3723
c828fca6f38a
transplant: show_changeset moved to cmdutil
Brendan Cully <brendan@kublai.com>
parents:
3714
diff
changeset
|
463 displayer = cmdutil.show_changeset(ui, repo, opts) |
3714 | 464 transplants = [] |
465 merges = [] | |
466 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
|
467 displayer.show(repo[node]) |
3714 | 468 action = None |
469 while not action: | |
470 action = ui.prompt(_('apply changeset? [ynmpcq?]:')) | |
471 if action == '?': | |
472 browsehelp(ui) | |
473 action = None | |
474 elif action == 'p': | |
475 parent = repo.changelog.parents(node)[0] | |
7308
b6f5490effbf
patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7280
diff
changeset
|
476 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
|
477 ui.write(chunk) |
3714 | 478 action = None |
479 elif action not in ('y', 'n', 'm', 'c', 'q'): | |
10510
f77f3383c666
i18n: mark more strings for translation
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10394
diff
changeset
|
480 ui.write(_('no such option\n')) |
3714 | 481 action = None |
482 if action == 'y': | |
483 transplants.append(node) | |
484 elif action == 'm': | |
485 merges.append(node) | |
486 elif action == 'c': | |
487 break | |
488 elif action == 'q': | |
489 transplants = () | |
490 merges = () | |
491 break | |
10152
56284451a22c
Added support for templatevar "footer" to cmdutil.py
Robert Bachmann <rbachm@gmail.com>
parents:
9995
diff
changeset
|
492 displayer.close() |
3714 | 493 return (transplants, merges) |
494 | |
14308
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
495 @command('transplant', |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
496 [('s', 'source', '', _('pull patches from REPO'), _('REPO')), |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
497 ('b', 'branch', [], |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
498 _('pull patches from branch BRANCH'), _('BRANCH')), |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
499 ('a', 'all', None, _('pull all changesets up to BRANCH')), |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
500 ('p', 'prune', [], _('skip over REV'), _('REV')), |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
501 ('m', 'merge', [], _('merge at REV'), _('REV')), |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
502 ('', 'parent', '', |
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
503 _('parent to choose when transplanting merge'), _('REV')), |
15220
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
504 ('e', 'edit', False, _('invoke editor on commit messages')), |
14308
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
505 ('', 'log', None, _('append transplant info to log message')), |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
506 ('c', 'continue', None, _('continue last transplant session ' |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
507 'after repair')), |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
508 ('', 'filter', '', |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
509 _('filter changesets through command'), _('CMD'))], |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
510 _('hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] ' |
e7ea3e38fea8
transplant: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14260
diff
changeset
|
511 '[-m REV] [REV]...')) |
3714 | 512 def transplant(ui, repo, *revs, **opts): |
513 '''transplant changesets from another branch | |
514 | |
515 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
|
516 directory with the log of the original changeset. The changesets |
888ec2650c2d
transplant: explain that changesets are copied, not moved
Martin Geisler <mg@lazybytes.net>
parents:
13031
diff
changeset
|
517 are copied and will thus appear twice in the history. Use the |
888ec2650c2d
transplant: explain that changesets are copied, not moved
Martin Geisler <mg@lazybytes.net>
parents:
13031
diff
changeset
|
518 rebase extension instead if you want to move a whole branch of |
888ec2650c2d
transplant: explain that changesets are copied, not moved
Martin Geisler <mg@lazybytes.net>
parents:
13031
diff
changeset
|
519 unpublished changesets. |
888ec2650c2d
transplant: explain that changesets are copied, not moved
Martin Geisler <mg@lazybytes.net>
parents:
13031
diff
changeset
|
520 |
888ec2650c2d
transplant: explain that changesets are copied, not moved
Martin Geisler <mg@lazybytes.net>
parents:
13031
diff
changeset
|
521 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
|
522 of the form:: |
3714 | 523 |
9200
6b4c527c3d22
transplant: better reST formatting
Martin Geisler <mg@lazybytes.net>
parents:
9196
diff
changeset
|
524 (transplanted from CHANGESETHASH) |
3714 | 525 |
526 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
|
527 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
|
528 $1 and the patch as $2. |
3714 | 529 |
8076
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8000
diff
changeset
|
530 If --source/-s is specified, selects changesets from the named |
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8000
diff
changeset
|
531 repository. If --branch/-b is specified, selects changesets from |
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8000
diff
changeset
|
532 the branch holding the named revision, up to that revision. If |
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8000
diff
changeset
|
533 --all/-a is specified, all changesets on the branch will be |
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8000
diff
changeset
|
534 transplanted, otherwise you will be prompted to select the |
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8000
diff
changeset
|
535 changesets you want. |
3714 | 536 |
13606
1532ed1e50ca
transplant: avoid the word "rebase" when we mean "transplant"
Martin Geisler <mg@lazybytes.net>
parents:
13605
diff
changeset
|
537 :hg:`transplant --branch REVISION --all` will transplant the |
1532ed1e50ca
transplant: avoid the word "rebase" when we mean "transplant"
Martin Geisler <mg@lazybytes.net>
parents:
13605
diff
changeset
|
538 selected branch (up to the named revision) onto your current |
1532ed1e50ca
transplant: avoid the word "rebase" when we mean "transplant"
Martin Geisler <mg@lazybytes.net>
parents:
13605
diff
changeset
|
539 working directory. |
3714 | 540 |
8000
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
541 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
|
542 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
|
543 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
|
544 normally instead of transplanting them. |
3714 | 545 |
16400
f2ba409dbb0f
transplant: permit merge changesets via --parent
Steven Stallion <sstallion@gmail.com>
parents:
15220
diff
changeset
|
546 Merge changesets may be transplanted directly by specifying the |
16457
91196ebcaeed
transplant: remove extraneous whitespace
Steven Stallion <sstallion@gmail.com>
parents:
16400
diff
changeset
|
547 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
|
548 |
11193
687c7d395f20
Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents:
10510
diff
changeset
|
549 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
|
550 start an interactive changeset browser. |
3714 | 551 |
8000
83d7c9cfb065
transplant: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7874
diff
changeset
|
552 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
|
553 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
|
554 --continue/-c`. |
3714 | 555 ''' |
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
556 def incwalk(repo, csets, match=util.always): |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
557 for node in csets: |
3714 | 558 if match(node): |
559 yield node | |
560 | |
561 def transplantwalk(repo, root, branches, match=util.always): | |
562 if not branches: | |
563 branches = repo.heads() | |
564 ancestors = [] | |
565 for branch in branches: | |
566 ancestors.append(repo.changelog.ancestor(root, branch)) | |
567 for node in repo.changelog.nodesbetween(ancestors, branches)[0]: | |
568 if match(node): | |
569 yield node | |
570 | |
571 def checkopts(opts, revs): | |
572 if opts.get('continue'): | |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
573 if opts.get('branch') or opts.get('all') or opts.get('merge'): |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
574 raise util.Abort(_('--continue is incompatible with ' |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
575 'branch, all or merge')) |
3714 | 576 return |
577 if not (opts.get('source') or revs or | |
578 opts.get('merge') or opts.get('branch')): | |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
579 raise util.Abort(_('no source URL, branch tag or revision ' |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
580 'list provided')) |
3714 | 581 if opts.get('all'): |
582 if not opts.get('branch'): | |
583 raise util.Abort(_('--all requires a branch revision')) | |
584 if revs: | |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
585 raise util.Abort(_('--all is incompatible with a ' |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
586 'revision list')) |
3714 | 587 |
588 checkopts(opts, revs) | |
589 | |
590 if not opts.get('log'): | |
591 opts['log'] = ui.config('transplant', 'log') | |
592 if not opts.get('filter'): | |
593 opts['filter'] = ui.config('transplant', 'filter') | |
594 | |
595 tp = transplanter(ui, repo) | |
15220
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
596 if opts.get('edit'): |
f7db54b832af
transplant: add --edit option
Matt Mackall <mpm@selenic.com>
parents:
15204
diff
changeset
|
597 tp.editor = cmdutil.commitforceeditor |
3714 | 598 |
599 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
|
600 if len(repo) > 0 and p1 == revlog.nullid: |
2660e7002413
transplant: forbid transplant to nonempty repositories with no working directory.
Brendan Cully <brendan@kublai.com>
parents:
8173
diff
changeset
|
601 raise util.Abort(_('no revision checked out')) |
3714 | 602 if not opts.get('continue'): |
603 if p2 != revlog.nullid: | |
604 raise util.Abort(_('outstanding uncommitted merges')) | |
605 m, a, r, d = repo.status()[:4] | |
606 if m or a or r or d: | |
607 raise util.Abort(_('outstanding local changes')) | |
608 | |
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
609 sourcerepo = opts.get('source') |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
610 if sourcerepo: |
14556
517e1d88bf7e
hg: change various repository() users to use peer() where appropriate
Matt Mackall <mpm@selenic.com>
parents:
14393
diff
changeset
|
611 source = hg.peer(ui, opts, ui.expandpath(sourcerepo)) |
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
612 branches = map(source.lookup, opts.get('branch', ())) |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
613 source, csets, cleanupfn = bundlerepo.getremotechanges(ui, repo, source, |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
614 onlyheads=branches, force=True) |
3714 | 615 else: |
616 source = repo | |
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
617 branches = map(source.lookup, opts.get('branch', ())) |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
618 cleanupfn = None |
3714 | 619 |
620 try: | |
621 if opts.get('continue'): | |
3724
ea523d6f5f1a
transplant: fix --continue; add --continue test
Brendan Cully <brendan@kublai.com>
parents:
3723
diff
changeset
|
622 tp.resume(repo, source, opts) |
3714 | 623 return |
624 | |
10394
4612cded5176
fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10282
diff
changeset
|
625 tf = tp.transplantfilter(repo, source, p1) |
3714 | 626 if opts.get('prune'): |
627 prune = [source.lookup(r) | |
14319
b33f3e35efb0
scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14308
diff
changeset
|
628 for r in scmutil.revrange(source, opts.get('prune'))] |
3714 | 629 matchfn = lambda x: tf(x) and x not in prune |
630 else: | |
631 matchfn = tf | |
632 merges = map(source.lookup, opts.get('merge', ())) | |
633 revmap = {} | |
634 if revs: | |
14319
b33f3e35efb0
scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14308
diff
changeset
|
635 for r in scmutil.revrange(source, revs): |
3714 | 636 revmap[int(r)] = source.lookup(r) |
637 elif opts.get('all') or not merges: | |
638 if source != repo: | |
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
639 alltransplants = incwalk(source, csets, match=matchfn) |
3714 | 640 else: |
7744
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
641 alltransplants = transplantwalk(source, p1, branches, |
b44dbb95f07f
transplant: wrapped long lines
Martin Geisler <mg@daimi.au.dk>
parents:
7633
diff
changeset
|
642 match=matchfn) |
3714 | 643 if opts.get('all'): |
644 revs = alltransplants | |
645 else: | |
646 revs, newmerges = browserevs(ui, source, alltransplants, opts) | |
647 merges.extend(newmerges) | |
648 for r in revs: | |
649 revmap[source.changelog.rev(r)] = r | |
650 for r in merges: | |
651 revmap[source.changelog.rev(r)] = r | |
652 | |
653 tp.apply(repo, source, revmap, merges, opts) | |
654 finally: | |
14161
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
655 if cleanupfn: |
8a0fca925992
bundlerepo: fix and improve getremotechanges
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
14073
diff
changeset
|
656 cleanupfn() |
3714 | 657 |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
658 def revsettransplanted(repo, subset, x): |
14211
b00ab6890fe9
transplant: fix revset doc
Idan Kamara <idankk86@gmail.com>
parents:
13606
diff
changeset
|
659 """``transplanted([set])`` |
b00ab6890fe9
transplant: fix revset doc
Idan Kamara <idankk86@gmail.com>
parents:
13606
diff
changeset
|
660 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
|
661 """ |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
662 if x: |
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
663 s = revset.getset(repo, subset, x) |
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
664 else: |
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
665 s = subset |
14212
8f551386abf0
transplant: remove unneeded loop over repo in revset
Idan Kamara <idankk86@gmail.com>
parents:
14168
diff
changeset
|
666 return [r for r in s if 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
|
667 |
13689
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
668 def kwtransplanted(repo, ctx, **args): |
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
669 """:transplanted: String. The node identifier of the transplanted |
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
670 changeset if any.""" |
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
671 n = ctx.extra().get('transplant_source') |
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
672 return n and revlog.hex(n) or '' |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
673 |
12822
f13acb96b2a7
Fix and unify transplant and bookmarks revsets doc registration
Patrick Mezard <pmezard@gmail.com>
parents:
12734
diff
changeset
|
674 def extsetup(ui): |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
675 revset.symbols['transplanted'] = revsettransplanted |
13689
65399579da68
transplant: add "transplanted" keyword
Patrick Mezard <pmezard@gmail.com>
parents:
13607
diff
changeset
|
676 templatekw.keywords['transplanted'] = kwtransplanted |
12581
19dabc8a3236
transplant: add the transplanted revset predicate
Juan Pablo Aroztegi <juanpablo.aroztegi@openbravo.com>
parents:
12349
diff
changeset
|
677 |
12823
80deae3bc5ea
hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents:
12822
diff
changeset
|
678 # 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
|
679 i18nfunctions = [revsettransplanted, kwtransplanted] |