You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2012/12/07 23:26:36 UTC

[17/49] git commit: [#5037] ticket:202 svn implementation

[#5037] ticket:202 svn implementation


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

Branch: refs/heads/db/4803
Commit: 4893d756c716b90b2c217dffeebf0c9f5a755621
Parents: b030b67
Author: Igor Bondarenko <je...@gmail.com>
Authored: Wed Nov 7 12:36:30 2012 +0000
Committer: Cory Johns <jo...@geek.net>
Committed: Mon Dec 3 23:56:28 2012 +0000

----------------------------------------------------------------------
 ForgeSVN/forgesvn/model/svn.py                   |   44 +++++++++++++---
 ForgeSVN/forgesvn/tests/model/test_repository.py |   47 +++++++++++++++--
 2 files changed, 80 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4893d756/ForgeSVN/forgesvn/model/svn.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/model/svn.py b/ForgeSVN/forgesvn/model/svn.py
index b8550d5..4b9c724 100644
--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -468,14 +468,44 @@ class SVNImplementation(M.RepositoryImplementation):
     def _oid(self, revno):
         return '%s:%s' % (self._repo._id, revno)
 
-    def  get_commits_by_path(self, path):
-        result = []
+    def commits(self, path=None, rev=None, skip=None, limit=None):
+        if path is not None:
+            path = '%s/%s' % (self._url, path)
+        else:
+            path = self._url
+        opts = {}
+        if rev is not None:
+            opts['revision_start'] = pysvn.Revision(pysvn.opt_revision_kind.number, self._revno(rev))
+            opts['revision_end'] = pysvn.Revision(pysvn.opt_revision_kind.number, 0)
+        if skip is None: skip = 0
+        if limit:
+            # we need to expand limit to include skipped revs (pysvn doesn't support skip)
+            opts['limit'] = skip + limit
+        try:
+            revs = self._svn.log(path, **opts)
+        except pysvn.ClientError:
+            log.info('ClientError processing commits for path %s, rev %s, skip=%s, limit=%s, treating as empty',
+                    path, rev, skip, limit, exc_info=True)
+            return []
+        if skip:
+            # pysvn has already limited result for us, we just need to skip
+            revs = revs[skip:]
+        return [self._oid(r.revision.number) for r in revs]
+
+    def commits_count(self, path=None, rev=None):
+        if path is not None:
+            path = '%s/%s' % (self._url, path)
+        else:
+            path = self._url
+        opts = {}
+        if rev is not None:
+            opts['revision_start'] = pysvn.Revision(pysvn.opt_revision_kind.number, self._revno(rev))
+            opts['revision_end'] = pysvn.Revision(pysvn.opt_revision_kind.number, 0)
         try:
-            for l in self._svn.log(url_or_path=self._url + "/" + path):
-                result.append(self._oid('') + str(l.revision.number))
-            return result
-        except:
-            return result
+            return len(self._svn.log(path, **opts))
+        except pysvn.ClientError:
+            log.info('ClientError processing commits for path %s, rev %s, treating as empty', path, rev, exc_info=True)
+            return 0
 
 
 Mapper.compile_all()

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/4893d756/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 fb65a70..2515210 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -287,10 +287,49 @@ class TestSVNRev(unittest.TestCase):
         for d in diffs:
             print d
 
-    def test_get_commits_by_path(self):
-        assert  len(self.repo.get_commits_by_path('')) == 5
-        assert  len(self.repo.get_commits_by_path('README')) == 2
-        assert  len(self.repo.get_commits_by_path('test')) == 0
+    def _oid(self, rev_id):
+        return '%s:%s' % (self.repo._id, rev_id)
+
+    def test_commits(self):
+        # path only
+        commits = self.repo.commits()
+        assert len(commits) == 5, 'Returned %s commits' % len(commits)
+        assert self._oid(5) in commits, commits
+        assert self._oid(1) in commits, commits
+        commits = self.repo.commits('README')
+        assert commits == [self._oid(3), self._oid(1)]
+        assert self.repo.commits('does/not/exist') == []
+        # with path and start rev
+        commits = self.repo.commits('README', self._oid(1))
+        assert commits == [self._oid(1)], commits
+        # skip and limit
+        commits = self.repo.commits(None, rev=None, skip=1, limit=2)
+        assert commits == [self._oid(4), self._oid(3)]
+        commits = self.repo.commits(None, self._oid(2), skip=1)
+        assert commits == [self._oid(1)], commits
+        commits = self.repo.commits('README', self._oid(1), skip=1)
+        assert commits == []
+        # path to dir
+        commits = self.repo.commits('a/b/c/')
+        assert commits == [self._oid(4), self._oid(2)]
+        commits = self.repo.commits('a/b/c/', skip=1)
+        assert commits == [self._oid(2)]
+        commits = self.repo.commits('a/b/c/', limit=1)
+        assert commits == [self._oid(4)]
+        commits = self.repo.commits('not/exist/')
+        assert commits == []
+
+    def test_commits_count(self):
+        commits = self.repo.commits_count()
+        assert commits == 5, commits
+        commits = self.repo.commits_count('a/b/c/')
+        assert commits == 2, commits
+        commits = self.repo.commits_count(None, self._oid(3))
+        assert commits == 3, commits
+        commits = self.repo.commits_count('README', self._oid(1))
+        assert commits == 1, commits
+        commits = self.repo.commits_count('not/exist/')
+        assert commits == 0, commits
 
 
 class _Test(unittest.TestCase):