[#5783] Only compute diffs for current page
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index 40a9bc3..14a523c 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -407,12 +407,12 @@
tree = self._commit.tree
limit, page, start = g.handle_paging(limit, page,
default=self.DEFAULT_PAGE_LIMIT)
+ diffs = self._commit.paged_diffs(start=start, end=start+limit)
result['artifacts'] = [
(t,f) for t in ('added', 'removed', 'changed', 'copied')
- for f in self._commit.diffs[t]
+ for f in diffs[t]
if t == 'removed' or tree.get_blob_by_path(f)]
- count = len(result['artifacts'])
- result['artifacts'] = result['artifacts'][start:start+limit]
+ count = diffs['total']
result.update(dict(page=page, limit=limit, count=count))
return result
diff --git a/Allura/allura/model/repo.py b/Allura/allura/model/repo.py
index 569cbb3..568e7f8 100644
--- a/Allura/allura/model/repo.py
+++ b/Allura/allura/model/repo.py
@@ -263,6 +263,9 @@
@LazyProperty
def diffs(self):
+ return self.paged_diffs()
+
+ def paged_diffs(self, start=0, end=None):
di = DiffInfoDoc.m.get(_id=self._id)
if di is None:
return Object(added=[], removed=[], changed=[], copied=[])
@@ -270,7 +273,7 @@
removed = []
changed = []
copied = []
- for change in di.differences:
+ for change in di.differences[start:end]:
if change.rhs_id is None:
removed.append(change.name)
elif change.lhs_id is None:
@@ -280,7 +283,8 @@
copied = self._diffs_copied(added, removed)
return Object(
added=added, removed=removed,
- changed=changed, copied=copied)
+ changed=changed, copied=copied,
+ total=len(di.differences))
def _diffs_copied(self, added, removed):
'''Return list with file renames diffs.
diff --git a/ForgeSVN/forgesvn/tests/model/test_repository.py b/ForgeSVN/forgesvn/tests/model/test_repository.py
index 9006271..f3ac7bc 100644
--- a/ForgeSVN/forgesvn/tests/model/test_repository.py
+++ b/ForgeSVN/forgesvn/tests/model/test_repository.py
@@ -208,12 +208,21 @@
print entry.message
print entry.diffs
+ def test_paged_diffs(self):
+ entry = self.repo.log(2, limit=1)[0]
+ self.assertEqual(entry.diffs, entry.paged_diffs())
+ self.assertEqual(entry.diffs, entry.paged_diffs(start=0))
+ expected = dict(
+ copied=[], changed=[], removed=[],
+ added=['/a/b', '/a/b/c'], total=4)
+ self.assertEqual(expected, entry.paged_diffs(start=1, end=3))
+
def test_diff_create_file(self):
entry = self.repo.log(1, limit=1)[0]
self.assertEqual(
entry.diffs, dict(
copied=[], changed=[],
- removed=[], added=['/README']))
+ removed=[], added=['/README'], total=1))
def test_diff_create_path(self):
entry = self.repo.log(2, limit=1)[0]
@@ -222,21 +231,21 @@
copied=[], changed=[], removed=[],
added=[
'/a', '/a/b', '/a/b/c',
- '/a/b/c/hello.txt']))
+ '/a/b/c/hello.txt'], total=4))
def test_diff_modify_file(self):
entry = self.repo.log(3, limit=1)[0]
self.assertEqual(
entry.diffs, dict(
copied=[], changed=['/README'],
- removed=[], added=[]))
+ removed=[], added=[], total=1))
def test_diff_delete(self):
entry = self.repo.log(4, limit=1)[0]
self.assertEqual(
entry.diffs, dict(
copied=[], changed=[],
- removed=['/a/b/c/hello.txt'], added=[]))
+ removed=['/a/b/c/hello.txt'], added=[], total=1))
def test_diff_copy(self):
# Copies are currently only detected as 'add'
@@ -244,7 +253,7 @@
self.assertEqual(
entry.diffs, dict(
copied=[], changed=[],
- removed=[], added=['/b']))
+ removed=[], added=['/b'], total=1))
def test_commit(self):
entry = self.repo.commit(1)