Switch to side-by-side view

--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -6,7 +6,7 @@
 from datetime import datetime
 from collections import defaultdict
 
-from pylons import g
+from pylons import g, c
 import pymongo.errors
 
 from ming import Field, Index, collection
@@ -133,6 +133,7 @@
         return r, isnew
 
 class Commit(RepoObject):
+    type_s = 'Commit'
     # Ephemeral attrs
     repo=None
 
@@ -169,6 +170,8 @@
         return h.text.truncate(first_line, 50)
 
     def shorthand_id(self):
+        if self.repo is None: self.repo = self.guess_repo()
+        if self.repo is None: return repr(self)
         return self.repo.shorthand_for_commit(self._id)
 
     @LazyProperty
@@ -176,7 +179,28 @@
         return self.repo.symbolics_for_commit(self.legacy)
 
     def url(self):
+        if self.repo is None: self.repo = self.guess_repo()
+        if self.repo is None: return '#'
         return self.repo.url_for_commit(self.legacy)
+
+    def guess_repo(self):
+        for ac in c.project.app_configs:
+            try:
+                app = c.project.app_instance(ac)
+                if app.repo._id in self.repo_ids:
+                    return app.repo
+            except AttributeError:
+                pass
+        return None
+
+    def link_text(self):
+        '''The link text that will be used when a shortlink to this artifact
+        is expanded into an <a></a> tag.
+
+        By default this method returns shorthand_id(). Subclasses should
+        override this method to provide more descriptive link text.
+        '''
+        return self.shorthand_id()
 
     def log_iter(self, skip, count):
         for oids in utils.chunked_iter(commitlog(self._id), QSIZE):