You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/06/28 16:59:38 UTC

[5/5] git commit: [#6272] Re-added file size on SCM log view and added extended tests of indexless log

[#6272] Re-added file size on SCM log view and added extended tests of indexless log

Signed-off-by: Cory Johns <cj...@slashdotmedia.com>


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

Branch: refs/heads/master
Commit: d4509f0822bc28d2ddfded6c49063836d4e79620
Parents: a06b914
Author: Cory Johns <cj...@slashdotmedia.com>
Authored: Fri Jun 14 14:15:08 2013 +0000
Committer: Cory Johns <cj...@slashdotmedia.com>
Committed: Fri Jun 28 14:58:53 2013 +0000

----------------------------------------------------------------------
 Allura/allura/controllers/repository.py         |  3 +-
 Allura/allura/model/repository.py               |  6 ++
 Allura/allura/templates/widgets/repo/log.html   |  7 +-
 ForgeGit/forgegit/model/git_repo.py             | 18 ++++
 .../forgegit/tests/model/test_repository.py     | 85 ++++++++++++++++-
 ForgeSVN/forgesvn/model/svn.py                  | 20 +++-
 .../forgesvn/tests/model/test_repository.py     | 98 +++++++++++++++++++-
 7 files changed, 223 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d4509f08/Allura/allura/controllers/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index e8848eb..4f6122d 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -475,8 +475,7 @@ class CommitBrowser(BaseController):
     def log(self, limit=25, path=None, **kw):
         is_file = False
         if path:
-            path = path.lstrip('/')
-            is_file = self.tree._tree.get_blob_by_path(path) is not None
+            is_file = c.app.repo.is_file(path, self._commit._id)
         commits = list(islice(c.app.repo.log(
                 revs=self._commit._id,
                 path=path,

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d4509f08/Allura/allura/model/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/repository.py b/Allura/allura/model/repository.py
index 6916bec..aefbdca 100644
--- a/Allura/allura/model/repository.py
+++ b/Allura/allura/model/repository.py
@@ -179,6 +179,10 @@ class RepositoryImplementation(object):
         '''Determine if the repository is empty by checking the filesystem'''
         raise NotImplementedError, 'is_empty'
 
+    def is_file(self, path, rev=None):
+        '''Determine if the repository is a file by checking the filesystem'''
+        raise NotImplementedError, 'is_file'
+
     @classmethod
     def shorthand_for_commit(cls, oid):
         return '[%s]' % oid[:6]
@@ -349,6 +353,8 @@ class Repository(Artifact, ActivityObject):
         return self._impl.last_commit_ids(commit, paths)
     def is_empty(self):
         return self._impl.is_empty()
+    def is_file(self, path, rev=None):
+        return self._impl.is_file(path, rev)
     def get_heads(self):
         """
         Return list of heads for the repo.

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d4509f08/Allura/allura/templates/widgets/repo/log.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/repo/log.html b/Allura/allura/templates/widgets/repo/log.html
index 840ebb2..69d7129 100644
--- a/Allura/allura/templates/widgets/repo/log.html
+++ b/Allura/allura/templates/widgets/repo/log.html
@@ -35,9 +35,9 @@
         <tr class="rev">
           <td>
             <div>
-                {%if is_file%}
+                {%if is_file %}
                     <div class="grid-1"><input type="checkbox" class="revision" revision="{{commit.id}}" url_commit="{{app.repo.url_for_commit(commit.id)}}"></div>
-                {%endif%}
+                {% endif %}
                 <a class="rev" href="{{app.repo.url_for_commit(commit.id)}}">{{app.repo.shorthand_for_commit(commit.id)}}</a>
                 {% if commit.refs -%}
                     (
@@ -46,6 +46,9 @@
                     {%- endfor -%}
                     )
                 {%- endif %}
+                {%if is_file %}
+                    ({{ commit.size|filesizeformat if commit.size else 'None' }})
+                {% endif %}
                 by {{ user_link(commit.authored.email, commit.authored.name) }}
                 {%- if commit.committed.email != commit.authored.email %},
                 pushed by {{ user_link(commit.committed.email, commit.committed.name) }}

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d4509f08/ForgeGit/forgegit/model/git_repo.py
----------------------------------------------------------------------
diff --git a/ForgeGit/forgegit/model/git_repo.py b/ForgeGit/forgegit/model/git_repo.py
index 2220260..4a8b10a 100644
--- a/ForgeGit/forgegit/model/git_repo.py
+++ b/ForgeGit/forgegit/model/git_repo.py
@@ -288,6 +288,7 @@ class GitImplementation(M.RepositoryImplementation):
         If id_only is True, returns only the commit ID, otherwise it returns
         detailed information about each commit.
         """
+        path = path.strip('/') if path else None
         if exclude is not None:
             revs.extend(['^%s' % e for e in exclude])
 
@@ -295,6 +296,13 @@ class GitImplementation(M.RepositoryImplementation):
             if id_only:
                 yield ci.hexsha
             else:
+                size = None
+                if path:
+                    try:
+                        node = ci.tree/path
+                        size = node.size if node.type == 'blob' else None
+                    except KeyError as e:
+                        size = None
                 yield {
                         'id': ci.hexsha,
                         'message': h.really_unicode(ci.message or '--none--'),
@@ -310,6 +318,7 @@ class GitImplementation(M.RepositoryImplementation):
                             },
                         'refs': refs,
                         'parents': [pci.hexsha for pci in ci.parents],
+                        'size': size,
                     }
 
     def _iter_commits_with_refs(self, *args, **kwargs):
@@ -399,6 +408,15 @@ class GitImplementation(M.RepositoryImplementation):
     def is_empty(self):
         return not self._git or len(self._git.heads) == 0
 
+    def is_file(self, path, rev=None):
+        path = path.strip('/')
+        ci = self._git.rev_parse(rev)
+        try:
+            node = ci.tree/path
+            return node.type == 'blob'
+        except KeyError as e:
+            return False
+
     @LazyProperty
     def head(self):
         return self._git.head.commit.hexsha

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d4509f08/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 0bbd6c2..dba95ae 100644
--- a/ForgeGit/forgegit/tests/model/test_repository.py
+++ b/ForgeGit/forgegit/tests/model/test_repository.py
@@ -219,10 +219,89 @@ class TestGitRepo(unittest.TestCase, RepoImplTestBase):
         i = self.repo.index()
         assert i['type_s'] == 'Git Repository', i
 
+    def test_log_id_only(self):
+        entries = list(self.repo.log(id_only=True))
+        assert_equal(entries, [
+            '1e146e67985dcd71c74de79613719bef7bddca4a',
+            'df30427c488aeab84b2352bdf88a3b19223f9d7a',
+            '6a45885ae7347f1cac5103b0050cc1be6a1496c8',
+            '9a7df788cf800241e3bb5a849c8870f2f8259d98'])
+
     def test_log(self):
-        for entry in self.repo.log(id_only=False):
-            assert str(entry['authored'])
-            assert entry['message']
+        entries = list(self.repo.log(id_only=False))
+        assert_equal(entries, [
+            {'authored': {'date': datetime.datetime(2010, 10, 7, 18, 44, 11),
+                          'email': u'rcopeland@geek.net',
+                          'name': u'Rick Copeland'},
+             'committed': {'date': datetime.datetime(2010, 10, 7, 18, 44, 11),
+                           'email': u'rcopeland@geek.net',
+                           'name': u'Rick Copeland'},
+             'id': '1e146e67985dcd71c74de79613719bef7bddca4a',
+             'message': u'Change README\n',
+             'parents': ['df30427c488aeab84b2352bdf88a3b19223f9d7a'],
+             'refs': ['HEAD', 'foo', 'master'],
+             'size': None},
+            {'authored': {'date': datetime.datetime(2010, 10, 7, 18, 44, 1),
+                          'email': u'rcopeland@geek.net',
+                          'name': u'Rick Copeland'},
+             'committed': {'date': datetime.datetime(2010, 10, 7, 18, 44, 1),
+                           'email': u'rcopeland@geek.net',
+                           'name': u'Rick Copeland'},
+             'id': 'df30427c488aeab84b2352bdf88a3b19223f9d7a',
+             'message': u'Add README\n',
+             'parents': ['6a45885ae7347f1cac5103b0050cc1be6a1496c8'],
+             'refs': [],
+             'size': None},
+            {'authored': {'date': datetime.datetime(2010, 10, 7, 18, 43, 26),
+                          'email': u'rcopeland@geek.net',
+                          'name': u'Rick Copeland'},
+             'committed': {'date': datetime.datetime(2010, 10, 7, 18, 43, 26),
+                           'email': u'rcopeland@geek.net',
+                           'name': u'Rick Copeland'},
+             'id': '6a45885ae7347f1cac5103b0050cc1be6a1496c8',
+             'message': u'Remove file\n',
+             'parents': ['9a7df788cf800241e3bb5a849c8870f2f8259d98'],
+             'refs': [],
+             'size': None},
+            {'authored': {'date': datetime.datetime(2010, 10, 7, 18, 42, 54),
+                          'email': u'rcopeland@geek.net',
+                          'name': u'Rick Copeland'},
+             'committed': {'date': datetime.datetime(2010, 10, 7, 18, 42, 54),
+                           'email': u'rcopeland@geek.net',
+                           'name': u'Rick Copeland'},
+             'id': '9a7df788cf800241e3bb5a849c8870f2f8259d98',
+             'message': u'Initial commit\n',
+             'parents': [],
+             'refs': [],
+             'size': None},
+            ])
+
+    def test_log_file(self):
+        entries = list(self.repo.log(path='README', id_only=False))
+        assert_equal(entries, [
+            {'authored': {'date': datetime.datetime(2010, 10, 7, 18, 44, 11),
+                          'email': u'rcopeland@geek.net',
+                          'name': u'Rick Copeland'},
+             'committed': {'date': datetime.datetime(2010, 10, 7, 18, 44, 11),
+                           'email': u'rcopeland@geek.net',
+                           'name': u'Rick Copeland'},
+             'id': '1e146e67985dcd71c74de79613719bef7bddca4a',
+             'message': u'Change README\n',
+             'parents': ['df30427c488aeab84b2352bdf88a3b19223f9d7a'],
+             'refs': ['HEAD', 'foo', 'master'],
+             'size': 28},
+            {'authored': {'date': datetime.datetime(2010, 10, 7, 18, 44, 1),
+                          'email': u'rcopeland@geek.net',
+                          'name': u'Rick Copeland'},
+             'committed': {'date': datetime.datetime(2010, 10, 7, 18, 44, 1),
+                           'email': u'rcopeland@geek.net',
+                           'name': u'Rick Copeland'},
+             'id': 'df30427c488aeab84b2352bdf88a3b19223f9d7a',
+             'message': u'Add README\n',
+             'parents': ['6a45885ae7347f1cac5103b0050cc1be6a1496c8'],
+             'refs': [],
+             'size': 15},
+            ])
 
     def test_commit(self):
         entry = self.repo.commit('HEAD')

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d4509f08/ForgeSVN/forgesvn/model/svn.py
----------------------------------------------------------------------
diff --git a/ForgeSVN/forgesvn/model/svn.py b/ForgeSVN/forgesvn/model/svn.py
index 82b31b9..dcb08e0 100644
--- a/ForgeSVN/forgesvn/model/svn.py
+++ b/ForgeSVN/forgesvn/model/svn.py
@@ -512,7 +512,7 @@ class SVNImplementation(M.RepositoryImplementation):
         if path is None:
             url = self._url
         else:
-            url = '/'.join([self._url, path])
+            url = '/'.join([self._url, path.strip('/')])
         while revno > exclude:
             rev = pysvn.Revision(pysvn.opt_revision_kind.number, revno)
             try:
@@ -527,13 +527,17 @@ class SVNImplementation(M.RepositoryImplementation):
                 if id_only:
                     yield ci.revision.number
                 else:
-                    yield self._map_log(ci)
+                    yield self._map_log(ci, url)
             if len(logs) < page_size:
                 return  # we didn't get a full page, don't bother calling SVN again
             revno = ci.revision.number - 1
 
-    def _map_log(self, ci):
+    def _map_log(self, ci, url):
         revno = ci.revision.number
+        try:
+            size = int(self._svn.list(url)[0][0].size)
+        except pysvn.ClientError as e:
+            size = None
         return {
                 'id': revno,
                 'message': h.really_unicode(ci.get('message', '--none--')),
@@ -549,6 +553,7 @@ class SVNImplementation(M.RepositoryImplementation):
                     },
                 'refs': ['HEAD'] if revno == self.head else [],
                 'parents': [revno-1] if revno > 1 else [],
+                'size': size,
             }
 
     def open_blob(self, blob):
@@ -717,6 +722,15 @@ class SVNImplementation(M.RepositoryImplementation):
     def is_empty(self):
         return self.head == 0
 
+    def is_file(self, path, rev=None):
+        url = '/'.join([self._url, path.strip('/')])
+        rev = pysvn.Revision(pysvn.opt_revision_kind.number, self._revno(self.rev_parse(rev)))
+        try:
+            info = self._svn.list(url, revision=rev, dirent_fields=pysvn.SVN_DIRENT_KIND)[0][0]
+            return info.kind == pysvn.node_kind.file
+        except pysvn.ClientError:
+            return False
+
     def symbolics_for_commit(self, commit):
         return [], []
 

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/d4509f08/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 0f90c17..3f5182a 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -220,10 +220,100 @@ class TestSVNRepo(unittest.TestCase, RepoImplTestBase):
         i = self.repo.index()
         assert i['type_s'] == 'SVN Repository', i
 
+    def test_log_id_only(self):
+        entries = list(self.repo.log(id_only=True))
+        assert_equal(entries, [5, 4, 3, 2, 1])
+
     def test_log(self):
-        for entry in self.repo.log(id_only=False):
-            assert entry['committed']['name'] == 'rick446'
-            assert entry['message']
+        entries = list(self.repo.log(id_only=False))
+        assert_equal(entries, [
+            {'authored': {'date': datetime(2010, 11, 18, 20, 14, 21, 515743),
+                          'email': '',
+                          'name': u'rick446'},
+             'committed': {'date': datetime(2010, 11, 18, 20, 14, 21, 515743),
+                           'email': '',
+                           'name': u'rick446'},
+             'id': 5,
+             'message': u'Copied a => b',
+             'parents': [4],
+             'refs': ['HEAD'],
+             'size': 0},
+            {'authored': {'date': datetime(2010, 10, 8, 15, 32, 59, 383719),
+                          'email': '',
+                          'name': u'rick446'},
+             'committed': {'date': datetime(2010, 10, 8, 15, 32, 59, 383719),
+                           'email': '',
+                           'name': u'rick446'},
+             'id': 4,
+             'message': u'Remove hello.txt',
+             'parents': [3],
+             'refs': [],
+             'size': 0},
+            {'authored': {'date': datetime(2010, 10, 8, 15, 32, 48, 272296),
+                          'email': '',
+                          'name': u'rick446'},
+             'committed': {'date': datetime(2010, 10, 8, 15, 32, 48, 272296),
+                           'email': '',
+                           'name': u'rick446'},
+             'id': 3,
+             'message': u'Modify readme',
+             'parents': [2],
+             'refs': [],
+             'size': 0},
+            {'authored': {'date': datetime(2010, 10, 8, 15, 32, 36, 221863),
+                          'email': '',
+                          'name': u'rick446'},
+             'committed': {'date': datetime(2010, 10, 8, 15, 32, 36, 221863),
+                           'email': '',
+                           'name': u'rick446'},
+             'id': 2,
+             'message': u'Add path',
+             'parents': [1],
+             'refs': [],
+             'size': 0},
+            {'authored': {'date': datetime(2010, 10, 8, 15, 32, 7, 238375),
+                          'email': '',
+                          'name': u'rick446'},
+             'committed': {'date': datetime(2010, 10, 8, 15, 32, 7, 238375),
+                           'email': '',
+                           'name': u'rick446'},
+             'id': 1,
+             'message': u'Create readme',
+             'parents': [],
+             'refs': [],
+             'size': 0},
+            ])
+
+    def test_log_file(self):
+        entries = list(self.repo.log(path='/README', id_only=False))
+        assert_equal(entries, [
+            {'authored': {'date': datetime(2010, 10, 8, 15, 32, 48, 272296),
+                          'email': '',
+                          'name': u'rick446'},
+             'committed': {'date': datetime(2010, 10, 8, 15, 32, 48, 272296),
+                           'email': '',
+                           'name': u'rick446'},
+             'id': 3,
+             'message': u'Modify readme',
+             'parents': [2],
+             'refs': [],
+             'size': 28},
+            {'authored': {'date': datetime(2010, 10, 8, 15, 32, 7, 238375),
+                          'email': '',
+                          'name': u'rick446'},
+             'committed': {'date': datetime(2010, 10, 8, 15, 32, 7, 238375),
+                           'email': '',
+                           'name': u'rick446'},
+             'id': 1,
+             'message': u'Create readme',
+             'parents': [],
+             'refs': [],
+             'size': 28},
+            ])
+
+    def test_is_file(self):
+        assert self.repo.is_file('/README')
+        assert not self.repo.is_file('/a')
 
     def test_paged_diffs(self):
         entry = self.repo.commit(self.repo.log(2, id_only=True).next())
@@ -784,7 +874,7 @@ class TestMergeRequest(_TestWithRepoAndCommit):
             assert_equal(_svn().log.call_args[0], ('file:///tmp/svn/p/test/test2',))
             assert_equal(_svn().log.call_args[1]['revision_start'].number, 2)
             assert_equal(_svn().log.call_args[1]['limit'], 25)
-            _map_log.assert_called_once_with(_svn().log.return_value[0])
+            _map_log.assert_called_once_with(_svn().log.return_value[0], 'file:///tmp/svn/p/test/test2')
 
 class TestRepoObject(_TestWithRepoAndCommit):