test_objectspec.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. # test_objectspec.py -- tests for objectspec.py
  2. # Copyright (C) 2014 Jelmer Vernooij <jelmer@samba.org>
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; version 2
  7. # of the License or (at your option) any later version of
  8. # the License.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18. # MA 02110-1301, USA.
  19. """Tests for revision spec parsing."""
  20. # TODO: Round-trip parse-serialize-parse and serialize-parse-serialize tests.
  21. from dulwich.objects import (
  22. Blob,
  23. )
  24. from dulwich.objectspec import (
  25. parse_object,
  26. parse_commit_range,
  27. parse_ref,
  28. parse_refs,
  29. parse_reftuple,
  30. parse_reftuples,
  31. )
  32. from dulwich.repo import MemoryRepo
  33. from dulwich.tests import (
  34. TestCase,
  35. )
  36. from dulwich.tests.utils import (
  37. build_commit_graph,
  38. )
  39. class ParseObjectTests(TestCase):
  40. """Test parse_object."""
  41. def test_nonexistent(self):
  42. r = MemoryRepo()
  43. self.assertRaises(KeyError, parse_object, r, "thisdoesnotexist")
  44. def test_blob_by_sha(self):
  45. r = MemoryRepo()
  46. b = Blob.from_string(b"Blah")
  47. r.object_store.add_object(b)
  48. self.assertEqual(b, parse_object(r, b.id))
  49. class ParseCommitRangeTests(TestCase):
  50. """Test parse_commit_range."""
  51. def test_nonexistent(self):
  52. r = MemoryRepo()
  53. self.assertRaises(KeyError, parse_commit_range, r, "thisdoesnotexist")
  54. def test_commit_by_sha(self):
  55. r = MemoryRepo()
  56. c1, c2, c3 = build_commit_graph(r.object_store, [[1], [2, 1],
  57. [3, 1, 2]])
  58. self.assertEqual([c1], list(parse_commit_range(r, c1.id)))
  59. class ParseRefTests(TestCase):
  60. def test_nonexistent(self):
  61. r = {}
  62. self.assertRaises(KeyError, parse_ref, r, b"thisdoesnotexist")
  63. def test_ambiguous_ref(self):
  64. r = {b"ambig1": 'bla',
  65. b"refs/ambig1": 'bla',
  66. b"refs/tags/ambig1": 'bla',
  67. b"refs/heads/ambig1": 'bla',
  68. b"refs/remotes/ambig1": 'bla',
  69. b"refs/remotes/ambig1/HEAD": "bla"}
  70. self.assertEqual(b"ambig1", parse_ref(r, b"ambig1"))
  71. def test_ambiguous_ref2(self):
  72. r = {b"refs/ambig2": 'bla',
  73. b"refs/tags/ambig2": 'bla',
  74. b"refs/heads/ambig2": 'bla',
  75. b"refs/remotes/ambig2": 'bla',
  76. b"refs/remotes/ambig2/HEAD": "bla"}
  77. self.assertEqual(b"refs/ambig2", parse_ref(r, b"ambig2"))
  78. def test_ambiguous_tag(self):
  79. r = {b"refs/tags/ambig3": 'bla',
  80. b"refs/heads/ambig3": 'bla',
  81. b"refs/remotes/ambig3": 'bla',
  82. b"refs/remotes/ambig3/HEAD": "bla"}
  83. self.assertEqual(b"refs/tags/ambig3", parse_ref(r, b"ambig3"))
  84. def test_ambiguous_head(self):
  85. r = {b"refs/heads/ambig4": 'bla',
  86. b"refs/remotes/ambig4": 'bla',
  87. b"refs/remotes/ambig4/HEAD": "bla"}
  88. self.assertEqual(b"refs/heads/ambig4", parse_ref(r, b"ambig4"))
  89. def test_ambiguous_remote(self):
  90. r = {b"refs/remotes/ambig5": 'bla',
  91. b"refs/remotes/ambig5/HEAD": "bla"}
  92. self.assertEqual(b"refs/remotes/ambig5", parse_ref(r, b"ambig5"))
  93. def test_ambiguous_remote_head(self):
  94. r = {b"refs/remotes/ambig6/HEAD": "bla"}
  95. self.assertEqual(b"refs/remotes/ambig6/HEAD", parse_ref(r, b"ambig6"))
  96. def test_heads_full(self):
  97. r = {b"refs/heads/foo": "bla"}
  98. self.assertEqual(b"refs/heads/foo", parse_ref(r, b"refs/heads/foo"))
  99. def test_heads_partial(self):
  100. r = {b"refs/heads/foo": "bla"}
  101. self.assertEqual(b"refs/heads/foo", parse_ref(r, b"heads/foo"))
  102. def test_tags_partial(self):
  103. r = {b"refs/tags/foo": "bla"}
  104. self.assertEqual(b"refs/tags/foo", parse_ref(r, b"tags/foo"))
  105. class ParseRefsTests(TestCase):
  106. def test_nonexistent(self):
  107. r = {}
  108. self.assertRaises(KeyError, parse_refs, r, [b"thisdoesnotexist"])
  109. def test_head(self):
  110. r = {b"refs/heads/foo": "bla"}
  111. self.assertEqual([b"refs/heads/foo"], parse_refs(r, [b"foo"]))
  112. def test_full(self):
  113. r = {b"refs/heads/foo": "bla"}
  114. self.assertEqual([b"refs/heads/foo"], parse_refs(r, b"refs/heads/foo"))
  115. class ParseReftupleTests(TestCase):
  116. def test_nonexistent(self):
  117. r = {}
  118. self.assertRaises(KeyError, parse_reftuple, r, r, b"thisdoesnotexist")
  119. def test_head(self):
  120. r = {b"refs/heads/foo": "bla"}
  121. self.assertEqual((b"refs/heads/foo", b"refs/heads/foo", False),
  122. parse_reftuple(r, r, b"foo"))
  123. self.assertEqual((b"refs/heads/foo", b"refs/heads/foo", True),
  124. parse_reftuple(r, r, b"+foo"))
  125. self.assertEqual((b"refs/heads/foo", b"refs/heads/foo", True),
  126. parse_reftuple(r, {}, b"+foo"))
  127. def test_full(self):
  128. r = {b"refs/heads/foo": "bla"}
  129. self.assertEqual((b"refs/heads/foo", b"refs/heads/foo", False),
  130. parse_reftuple(r, r, b"refs/heads/foo"))
  131. def test_no_left_ref(self):
  132. r = {b"refs/heads/foo": "bla"}
  133. self.assertEqual((None, b"refs/heads/foo", False),
  134. parse_reftuple(r, r, b":refs/heads/foo"))
  135. def test_no_right_ref(self):
  136. r = {b"refs/heads/foo": "bla"}
  137. self.assertEqual((b"refs/heads/foo", None, False),
  138. parse_reftuple(r, r, b"refs/heads/foo:"))
  139. class ParseReftuplesTests(TestCase):
  140. def test_nonexistent(self):
  141. r = {}
  142. self.assertRaises(KeyError, parse_reftuples, r, r,
  143. [b"thisdoesnotexist"])
  144. def test_head(self):
  145. r = {b"refs/heads/foo": "bla"}
  146. self.assertEqual([(b"refs/heads/foo", b"refs/heads/foo", False)],
  147. parse_reftuples(r, r, [b"foo"]))
  148. def test_full(self):
  149. r = {b"refs/heads/foo": "bla"}
  150. self.assertEqual([(b"refs/heads/foo", b"refs/heads/foo", False)],
  151. parse_reftuples(r, r, b"refs/heads/foo"))