Mercurial > hgsubversion
comparison wrappers.py @ 264:112d57bb736e
rebase: moved to wrappers, now a wrapper around rebase triggered with --svn.
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Mon, 13 Apr 2009 21:51:12 -0500 |
parents | d978192f0d63 |
children | 9f0738587f94 |
comparison
equal
deleted
inserted
replaced
263:d978192f0d63 | 264:112d57bb736e |
---|---|
1 import os | 1 import os |
2 | |
3 from hgext import rebase as hgrebase | |
2 | 4 |
3 from mercurial import cmdutil as hgcmdutil | 5 from mercurial import cmdutil as hgcmdutil |
4 from mercurial import commands | 6 from mercurial import commands |
5 from mercurial import patch | 7 from mercurial import patch |
6 from mercurial import hg | 8 from mercurial import hg |
13 import cmdutil | 15 import cmdutil |
14 import hg_delta_editor | 16 import hg_delta_editor |
15 import stupid as stupidmod | 17 import stupid as stupidmod |
16 import svnwrap | 18 import svnwrap |
17 import util | 19 import util |
18 import utility_commands | |
19 | 20 |
20 def parent(orig, ui, repo, *args, **opts): | 21 def parent(orig, ui, repo, *args, **opts): |
21 """show Mercurial & Subversion parents of the working dir or revision | 22 """show Mercurial & Subversion parents of the working dir or revision |
22 """ | 23 """ |
23 if not opts.get('svn', False): | 24 if not opts.get('svn', False): |
49 ui.status('no changes found\n') | 50 ui.status('no changes found\n') |
50 return 0 | 51 return 0 |
51 displayer = hgcmdutil.show_changeset(ui, repo, opts, buffered=False) | 52 displayer = hgcmdutil.show_changeset(ui, repo, opts, buffered=False) |
52 for node in reversed(o_r): | 53 for node in reversed(o_r): |
53 displayer.show(repo[node]) | 54 displayer.show(repo[node]) |
54 | |
55 | |
56 | 55 |
57 | 56 |
58 def diff(orig, ui, repo, *args, **opts): | 57 def diff(orig, ui, repo, *args, **opts): |
59 """show a diff of the most recent revision against its parent from svn | 58 """show a diff of the most recent revision against its parent from svn |
60 """ | 59 """ |
84 'text': False, | 83 'text': False, |
85 })) | 84 })) |
86 ui.write(cmdutil.filterdiff(''.join(it), baserev, newrev)) | 85 ui.write(cmdutil.filterdiff(''.join(it), baserev, newrev)) |
87 | 86 |
88 | 87 |
89 | |
90 | |
91 def push(orig, ui, repo, dest=None, *args, **opts): | 88 def push(orig, ui, repo, dest=None, *args, **opts): |
92 """push revisions starting at a specified head back to Subversion. | 89 """push revisions starting at a specified head back to Subversion. |
93 """ | 90 """ |
94 svnurl = repo.ui.expandpath(dest or 'default-push', dest or 'default') | 91 svnurl = repo.ui.expandpath(dest or 'default-push', dest or 'default') |
95 if not cmdutil.issvnurl(svnurl): | 92 if not cmdutil.issvnurl(svnurl): |
113 outgoing = util.outgoing_revisions(ui, repo, hge, svn_commit_hashes, workingrev.node()) | 110 outgoing = util.outgoing_revisions(ui, repo, hge, svn_commit_hashes, workingrev.node()) |
114 if not (outgoing and len(outgoing)): | 111 if not (outgoing and len(outgoing)): |
115 ui.status('No revisions to push.') | 112 ui.status('No revisions to push.') |
116 return 0 | 113 return 0 |
117 while outgoing: | 114 while outgoing: |
115 print [node.hex(x) for x in outgoing] | |
118 oldest = outgoing.pop(-1) | 116 oldest = outgoing.pop(-1) |
119 old_ctx = repo[oldest] | 117 old_ctx = repo[oldest] |
120 if len(old_ctx.parents()) != 1: | 118 if len(old_ctx.parents()) != 1: |
121 ui.status('Found a branch merge, this needs discussion and ' | 119 ui.status('Found a branch merge, this needs discussion and ' |
122 'implementation.') | 120 'implementation.') |
157 for needs_transplant in heads: | 155 for needs_transplant in heads: |
158 def extrafn(ctx, extra): | 156 def extrafn(ctx, extra): |
159 if ctx.node() == oldest: | 157 if ctx.node() == oldest: |
160 return | 158 return |
161 extra['branch'] = ctx.branch() | 159 extra['branch'] = ctx.branch() |
162 utility_commands.rebase(ui, repo, extrafn=extrafn, | 160 rebase(hgrebase.rebase, ui, repo, svn=True, svnextrafn=extrafn, |
163 sourcerev=needs_transplant, **opts) | 161 svnsourcerev=needs_transplant, **opts) |
164 repo = hg.repository(ui, hge.path) | 162 repo = hg.repository(ui, hge.path) |
165 for child in repo[replacement.node()].children(): | 163 for child in repo[replacement.node()].children(): |
166 rebasesrc = node.bin(child.extra().get('rebase_source', node.hex(node.nullid))) | 164 rebasesrc = node.bin(child.extra().get('rebase_source', node.hex(node.nullid))) |
165 print node.hex(rebasesrc) | |
167 if rebasesrc in outgoing: | 166 if rebasesrc in outgoing: |
167 print 'swap outgoin' | |
168 while rebasesrc in outgoing: | 168 while rebasesrc in outgoing: |
169 rebsrcindex = outgoing.index(rebasesrc) | 169 rebsrcindex = outgoing.index(rebasesrc) |
170 outgoing = (outgoing[0:rebsrcindex] + | 170 outgoing = (outgoing[0:rebsrcindex] + |
171 [child.node(), ] + outgoing[rebsrcindex+1:]) | 171 [child.node(), ] + outgoing[rebsrcindex+1:]) |
172 children = [c for c in child.children() if c.branch() == child.branch()] | 172 children = [c for c in child.children() if c.branch() == child.branch()] |
175 rebasesrc = node.bin(child.extra().get('rebase_source', node.hex(node.nullid))) | 175 rebasesrc = node.bin(child.extra().get('rebase_source', node.hex(node.nullid))) |
176 hge = hg_delta_editor.HgChangeReceiver(hge.path, ui_=ui) | 176 hge = hg_delta_editor.HgChangeReceiver(hge.path, ui_=ui) |
177 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), hge.revmap.iterkeys())) | 177 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), hge.revmap.iterkeys())) |
178 util.swap_out_encoding(old_encoding) | 178 util.swap_out_encoding(old_encoding) |
179 return 0 | 179 return 0 |
180 | |
181 | 180 |
182 | 181 |
183 def clone(orig, ui, source, dest=None, *args, **opts): | 182 def clone(orig, ui, source, dest=None, *args, **opts): |
184 '''clone Subversion repository to a local Mercurial repository. | 183 '''clone Subversion repository to a local Mercurial repository. |
185 | 184 |
320 tries += 1 | 319 tries += 1 |
321 ui.status('Got a 502, retrying (%s)\n' % tries) | 320 ui.status('Got a 502, retrying (%s)\n' % tries) |
322 else: | 321 else: |
323 raise hgutil.Abort(*e.args) | 322 raise hgutil.Abort(*e.args) |
324 util.swap_out_encoding(old_encoding) | 323 util.swap_out_encoding(old_encoding) |
324 | |
325 | |
326 def rebase(orig, ui, repo, **opts): | |
327 """rebase current unpushed revisions onto the Subversion head | |
328 | |
329 This moves a line of development from making its own head to the top of | |
330 Subversion development, linearizing the changes. In order to make sure you | |
331 rebase on top of the current top of Subversion work, you should probably run | |
332 'hg svn pull' before running this. | |
333 | |
334 Also looks for svnextrafn and svnsourcerev in **opts. | |
335 """ | |
336 if not opts.get('svn', False): | |
337 return orig(ui, repo, **opts) | |
338 def extrafn2(ctx, extra): | |
339 """defined here so we can add things easily. | |
340 """ | |
341 extra['branch'] = ctx.branch() | |
342 extrafn = opts.get('svnextrafn', extrafn2) | |
343 sourcerev = opts.get('svnsourcerev', repo.parents()[0].node()) | |
344 hge = hg_delta_editor.HgChangeReceiver(repo=repo) | |
345 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), | |
346 hge.revmap.iterkeys())) | |
347 o_r = util.outgoing_revisions(ui, repo, hge, svn_commit_hashes, sourcerev=sourcerev) | |
348 if not o_r: | |
349 ui.status('Nothing to rebase!\n') | |
350 return 0 | |
351 if len(repo[sourcerev].children()): | |
352 ui.status('Refusing to rebase non-head commit like a coward\n') | |
353 return 0 | |
354 parent_rev = repo[o_r[-1]].parents()[0] | |
355 target_rev = parent_rev | |
356 p_n = parent_rev.node() | |
357 exhausted_choices = False | |
358 while target_rev.children() and not exhausted_choices: | |
359 for c in target_rev.children(): | |
360 exhausted_choices = True | |
361 n = c.node() | |
362 if (n in svn_commit_hashes and | |
363 svn_commit_hashes[n][1] == svn_commit_hashes[p_n][1]): | |
364 target_rev = c | |
365 exhausted_choices = False | |
366 break | |
367 if parent_rev == target_rev: | |
368 ui.status('Already up to date!\n') | |
369 return 0 | |
370 return orig(ui, repo, dest=node.hex(target_rev.node()), | |
371 base=node.hex(sourcerev), | |
372 extrafn=extrafn) |