Mercurial > hgsubversion
comparison utility_commands.py @ 199:91db8fc049b0
Add a genignore utility command that generates an hgignore file by scraping svn:ignore properties.
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Tue, 24 Feb 2009 14:30:21 -0600 |
parents | 77812f98e250 |
children | a421aca2b0f5 |
comparison
equal
deleted
inserted
replaced
198:df4611050286 | 199:91db8fc049b0 |
---|---|
1 import os | |
2 | |
1 import mercurial | 3 import mercurial |
2 from mercurial import cmdutil | 4 from mercurial import cmdutil |
3 from mercurial import node | 5 from mercurial import node |
4 from mercurial import util as mutil | 6 from mercurial import util as mutil |
5 from hgext import rebase | 7 from hgext import rebase |
15 ui_=ui) | 17 ui_=ui) |
16 ui.status(hge.url, '\n') | 18 ui.status(hge.url, '\n') |
17 print_wc_url = util.register_subcommand('url')(print_wc_url) | 19 print_wc_url = util.register_subcommand('url')(print_wc_url) |
18 | 20 |
19 | 21 |
20 def run_svn_info(ui, repo, hg_repo_path, **opts): | 22 def find_wc_parent_rev(ui, repo, hge, svn_commit_hashes): |
21 """show Subversion details similar to `svn info' | 23 """Find the svn parent revision of the repo's dirstate. |
22 """ | 24 """ |
23 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, | |
24 ui_=ui) | |
25 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), | |
26 hge.revmap.iterkeys())) | |
27 workingctx = repo.parents()[0] | 25 workingctx = repo.parents()[0] |
28 o_r = util.outgoing_revisions(ui, repo, hge, svn_commit_hashes, workingctx.node()) | 26 o_r = util.outgoing_revisions(ui, repo, hge, svn_commit_hashes, workingctx.node()) |
29 if o_r: | 27 if o_r: |
30 workingctx = repo[o_r[-1]].parents()[0] | 28 workingctx = repo[o_r[-1]].parents()[0] |
31 r, br = svn_commit_hashes[workingctx.node()] | 29 return workingctx |
30 | |
31 | |
32 def generate_ignore(ui, repo, hg_repo_path, force=False, **opts): | |
33 """generate .hgignore from svn:ignore properties. | |
34 """ | |
35 ignpath = os.path.join(hg_repo_path, '.hgignore') | |
36 if not force and os.path.exists(ignpath): | |
37 raise mutil.Abort('not overwriting existing .hgignore, try --force?') | |
38 ignorefile = open(ignpath, 'w') | |
39 ignorefile.write('.hgignore\nsyntax:glob\n') | |
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 parent = find_wc_parent_rev(ui, repo, hge, svn_commit_hashes) | |
45 r, br = svn_commit_hashes[parent.node()] | |
46 if br == None: | |
47 branchpath = 'trunk' | |
48 else: | |
49 branchpath = 'branches/%s' % br | |
50 url = hge.url | |
51 if url[-1] == '/': | |
52 url = url[:-1] | |
53 svn = svnwrap.SubversionRepo(url) | |
54 dirs = [''] + [d[0] for d in svn.list_files(branchpath, r) if d[1] == 'd'] | |
55 for dir in dirs: | |
56 props = svn.list_props('%s/%s/' % (branchpath,dir), r) | |
57 if 'svn:ignore' in props: | |
58 lines = props['svn:ignore'].strip().split('\n') | |
59 for prop in lines: | |
60 if dir: | |
61 ignorefile.write('%s/%s\n' % (dir, prop)) | |
62 else: | |
63 ignorefile.write('%s\n' % prop) | |
64 generate_ignore = util.register_subcommand('genignore')(generate_ignore) | |
65 | |
66 | |
67 def run_svn_info(ui, repo, hg_repo_path, **opts): | |
68 """show Subversion details similar to `svn info' | |
69 """ | |
70 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, | |
71 ui_=ui) | |
72 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), | |
73 hge.revmap.iterkeys())) | |
74 parent = find_wc_parent_rev(ui, repo, hge, svn_commit_hashes) | |
75 r, br = svn_commit_hashes[parent.node()] | |
32 if br == None: | 76 if br == None: |
33 branchpath = '/trunk' | 77 branchpath = '/trunk' |
34 else: | 78 else: |
35 branchpath = '/branches/%s' % br | 79 branchpath = '/branches/%s' % br |
36 url = hge.url | 80 url = hge.url |
37 if url[-1] == '/': | 81 if url[-1] == '/': |
38 url = url[:-1] | 82 url = url[:-1] |
39 url = '%s%s' % (url, branchpath) | 83 url = '%s%s' % (url, branchpath) |
40 author = '@'.join(workingctx.user().split('@')[:-1]) | 84 author = '@'.join(parent.user().split('@')[:-1]) |
41 # cleverly figure out repo root w/o actually contacting the server | 85 # cleverly figure out repo root w/o actually contacting the server |
42 subdir = workingctx.extra()['convert_revision'][40:].split('@')[0] | 86 subdir = parent.extra()['convert_revision'][40:].split('@')[0] |
43 reporoot = url[:len(url)-len(subdir)] | 87 reporoot = url[:len(url)-len(subdir)] |
44 ui.status('''URL: %(url)s | 88 ui.status('''URL: %(url)s |
45 Repository Root: %(reporoot)s | 89 Repository Root: %(reporoot)s |
46 Repository UUID: %(uuid)s | 90 Repository UUID: %(uuid)s |
47 Revision: %(revision)s | 91 Revision: %(revision)s |
53 'uuid': open(hge.uuid_file).read(), | 97 'uuid': open(hge.uuid_file).read(), |
54 'url': url, | 98 'url': url, |
55 'author': author, | 99 'author': author, |
56 'revision': r, | 100 'revision': r, |
57 # TODO I'd like to format this to the user's local TZ if possible | 101 # TODO I'd like to format this to the user's local TZ if possible |
58 'date': mutil.datestr(workingctx.date(), | 102 'date': mutil.datestr(parent.date(), |
59 '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)') | 103 '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)') |
60 }) | 104 }) |
61 run_svn_info = util.register_subcommand('info')(run_svn_info) | 105 run_svn_info = util.register_subcommand('info')(run_svn_info) |
62 | 106 |
63 | 107 |
66 """ | 110 """ |
67 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, | 111 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, |
68 ui_=ui) | 112 ui_=ui) |
69 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), | 113 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), |
70 hge.revmap.iterkeys())) | 114 hge.revmap.iterkeys())) |
71 ha = repo.parents()[0] | 115 ha = find_wc_parent_rev(ui, repo, hge, svn_commit_hashes) |
72 o_r = util.outgoing_revisions(ui, repo, hge, svn_commit_hashes, ha.node()) | |
73 if o_r: | |
74 ha = repo[o_r[-1]].parents()[0] | |
75 if ha.node() != node.nullid: | 116 if ha.node() != node.nullid: |
76 r, br = svn_commit_hashes[ha.node()] | 117 r, br = svn_commit_hashes[ha.node()] |
77 ui.status('Working copy parent revision is %s: r%s on %s\n' % | 118 ui.status('Working copy parent revision is %s: r%s on %s\n' % |
78 (ha, r, br or 'trunk')) | 119 (ha, r, br or 'trunk')) |
79 else: | 120 else: |