diff hgext/convert/darcs.py @ 12393:84ceedcfeb6a stable

convert/darcs: improve unsupported format detection (issue2172)
author Patrick Mezard <pmezard@gmail.com>
date Fri, 24 Sep 2010 00:04:07 +0200
parents 4481f8a93c7a
children 89df79b3c011
line wrap: on
line diff
--- a/hgext/convert/darcs.py	Fri Sep 24 00:03:58 2010 +0200
+++ b/hgext/convert/darcs.py	Fri Sep 24 00:04:07 2010 +0200
@@ -8,7 +8,7 @@
 from common import NoRepo, checktool, commandline, commit, converter_source
 from mercurial.i18n import _
 from mercurial import util
-import os, shutil, tempfile
+import os, shutil, tempfile, re
 
 # The naming drift of ElementTree is fun!
 
@@ -31,11 +31,8 @@
         converter_source.__init__(self, ui, path, rev=rev)
         commandline.__init__(self, ui, 'darcs')
 
-        # check for _darcs, ElementTree, _darcs/inventory so that we can
-        # easily skip test-convert-darcs if ElementTree is not around
-        if not os.path.exists(os.path.join(path, '_darcs', 'inventories')):
-            raise NoRepo(_("%s does not look like a darcs repository") % path)
-
+        # check for _darcs, ElementTree so that we can easily skip
+        # test-convert-darcs if ElementTree is not around
         if not os.path.exists(os.path.join(path, '_darcs')):
             raise NoRepo(_("%s does not look like a darcs repository") % path)
 
@@ -55,6 +52,15 @@
         self.parents = {}
         self.tags = {}
 
+        # Check darcs repository format
+        format = self.format()
+        if format:
+            if format in ('darcs-1.0', 'hashed'):
+                raise NoRepo(_("%s repository format is unsupported, "
+                               "please upgrade") % format)
+        else:
+            self.ui.warn(_('failed to detect repository format!'))
+
     def before(self):
         self.tmppath = tempfile.mkdtemp(
             prefix='convert-' + os.path.basename(self.path) + '-')
@@ -91,6 +97,15 @@
         self.checkexit(fp.close())
         return etree.getroot()
 
+    def format(self):
+        output, status = self.run('show', 'repo', no_files=True,
+                                  repodir=self.path)
+        self.checkexit(status)
+        m = re.search(r'^\s*Format:\s*(.*)$', output, re.MULTILINE)
+        if not m:
+            return None
+        return ','.join(sorted(f.strip() for f in m.group(1).split(',')))
+
     def manifest(self):
         man = []
         output, status = self.run('show', 'files', no_directories=True,