Switch to side-by-side view

--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -11,6 +11,7 @@
 from datetime import datetime
 from collections import defaultdict
 from itertools import izip
+from urlparse import urljoin
 
 import tg
 from paste.deploy.converters import asbool
@@ -111,6 +112,10 @@
     def commits_count(self, path=None, rev=None):
         '''Return count of the commits related to path'''
         raise NotImplementedError, 'commits_count'
+
+    def tarball(self, revision):
+        '''Create a tarball for the revision'''
+        raise NotImplementedError, 'tarball'
 
     def last_commit_ids(self, commit, paths):
         '''
@@ -203,6 +208,7 @@
     branches = FieldProperty([dict(name=str,object_id=str, count=int)])
     repo_tags = FieldProperty([dict(name=str,object_id=str, count=int)])
     upstream_repo = FieldProperty(dict(name=str,url=str))
+    tarball_status = FieldProperty([dict(revision=str, status=str)])
 
     def __init__(self, **kw):
         if 'name' in kw and 'tool' in kw:
@@ -224,6 +230,33 @@
     @classmethod
     def default_url_path(cls, project, tool):
         return project.url()
+
+    @property
+    def tarball_path(self):
+        return os.path.join(tg.config.get('scm.repos.tarball.root', '/'),
+                            self.tool,
+                            self.project.url()[1:],
+                            self.name)
+
+    def tarball_url(self, revision):
+        shortname = c.app.repo.project.shortname.replace('/', '-')
+        mount_point = c.app.repo.app.config.options.mount_point
+        filename = '%s-%s-%s.tar.gz' % (shortname, mount_point, revision)
+        r = os.path.join(self.tool,self.project.url()[1:],self.name,filename)
+        return urljoin(tg.config.get('scm.repos.tarball.url_prefix', '/'), r)
+
+    def get_tarball_status(self, revision):
+        tarballs = dict((t.revision, t.status) for t in self.tarball_status)
+        return tarballs.get(revision)
+
+    def set_tarball_status(self, revision, status):
+        for tarball in self.tarball_status:
+            if tarball['revision'] == revision:
+                tarball['status'] = status
+                session(self).flush(self)
+                return
+        self.tarball_status.append(dict(revision=revision, status=status))
+        session(self).flush(self)
 
     def __repr__(self): # pragma no cover
         return '<%s %s>' % (
@@ -479,6 +512,9 @@
     def forks(self):
         return self.query.find({'upstream_repo.name': self.url()}).all()
 
+    def tarball(self, revision):
+        self._impl.tarball(revision)
+
 class MergeRequest(VersionedArtifact, ActivityObject):
     statuses=['open', 'merged', 'rejected']
     class __mongometa__: