jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/993250?usp=email )
Change subject: [tests] Skip interwiki link test until the problem is solved upstream
......................................................................
[tests] Skip interwiki link test until the problem is solved upstream
Bug: T356009
Change-Id: I25afe1bd2042002bcd1bcd196d83106d701ef756
---
M tests/page_tests.py
1 file changed, 23 insertions(+), 7 deletions(-)
Approvals:
jenkins-bot: Verified
Xqt: Looks good to me, approved
diff --git a/tests/page_tests.py b/tests/page_tests.py
index b76de07..1104935 100755
--- a/tests/page_tests.py
+++ b/tests/page_tests.py
@@ -26,7 +26,7 @@
UnknownExtensionError,
)
from pywikibot.tools import suppress_warnings
-from tests import WARN_SITE_CODE
+from tests import WARN_SITE_CODE, unittest_print
from tests.aspects import (
DefaultDrySiteTestCase,
DefaultSiteTestCase,
@@ -522,15 +522,21 @@
mainpage = self.get_mainpage()
for p in mainpage.linkedPages():
self.assertIsInstance(p, pywikibot.Page)
- iw = list(mainpage.interwiki(expand=True))
- for p in iw:
- self.assertIsInstance(p, pywikibot.Link)
- for p2 in mainpage.interwiki(expand=False):
- self.assertIsInstance(p2, pywikibot.Link)
- self.assertIn(p2, iw)
+
+ if mainpage.site.sitename == 'wikipedia:en':
+ unittest_print('Skipping interwiki link test due to T356009')
+ else:
+ iw = set(mainpage.interwiki(expand=True))
+ for link in iw:
+ self.assertIsInstance(link, pywikibot.Link)
+ for link in mainpage.interwiki(expand=False):
+ self.assertIsInstance(link, pywikibot.Link)
+ self.assertIn(link, iw)
+
with suppress_warnings(WARN_SITE_CODE, category=UserWarning):
for p in mainpage.langlinks():
self.assertIsInstance(p, pywikibot.Link)
+
for p in mainpage.imagelinks():
self.assertIsInstance(p, pywikibot.FilePage)
for p in mainpage.templates():
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/993250?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I25afe1bd2042002bcd1bcd196d83106d701ef756
Gerrit-Change-Number: 993250
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/990720?usp=email )
Change subject: Pass login token when using action=login
......................................................................
Pass login token when using action=login
This will take care of the warning currently shown when logging in
using a BotPassword, where MediaWiki API warns that fetching a
token via "action=login" is deprecated. We already have fetched
the token and we just need to provide it here.
Bug: T309898
Change-Id: I77d22d1d4d3a3dc66abe3a64107c59ec37ea3a2a
---
M pywikibot/login.py
1 file changed, 19 insertions(+), 2 deletions(-)
Approvals:
Xqt: Looks good to me, approved
Huji: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/login.py b/pywikibot/login.py
index 4ce3eea..17c6924 100644
--- a/pywikibot/login.py
+++ b/pywikibot/login.py
@@ -348,7 +348,6 @@
if botpassword:
self.action = 'login'
else:
- token = self.site.tokens['login']
self.action = 'clientlogin'
# prepare default login parameters
@@ -356,11 +355,14 @@
self.keyword('user'): self.login_name,
self.keyword('password'): self.password}
+ if self.action == 'login':
+ parameters['lgtoken'] = self.site.tokens['login']
+
if self.action == 'clientlogin':
# clientlogin requires non-empty loginreturnurl
parameters['loginreturnurl'] = 'https://example.com'
parameters['rememberMe'] = '1'
- parameters['logintoken'] = token
+ parameters['logintoken'] = self.site.tokens['login']
if self.site.family.ldapDomain:
parameters[self.keyword('ldap')] = self.site.family.ldapDomain
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/990720?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I77d22d1d4d3a3dc66abe3a64107c59ec37ea3a2a
Gerrit-Change-Number: 990720
Gerrit-PatchSet: 2
Gerrit-Owner: Huji <huji.huji(a)gmail.com>
Gerrit-Reviewer: Huji <huji.huji(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/991917?usp=email )
Change subject: [flake8] Detect arguments shadowing of Python buildins and rename them
......................................................................
[flake8] Detect arguments shadowing of Python buildins and rename them
Change-Id: Ia3bc1df5bde80e90bceede3500421a9e530fad4b
---
M pywikibot/data/api/_optionset.py
M pywikibot/date.py
M pywikibot/site/_apisite.py
M pywikibot/site/_generators.py
M pywikibot/userinterfaces/terminal_interface_base.py
M pywikibot/userinterfaces/transliteration.py
M scripts/blockpageschecker.py
M scripts/dataextend.py
M tests/site_generators_tests.py
9 files changed, 93 insertions(+), 55 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/data/api/_optionset.py b/pywikibot/data/api/_optionset.py
index 500da9c..d31f0e4 100644
--- a/pywikibot/data/api/_optionset.py
+++ b/pywikibot/data/api/_optionset.py
@@ -1,6 +1,6 @@
"""Object representing boolean API option."""
#
-# (C) Pywikibot team, 2015-2022
+# (C) Pywikibot team, 2015-2024
#
# Distributed under the terms of the MIT license.
#
@@ -8,6 +8,9 @@
from collections.abc import MutableMapping
+import pywikibot
+from pywikibot.tools import deprecate_arg
+
__all__ = ['OptionSet']
@@ -24,30 +27,33 @@
None and after setting it, any site (even None) will fail.
"""
- def __init__(self, site=None,
+ @deprecate_arg('dict', 'data') # since 9.0
+ def __init__(self,
+ site: pywikibot.site.APISite | None = None,
module: str | None = None,
param: str | None = None,
- dict: dict | None = None) -> None:
- """
- Initializer.
+ data: dict | None = None) -> None:
+ """Initializer.
If a site is given, the module and param must be given too.
+ .. versionchanged:: 9.0
+ *dict* parameter was renamed to *data*.
+
:param site: The associated site
- :type site: pywikibot.site.APISite or None
:param module: The module name which is used by paraminfo. (Ignored
when site is None)
:param param: The parameter name inside the module. That parameter must
have a 'type' entry. (Ignored when site is None)
- :param dict: The initializing dict which is used for
- :py:obj:`from_dict`
+ :param data: The initializing data dict which is used for
+ :meth:`from_dict`
"""
self._site_set = False
self._enabled = set()
self._disabled = set()
self._set_site(site, module, param)
- if dict:
- self.from_dict(dict)
+ if data:
+ self.from_dict(data)
def _set_site(self, site, module: str, param: str,
clear_invalid: bool = False):
diff --git a/pywikibot/date.py b/pywikibot/date.py
index d79aa47..4a85afc 100644
--- a/pywikibot/date.py
+++ b/pywikibot/date.py
@@ -1,6 +1,6 @@
"""Date data and manipulation module."""
#
-# (C) Pywikibot team, 2003-2023
+# (C) Pywikibot team, 2003-2024
#
# Distributed under the terms of the MIT license.
#
@@ -26,7 +26,7 @@
)
from pywikibot.site import BaseSite
from pywikibot.textlib import NON_LATIN_DIGITS
-from pywikibot.tools import first_lower, first_upper
+from pywikibot.tools import deprecate_arg, first_lower, first_upper
if TYPE_CHECKING:
@@ -459,8 +459,9 @@
@singledispatch
+@deprecate_arg('filter', 'filter_func') # since 9.0
def dh(value: int, pattern: str, encf: encf_type, decf: decf_type,
- filter: Callable[[int], bool] | None = None) -> str:
+ filter_func: Callable[[int], bool] | None = None) -> str:
"""Function to help with year parsing.
Usually it will be used as a lambda call in a map::
@@ -477,6 +478,9 @@
This function is a complement of decf.
+ .. versionchanged:: 9.0
+ *filter* parameter was renamed to *filter_func*
+
:param decf:
Converts a tuple/list of non-negative integers found in the original
value string
@@ -490,7 +494,7 @@
# Encode an integer value into a textual form.
# This will be called from outside as well as recursivelly to verify
# parsed value
- if filter and not filter(value):
+ if filter_func and not filter_func(value):
raise ValueError(f'value {value} is not allowed')
params = encf(value)
@@ -512,7 +516,7 @@
@dh.register(str)
def _(value: str, pattern: str, encf: encf_type, decf: decf_type,
- filter: Callable[[int], bool] | None = None) -> int:
+ filter_func: Callable[[int], bool] | None = None) -> int:
compPattern, _strPattern, decoders = escapePattern2(pattern)
m = compPattern.match(value)
if m:
@@ -525,8 +529,8 @@
'Decoder must not return a string!'
# recursive call to re-encode and see if we get the original
- # (may through filter exception)
- if value == dh(decValue, pattern, encf, decf, filter):
+ # (may through filter_func exception)
+ if value == dh(decValue, pattern, encf, decf, filter_func):
return decValue
raise ValueError("reverse encoding didn't match")
diff --git a/pywikibot/site/_apisite.py b/pywikibot/site/_apisite.py
index 9aa95d4..53ec3a3 100644
--- a/pywikibot/site/_apisite.py
+++ b/pywikibot/site/_apisite.py
@@ -1,6 +1,6 @@
"""Objects representing API interface to MediaWiki site."""
#
-# (C) Pywikibot team, 2008-2023
+# (C) Pywikibot team, 2008-2024
#
# Distributed under the terms of the MIT license.
#
@@ -73,6 +73,7 @@
from pywikibot.tools import (
MediaWikiVersion,
cached,
+ deprecate_arg,
deprecated,
issue_deprecation_warning,
merge_unique_dicts,
@@ -1394,18 +1395,22 @@
# 'title' is expected to be URL-encoded already
return self.siteinfo['articlepath'].replace('$1', title)
- def namespace(self, num: int, all: bool = False) -> str | Namespace:
+ @deprecate_arg('all', 'all_ns') # since 9.0
+ def namespace(self, num: int, all_ns: bool = False) -> str | Namespace:
"""Return string containing local name of namespace 'num'.
- If optional argument 'all' is true, return all recognized
+ If optional argument *all_ns* is true, return all recognized
values for this namespace.
+ .. versionchanged:: 9.0
+ *all* parameter was renamed to *all_ns*.
+
:param num: Namespace constant.
- :param all: If True return a Namespace object. Otherwise
- return the namespace name.
- :return: local name or Namespace object
+ :param all_ns: If True return a :class:`Namespace` object.
+ Otherwise return the namespace name.
+ :return: local name or :class:`Namespace` object
"""
- if all:
+ if all_ns:
return self.namespaces[num]
return self.namespaces[num][0]
diff --git a/pywikibot/site/_generators.py b/pywikibot/site/_generators.py
index 96be68e..1b36d19 100644
--- a/pywikibot/site/_generators.py
+++ b/pywikibot/site/_generators.py
@@ -1,6 +1,6 @@
"""Objects representing API generators to MediaWiki site."""
#
-# (C) Pywikibot team, 2008-2023
+# (C) Pywikibot team, 2008-2024
#
# Distributed under the terms of the MIT license.
#
@@ -26,7 +26,11 @@
)
from pywikibot.site._decorators import need_right
from pywikibot.site._namespace import NamespaceArgType
-from pywikibot.tools import is_ip_address, issue_deprecation_warning
+from pywikibot.tools import (
+ deprecate_arg,
+ is_ip_address,
+ issue_deprecation_warning,
+)
from pywikibot.tools.itertools import filter_unique
@@ -2070,41 +2074,43 @@
"""
return self.querypage('Listredirects', total)
+ @deprecate_arg('type', 'protect_type')
def protectedpages(
self,
namespace=0,
- type: str = 'edit',
+ protect_type: str = 'edit',
level: str | bool = False,
total=None
):
- """
- Return protected pages depending on protection level and type.
+ """Return protected pages depending on protection level and type.
For protection types which aren't 'create' it uses
:py:obj:`APISite.allpages`, while it uses for 'create' the
'query+protectedtitles' module.
+ .. versionchanged:: 9.0
+ *type* parameter was renamed to *protect_type*.
.. seealso:: :api:`Protectedtitles`
:param namespace: The searched namespace.
:type namespace: int or Namespace or str
- :param type: The protection type to search for (default 'edit').
- :type type: str
+ :param protect_type: The protection type to search for
+ (default 'edit').
:param level: The protection level (like 'autoconfirmed'). If False it
shows all protection levels.
:return: The pages which are protected.
:rtype: typing.Iterable[pywikibot.Page]
"""
namespaces = self.namespaces.resolve(namespace)
- # always assert that, so we are be sure that type could be 'create'
+ # always assert, so we are be sure that protect_type could be 'create'
assert 'create' in self.protection_types(), \
"'create' should be a valid protection type."
- if type == 'create':
+ if protect_type == 'create':
return self._generator(
api.PageGenerator, type_arg='protectedtitles',
namespaces=namespaces, gptlevel=level, total=total)
return self.allpages(namespace=namespaces[0], protect_level=level,
- protect_type=type, total=total)
+ protect_type=protect_type, total=total)
def pages_with_property(self, propname: str, *,
total: int | None = None):
diff --git a/pywikibot/userinterfaces/terminal_interface_base.py b/pywikibot/userinterfaces/terminal_interface_base.py
index 8346abb..83f7f4a 100644
--- a/pywikibot/userinterfaces/terminal_interface_base.py
+++ b/pywikibot/userinterfaces/terminal_interface_base.py
@@ -1,6 +1,6 @@
"""Base for terminal user interfaces."""
#
-# (C) Pywikibot team, 2003-2023
+# (C) Pywikibot team, 2003-2024
#
# Distributed under the terms of the MIT license.
#
@@ -313,10 +313,10 @@
if char == '?' and text[i] != '?':
try:
transliterated = transliterator.transliterate(
- text[i], default='?', prev=prev, next=text[i + 1])
+ text[i], default='?', prev=prev, succ=text[i + 1])
except IndexError:
transliterated = transliterator.transliterate(
- text[i], default='?', prev=prev, next=' ')
+ text[i], default='?', prev=prev, succ=' ')
# transliteration was successful. The replacement
# could consist of multiple letters.
# mark the transliterated letters in yellow.
diff --git a/pywikibot/userinterfaces/transliteration.py b/pywikibot/userinterfaces/transliteration.py
index 85755fa..0bbc083 100644
--- a/pywikibot/userinterfaces/transliteration.py
+++ b/pywikibot/userinterfaces/transliteration.py
@@ -1,11 +1,13 @@
"""Module to transliterate text."""
#
-# (C) Pywikibot team, 2006-2022
+# (C) Pywikibot team, 2006-2024
#
# Distributed under the terms of the MIT license.
#
from __future__ import annotations
+from pywikibot.tools import deprecate_arg
+
#: Non latin digits used by the framework
NON_LATIN_DIGITS = {
@@ -1119,15 +1121,18 @@
trans[char] = value
self.trans = trans
+ @deprecate_arg('next', 'succ') # since 9.0
def transliterate(self, char: str, default: str = '?',
- prev: str = '-', next: str = '-') -> str:
- """
- Transliterate the character.
+ prev: str = '-', succ: str = '-') -> str:
+ """Transliterate the character.
+
+ .. versionchanged:: 9.0
+ *next* parameter was renamed to *succ*.
:param char: The character to transliterate.
:param default: The character used when there is no transliteration.
:param prev: The previous character
- :param next: The next character
+ :param succ: The succeeding character
:return: The transliterated character which may be an empty string
"""
result = default
@@ -1138,7 +1143,7 @@
result = prev
# Japanese
elif char == 'ッ':
- result = self.transliterate(next)[0]
+ result = self.transliterate(succ)[0]
elif char in '々仝ヽヾゝゞ〱〲〳〵〴〵':
result = prev
# Lao
diff --git a/scripts/blockpageschecker.py b/scripts/blockpageschecker.py
index 438cbc8..154dba0 100755
--- a/scripts/blockpageschecker.py
+++ b/scripts/blockpageschecker.py
@@ -44,7 +44,7 @@
"""
#
-# (C) Pywikibot team, 2007-2023
+# (C) Pywikibot team, 2007-2024
#
# Distributed under the terms of the MIT license.
#
@@ -474,7 +474,7 @@
elif arg in ('-protectedpages', '-moveprotected'):
protect_type = 'move' if option.startswith('move') else 'edit'
generator = site.protectedpages(namespace=int(value or 0),
- type=protect_type)
+ protect_type=protect_type)
if not generator:
generator = gen_factory.getCombinedGenerator()
diff --git a/scripts/dataextend.py b/scripts/dataextend.py
index 0c97fe9..6c03a22 100755
--- a/scripts/dataextend.py
+++ b/scripts/dataextend.py
@@ -1282,9 +1282,9 @@
TAGRE = re.compile('<[^<>]*>')
SCRIPTRE = re.compile('(?s)<script.*?</script>')
- def __init__(self, id, data=None, item=None, bot=None):
+ def __init__(self, ident, data=None, item=None, bot=None):
"""Initializer."""
- self.id = id
+ self.id = ident
self.data = defaultdict(dict) if data is None else data
self.dbname = None
self.urlbase = None
@@ -16388,12 +16388,12 @@
class UrlAnalyzer(Analyzer):
- def __init__(self, id, data=None, item=None, bot=None):
+ def __init__(self, ident, data=None, item=None, bot=None):
"""Initializer."""
if data is None:
data = defaultdict(dict)
- super().__init__(id.split('/', 3)[-1], data, item, bot)
- self.urlbase = id
+ super().__init__(ident.split('/', 3)[-1], data, item, bot)
+ self.urlbase = ident
self.dbproperty = None
self.isurl = True
diff --git a/tests/site_generators_tests.py b/tests/site_generators_tests.py
index f73189a..1f74014 100755
--- a/tests/site_generators_tests.py
+++ b/tests/site_generators_tests.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""Tests for generators of the site module."""
#
-# (C) Pywikibot team, 2008-2023
+# (C) Pywikibot team, 2008-2024
#
# Distributed under the terms of the MIT license.
#
@@ -571,14 +571,15 @@
def test_protectedpages_create(self):
"""Test that protectedpages returns protected page titles."""
- pages = list(self.get_site().protectedpages(type='create', total=10))
+ pages = list(self.get_site().protectedpages(protect_type='create',
+ total=10))
# Do not check for the existence of pages as they might exist (T205883)
self.assertLessEqual(len(pages), 10)
def test_protectedpages_edit(self):
"""Test that protectedpages returns protected pages."""
site = self.get_site()
- pages = list(site.protectedpages(type='edit', total=10))
+ pages = list(site.protectedpages(protect_type='edit', total=10))
for page in pages:
self.assertTrue(page.exists())
self.assertIn('edit', page.protection())
@@ -590,7 +591,8 @@
levels = set()
all_levels = site.protection_levels().difference([''])
for level in all_levels:
- if list(site.protectedpages(type='edit', level=level, total=1)):
+ if list(site.protectedpages(protect_type='edit', level=level,
+ total=1)):
levels.add(level)
if not levels:
self.skipTest(
@@ -602,7 +604,8 @@
# if only one level found, then use any other except that
level = next(iter(all_levels.difference([level])))
invalid_levels = all_levels.difference([level])
- pages = list(site.protectedpages(type='edit', level=level, total=10))
+ pages = list(site.protectedpages(protect_type='edit', level=level,
+ total=10))
for page in pages:
self.assertTrue(page.exists())
self.assertIn('edit', page.protection())
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/991917?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ia3bc1df5bde80e90bceede3500421a9e530fad4b
Gerrit-Change-Number: 991917
Gerrit-PatchSet: 4
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: D3r1ck01 <dalangi-ctr(a)wikimedia.org>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/993213?usp=email )
Change subject: [dist] add pyproject.toml
......................................................................
[dist] add pyproject.toml
While build only installs setuptools and weel to isolated environment
but packaging is needed by setup.py. add pyproject.toml file to
determine requirements for build-system.
Remove flake8-executable due to false possitives.
Bug: T355988
Change-Id: Ib241d68109d87cc0924994729922c222ce0888e9
---
A pyproject.toml
1 file changed, 18 insertions(+), 0 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..e94bba3
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,2 @@
+[build-system]
+requires = ["packaging", "setuptools", "wheel"]
\ No newline at end of file
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/993213?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: Ib241d68109d87cc0924994729922c222ce0888e9
Gerrit-Change-Number: 993213
Gerrit-PatchSet: 4
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: JJMC89 <JJMC89.Wikimedia(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/993215?usp=email )
Change subject: [dest] remove final print statement
......................................................................
[dest] remove final print statement
with new build system and make_dist script the final print statement
is shown during build of the Pywikibot package but no longer at the
end. Remove it because the checking result is enough information.
Change-Id: I0e86a2e70ae2cb65896be56117c17bcc39db9b22
---
M setup.py
1 file changed, 13 insertions(+), 4 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/setup.py b/setup.py
index fd8bd4b..d217e9b 100755
--- a/setup.py
+++ b/setup.py
@@ -350,10 +350,6 @@
],
)
- # Finally show distribution version before uploading
- if 'sdist' in sys.argv:
- print(f'\nDistribution package created for version {version}')
-
if __name__ == '__main__': # pragma: no cover
main()
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/993215?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I0e86a2e70ae2cb65896be56117c17bcc39db9b22
Gerrit-Change-Number: 993215
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged