##// END OF EJS Templates
svn: fixed svn detection test
super-admin -
r5184:5a715fbe default
parent child Browse files
Show More
@@ -1,648 +1,648 b''
1 1 # Copyright (C) 2010-2023 RhodeCode GmbH
2 2 #
3 3 # This program is free software: you can redistribute it and/or modify
4 4 # it under the terms of the GNU Affero General Public License, version 3
5 5 # (only), as published by the Free Software Foundation.
6 6 #
7 7 # This program is distributed in the hope that it will be useful,
8 8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 10 # GNU General Public License for more details.
11 11 #
12 12 # You should have received a copy of the GNU Affero General Public License
13 13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 14 #
15 15 # This program is dual-licensed. If you wish to learn more about the
16 16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18 18
19 19 import datetime
20 20 from urllib.error import URLError
21 21
22 22 import mock
23 23 import pytest
24 24
25 25 from rhodecode.lib.vcs import backends
26 26 from rhodecode.lib.vcs.backends.base import (
27 27 Config,
28 28 BaseInMemoryCommit,
29 29 Reference,
30 30 MergeResponse,
31 31 MergeFailureReason,
32 32 )
33 33 from rhodecode.lib.vcs.exceptions import VCSError, RepositoryError
34 34 from rhodecode.lib.vcs.nodes import FileNode
35 35 from rhodecode.tests.vcs.conftest import BackendTestMixin
36 36 from rhodecode.tests import repo_id_generator
37 37
38 38
39 39 @pytest.mark.usefixtures("vcs_repository_support")
40 40 class TestRepositoryBase(BackendTestMixin):
41 41 recreate_repo_per_test = False
42 42
43 43 def test_init_accepts_unicode_path(self, tmpdir):
44 44 path = str(tmpdir.join("unicode Γ€"))
45 45 self.Backend(path, create=True)
46 46
47 47 def test_init_accepts_str_path(self, tmpdir):
48 48 path = str(tmpdir.join("str Γ€"))
49 49 self.Backend(path, create=True)
50 50
51 51 def test_init_fails_if_path_does_not_exist(self, tmpdir):
52 52 path = str(tmpdir.join("i-do-not-exist"))
53 53 with pytest.raises(VCSError):
54 54 self.Backend(path)
55 55
56 56 def test_init_fails_if_path_is_not_a_valid_repository(self, tmpdir):
57 57 path = str(tmpdir.mkdir("unicode Γ€"))
58 58 with pytest.raises(VCSError):
59 59 self.Backend(path)
60 60
61 61 def test_has_commits_attribute(self):
62 62 assert self.repo.commit_ids
63 63
64 64 def test_name(self):
65 65 assert self.repo.name.startswith("vcs-test")
66 66
67 67 @pytest.mark.backends("hg", "git")
68 68 def test_has_default_branch_name(self):
69 69 assert self.repo.DEFAULT_BRANCH_NAME is not None
70 70
71 71 @pytest.mark.backends("svn")
72 72 def test_has_no_default_branch_name(self):
73 73 assert self.repo.DEFAULT_BRANCH_NAME is None
74 74
75 75 def test_has_empty_commit(self):
76 76 assert self.repo.EMPTY_COMMIT_ID is not None
77 77 assert self.repo.EMPTY_COMMIT is not None
78 78
79 79 def test_empty_changeset_is_deprecated(self):
80 80 def get_empty_changeset(repo):
81 81 return repo.EMPTY_CHANGESET
82 82
83 83 pytest.deprecated_call(get_empty_changeset, self.repo)
84 84
85 85 def test_bookmarks(self):
86 86 assert len(self.repo.bookmarks) == 0
87 87
88 88 def test_check_url_on_path(self):
89 89 config = Config()
90 90 assert self.Backend.check_url(self.repo.path, config)
91 91
92 92 def test_check_url_on_remote_url(self):
93 93 config = Config()
94 94 url = {
95 95 "hg": "https://code.rhodecode.com/rhodecode-vcsserver",
96 "svn": "https://code.rhodecode.com/svn-doc",
96 "svn": "https://default:default@code.rhodecode.com/svn-doc",
97 97 "git": "https://code.rhodecode.com/appenlight",
98 98 }[self.repo.alias]
99 99
100 100 assert self.Backend.check_url(url, config)
101 101
102 102 def test_check_url_invalid(self):
103 103 config = Config()
104 104 with pytest.raises(URLError):
105 105 self.Backend.check_url(self.repo.path + "invalid", config)
106 106
107 107 def test_get_contact(self):
108 108 assert self.repo.contact
109 109
110 110 def test_get_description(self):
111 111 assert self.repo.description
112 112
113 113 def test_get_hook_location(self):
114 114 assert len(self.repo.get_hook_location()) != 0
115 115
116 116 def test_last_change(self, local_dt_to_utc):
117 117 assert self.repo.last_change >= local_dt_to_utc(
118 118 datetime.datetime(2010, 1, 1, 21, 0)
119 119 )
120 120
121 121 def test_last_change_in_empty_repository(self, vcsbackend, local_dt_to_utc):
122 122 delta = datetime.timedelta(seconds=1)
123 123
124 124 start = local_dt_to_utc(datetime.datetime.now())
125 125 empty_repo = vcsbackend.create_repo()
126 126 now = local_dt_to_utc(datetime.datetime.now())
127 127 assert empty_repo.last_change >= start - delta
128 128 assert empty_repo.last_change <= now + delta
129 129
130 130 def test_repo_equality(self):
131 131 assert self.repo == self.repo
132 132
133 133 def test_repo_equality_broken_object(self):
134 134 import copy
135 135
136 136 _repo = copy.copy(self.repo)
137 137 delattr(_repo, "path")
138 138 assert self.repo != _repo
139 139
140 140 def test_repo_equality_other_object(self):
141 141 class dummy(object):
142 142 path = self.repo.path
143 143
144 144 assert self.repo != dummy()
145 145
146 146 def test_get_commit_is_implemented(self):
147 147 self.repo.get_commit()
148 148
149 149 def test_get_commits_is_implemented(self):
150 150 commit_iter = iter(self.repo.get_commits())
151 151 commit = next(commit_iter)
152 152 assert commit.idx == 0
153 153
154 154 def test_supports_iteration(self):
155 155 repo_iter = iter(self.repo)
156 156 commit = next(repo_iter)
157 157 assert commit.idx == 0
158 158
159 159 def test_in_memory_commit(self):
160 160 imc = self.repo.in_memory_commit
161 161 assert isinstance(imc, BaseInMemoryCommit)
162 162
163 163 @pytest.mark.backends("hg")
164 164 def test__get_url_unicode(self):
165 165 url = "/home/repos/malmΓΆ"
166 166 assert self.repo._get_url(url)
167 167
168 168
169 169 @pytest.mark.usefixtures("vcs_repository_support")
170 170 class TestDeprecatedRepositoryAPI(BackendTestMixin):
171 171 recreate_repo_per_test = False
172 172
173 173 def test_revisions_is_deprecated(self):
174 174 def get_revisions(repo):
175 175 return repo.revisions
176 176
177 177 pytest.deprecated_call(get_revisions, self.repo)
178 178
179 179 def test_get_changeset_is_deprecated(self):
180 180 pytest.deprecated_call(self.repo.get_changeset)
181 181
182 182 def test_get_changesets_is_deprecated(self):
183 183 pytest.deprecated_call(self.repo.get_changesets)
184 184
185 185 def test_in_memory_changeset_is_deprecated(self):
186 186 def get_imc(repo):
187 187 return repo.in_memory_changeset
188 188
189 189 pytest.deprecated_call(get_imc, self.repo)
190 190
191 191
192 192 # TODO: these tests are incomplete, must check the resulting compare result for
193 193 # correcteness
194 194 class TestRepositoryCompare:
195 195 @pytest.mark.parametrize("merge", [True, False])
196 196 def test_compare_commits_of_same_repository(self, vcsbackend, merge):
197 197 target_repo = vcsbackend.create_repo(number_of_commits=5)
198 198 target_repo.compare(
199 199 target_repo[1].raw_id, target_repo[3].raw_id, target_repo, merge=merge
200 200 )
201 201
202 202 @pytest.mark.xfail_backends("svn")
203 203 @pytest.mark.parametrize("merge", [True, False])
204 204 def test_compare_cloned_repositories(self, vcsbackend, merge):
205 205 target_repo = vcsbackend.create_repo(number_of_commits=5)
206 206 source_repo = vcsbackend.clone_repo(target_repo)
207 207 assert target_repo != source_repo
208 208
209 209 vcsbackend.add_file(source_repo, b"newfile", b"somecontent")
210 210 source_commit = source_repo.get_commit()
211 211
212 212 target_repo.compare(
213 213 target_repo[1].raw_id, source_repo[3].raw_id, source_repo, merge=merge
214 214 )
215 215
216 216 @pytest.mark.xfail_backends("svn")
217 217 @pytest.mark.parametrize("merge", [True, False])
218 218 def test_compare_unrelated_repositories(self, vcsbackend, merge):
219 219 orig = vcsbackend.create_repo(number_of_commits=5)
220 220 unrelated = vcsbackend.create_repo(number_of_commits=5)
221 221 assert orig != unrelated
222 222
223 223 orig.compare(orig[1].raw_id, unrelated[3].raw_id, unrelated, merge=merge)
224 224
225 225
226 226 class TestRepositoryGetCommonAncestor:
227 227 def test_get_common_ancestor_from_same_repo_existing(self, vcsbackend):
228 228 target_repo = vcsbackend.create_repo(number_of_commits=5)
229 229
230 230 expected_ancestor = target_repo[2].raw_id
231 231
232 232 assert (
233 233 target_repo.get_common_ancestor(
234 234 commit_id1=target_repo[2].raw_id,
235 235 commit_id2=target_repo[4].raw_id,
236 236 repo2=target_repo,
237 237 )
238 238 == expected_ancestor
239 239 )
240 240
241 241 assert (
242 242 target_repo.get_common_ancestor(
243 243 commit_id1=target_repo[4].raw_id,
244 244 commit_id2=target_repo[2].raw_id,
245 245 repo2=target_repo,
246 246 )
247 247 == expected_ancestor
248 248 )
249 249
250 250 @pytest.mark.xfail_backends("svn")
251 251 def test_get_common_ancestor_from_cloned_repo_existing(self, vcsbackend):
252 252 target_repo = vcsbackend.create_repo(number_of_commits=5)
253 253 source_repo = vcsbackend.clone_repo(target_repo)
254 254 assert target_repo != source_repo
255 255
256 256 vcsbackend.add_file(source_repo, b"newfile", b"somecontent")
257 257 source_commit = source_repo.get_commit()
258 258
259 259 expected_ancestor = target_repo[4].raw_id
260 260
261 261 assert (
262 262 target_repo.get_common_ancestor(
263 263 commit_id1=target_repo[4].raw_id,
264 264 commit_id2=source_commit.raw_id,
265 265 repo2=source_repo,
266 266 )
267 267 == expected_ancestor
268 268 )
269 269
270 270 assert (
271 271 target_repo.get_common_ancestor(
272 272 commit_id1=source_commit.raw_id,
273 273 commit_id2=target_repo[4].raw_id,
274 274 repo2=target_repo,
275 275 )
276 276 == expected_ancestor
277 277 )
278 278
279 279 @pytest.mark.xfail_backends("svn")
280 280 def test_get_common_ancestor_from_unrelated_repo_missing(self, vcsbackend):
281 281 original = vcsbackend.create_repo(number_of_commits=5)
282 282 unrelated = vcsbackend.create_repo(number_of_commits=5)
283 283 assert original != unrelated
284 284
285 285 assert (
286 286 original.get_common_ancestor(
287 287 commit_id1=original[0].raw_id,
288 288 commit_id2=unrelated[0].raw_id,
289 289 repo2=unrelated,
290 290 )
291 291 is None
292 292 )
293 293
294 294 assert (
295 295 original.get_common_ancestor(
296 296 commit_id1=original[-1].raw_id,
297 297 commit_id2=unrelated[-1].raw_id,
298 298 repo2=unrelated,
299 299 )
300 300 is None
301 301 )
302 302
303 303
304 304 @pytest.mark.backends("git", "hg")
305 305 class TestRepositoryMerge(object):
306 306 def prepare_for_success(self, vcsbackend):
307 307 self.target_repo = vcsbackend.create_repo(number_of_commits=1)
308 308 self.source_repo = vcsbackend.clone_repo(self.target_repo)
309 309 vcsbackend.add_file(self.target_repo, b"README_MERGE1", b"Version 1")
310 310 vcsbackend.add_file(self.source_repo, b"README_MERGE2", b"Version 2")
311 311 imc = self.source_repo.in_memory_commit
312 312 imc.add(FileNode(b"file_x", content=self.source_repo.name))
313 313 imc.commit(
314 314 message="Automatic commit from repo merge test",
315 315 author="Automatic <automatic@rhodecode.com>",
316 316 )
317 317 self.target_commit = self.target_repo.get_commit()
318 318 self.source_commit = self.source_repo.get_commit()
319 319 # This only works for Git and Mercurial
320 320 default_branch = self.target_repo.DEFAULT_BRANCH_NAME
321 321 self.target_ref = Reference("branch", default_branch, self.target_commit.raw_id)
322 322 self.source_ref = Reference("branch", default_branch, self.source_commit.raw_id)
323 323 self.workspace_id = "test-merge-{}".format(vcsbackend.alias)
324 324 self.repo_id = repo_id_generator(self.target_repo.path)
325 325
326 326 def prepare_for_conflict(self, vcsbackend):
327 327 self.target_repo = vcsbackend.create_repo(number_of_commits=1)
328 328 self.source_repo = vcsbackend.clone_repo(self.target_repo)
329 329 vcsbackend.add_file(self.target_repo, b"README_MERGE", b"Version 1")
330 330 vcsbackend.add_file(self.source_repo, b"README_MERGE", b"Version 2")
331 331 self.target_commit = self.target_repo.get_commit()
332 332 self.source_commit = self.source_repo.get_commit()
333 333 # This only works for Git and Mercurial
334 334 default_branch = self.target_repo.DEFAULT_BRANCH_NAME
335 335 self.target_ref = Reference("branch", default_branch, self.target_commit.raw_id)
336 336 self.source_ref = Reference("branch", default_branch, self.source_commit.raw_id)
337 337 self.workspace_id = "test-merge-{}".format(vcsbackend.alias)
338 338 self.repo_id = repo_id_generator(self.target_repo.path)
339 339
340 340 def test_merge_success(self, vcsbackend):
341 341 self.prepare_for_success(vcsbackend)
342 342
343 343 merge_response = self.target_repo.merge(
344 344 self.repo_id,
345 345 self.workspace_id,
346 346 self.target_ref,
347 347 self.source_repo,
348 348 self.source_ref,
349 349 "test user",
350 350 "test@rhodecode.com",
351 351 "merge message 1",
352 352 dry_run=False,
353 353 )
354 354 expected_merge_response = MergeResponse(
355 355 True, True, merge_response.merge_ref, MergeFailureReason.NONE
356 356 )
357 357 assert merge_response == expected_merge_response
358 358
359 359 target_repo = backends.get_backend(vcsbackend.alias)(self.target_repo.path)
360 360 target_commits = list(target_repo.get_commits())
361 361 commit_ids = [c.raw_id for c in target_commits[:-1]]
362 362 assert self.source_ref.commit_id in commit_ids
363 363 assert self.target_ref.commit_id in commit_ids
364 364
365 365 merge_commit = target_commits[-1]
366 366 assert merge_commit.raw_id == merge_response.merge_ref.commit_id
367 367 assert merge_commit.message.strip() == "merge message 1"
368 368 assert merge_commit.author == "test user <test@rhodecode.com>"
369 369
370 370 # We call it twice so to make sure we can handle updates
371 371 target_ref = Reference(
372 372 self.target_ref.type,
373 373 self.target_ref.name,
374 374 merge_response.merge_ref.commit_id,
375 375 )
376 376
377 377 merge_response = target_repo.merge(
378 378 self.repo_id,
379 379 self.workspace_id,
380 380 target_ref,
381 381 self.source_repo,
382 382 self.source_ref,
383 383 "test user",
384 384 "test@rhodecode.com",
385 385 "merge message 2",
386 386 dry_run=False,
387 387 )
388 388 expected_merge_response = MergeResponse(
389 389 True, True, merge_response.merge_ref, MergeFailureReason.NONE
390 390 )
391 391 assert merge_response == expected_merge_response
392 392
393 393 target_repo = backends.get_backend(vcsbackend.alias)(self.target_repo.path)
394 394 merge_commit = target_repo.get_commit(merge_response.merge_ref.commit_id)
395 395 assert merge_commit.message.strip() == "merge message 1"
396 396 assert merge_commit.author == "test user <test@rhodecode.com>"
397 397
398 398 def test_merge_success_dry_run(self, vcsbackend):
399 399 self.prepare_for_success(vcsbackend)
400 400
401 401 merge_response = self.target_repo.merge(
402 402 self.repo_id,
403 403 self.workspace_id,
404 404 self.target_ref,
405 405 self.source_repo,
406 406 self.source_ref,
407 407 dry_run=True,
408 408 )
409 409
410 410 # We call it twice so to make sure we can handle updates
411 411 merge_response_update = self.target_repo.merge(
412 412 self.repo_id,
413 413 self.workspace_id,
414 414 self.target_ref,
415 415 self.source_repo,
416 416 self.source_ref,
417 417 dry_run=True,
418 418 )
419 419
420 420 assert merge_response.merge_ref
421 421 assert merge_response_update.merge_ref
422 422
423 423 # Multiple merges may differ in their commit id. Therefore, we set the
424 424 # commit id to `None` before comparing the merge responses.
425 425 merge_response.merge_ref.commit_id = 'abcdeabcde'
426 426
427 427 merge_response_update.merge_ref.commit_id = 'abcdeabcde'
428 428
429 429 assert merge_response == merge_response_update
430 430 assert merge_response.possible is True
431 431 assert merge_response.executed is False
432 432 assert merge_response.merge_ref
433 433 assert merge_response.failure_reason is MergeFailureReason.NONE
434 434
435 435 @pytest.mark.parametrize("dry_run", [True, False])
436 436 def test_merge_conflict(self, vcsbackend, dry_run):
437 437 self.prepare_for_conflict(vcsbackend)
438 438
439 439 expected_merge_response = MergeResponse(
440 440 False, False, None, MergeFailureReason.MERGE_FAILED
441 441 )
442 442
443 443 merge_response = self.target_repo.merge(
444 444 self.repo_id,
445 445 self.workspace_id,
446 446 self.target_ref,
447 447 self.source_repo,
448 448 self.source_ref,
449 449 "test_user",
450 450 "test@rhodecode.com",
451 451 "test message",
452 452 dry_run=dry_run,
453 453 )
454 454 assert merge_response == expected_merge_response
455 455
456 456 # We call it twice so to make sure we can handle updates
457 457 merge_response = self.target_repo.merge(
458 458 self.repo_id,
459 459 self.workspace_id,
460 460 self.target_ref,
461 461 self.source_repo,
462 462 self.source_ref,
463 463 "test_user",
464 464 "test@rhodecode.com",
465 465 "test message",
466 466 dry_run=dry_run,
467 467 )
468 468 assert merge_response == expected_merge_response
469 469
470 470 def test_merge_target_is_not_head(self, vcsbackend):
471 471 self.prepare_for_success(vcsbackend)
472 472 target_ref = Reference(self.target_ref.type, self.target_ref.name, "0" * 40)
473 473 expected_merge_response = MergeResponse(
474 474 False,
475 475 False,
476 476 None,
477 477 MergeFailureReason.TARGET_IS_NOT_HEAD,
478 478 metadata={"target_ref": target_ref},
479 479 )
480 480 merge_response = self.target_repo.merge(
481 481 self.repo_id,
482 482 self.workspace_id,
483 483 target_ref,
484 484 self.source_repo,
485 485 self.source_ref,
486 486 dry_run=True,
487 487 )
488 488
489 489 assert merge_response == expected_merge_response
490 490
491 491 def test_merge_missing_source_reference(self, vcsbackend):
492 492 self.prepare_for_success(vcsbackend)
493 493
494 494 source_ref = Reference(
495 495 self.source_ref.type, "not_existing", self.source_ref.commit_id
496 496 )
497 497 expected_merge_response = MergeResponse(
498 498 False,
499 499 False,
500 500 None,
501 501 MergeFailureReason.MISSING_SOURCE_REF,
502 502 metadata={"source_ref": source_ref},
503 503 )
504 504
505 505 merge_response = self.target_repo.merge(
506 506 self.repo_id,
507 507 self.workspace_id,
508 508 self.target_ref,
509 509 self.source_repo,
510 510 source_ref,
511 511 dry_run=True,
512 512 )
513 513
514 514 assert merge_response == expected_merge_response
515 515
516 516 def test_merge_raises_exception(self, vcsbackend):
517 517 self.prepare_for_success(vcsbackend)
518 518 expected_merge_response = MergeResponse(
519 519 False,
520 520 False,
521 521 None,
522 522 MergeFailureReason.UNKNOWN,
523 523 metadata={"exception": "ErrorForTest"},
524 524 )
525 525
526 526 with mock.patch.object(
527 527 self.target_repo, "_merge_repo", side_effect=RepositoryError()
528 528 ):
529 529 merge_response = self.target_repo.merge(
530 530 self.repo_id,
531 531 self.workspace_id,
532 532 self.target_ref,
533 533 self.source_repo,
534 534 self.source_ref,
535 535 dry_run=True,
536 536 )
537 537
538 538 assert merge_response == expected_merge_response
539 539
540 540 def test_merge_invalid_user_name(self, vcsbackend):
541 541 repo = vcsbackend.create_repo(number_of_commits=1)
542 542 ref = Reference("branch", "master", "not_used")
543 543 workspace_id = "test-errors-in-merge"
544 544 repo_id = repo_id_generator(workspace_id)
545 545 with pytest.raises(ValueError):
546 546 repo.merge(repo_id, workspace_id, ref, self, ref)
547 547
548 548 def test_merge_invalid_user_email(self, vcsbackend):
549 549 repo = vcsbackend.create_repo(number_of_commits=1)
550 550 ref = Reference("branch", "master", "not_used")
551 551 workspace_id = "test-errors-in-merge"
552 552 repo_id = repo_id_generator(workspace_id)
553 553 with pytest.raises(ValueError):
554 554 repo.merge(repo_id, workspace_id, ref, self, ref, "user name")
555 555
556 556 def test_merge_invalid_message(self, vcsbackend):
557 557 repo = vcsbackend.create_repo(number_of_commits=1)
558 558 ref = Reference("branch", "master", "not_used")
559 559 workspace_id = "test-errors-in-merge"
560 560 repo_id = repo_id_generator(workspace_id)
561 561 with pytest.raises(ValueError):
562 562 repo.merge(
563 563 repo_id, workspace_id, ref, self, ref, "user name", "user@email.com"
564 564 )
565 565
566 566
567 567 @pytest.mark.usefixtures("vcs_repository_support")
568 568 class TestRepositoryStrip(BackendTestMixin):
569 569 recreate_repo_per_test = True
570 570
571 571 @classmethod
572 572 def _get_commits(cls):
573 573 commits = [
574 574 {
575 575 "message": "Initial commit",
576 576 "author": "Joe Doe <joe.doe@example.com>",
577 577 "date": datetime.datetime(2010, 1, 1, 20),
578 578 "branch": "master",
579 579 "added": [
580 580 FileNode(b"foobar", content="foobar"),
581 581 FileNode(b"foobar2", content="foobar2"),
582 582 ],
583 583 },
584 584 ]
585 585 for x in range(10):
586 586 commit_data = {
587 587 "message": "Changed foobar - commit%s" % x,
588 588 "author": "Jane Doe <jane.doe@example.com>",
589 589 "date": datetime.datetime(2010, 1, 1, 21, x),
590 590 "branch": "master",
591 591 "changed": [
592 592 FileNode(b"foobar", "FOOBAR - %s" % x),
593 593 ],
594 594 }
595 595 commits.append(commit_data)
596 596 return commits
597 597
598 598 @pytest.mark.backends("git", "hg")
599 599 def test_strip_commit(self):
600 600 tip = self.repo.get_commit()
601 601 assert tip.idx == 10
602 602 self.repo.strip(tip.raw_id, self.repo.DEFAULT_BRANCH_NAME)
603 603
604 604 tip = self.repo.get_commit()
605 605 assert tip.idx == 9
606 606
607 607 @pytest.mark.backends("git", "hg")
608 608 def test_strip_multiple_commits(self):
609 609 tip = self.repo.get_commit()
610 610 assert tip.idx == 10
611 611
612 612 old = self.repo.get_commit(commit_idx=5)
613 613 self.repo.strip(old.raw_id, self.repo.DEFAULT_BRANCH_NAME)
614 614
615 615 tip = self.repo.get_commit()
616 616 assert tip.idx == 4
617 617
618 618
619 619 @pytest.mark.backends("hg", "git")
620 620 class TestRepositoryPull(object):
621 621 def test_pull(self, vcsbackend):
622 622 source_repo = vcsbackend.repo
623 623 target_repo = vcsbackend.create_repo()
624 624 assert len(source_repo.commit_ids) > len(target_repo.commit_ids)
625 625
626 626 target_repo.pull(source_repo.path)
627 627 # Note: Get a fresh instance, avoids caching trouble
628 628 target_repo = vcsbackend.backend(target_repo.path)
629 629 assert len(source_repo.commit_ids) == len(target_repo.commit_ids)
630 630
631 631 def test_pull_wrong_path(self, vcsbackend):
632 632 target_repo = vcsbackend.create_repo()
633 633 with pytest.raises(RepositoryError):
634 634 target_repo.pull(target_repo.path + "wrong")
635 635
636 636 def test_pull_specific_commits(self, vcsbackend):
637 637 source_repo = vcsbackend.repo
638 638 target_repo = vcsbackend.create_repo()
639 639
640 640 second_commit = source_repo[1].raw_id
641 641 if vcsbackend.alias == "git":
642 642 second_commit_ref = "refs/test-refs/a"
643 643 source_repo.set_refs(second_commit_ref, second_commit)
644 644
645 645 target_repo.pull(source_repo.path, commit_ids=[second_commit])
646 646 target_repo = vcsbackend.backend(target_repo.path)
647 647 assert 2 == len(target_repo.commit_ids)
648 648 assert second_commit == target_repo.get_commit().raw_id
General Comments 0
You need to be logged in to leave comments. Login now