comparison hgext/convert/__init__.py @ 4756:8e9d3faec270

convert: split converter into convertsource and convertsink
author Brendan Cully <brendan@kublai.com>
date Sun, 01 Jul 2007 19:58:19 -0700
parents 7c8cd400e86a
children b6a1f2c46c6c
comparison
equal deleted inserted replaced
4755:47091c8d028e 4756:8e9d3faec270
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> 3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 # 4 #
5 # This software may be used and distributed according to the terms 5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference. 6 # of the GNU General Public License, incorporated herein by reference.
7 7
8 from common import NoRepo 8 from common import NoRepo, converter_source, converter_sink
9 from cvs import convert_cvs 9 from cvs import convert_cvs
10 from git import convert_git 10 from git import convert_git
11 from hg import convert_mercurial 11 from hg import convert_mercurial
12 12
13 import os, shutil 13 import os, shutil
15 15
16 commands.norepo += " convert" 16 commands.norepo += " convert"
17 17
18 converters = [convert_cvs, convert_git, convert_mercurial] 18 converters = [convert_cvs, convert_git, convert_mercurial]
19 19
20 def converter(ui, path, rev=None): 20 def convertsource(ui, path, rev=None):
21 for c in converters:
22 try:
23 converter = c(ui, path, rev=rev)
24 if not isinstance(converter, converter_source):
25 raise util.Abort('%s: cannot read from this repository type' % path)
26 return converter
27 except NoRepo:
28 pass
29 raise util.Abort('%s: unknown repository type' % path)
30
31 def convertsink(ui, path):
21 if not os.path.isdir(path): 32 if not os.path.isdir(path):
22 raise util.Abort("%s: not a directory" % path) 33 raise util.Abort("%s: not a directory" % path)
23 for c in converters: 34 for c in converters:
24 try: 35 try:
25 if rev: 36 converter = c(ui, path)
26 return c(ui, path, rev=rev) 37 if not isinstance(converter, converter_sink):
27 else: 38 raise util.Abort('%s: cannot write to this repository type' % path)
28 return c(ui, path) 39 return converter
29 except NoRepo: 40 except NoRepo:
30 pass 41 pass
31 raise util.Abort("%s: unknown repository type" % path) 42 raise util.Abort('%s: unknown repository type' % path)
32 43
33 class convert(object): 44 class convert(object):
34 def __init__(self, ui, source, dest, mapfile, opts): 45 def __init__(self, ui, source, dest, mapfile, opts):
35 46
36 self.source = source 47 self.source = source
300 else: 311 else:
301 ui.status("initializing destination %s repository\n" % dest) 312 ui.status("initializing destination %s repository\n" % dest)
302 hg.repository(ui, dest, create=True) 313 hg.repository(ui, dest, create=True)
303 created = True 314 created = True
304 315
305 destc = converter(ui, dest) 316 destc = convertsink(ui, dest)
306 if not hasattr(destc, "putcommit"):
307 raise util.Abort("%s: can't write to this repo type" % src)
308 317
309 try: 318 try:
310 srcc = converter(ui, src, rev=opts.get('rev')) 319 srcc = convertsource(ui, src, rev=opts.get('rev'))
311 if not hasattr(srcc, "getcommit"):
312 raise util.Abort("%s: can't read from this repo type" % src)
313 except Exception: 320 except Exception:
314 if created: 321 if created:
315 shutil.rmtree(dest, True) 322 shutil.rmtree(dest, True)
316 raise 323 raise
317 324