Mercurial > hgsubversion
comparison utility_commands.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 | 2 |
| 3 from mercurial import node | |
| 4 from mercurial import util as hgutil | 3 from mercurial import util as hgutil |
| 5 from hgext import rebase as hgrebase | |
| 6 | 4 |
| 7 import svnwrap | 5 import svnwrap |
| 8 import cmdutil | 6 import cmdutil |
| 9 import util | 7 import util |
| 10 import hg_delta_editor | 8 import hg_delta_editor |
| 98 'date': hgutil.datestr(parent.date(), | 96 'date': hgutil.datestr(parent.date(), |
| 99 '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)') | 97 '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)') |
| 100 }) | 98 }) |
| 101 | 99 |
| 102 | 100 |
| 103 def rebase(ui, repo, extrafn=None, sourcerev=None, **opts): | |
| 104 """rebase current unpushed revisions onto the Subversion head | |
| 105 | |
| 106 This moves a line of development from making its own head to the top of | |
| 107 Subversion development, linearizing the changes. In order to make sure you | |
| 108 rebase on top of the current top of Subversion work, you should probably run | |
| 109 'hg svn pull' before running this. | |
| 110 """ | |
| 111 if extrafn is None: | |
| 112 def extrafn2(ctx, extra): | |
| 113 """defined here so we can add things easily. | |
| 114 """ | |
| 115 extra['branch'] = ctx.branch() | |
| 116 extrafn = extrafn2 | |
| 117 if sourcerev is None: | |
| 118 sourcerev = repo.parents()[0].node() | |
| 119 hge = hg_delta_editor.HgChangeReceiver(repo=repo) | |
| 120 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), | |
| 121 hge.revmap.iterkeys())) | |
| 122 o_r = util.outgoing_revisions(ui, repo, hge, svn_commit_hashes, sourcerev=sourcerev) | |
| 123 if not o_r: | |
| 124 ui.status('Nothing to rebase!\n') | |
| 125 return 0 | |
| 126 if len(repo[sourcerev].children()): | |
| 127 ui.status('Refusing to rebase non-head commit like a coward\n') | |
| 128 return 0 | |
| 129 parent_rev = repo[o_r[-1]].parents()[0] | |
| 130 target_rev = parent_rev | |
| 131 p_n = parent_rev.node() | |
| 132 exhausted_choices = False | |
| 133 while target_rev.children() and not exhausted_choices: | |
| 134 for c in target_rev.children(): | |
| 135 exhausted_choices = True | |
| 136 n = c.node() | |
| 137 if (n in svn_commit_hashes and | |
| 138 svn_commit_hashes[n][1] == svn_commit_hashes[p_n][1]): | |
| 139 target_rev = c | |
| 140 exhausted_choices = False | |
| 141 break | |
| 142 if parent_rev == target_rev: | |
| 143 ui.status('Already up to date!\n') | |
| 144 return 0 | |
| 145 return hgrebase.rebase(ui, repo, dest=node.hex(target_rev.node()), | |
| 146 base=node.hex(sourcerev), | |
| 147 extrafn=extrafn) | |
| 148 | |
| 149 | |
| 150 def listauthors(ui, args, authors=None, **opts): | 101 def listauthors(ui, args, authors=None, **opts): |
| 151 """list all authors in a Subversion repository | 102 """list all authors in a Subversion repository |
| 152 """ | 103 """ |
| 153 if not len(args): | 104 if not len(args): |
| 154 ui.status('No repository specified.\n') | 105 ui.status('No repository specified.\n') |
| 178 'url': url, | 129 'url': url, |
| 179 'genignore': genignore, | 130 'genignore': genignore, |
| 180 'info': info, | 131 'info': info, |
| 181 'listauthors': listauthors, | 132 'listauthors': listauthors, |
| 182 'version': version, | 133 'version': version, |
| 183 'rebase': rebase, | |
| 184 } | 134 } |
