Browse Source

Support repository format version 1. Fixes #1056

Jelmer Vernooij 2 years ago
parent
commit
0f2b04e25a
3 changed files with 32 additions and 2 deletions
  1. 3 0
      NEWS
  2. 12 1
      dulwich/repo.py
  3. 17 1
      dulwich/tests/test_repository.py

+ 3 - 0
NEWS

@@ -1,5 +1,8 @@
 0.20.47	UNRELEASED
 
+ * Support repository format version 1.
+   (Jelmer Vernooij, #1056)
+
  * Support \r\n line endings with continuations when parsing
    configuration files.  (Jelmer Vernooij)
 

+ 12 - 1
dulwich/repo.py

@@ -1050,6 +1050,13 @@ class UnsupportedVersion(Exception):
         self.version = version
 
 
+class UnsupportedExtension(Exception):
+    """Unsupported repository extension."""
+
+    def __init__(self, extension):
+        self.extension = extension
+
+
 class Repo(BaseRepo):
     """A git repository backed by local disk.
 
@@ -1125,8 +1132,12 @@ class Repo(BaseRepo):
         except KeyError:
             format_version = 0
 
-        if format_version != 0:
+        if format_version not in (0, 1):
             raise UnsupportedVersion(format_version)
+
+        for extension in config.items((b"extensions", )):
+            raise UnsupportedExtension(extension)
+
         if object_store is None:
             object_store = DiskObjectStore.from_config(
                 os.path.join(self.commondir(), OBJECTDIR), config

+ 17 - 1
dulwich/tests/test_repository.py

@@ -44,6 +44,7 @@ from dulwich.repo import (
     MemoryRepo,
     check_user_identity,
     UnsupportedVersion,
+    UnsupportedExtension,
 )
 from dulwich.tests import (
     TestCase,
@@ -1081,13 +1082,28 @@ class BuildRepoRootTests(TestCase):
         r = Repo(self._repo_dir)
         self.assertEqual(r.object_store.loose_compression_level, 4)
 
-    def test_repositoryformatversion(self):
+    def test_repositoryformatversion_unsupported(self):
         r = self._repo
         c = r.get_config()
         c.set(("core",), "repositoryformatversion", "2")
         c.write_to_path()
         self.assertRaises(UnsupportedVersion, Repo, self._repo_dir)
 
+    def test_repositoryformatversion_1(self):
+        r = self._repo
+        c = r.get_config()
+        c.set(("core",), "repositoryformatversion", "1")
+        c.write_to_path()
+        Repo(self._repo_dir)
+
+    def test_repositoryformatversion_1_extension(self):
+        r = self._repo
+        c = r.get_config()
+        c.set(("core",), "repositoryformatversion", "1")
+        c.set(("extensions", ), "worktreeconfig", True)
+        c.write_to_path()
+        self.assertRaises(UnsupportedExtension, Repo, self._repo_dir)
+
     def test_commit_encoding_from_config(self):
         r = self._repo
         c = r.get_config()