[PATCH] kallithea pullrequests: allow limiting the number of additional changes shown

Mathias De Mare mathias.de_mare at nokia.com
Mon Dec 5 16:18:00 UTC 2022


# HG changeset patch
# User Mathias De Mare <mathias.de_mare at nokia.com>
# Date 1669726298 -3600
#      Tue Nov 29 13:51:38 2022 +0100
# Node ID 2a5de196e40454dc9437e31e2224c183779a61d9
# Parent  7037365a7bc351b81f05c790c6d3417d81d7bd5d
kallithea pullrequests: allow limiting the number of additional changes shown

We've noticed some scalability issues when many descendants exist
for the changesets in a pull request.
If we limit the number of proposed changesets to add to the review,
we no longer overwhelm Kallithea in this case.

(This occurred because we were merging a lot of heads in the repository.)

diff --git a/kallithea/controllers/pullrequests.py b/kallithea/controllers/pullrequests.py
--- a/kallithea/controllers/pullrequests.py
+++ b/kallithea/controllers/pullrequests.py
@@ -30,6 +30,7 @@ import traceback
 
 import formencode
 import mercurial.unionrepo
+import tg
 from tg import request
 from tg import tmpl_context as c
 from tg.i18n import ugettext as _
@@ -68,6 +69,14 @@ def _get_reviewer(user_id):
 
     return user
 
+def _filter_additional_changes_revs(revs):
+    """Allow hooking in to filter out some of the additional changes."""
+    additional_changes_rev_limit = tg.config.get('additional_changes_rev_limit')
+    if additional_changes_rev_limit and additional_changes_rev_limit.isnumeric():
+        new_revs = list(revs)
+        return new_revs[-int(additional_changes_rev_limit):]
+    else:
+        return revs
 
 class PullrequestsController(base.BaseRepoController):
 
@@ -523,6 +532,7 @@ class PullrequestsController(base.BaseRe
                 else: # look for descendants of PR head on source branch in org repo
                     avail_revs = org_scm_instance._repo.revs('%s:: & branch(%s)',
                                                              revs[0], c.cs_branch_name)
+                    avail_revs = _filter_additional_changes_revs(avail_revs)
                     if len(avail_revs) > 1: # more than just revs[0]
                         # also show changesets that not are descendants but would be merged in
                         targethead = other_scm_instance.get_changeset(c.a_branch_name).raw_id
@@ -537,6 +547,7 @@ class PullrequestsController(base.BaseRe
                             hgrepo = org_scm_instance._repo
                         show = set(hgrepo.revs('::%ld & !::parents(%s) & !::%s',
                                                avail_revs, revs[0], targethead))
+                        show = _filter_additional_changes_revs(show)
                         if show:
                             c.update_msg = _('The following additional changes are available on %s:') % c.cs_branch_name
                         else:
diff --git a/kallithea/tests/functional/test_pullrequests.py b/kallithea/tests/functional/test_pullrequests.py
--- a/kallithea/tests/functional/test_pullrequests.py
+++ b/kallithea/tests/functional/test_pullrequests.py
@@ -1,7 +1,9 @@
 import re
 
+import mock
 import pytest
 
+import kallithea.controllers
 from kallithea.controllers.pullrequests import PullrequestsController
 from kallithea.model import db, meta
 from kallithea.tests import base
@@ -390,3 +392,18 @@ class TestPullrequestsGetRepoRefs(base.T
                 content='line1\n', message='commit1', vcs_type='hg',
                 parent=None, newfile=True)
         # TODO
+
+class TestPullrequests(base.TestController):
+
+    def test_filter_additional_changes_no_rev_limit(self):
+        config_mock = {
+        }
+        with mock.patch('tg.config', config_mock):
+            assert len(kallithea.controllers.pullrequests._filter_additional_changes_revs(["1", "2", "3", "4"])) == 4
+
+    def test_filter_additional_changes_rev_limit(self):
+        config_mock = {
+            'additional_changes_rev_limit': "2",
+        }
+        with mock.patch('tg.config', config_mock):
+            assert len(kallithea.controllers.pullrequests._filter_additional_changes_revs(["1", "2", "3", "4"])) == 2



More information about the kallithea-general mailing list