Mercurial > hgsubversion
comparison __init__.py @ 304:ce676eff002b
First merge, totally untested.
author | Dan Villiom Podlaski Christiansen <danchr@gmail.com> |
---|---|
date | Fri, 01 May 2009 10:28:59 +0200 |
parents | 79440ed81011 ba8e91a7c077 |
children | b6c6d32c8ef1 33736e2e25f0 |
comparison
equal
deleted
inserted
replaced
303:f423a8780832 | 304:ce676eff002b |
---|---|
11 automated tests. See `README' in the hgsubversion directory for | 11 automated tests. See `README' in the hgsubversion directory for |
12 details. | 12 details. |
13 ''' | 13 ''' |
14 | 14 |
15 import os | 15 import os |
16 import sys | |
17 import traceback | |
16 | 18 |
17 from mercurial import commands | 19 from mercurial import commands |
18 from mercurial import hg | 20 from mercurial import extensions |
19 from mercurial import util as mutil | 21 from mercurial import util as hgutil |
20 | 22 |
21 from svn import core | 23 from svn import core |
22 | 24 |
23 import svncommand | 25 import svncommands |
24 import fetch_command | |
25 import tag_repo | 26 import tag_repo |
26 import util | 27 import util |
28 import wrappers | |
29 import svnexternals | |
27 | 30 |
28 def reposetup(ui, repo): | 31 def reposetup(ui, repo): |
29 if not util.is_svn_repo(repo): | 32 if not util.is_svn_repo(repo): |
30 return | 33 return |
31 | 34 |
32 repo.__class__ = tag_repo.generate_repo_class(ui, repo) | 35 repo.__class__ = tag_repo.generate_repo_class(ui, repo) |
33 | 36 |
37 def uisetup(ui): | |
38 """Do our UI setup. | |
39 | |
40 Does the following wrappings: | |
41 * parent -> utility_commands.parent | |
42 * outgoing -> utility_commands.outgoing | |
43 """ | |
44 entry = extensions.wrapcommand(commands.table, 'parents', | |
45 wrappers.parent) | |
46 entry[1].append(('', 'svn', None, "show parent svn revision instead")) | |
47 entry = extensions.wrapcommand(commands.table, 'outgoing', | |
48 wrappers.outgoing) | |
49 entry[1].append(('', 'svn', None, "show revisions outgoing to subversion")) | |
50 entry = extensions.wrapcommand(commands.table, 'diff', | |
51 wrappers.diff) | |
52 entry[1].append(('', 'svn', None, | |
53 "show svn-style diffs, default against svn parent")) | |
54 entry = extensions.wrapcommand(commands.table, 'push', | |
55 wrappers.push) | |
56 entry[1].append(('', 'svn', None, "push to subversion")) | |
57 entry[1].append(('', 'svn-stupid', None, "use stupid replay during push to svn")) | |
58 entry = extensions.wrapcommand(commands.table, 'pull', | |
59 wrappers.pull) | |
60 entry[1].append(('', 'svn', None, "pull from subversion")) | |
61 entry[1].append(('', 'svn-stupid', None, "use stupid replay during pull from svn")) | |
62 | |
63 entry = extensions.wrapcommand(commands.table, 'clone', | |
64 wrappers.clone) | |
65 entry[1].extend([#('', 'skipto-rev', '0', 'skip commits before this revision.'), | |
66 ('', 'svn-stupid', False, 'be stupid and use diffy replay.'), | |
67 ('', 'svn-tag-locations', 'tags', 'Relative path to Subversion tags.'), | |
68 ('', 'svn-authors', '', 'username mapping filename'), | |
69 ('', 'svn-filemap', '', | |
70 'remap file to exclude paths or include only certain paths'), | |
71 ]) | |
72 | |
73 try: | |
74 rebase = extensions.find('rebase') | |
75 if rebase: | |
76 entry = extensions.wrapcommand(rebase.cmdtable, 'rebase', wrappers.rebase) | |
77 entry[1].append(('', 'svn', None, 'automatic svn rebase', )) | |
78 except: | |
79 pass | |
80 | |
34 | 81 |
35 def svn(ui, repo, subcommand, *args, **opts): | 82 def svn(ui, repo, subcommand, *args, **opts): |
36 '''see detailed help for list of subcommands''' | 83 '''see detailed help for list of subcommands''' |
84 | |
85 # guess command if prefix | |
86 if subcommand not in svncommands.table: | |
87 candidates = [] | |
88 for c in svncommands.table: | |
89 if c.startswith(subcommand): | |
90 candidates.append(c) | |
91 if len(candidates) == 1: | |
92 subcommand = candidates[0] | |
93 | |
94 path = os.path.dirname(repo.path) | |
37 try: | 95 try: |
38 return svncommand.svncmd(ui, repo, subcommand, *args, **opts) | 96 commandfunc = svncommands.table[subcommand] |
97 if subcommand not in svncommands.nourl: | |
98 opts['svn_url'] = open(os.path.join(repo.path, 'svn', 'url')).read() | |
99 return commandfunc(ui, args=args, hg_repo_path=path, repo=repo, **opts) | |
39 except core.SubversionException, e: | 100 except core.SubversionException, e: |
40 if e.apr_err == core.SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED: | 101 if e.apr_err == core.SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED: |
41 raise mutil.Abort('It appears svn does not trust the ssl cert for this site.\n' | 102 raise hgutil.Abort('It appears svn does not trust the ssl cert for this site.\n' |
42 'Please try running svn ls on that url first.') | 103 'Please try running svn ls on that url first.') |
43 raise | 104 raise |
105 except TypeError: | |
106 tb = traceback.extract_tb(sys.exc_info()[2]) | |
107 if len(tb) == 1: | |
108 ui.status('Bad arguments for subcommand %s\n' % subcommand) | |
109 else: | |
110 raise | |
111 except KeyError, e: | |
112 tb = traceback.extract_tb(sys.exc_info()[2]) | |
113 if len(tb) == 1: | |
114 ui.status('Unknown subcommand %s\n' % subcommand) | |
115 else: | |
116 raise | |
44 | 117 |
45 | 118 |
46 def svn_fetch(ui, svn_url, hg_repo_path=None, **opts): | |
47 '''clone Subversion repository to a local Mercurial repository. | |
48 | 119 |
49 If no destination directory name is specified, it defaults to the | |
50 basename of the source plus "-hg". | |
51 | |
52 You can specify multiple paths for the location of tags using comma | |
53 separated values. | |
54 ''' | |
55 if not hg_repo_path: | |
56 hg_repo_path = hg.defaultdest(svn_url) + "-hg" | |
57 ui.status("Assuming destination %s\n" % hg_repo_path) | |
58 should_update = not os.path.exists(hg_repo_path) | |
59 svn_url = util.normalize_url(svn_url) | |
60 try: | |
61 res = fetch_command.fetch_revisions(ui, svn_url, hg_repo_path, **opts) | |
62 except core.SubversionException, e: | |
63 if e.apr_err == core.SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED: | |
64 raise mutil.Abort('It appears svn does not trust the ssl cert for this site.\n' | |
65 'Please try running svn ls on that url first.') | |
66 raise | |
67 if (res is None or res == 0) and should_update: | |
68 repo = hg.repository(ui, hg_repo_path) | |
69 commands.update(ui, repo, repo['tip'].node()) | |
70 return res | |
71 | |
72 commands.norepo += " svnclone" | |
73 cmdtable = { | 120 cmdtable = { |
74 "svn": | 121 "svn": |
75 (svn, | 122 (svn, |
76 [('u', 'svn-url', '', 'path to the Subversion server.'), | 123 [('u', 'svn-url', '', 'path to the Subversion server.'), |
77 ('', 'stupid', False, 'be stupid and use diffy replay.'), | 124 ('', 'stupid', False, 'be stupid and use diffy replay.'), |
78 ('A', 'authors', '', 'username mapping filename'), | 125 ('A', 'authors', '', 'username mapping filename'), |
79 ('', 'filemap', '', | 126 ('', 'filemap', '', |
80 'remap file to exclude paths or include only certain paths'), | 127 'remap file to exclude paths or include only certain paths'), |
81 ('', 'force', False, 'force an operation to happen'), | 128 ('', 'force', False, 'force an operation to happen'), |
129 ('', 'username', '', 'username for authentication'), | |
130 ('', 'password', '', 'password for authentication'), | |
82 ], | 131 ], |
83 svncommand.generate_help(), | 132 svncommands._helpgen(), |
84 ), | 133 ), |
85 "svnclone": | |
86 (svn_fetch, | |
87 [('S', 'skipto-rev', 0, 'skip commits before this revision.'), | |
88 ('H', 'head', 0, 'skip revisions after this one.'), | |
89 ('', 'stupid', False, 'be stupid and use diffy replay.'), | |
90 ('T', 'tag-locations', 'tags', 'Relative path to Subversion tags.'), | |
91 ('A', 'authors', '', 'username mapping filename'), | |
92 ('', 'filemap', '', | |
93 'remap file to exclude paths or include only certain paths'), | |
94 ], | |
95 'hg svnclone source [dest]'), | |
96 } | 134 } |