Show More
@@ -655,7 +655,7 b' def get_clone_url(request, uri_tmpl, rep' | |||
|
655 | 655 | |
|
656 | 656 | |
|
657 | 657 | def get_commit_safe(repo, commit_id=None, commit_idx=None, pre_load=None, |
|
658 | maybe_unreachable=False): | |
|
658 | maybe_unreachable=False, reference_obj=None): | |
|
659 | 659 | """ |
|
660 | 660 | Safe version of get_commit if this commit doesn't exists for a |
|
661 | 661 | repository it returns a Dummy one instead |
@@ -665,6 +665,7 b' def get_commit_safe(repo, commit_id=None' | |||
|
665 | 665 | :param commit_idx: numeric commit index |
|
666 | 666 | :param pre_load: optional list of commit attributes to load |
|
667 | 667 | :param maybe_unreachable: translate unreachable commits on git repos |
|
668 | :param reference_obj: explicitly search via a reference obj in git. E.g "branch:123" would mean branch "123" | |
|
668 | 669 | """ |
|
669 | 670 | # TODO(skreft): remove these circular imports |
|
670 | 671 | from rhodecode.lib.vcs.backends.base import BaseRepository, EmptyCommit |
@@ -676,7 +677,7 b' def get_commit_safe(repo, commit_id=None' | |||
|
676 | 677 | try: |
|
677 | 678 | commit = repo.get_commit( |
|
678 | 679 | commit_id=commit_id, commit_idx=commit_idx, pre_load=pre_load, |
|
679 | maybe_unreachable=maybe_unreachable) | |
|
680 | maybe_unreachable=maybe_unreachable, reference_obj=reference_obj) | |
|
680 | 681 | except (RepositoryError, LookupError): |
|
681 | 682 | commit = EmptyCommit() |
|
682 | 683 | return commit |
@@ -72,6 +72,10 b' class Reference(_Reference):' | |||
|
72 | 72 | if self.type == 'book': |
|
73 | 73 | return self.name |
|
74 | 74 | |
|
75 | @property | |
|
76 | def to_unicode(self): | |
|
77 | return reference_to_unicode(self) | |
|
78 | ||
|
75 | 79 | |
|
76 | 80 | def unicode_to_reference(raw): |
|
77 | 81 | """ |
@@ -483,7 +487,7 b' class BaseRepository(object):' | |||
|
483 | 487 | self._is_empty = False |
|
484 | 488 | |
|
485 | 489 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, |
|
486 | translate_tag=None, maybe_unreachable=False): | |
|
490 | translate_tag=None, maybe_unreachable=False, reference_obj=None): | |
|
487 | 491 | """ |
|
488 | 492 | Returns instance of `BaseCommit` class. If `commit_id` and `commit_idx` |
|
489 | 493 | are both None, most recent commit is returned. |
@@ -228,7 +228,8 b' class GitRepository(BaseRepository):' | |||
|
228 | 228 | return [] |
|
229 | 229 | return output.splitlines() |
|
230 | 230 | |
|
231 | def _lookup_commit(self, commit_id_or_idx, translate_tag=True, maybe_unreachable=False): | |
|
231 | def _lookup_commit(self, commit_id_or_idx, translate_tag=True, maybe_unreachable=False, reference_obj=None): | |
|
232 | ||
|
232 | 233 | def is_null(value): |
|
233 | 234 | return len(value) == commit_id_or_idx.count('0') |
|
234 | 235 | |
@@ -239,15 +240,20 b' class GitRepository(BaseRepository):' | |||
|
239 | 240 | *map(safe_str, [commit_id_or_idx, self.name])) |
|
240 | 241 | |
|
241 | 242 | is_bstr = isinstance(commit_id_or_idx, (str, unicode)) |
|
242 | if ((is_bstr and commit_id_or_idx.isdigit() and len(commit_id_or_idx) < 12) | |
|
243 | or isinstance(commit_id_or_idx, int) or is_null(commit_id_or_idx)): | |
|
243 | is_branch = reference_obj and reference_obj.branch | |
|
244 | is_numeric_idx = \ | |
|
245 | (is_bstr and commit_id_or_idx.isdigit() and len(commit_id_or_idx) < 12) \ | |
|
246 | or isinstance(commit_id_or_idx, int) | |
|
247 | ||
|
248 | if not is_branch and (is_numeric_idx or is_null(commit_id_or_idx)): | |
|
244 | 249 | try: |
|
245 | 250 | commit_id_or_idx = self.commit_ids[int(commit_id_or_idx)] |
|
246 | 251 | except Exception: |
|
247 | 252 | raise CommitDoesNotExistError(commit_missing_err) |
|
248 | 253 | |
|
249 | 254 | elif is_bstr: |
|
250 | # Need to call remote to translate id for tagging scenario | |
|
255 | # Need to call remote to translate id for tagging scenarios, | |
|
256 | # or branch that are numeric | |
|
251 | 257 | try: |
|
252 | 258 | remote_data = self._remote.get_object(commit_id_or_idx, |
|
253 | 259 | maybe_unreachable=maybe_unreachable) |
@@ -413,11 +419,12 b' class GitRepository(BaseRepository):' | |||
|
413 | 419 | return |
|
414 | 420 | |
|
415 | 421 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, |
|
416 | translate_tag=True, maybe_unreachable=False): | |
|
422 | translate_tag=True, maybe_unreachable=False, reference_obj=None): | |
|
417 | 423 | """ |
|
418 | 424 | Returns `GitCommit` object representing commit from git repository |
|
419 | 425 | at the given `commit_id` or head (most recent commit) if None given. |
|
420 | 426 | """ |
|
427 | ||
|
421 | 428 | if self.is_empty(): |
|
422 | 429 | raise EmptyRepositoryError("There are no commits yet") |
|
423 | 430 | |
@@ -443,7 +450,9 b' class GitRepository(BaseRepository):' | |||
|
443 | 450 | commit_id = "tip" |
|
444 | 451 | |
|
445 | 452 | if translate_tag: |
|
446 |
commit_id = self._lookup_commit( |
|
|
453 | commit_id = self._lookup_commit( | |
|
454 | commit_id, maybe_unreachable=maybe_unreachable, | |
|
455 | reference_obj=reference_obj) | |
|
447 | 456 | |
|
448 | 457 | try: |
|
449 | 458 | idx = self._commit_ids[commit_id] |
@@ -437,7 +437,7 b' class MercurialRepository(BaseRepository' | |||
|
437 | 437 | return os.path.join(self.path, '.hg', '.hgrc') |
|
438 | 438 | |
|
439 | 439 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, |
|
440 | translate_tag=None, maybe_unreachable=False): | |
|
440 | translate_tag=None, maybe_unreachable=False, reference_obj=None): | |
|
441 | 441 | """ |
|
442 | 442 | Returns ``MercurialCommit`` object representing repository's |
|
443 | 443 | commit at the given `commit_id` or `commit_idx`. |
@@ -277,7 +277,7 b' class SubversionRepository(base.BaseRepo' | |||
|
277 | 277 | return os.path.join(self.path, 'hooks') |
|
278 | 278 | |
|
279 | 279 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, |
|
280 | translate_tag=None, maybe_unreachable=False): | |
|
280 | translate_tag=None, maybe_unreachable=False, reference_obj=None): | |
|
281 | 281 | if self.is_empty(): |
|
282 | 282 | raise EmptyRepositoryError("There are no commits yet") |
|
283 | 283 | if commit_id is not None: |
@@ -2398,10 +2398,10 b' class Repository(Base, BaseModel):' | |||
|
2398 | 2398 | # SCM PROPERTIES |
|
2399 | 2399 | #========================================================================== |
|
2400 | 2400 | |
|
2401 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, maybe_unreachable=False): | |
|
2401 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, maybe_unreachable=False, reference_obj=None): | |
|
2402 | 2402 | return get_commit_safe( |
|
2403 | 2403 | self.scm_instance(), commit_id, commit_idx, pre_load=pre_load, |
|
2404 | maybe_unreachable=maybe_unreachable) | |
|
2404 | maybe_unreachable=maybe_unreachable, reference_obj=reference_obj) | |
|
2405 | 2405 | |
|
2406 | 2406 | def get_changeset(self, rev=None, pre_load=None): |
|
2407 | 2407 | warnings.warn("Use get_commit", DeprecationWarning) |
@@ -908,7 +908,8 b' class PullRequestModel(BaseModel):' | |||
|
908 | 908 | |
|
909 | 909 | try: |
|
910 | 910 | if source_ref_type in self.REF_TYPES: |
|
911 |
source_commit = source_repo.get_commit( |
|
|
911 | source_commit = source_repo.get_commit( | |
|
912 | source_ref_name, reference_obj=pull_request.source_ref_parts) | |
|
912 | 913 | else: |
|
913 | 914 | source_commit = source_repo.get_commit(source_ref_id) |
|
914 | 915 | except CommitDoesNotExistError: |
@@ -922,7 +923,8 b' class PullRequestModel(BaseModel):' | |||
|
922 | 923 | |
|
923 | 924 | try: |
|
924 | 925 | if target_ref_type in self.REF_TYPES: |
|
925 |
target_commit = target_repo.get_commit( |
|
|
926 | target_commit = target_repo.get_commit( | |
|
927 | target_ref_name, reference_obj=pull_request.target_ref_parts) | |
|
926 | 928 | else: |
|
927 | 929 | target_commit = target_repo.get_commit(target_ref_id) |
|
928 | 930 | except CommitDoesNotExistError: |
General Comments 0
You need to be logged in to leave comments.
Login now