You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by tv...@apache.org on 2013/03/12 21:04:51 UTC

[12/50] [abbrv] git commit: [#2840] ticket:272 task for code snapshots generation

[#2840] ticket:272 task for code snapshots generation


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/6ffde84f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/6ffde84f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/6ffde84f

Branch: refs/heads/si/5453
Commit: 6ffde84f5d9c072352fac3b1274481b6a55a8910
Parents: 6049825
Author: Yuriy Arhipov <yu...@yandex.ru>
Authored: Mon Feb 18 14:29:49 2013 +0400
Committer: Cory Johns <jo...@geek.net>
Committed: Mon Mar 11 22:29:45 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/repository.py          |    5 ++++
 Allura/allura/model/repository.py                |   14 +++++++++++
 Allura/allura/tasks/repo_tasks.py                |   12 ++++++++++
 Allura/allura/templates/repo/tree.html           |    4 +++
 Allura/development.ini                           |    1 +
 Allura/test.ini                                  |    1 +
 ForgeGit/forgegit/model/git_repo.py              |    9 +++++++
 ForgeGit/forgegit/tests/model/test_repository.py |    6 +++++
 ForgeSVN/forgesvn/model/svn.py                   |   20 +++++++++++++++++
 ForgeSVN/forgesvn/tests/model/test_repository.py |    5 ++++
 10 files changed, 77 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/Allura/allura/controllers/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index f543c6a..6a38f74 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -425,6 +425,11 @@ class CommitBrowser(BaseController):
             result.update(self._commit.context())
         return result
 
+    @expose()
+    def tarball(self, **kw):
+        allura.tasks.repo_tasks.tarball.post(revision=self._revision)
+        redirect(redirect(request.referer))
+
     @expose('jinja:allura:templates/repo/log.html')
     @with_trailing_slash
     @validate(dict(page=validators.Int(if_empty=0),

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index f293f4e..5653e2b 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -112,6 +112,10 @@ class RepositoryImplementation(object):
         '''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):
         '''
         Return a mapping {path: commit_id} of the _id of the last
@@ -225,6 +229,13 @@ class Repository(Artifact, ActivityObject):
     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 __repr__(self): # pragma no cover
         return '<%s %s>' % (
             self.__class__.__name__,
@@ -479,6 +490,9 @@ class Repository(Artifact, ActivityObject):
     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__:

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/Allura/allura/tasks/repo_tasks.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tasks/repo_tasks.py b/Allura/allura/tasks/repo_tasks.py
index 355daf7..87d4f72 100644
--- a/Allura/allura/tasks/repo_tasks.py
+++ b/Allura/allura/tasks/repo_tasks.py
@@ -102,3 +102,15 @@ def reclone_repo(*args, **kwargs):
     except Exception, e:
         source_url = source_path or source_url
         g.post_event('repo_clone_task_failed', source_url, traceback.format_exc())
+
+@task
+def tarball(revision=None):
+    log = logging.getLogger(__name__)
+    if revision:
+        repo = c.app.repo
+        try:
+            repo.tarball(revision)
+        except:
+            log.error('Could not create tarball for repository %s:%s revision %s' % (c.project.shortname, c.app.config.options.mount_point, revision), exc_info=True)
+    else:
+        log.warn('Creation of tarball for %s:%s skipped because revision is not specified' % (c.project.shortname, c.app.config.options.mount_point))
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/Allura/allura/templates/repo/tree.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/tree.html b/Allura/allura/templates/repo/tree.html
index 31d7b2b..b3e3094 100644
--- a/Allura/allura/templates/repo/tree.html
+++ b/Allura/allura/templates/repo/tree.html
@@ -12,6 +12,10 @@ Tree <a href="{{commit.url()}}">{{commit.shorthand_id()}}</a> {{commit_labels(co
 {% endblock %}
 
 {% block actions %}
+<a href="{{commit.url()}}tarball">
+     Tarball
+</a>
+
 <a href="{{commit.url()}}log/?path={{ path }}">
   <b data-icon="{{g.icons.history.char}}" class="ico {{g.icons.history.css}}" title="History"> </b> History
 </a>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/Allura/development.ini
----------------------------------------------------------------------
diff --git a/Allura/development.ini b/Allura/development.ini
index ae550ae..fce244c 100644
--- a/Allura/development.ini
+++ b/Allura/development.ini
@@ -120,6 +120,7 @@ scm.new_refresh = true
 gitweb.cgi = /usr/lib/cgi-bin/gitweb.cgi
 
 scm.repos.root = /tmp
+scm.repos.tarball.root = /tmp/tarball
 
 trovecategories.enableediting = true
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/Allura/test.ini
----------------------------------------------------------------------
diff --git a/Allura/test.ini b/Allura/test.ini
index fa951e2..3e0d18e 100644
--- a/Allura/test.ini
+++ b/Allura/test.ini
@@ -81,6 +81,7 @@ scm.clone.ro.svn = svn checkout $source_url $dest_path
 scm.clone.svn = svn checkout --username=$username $source_url $dest_path
 
 scm.repos.root = /tmp
+scm.repos.tarball.root = /tmp/tarball
 
 #stats.sample_rate = 0
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/ForgeGit/forgegit/model/git_repo.py
----------------------------------------------------------------------
diff --git a/ForgeGit/forgegit/model/git_repo.py b/ForgeGit/forgegit/model/git_repo.py
index 092d24d..097630e 100644
--- a/ForgeGit/forgegit/model/git_repo.py
+++ b/ForgeGit/forgegit/model/git_repo.py
@@ -322,6 +322,15 @@ class GitImplementation(M.RepositoryImplementation):
         tree = self.refresh_tree_info(ci.tree, set())
         return tree._id
 
+    def tarball(self, commit):
+        shortname = self._repo.project.shortname
+        mount_point = self._repo.app.config.options.mount_point
+        if not os.path.exists(self._repo.tarball_path):
+            os.makedirs(self._repo.tarball_path)
+        filename = '%s-%s-%s.tar' % (shortname, mount_point, commit)
+        self._git.archive(open(os.path.join(self._repo.tarball_path, filename), 'w'),
+                          treeish=commit)
+
 class _OpenedGitBlob(object):
     CHUNK_SIZE=4096
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/ForgeGit/forgegit/tests/model/test_repository.py
----------------------------------------------------------------------
diff --git a/ForgeGit/forgegit/tests/model/test_repository.py b/ForgeGit/forgegit/tests/model/test_repository.py
index 223c1af..48c82ab 100644
--- a/ForgeGit/forgegit/tests/model/test_repository.py
+++ b/ForgeGit/forgegit/tests/model/test_repository.py
@@ -238,6 +238,12 @@ class TestGitRepo(unittest.TestCase, RepoImplTestBase):
         self.assertEqual(new_tree.blob_ids, orig_tree.blob_ids)
         self.assertEqual(new_tree.other_ids, orig_tree.other_ids)
 
+    def test_tarball(self):
+        assert_equal(self.repo.tarball_path, '/tmp/tarball/git/p/test/testgit.git')
+        self.repo.tarball('HEAD')
+        assert os.path.isfile("/tmp/tarball/git/p/test/testgit.git/test-src-git-HEAD.tar")
+
+
 class TestGitCommit(unittest.TestCase):
 
     def setUp(self):

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/ForgeSVN/forgesvn/model/svn.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/model/svn.py b/ForgeSVN/forgesvn/model/svn.py
index 0b94028..41753ae 100644
--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -10,6 +10,8 @@ from hashlib import sha1
 from cStringIO import StringIO
 from datetime import datetime
 import tempfile
+import tarfile
+from shutil import rmtree
 
 import tg
 import pysvn
@@ -608,4 +610,22 @@ class SVNImplementation(M.RepositoryImplementation):
                 entries[path] = self._oid(info.last_changed_rev.number)
         return entries
 
+    def tarball(self, commit):
+        shortname = self._repo.project.shortname
+        mount_point = self._repo.app.config.options.mount_point
+        if not os.path.exists(self._repo.tarball_path):
+            os.makedirs(self._repo.tarball_path)
+        path = os.path.join(self._repo.tarball_path, commit)
+        if os.path.exists(path):
+            rmtree(path)
+        self._svn.export(self._url,
+                         path,
+                         revision=pysvn.Revision(pysvn.opt_revision_kind.number, commit))
+        filename = '%s-%s-%s.tar' % (shortname, mount_point, commit)
+        tar = tarfile.open(os.path.join(self._repo.tarball_path, filename), "w")
+        tar.add(path, arcname=commit)
+        tar.close()
+        rmtree(path)
+
+
 Mapper.compile_all()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6ffde84f/ForgeSVN/forgesvn/tests/model/test_repository.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/tests/model/test_repository.py b/ForgeSVN/forgesvn/tests/model/test_repository.py
index 5174c00..0eb7f19 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -265,6 +265,11 @@ class TestSVNRepo(unittest.TestCase, RepoImplTestBase):
         ci = mock.Mock(_id='deadbeef:100')
         self.assertEqual(self.repo.count_revisions(ci), 100)
 
+    def test_tarball(self):
+        assert_equal(self.repo.tarball_path, '/tmp/tarball/svn/p/test/testsvn')
+        self.repo.tarball('1')
+        assert os.path.isfile("/tmp/tarball/svn/p/test/testsvn/test-src-1.tar")
+
 
 class TestSVNRev(unittest.TestCase):