test_objectspec.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. # test_objectspec.py -- tests for objectspec.py
  2. # Copyright (C) 2014 Jelmer Vernooij <jelmer@jelmer.uk>
  3. #
  4. # Dulwich is dual-licensed under the Apache License, Version 2.0 and the GNU
  5. # General Public License as public by the Free Software Foundation; version 2.0
  6. # or (at your option) any later version. You can redistribute it and/or
  7. # modify it under the terms of either of these two licenses.
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. #
  15. # You should have received a copy of the licenses; if not, see
  16. # <http://www.gnu.org/licenses/> for a copy of the GNU General Public License
  17. # and <http://www.apache.org/licenses/LICENSE-2.0> for a copy of the Apache
  18. # License, Version 2.0.
  19. #
  20. """Tests for revision spec parsing."""
  21. # TODO: Round-trip parse-serialize-parse and serialize-parse-serialize tests.
  22. from dulwich.objects import (
  23. Blob,
  24. )
  25. from dulwich.objectspec import (
  26. parse_object,
  27. parse_commit,
  28. parse_commit_range,
  29. parse_ref,
  30. parse_refs,
  31. parse_reftuple,
  32. parse_reftuples,
  33. parse_tree,
  34. )
  35. from dulwich.repo import MemoryRepo
  36. from dulwich.tests import (
  37. TestCase,
  38. )
  39. from dulwich.tests.utils import (
  40. build_commit_graph,
  41. )
  42. class ParseObjectTests(TestCase):
  43. """Test parse_object."""
  44. def test_nonexistent(self):
  45. r = MemoryRepo()
  46. self.assertRaises(KeyError, parse_object, r, "thisdoesnotexist")
  47. def test_blob_by_sha(self):
  48. r = MemoryRepo()
  49. b = Blob.from_string(b"Blah")
  50. r.object_store.add_object(b)
  51. self.assertEqual(b, parse_object(r, b.id))
  52. class ParseCommitRangeTests(TestCase):
  53. """Test parse_commit_range."""
  54. def test_nonexistent(self):
  55. r = MemoryRepo()
  56. self.assertRaises(KeyError, parse_commit_range, r, "thisdoesnotexist")
  57. def test_commit_by_sha(self):
  58. r = MemoryRepo()
  59. c1, c2, c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 1, 2]])
  60. self.assertEqual([c1], list(parse_commit_range(r, c1.id)))
  61. class ParseCommitTests(TestCase):
  62. """Test parse_commit."""
  63. def test_nonexistent(self):
  64. r = MemoryRepo()
  65. self.assertRaises(KeyError, parse_commit, r, "thisdoesnotexist")
  66. def test_commit_by_sha(self):
  67. r = MemoryRepo()
  68. [c1] = build_commit_graph(r.object_store, [[1]])
  69. self.assertEqual(c1, parse_commit(r, c1.id))
  70. def test_commit_by_short_sha(self):
  71. r = MemoryRepo()
  72. [c1] = build_commit_graph(r.object_store, [[1]])
  73. self.assertEqual(c1, parse_commit(r, c1.id[:10]))
  74. class ParseRefTests(TestCase):
  75. def test_nonexistent(self):
  76. r = {}
  77. self.assertRaises(KeyError, parse_ref, r, b"thisdoesnotexist")
  78. def test_ambiguous_ref(self):
  79. r = {
  80. b"ambig1": "bla",
  81. b"refs/ambig1": "bla",
  82. b"refs/tags/ambig1": "bla",
  83. b"refs/heads/ambig1": "bla",
  84. b"refs/remotes/ambig1": "bla",
  85. b"refs/remotes/ambig1/HEAD": "bla",
  86. }
  87. self.assertEqual(b"ambig1", parse_ref(r, b"ambig1"))
  88. def test_ambiguous_ref2(self):
  89. r = {
  90. b"refs/ambig2": "bla",
  91. b"refs/tags/ambig2": "bla",
  92. b"refs/heads/ambig2": "bla",
  93. b"refs/remotes/ambig2": "bla",
  94. b"refs/remotes/ambig2/HEAD": "bla",
  95. }
  96. self.assertEqual(b"refs/ambig2", parse_ref(r, b"ambig2"))
  97. def test_ambiguous_tag(self):
  98. r = {
  99. b"refs/tags/ambig3": "bla",
  100. b"refs/heads/ambig3": "bla",
  101. b"refs/remotes/ambig3": "bla",
  102. b"refs/remotes/ambig3/HEAD": "bla",
  103. }
  104. self.assertEqual(b"refs/tags/ambig3", parse_ref(r, b"ambig3"))
  105. def test_ambiguous_head(self):
  106. r = {
  107. b"refs/heads/ambig4": "bla",
  108. b"refs/remotes/ambig4": "bla",
  109. b"refs/remotes/ambig4/HEAD": "bla",
  110. }
  111. self.assertEqual(b"refs/heads/ambig4", parse_ref(r, b"ambig4"))
  112. def test_ambiguous_remote(self):
  113. r = {b"refs/remotes/ambig5": "bla", b"refs/remotes/ambig5/HEAD": "bla"}
  114. self.assertEqual(b"refs/remotes/ambig5", parse_ref(r, b"ambig5"))
  115. def test_ambiguous_remote_head(self):
  116. r = {b"refs/remotes/ambig6/HEAD": "bla"}
  117. self.assertEqual(b"refs/remotes/ambig6/HEAD", parse_ref(r, b"ambig6"))
  118. def test_heads_full(self):
  119. r = {b"refs/heads/foo": "bla"}
  120. self.assertEqual(b"refs/heads/foo", parse_ref(r, b"refs/heads/foo"))
  121. def test_heads_partial(self):
  122. r = {b"refs/heads/foo": "bla"}
  123. self.assertEqual(b"refs/heads/foo", parse_ref(r, b"heads/foo"))
  124. def test_tags_partial(self):
  125. r = {b"refs/tags/foo": "bla"}
  126. self.assertEqual(b"refs/tags/foo", parse_ref(r, b"tags/foo"))
  127. class ParseRefsTests(TestCase):
  128. def test_nonexistent(self):
  129. r = {}
  130. self.assertRaises(KeyError, parse_refs, r, [b"thisdoesnotexist"])
  131. def test_head(self):
  132. r = {b"refs/heads/foo": "bla"}
  133. self.assertEqual([b"refs/heads/foo"], parse_refs(r, [b"foo"]))
  134. def test_full(self):
  135. r = {b"refs/heads/foo": "bla"}
  136. self.assertEqual([b"refs/heads/foo"], parse_refs(r, b"refs/heads/foo"))
  137. class ParseReftupleTests(TestCase):
  138. def test_nonexistent(self):
  139. r = {}
  140. self.assertRaises(KeyError, parse_reftuple, r, r, b"thisdoesnotexist")
  141. def test_head(self):
  142. r = {b"refs/heads/foo": "bla"}
  143. self.assertEqual(
  144. (b"refs/heads/foo", b"refs/heads/foo", False),
  145. parse_reftuple(r, r, b"foo"),
  146. )
  147. self.assertEqual(
  148. (b"refs/heads/foo", b"refs/heads/foo", True),
  149. parse_reftuple(r, r, b"+foo"),
  150. )
  151. self.assertEqual(
  152. (b"refs/heads/foo", b"refs/heads/foo", True),
  153. parse_reftuple(r, {}, b"+foo"),
  154. )
  155. self.assertEqual(
  156. (b"refs/heads/foo", b"refs/heads/foo", True),
  157. parse_reftuple(r, {}, b"foo", True),
  158. )
  159. def test_full(self):
  160. r = {b"refs/heads/foo": "bla"}
  161. self.assertEqual(
  162. (b"refs/heads/foo", b"refs/heads/foo", False),
  163. parse_reftuple(r, r, b"refs/heads/foo"),
  164. )
  165. def test_no_left_ref(self):
  166. r = {b"refs/heads/foo": "bla"}
  167. self.assertEqual(
  168. (None, b"refs/heads/foo", False),
  169. parse_reftuple(r, r, b":refs/heads/foo"),
  170. )
  171. def test_no_right_ref(self):
  172. r = {b"refs/heads/foo": "bla"}
  173. self.assertEqual(
  174. (b"refs/heads/foo", None, False),
  175. parse_reftuple(r, r, b"refs/heads/foo:"),
  176. )
  177. def test_default_with_string(self):
  178. r = {b"refs/heads/foo": "bla"}
  179. self.assertEqual(
  180. (b"refs/heads/foo", b"refs/heads/foo", False),
  181. parse_reftuple(r, r, "foo"),
  182. )
  183. class ParseReftuplesTests(TestCase):
  184. def test_nonexistent(self):
  185. r = {}
  186. self.assertRaises(KeyError, parse_reftuples, r, r, [b"thisdoesnotexist"])
  187. def test_head(self):
  188. r = {b"refs/heads/foo": "bla"}
  189. self.assertEqual(
  190. [(b"refs/heads/foo", b"refs/heads/foo", False)],
  191. parse_reftuples(r, r, [b"foo"]),
  192. )
  193. def test_full(self):
  194. r = {b"refs/heads/foo": "bla"}
  195. self.assertEqual(
  196. [(b"refs/heads/foo", b"refs/heads/foo", False)],
  197. parse_reftuples(r, r, b"refs/heads/foo"),
  198. )
  199. r = {b"refs/heads/foo": "bla"}
  200. self.assertEqual(
  201. [(b"refs/heads/foo", b"refs/heads/foo", True)],
  202. parse_reftuples(r, r, b"refs/heads/foo", True),
  203. )
  204. class ParseTreeTests(TestCase):
  205. """Test parse_tree."""
  206. def test_nonexistent(self):
  207. r = MemoryRepo()
  208. self.assertRaises(KeyError, parse_tree, r, "thisdoesnotexist")
  209. def test_from_commit(self):
  210. r = MemoryRepo()
  211. c1, c2, c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 1, 2]])
  212. self.assertEqual(r[c1.tree], parse_tree(r, c1.id))
  213. self.assertEqual(r[c1.tree], parse_tree(r, c1.tree))
  214. def test_from_ref(self):
  215. r = MemoryRepo()
  216. c1, c2, c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 1, 2]])
  217. r.refs[b'refs/heads/foo'] = c1.id
  218. self.assertEqual(r[c1.tree], parse_tree(r, b'foo'))