--- 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__: