jenkins-bot has submitted this change. ( 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1328712?usp=email )

Change subject: revertbot: Batch revision content requests
......................................................................

revertbot: Batch revision content requests

Load missing contents for the latest two revisions in one API request
before producing a manual revert. This reduces uncached manual reverts
from three revision requests to two while reusing content already
present in the page cache.

Change-Id: I504f9057dc4588875f0a3411a4916cf3efd64879
---
M scripts/revertbot.py
M tests/__init__.py
A tests/revertbot_tests.py
3 files changed, 89 insertions(+), 1 deletion(-)

Approvals:
  jenkins-bot: Verified
  Xqt: Looks good to me, approved




diff --git a/scripts/revertbot.py b/scripts/revertbot.py
index 2fc2df0..debe6d9 100755
--- a/scripts/revertbot.py
+++ b/scripts/revertbot.py
@@ -136,6 +136,13 @@
                                           textlink=True)))

         if not self.opt.rollback:
+            # Load missing contents together so the accesses below use cache.
+            missing_revids = [revision.revid for revision in history
+                              if revision.text is None]
+            if missing_revids:
+                page.site.loadrevisions(
+                    page, revids=missing_revids, content=True)
+
             comment = i18n.twtranslate(
                 self.site, 'revertbot-revert',
                 {'revid': rev.revid,
@@ -145,7 +152,7 @@
                 comment += ': ' + self.opt.comment

             old = page.text
-            page.text = page.get_revision(rev.revid, content=True).text
+            page.text = page.get_revision(rev.revid).text
             pywikibot.showDiff(old, page.text)
             page.save(comment)
             return comment
diff --git a/tests/__init__.py b/tests/__init__.py
index 7c0145f..4813220 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -198,6 +198,7 @@
     'redirect_bot',
     'reflinks',
     'replacebot',
+    'revertbot',
     'script',
     'speedy_delete',
     'template_bot',
diff --git a/tests/revertbot_tests.py b/tests/revertbot_tests.py
new file mode 100755
index 0000000..9f57cbc
--- /dev/null
+++ b/tests/revertbot_tests.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python3
+#
+# (C) Pywikibot team, 2026
+#
+# Distributed under the terms of the MIT license.
+#
+"""Tests for the revertbot script."""
+from __future__ import annotations
+
+from types import SimpleNamespace
+from unittest.mock import Mock, patch
+
+from scripts import revertbot
+from tests.aspects import TestCase
+
+
+class TestRevertBot(TestCase):
+
+    """Test revertbot revision loading."""
+
+    net = False
+
+    def setUp(self) -> None:
+        """Set up test bot and page."""
+        super().setUp()
+        self.site = Mock()
+        self.site.username.return_value = 'RevertBot'
+        self.site.lang = 'en'
+        self.bot = revertbot.ContribRevertBot(site=self.site)
+        self.page = Mock()
+        self.page.site = self.site
+        self.page.title.return_value = 'Test page'
+        self.latest = SimpleNamespace(revid=2, text=None)
+        self.previous = SimpleNamespace(
+            revid=1,
+            user='Example',
+            timestamp=Mock(),
+            text=None,
+        )
+        self.page.revisions.return_value = iter(
+            [self.latest, self.previous])
+        self.page.text = 'current text'
+        self.page.get_revision.return_value = SimpleNamespace(
+            text='previous text')
+        self.bot.get_page = Mock(return_value=self.page)
+
+    def test_manual_revert_batches_missing_content(self) -> None:
+        """Test that a manual revert batches missing revision texts."""
+        with patch.object(revertbot.i18n, 'twtranslate',
+                          return_value='Revert summary'), \
+             patch.object(revertbot.pywikibot, 'showDiff') as show_diff, \
+             patch.object(self.bot, 'local_timestamp', return_value='date'):
+            result = self.bot.revert({})
+
+        self.assertEqual(result, 'Revert summary')
+        self.page.revisions.assert_called_once_with(total=2)
+        self.site.loadrevisions.assert_called_once_with(
+            self.page, revids=[2, 1], content=True)
+        self.page.get_revision.assert_called_once_with(1)
+        show_diff.assert_called_once_with('current text', 'previous text')
+        self.page.save.assert_called_once_with('Revert summary')
+
+    def test_manual_revert_reuses_cached_content(self) -> None:
+        """Test that cached revision content is not requested again."""
+        self.latest.text = 'current text'
+
+        with patch.object(revertbot.i18n, 'twtranslate',
+                          return_value='Revert summary'), \
+             patch.object(revertbot.pywikibot, 'showDiff'), \
+             patch.object(self.bot, 'local_timestamp', return_value='date'):
+            self.bot.revert({})
+
+        self.site.loadrevisions.assert_called_once_with(
+            self.page, revids=[1], content=True)
+
+
+if __name__ == '__main__':
+    import unittest
+
+    unittest.main()

--
To view, visit 
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/1328712?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.wikimedia.org/r/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I504f9057dc4588875f0a3411a4916cf3efd64879
Gerrit-Change-Number: 1328712
Gerrit-PatchSet: 3
Gerrit-Owner: Mahveotm <[email protected]>
Gerrit-Reviewer: Xqt <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
Pywikibot-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to