Mercurial > hgsubversion
comparison svncommands.py @ 253:c3d5c4ae9c7c
Work with simple command table instead of decorators.
author | Dirkjan Ochtman <dirkjan@ochtman.nl> |
---|---|
date | Fri, 10 Apr 2009 23:09:59 +0200 |
parents | 1272e87546ed |
children | 246aaefb1cc0 |
comparison
equal
deleted
inserted
replaced
252:4d3bcd2f26ed | 253:c3d5c4ae9c7c |
---|---|
13 import svnwrap | 13 import svnwrap |
14 import stupid as stupidmod | 14 import stupid as stupidmod |
15 import cmdutil | 15 import cmdutil |
16 import util | 16 import util |
17 import utility_commands | 17 import utility_commands |
18 | |
19 from util import generate_help, svn_subcommands, register_subcommand | |
20 | 18 |
21 | 19 |
22 def pull(ui, svn_url, hg_repo_path, skipto_rev=0, stupid=None, | 20 def pull(ui, svn_url, hg_repo_path, skipto_rev=0, stupid=None, |
23 tag_locations='tags', authors=None, filemap=None, **opts): | 21 tag_locations='tags', authors=None, filemap=None, **opts): |
24 """pull new revisions from Subversion | 22 """pull new revisions from Subversion |
95 tries += 1 | 93 tries += 1 |
96 ui.status('Got a 502, retrying (%s)\n' % tries) | 94 ui.status('Got a 502, retrying (%s)\n' % tries) |
97 else: | 95 else: |
98 raise hgutil.Abort(*e.args) | 96 raise hgutil.Abort(*e.args) |
99 util.swap_out_encoding(old_encoding) | 97 util.swap_out_encoding(old_encoding) |
100 | |
101 pull = util.register_subcommand('pull')(pull) | |
102 | 98 |
103 | 99 |
104 def push(ui, repo, hg_repo_path, svn_url, stupid=False, **opts): | 100 def push(ui, repo, hg_repo_path, svn_url, stupid=False, **opts): |
105 """push revisions starting at a specified head back to Subversion. | 101 """push revisions starting at a specified head back to Subversion. |
106 """ | 102 """ |
164 for needs_transplant in heads: | 160 for needs_transplant in heads: |
165 def extrafn(ctx, extra): | 161 def extrafn(ctx, extra): |
166 if ctx.node() == oldest: | 162 if ctx.node() == oldest: |
167 return | 163 return |
168 extra['branch'] = ctx.branch() | 164 extra['branch'] = ctx.branch() |
169 utility_commands.rebase_commits(ui, repo, | 165 utility_commands.rebase(ui, repo, extrafn=extrafn, |
170 extrafn=extrafn, | 166 sourcerev=needs_transplant, **opts) |
171 sourcerev=needs_transplant, | |
172 **opts) | |
173 repo = hg.repository(ui, hge.path) | 167 repo = hg.repository(ui, hge.path) |
174 for child in repo[replacement.node()].children(): | 168 for child in repo[replacement.node()].children(): |
175 rebasesrc = node.bin(child.extra().get('rebase_source', node.hex(node.nullid))) | 169 rebasesrc = node.bin(child.extra().get('rebase_source', node.hex(node.nullid))) |
176 if rebasesrc in outgoing: | 170 if rebasesrc in outgoing: |
177 while rebasesrc in outgoing: | 171 while rebasesrc in outgoing: |
184 rebasesrc = node.bin(child.extra().get('rebase_source', node.hex(node.nullid))) | 178 rebasesrc = node.bin(child.extra().get('rebase_source', node.hex(node.nullid))) |
185 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, ui_=ui) | 179 hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, ui_=ui) |
186 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), hge.revmap.iterkeys())) | 180 svn_commit_hashes = dict(zip(hge.revmap.itervalues(), hge.revmap.iterkeys())) |
187 util.swap_out_encoding(old_encoding) | 181 util.swap_out_encoding(old_encoding) |
188 return 0 | 182 return 0 |
189 push = util.register_subcommand('push')(push) | |
190 # for git expats | |
191 dcommit = util.register_subcommand('dcommit')(push) | |
192 | 183 |
193 | 184 |
194 def diff(ui, repo, hg_repo_path, **opts): | 185 def diff(ui, repo, hg_repo_path, **opts): |
195 """show a diff of the most recent revision against its parent from svn | 186 """show a diff of the most recent revision against its parent from svn |
196 """ | 187 """ |
211 'ignore_blank_lines': False, | 202 'ignore_blank_lines': False, |
212 'unified': True, | 203 'unified': True, |
213 'text': False, | 204 'text': False, |
214 })) | 205 })) |
215 ui.write(cmdutil.filterdiff(''.join(it), base_rev)) | 206 ui.write(cmdutil.filterdiff(''.join(it), base_rev)) |
216 diff = util.register_subcommand('diff')(diff) | |
217 | 207 |
218 | 208 |
219 def rebuildmeta(ui, repo, hg_repo_path, args, **opts): | 209 def rebuildmeta(ui, repo, hg_repo_path, args, **opts): |
220 """rebuild hgsubversion metadata using values stored in revisions | 210 """rebuild hgsubversion metadata using values stored in revisions |
221 """ | 211 """ |
327 tagsinfo[tag] = source, rev | 317 tagsinfo[tag] = source, rev |
328 | 318 |
329 tagsinfofile = open(os.path.join(svnmetadir, 'tag_info'), 'w') | 319 tagsinfofile = open(os.path.join(svnmetadir, 'tag_info'), 'w') |
330 pickle.dump(tagsinfo, tagsinfofile) | 320 pickle.dump(tagsinfo, tagsinfofile) |
331 tagsinfofile.close() | 321 tagsinfofile.close() |
332 rebuildmeta = util.register_subcommand('rebuildmeta')(rebuildmeta) | |
333 rebuildmeta = util.command_needs_no_url(rebuildmeta) | |
334 | 322 |
335 | 323 |
336 def help(ui, args=None, **opts): | 324 def help(ui, args=None, **opts): |
337 """show help for a given subcommands or a help overview | 325 """show help for a given subcommands or a help overview |
338 """ | 326 """ |
339 if args: | 327 if args: |
340 subcommand = args[0] | 328 subcommand = args[0] |
341 if subcommand not in svn_subcommands: | 329 if subcommand not in table: |
342 candidates = [] | 330 candidates = [] |
343 for c in svn_subcommands: | 331 for c in table: |
344 if c.startswith(subcommand): | 332 if c.startswith(subcommand): |
345 candidates.append(c) | 333 candidates.append(c) |
346 if len(candidates) == 1: | 334 if len(candidates) == 1: |
347 subcommand = candidates[0] | 335 subcommand = candidates[0] |
348 elif len(candidates) > 1: | 336 elif len(candidates) > 1: |
349 ui.status('Ambiguous command. Could have been:\n%s\n' % | 337 ui.status('Ambiguous command. Could have been:\n%s\n' % |
350 ' '.join(candidates)) | 338 ' '.join(candidates)) |
351 return | 339 return |
352 doc = svn_subcommands[subcommand].__doc__ | 340 doc = table[subcommand].__doc__ |
353 if doc is None: | 341 if doc is None: |
354 doc = "No documentation available for %s." % subcommand | 342 doc = "No documentation available for %s." % subcommand |
355 ui.status(doc.strip(), '\n') | 343 ui.status(doc.strip(), '\n') |
356 return | 344 return |
357 ui.status(generate_help()) | 345 ui.status(_helpgen()) |
358 help = register_subcommand('help')(help) | |
359 | 346 |
360 | 347 |
361 def update(ui, args, repo, clean=False, **opts): | 348 def update(ui, args, repo, clean=False, **opts): |
362 """update to a specified Subversion revision number | 349 """update to a specified Subversion revision number |
363 """ | 350 """ |
378 else: | 365 else: |
379 ui.status('Ambiguous revision!\n') | 366 ui.status('Ambiguous revision!\n') |
380 ui.status('\n'.join(['%s on %s' % (node.hex(a[0]), a[1]) for a in | 367 ui.status('\n'.join(['%s on %s' % (node.hex(a[0]), a[1]) for a in |
381 answers]+[''])) | 368 answers]+[''])) |
382 return 1 | 369 return 1 |
383 update = register_subcommand('up')(update) | 370 |
371 | |
372 nourl = ['rebuildmeta'] + utility_commands.nourl | |
373 table = { | |
374 'pull': pull, | |
375 'push': push, | |
376 'dcommit': push, | |
377 'update': update, | |
378 'help': help, | |
379 'rebuildmeta': rebuildmeta, | |
380 'diff': diff, | |
381 } | |
382 | |
383 table.update(utility_commands.table) | |
384 | |
385 | |
386 def _helpgen(): | |
387 ret = ['hg svn ...', '', | |
388 'subcommands for Subversion integration', '', | |
389 'list of subcommands:', ''] | |
390 for name, func in sorted(table.items()): | |
391 short_description = (func.__doc__ or '').splitlines()[0] | |
392 ret.append(" %-10s %s" % (name, short_description)) | |
393 return '\n'.join(ret) + '\n' |