changeset 4038:ed50319aab94

compare: make __get_cs_or_redirect more exact
author Mads Kiilerich <madski@unity3d.com>
date Wed, 26 Jun 2013 00:13:15 +0200
parents 48142e84bdc8
children b44fabc4377c
files rhodecode/controllers/compare.py
diffstat 1 files changed, 18 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/compare.py	Wed Jun 26 00:13:15 2013 +0200
+++ b/rhodecode/controllers/compare.py	Wed Jun 26 00:13:15 2013 +0200
@@ -54,7 +54,7 @@
     def __before__(self):
         super(CompareController, self).__before__()
 
-    def __get_cs_or_redirect(self, rev, repo, redirect_after=True,
+    def __get_cs_or_redirect(self, ref, repo, redirect_after=True,
                              partial=False):
         """
         Safe way to get changeset if error occur it redirects to changeset with
@@ -65,8 +65,22 @@
         :param repo: repo instance
         """
 
+        rev = ref[1] # default and used for git
+        if repo.scm_instance.alias == 'hg':
+            # lookup up the exact node id
+            _revset_predicates = {
+                    'branch': 'branch',
+                    'book': 'bookmark',
+                    'tag': 'tag',
+                    'rev': 'id',
+                }
+            rev_spec = "max(%s(%%s))" % _revset_predicates[ref[0]]
+            revs = repo.scm_instance._repo.revs(rev_spec, safe_str(ref[1]))
+            if revs:
+                rev = revs[-1]
+            # else: TODO: just report 'not found'
+
         try:
-            type_, rev = rev
             return repo.scm_instance.get_changeset(rev)
         except EmptyRepositoryError, e:
             if not redirect_after:
@@ -205,8 +219,8 @@
             log.error('compare of two different kind of remote repos not available')
             raise HTTPNotFound
 
-        self.__get_cs_or_redirect(rev=org_ref, repo=org_repo, partial=partial)
-        self.__get_cs_or_redirect(rev=other_ref, repo=other_repo, partial=partial)
+        self.__get_cs_or_redirect(ref=org_ref, repo=org_repo, partial=partial)
+        self.__get_cs_or_redirect(ref=other_ref, repo=other_repo, partial=partial)
 
         c.org_repo = org_repo
         c.other_repo = other_repo