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]