Mercurial > hgsubversion
comparison utility_commands.py @ 0:f2636cfed115
Initial import of hgsubversion into a public repository.
| author | Augie Fackler <durin42@gmail.com> |
|---|---|
| date | Tue, 30 Sep 2008 11:42:52 -0500 |
| parents | |
| children | 05800c403321 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:f2636cfed115 |
|---|---|
| 1 from mercurial import cmdutil | |
| 2 from mercurial import node | |
| 3 from hgext import rebase | |
| 4 | |
| 5 import util | |
| 6 import hg_delta_editor | |
| 7 | |
| 8 @util.register_subcommand('url') | |
| 9 def print_wc_url(ui, repo, hg_repo_path, **opts): | |
| 10 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, | |
| 11 ui_=ui) | |
| 12 ui.status(hge.url, '\n') | |
| 13 | |
| 14 | |
| 15 @util.register_subcommand('parent') | |
| 16 def print_parent_revision(ui, repo, hg_repo_path, **opts): | |
| 17 """Prints the hg hash and svn revision info for the nearest svn parent of | |
| 18 the current revision""" | |
| 19 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, | |
| 20 ui_=ui) | |
| 21 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), | |
| 22 hge.revmap.iterkeys())) | |
| 23 ha = repo.parents()[0] | |
| 24 o_r = outgoing_revisions(ui, repo, hge, svn_commit_hashes) | |
| 25 if o_r: | |
| 26 ha = repo[o_r[-1]].parents()[0] | |
| 27 if ha.node() != node.nullid: | |
| 28 r, br = svn_commit_hashes[ha.node()] | |
| 29 ui.status('Working copy parent revision is %s: r%s on %s\n' % | |
| 30 (ha, r, br or 'trunk')) | |
| 31 else: | |
| 32 ui.status('Working copy seems to have no parent svn revision.\n') | |
| 33 return 0 | |
| 34 | |
| 35 | |
| 36 @util.register_subcommand('rebase') | |
| 37 def rebase_commits(ui, repo, hg_repo_path, **opts): | |
| 38 """Rebases the current uncommitted revisions onto the top of the branch. | |
| 39 """ | |
| 40 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, | |
| 41 ui_=ui) | |
| 42 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), | |
| 43 hge.revmap.iterkeys())) | |
| 44 o_r = outgoing_revisions(ui, repo, hge, svn_commit_hashes) | |
| 45 if not o_r: | |
| 46 ui.status('Nothing to rebase!\n') | |
| 47 return 0 | |
| 48 if len(repo.parents()[0].children()): | |
| 49 ui.status('Refusing to rebase non-head commit like a coward\n') | |
| 50 return 0 | |
| 51 parent_rev = repo[o_r[-1]].parents()[0] | |
| 52 target_rev = parent_rev | |
| 53 p_n = parent_rev.node() | |
| 54 exhausted_choices = False | |
| 55 while target_rev.children() and not exhausted_choices: | |
| 56 for c in target_rev.children(): | |
| 57 exhausted_choices = True | |
| 58 n = c.node() | |
| 59 if (n in svn_commit_hashes and | |
| 60 svn_commit_hashes[n][1] == svn_commit_hashes[p_n][1]): | |
| 61 target_rev = c | |
| 62 exhausted_choices = False | |
| 63 break | |
| 64 if parent_rev == target_rev: | |
| 65 ui.status('Already up to date!\n') | |
| 66 return 0 | |
| 67 # TODO this is really hacky, there must be a more direct way | |
| 68 return rebase.rebase(ui, repo, dest=node.hex(target_rev.node()), | |
| 69 base=node.hex(repo.parents()[0].node())) | |
| 70 | |
| 71 | |
| 72 @util.register_subcommand('outgoing') | |
| 73 def show_outgoing_to_svn(ui, repo, hg_repo_path, **opts): | |
| 74 """Commit the current revision and any required parents back to svn. | |
| 75 """ | |
| 76 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, | |
| 77 ui_=ui) | |
| 78 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), | |
| 79 hge.revmap.iterkeys())) | |
| 80 o_r = outgoing_revisions(ui, repo, hge, svn_commit_hashes) | |
| 81 if not (o_r and len(o_r)): | |
| 82 ui.status('No outgoing changes found.\n') | |
| 83 return 0 | |
| 84 displayer = cmdutil.show_changeset(ui, repo, opts, buffered=False) | |
| 85 for rev in reversed(o_r): | |
| 86 displayer.show(changenode=rev) | |
| 87 | |
| 88 | |
| 89 def outgoing_revisions(ui, repo, hg_editor, reverse_map): | |
| 90 """Given a repo and an hg_editor, determines outgoing revisions for the | |
| 91 current working copy state. | |
| 92 """ | |
| 93 outgoing_rev_hashes = [] | |
| 94 working_rev = repo.parents() | |
| 95 assert len(working_rev) == 1 | |
| 96 working_rev = working_rev[0] | |
| 97 if working_rev.node() in reverse_map: | |
| 98 return | |
| 99 while (not working_rev.node() in reverse_map | |
| 100 and working_rev.node() != node.nullid): | |
| 101 outgoing_rev_hashes.append(working_rev.node()) | |
| 102 working_rev = working_rev.parents() | |
| 103 assert len(working_rev) == 1 | |
| 104 working_rev = working_rev[0] | |
| 105 if working_rev.node() != node.nullid: | |
| 106 return outgoing_rev_hashes |
