Pārlūkot izejas kodu

Merge pull request #1044 from jelmer/follow-ref-fix

Catch SymrefLoop in set_if_equals
Jelmer Vernooij 2 gadi atpakaļ
vecāks
revīzija
9bb43127a2
3 mainītis faili ar 12 papildinājumiem un 1 dzēšanām
  1. 3 0
      NEWS
  2. 1 1
      dulwich/refs.py
  3. 8 0
      dulwich/tests/test_refs.py

+ 3 - 0
NEWS

@@ -1,5 +1,8 @@
 0.20.47	UNRELEASED
 
+ * Fix handling of SymrefLoop in RefsContainer.__setitem__.
+   (Dominic Davis-Foster, Jelmer Vernooij)
+
 0.20.46	2022-09-06
 
  * Apply insteadOf to rsync-style location strings

+ 1 - 1
dulwich/refs.py

@@ -835,7 +835,7 @@ class DiskRefsContainer(RefsContainer):
         try:
             realnames, _ = self.follow(name)
             realname = realnames[-1]
-        except (KeyError, IndexError):
+        except (KeyError, IndexError, SymrefLoop):
             realname = name
         filename = self.refpath(realname)
 

+ 8 - 0
dulwich/tests/test_refs.py

@@ -521,6 +521,14 @@ class DiskRefsContainerTests(RefsContainerTests, TestCase):
         )
         self.assertRaises(SymrefLoop, self._refs.follow, b"refs/heads/loop")
 
+    def test_set_overwrite_loop(self):
+        self.assertRaises(SymrefLoop, self._refs.follow, b"refs/heads/loop")
+        self._refs[b'refs/heads/loop'] = (
+            b"42d06bd4b77fed026b154d16493e5deab78f02ec")
+        self.assertEqual(
+            ([b'refs/heads/loop'], b'42d06bd4b77fed026b154d16493e5deab78f02ec'),
+            self._refs.follow(b"refs/heads/loop"))
+
     def test_delitem(self):
         RefsContainerTests.test_delitem(self)
         ref_file = os.path.join(self._refs.path, b"refs", b"heads", b"master")