jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/842906 )
Change subject: [IMPR] use pathlib.Path to manage sys.path entries in conf.py
......................................................................
[IMPR] use pathlib.Path to manage sys.path entries in conf.py
This adds the pywikibot folder in a canonical way.
Change-Id: I2b13f1d17e02044cee0f810eff795d32c201c4da
---
M docs/conf.py
1 file changed, 4 insertions(+), 7 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/docs/conf.py b/docs/conf.py
index 55fdafc..40f4cfd 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -18,13 +18,13 @@
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
+# documentation root, use Path.resolve() to make it absolute, like shown here.
#
import os
import re
import sys
import warnings
-from os.path import abspath, dirname, join
+from pathlib import Path
# Deprecated classes will generate warnings as Sphinx processes them.
@@ -32,11 +32,8 @@
warnings.simplefilter(action='ignore', category=FutureWarning)
-docs_dir = dirname(__file__)
-repo_dir = abspath(join(docs_dir, '..'))
-sys.path.insert(0, repo_dir + '/pywikibot')
-sys.path.insert(0, repo_dir)
-os.chdir(repo_dir)
+repo_dir = Path(__file__).resolve().parents[1]
+sys.path = [str(repo_dir), str(repo_dir / 'pywikibot')] + sys.path
os.environ['PYWIKIBOT_NO_USER_CONFIG'] = '1'
import pywikibot # noqa: E402
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/842906
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: I2b13f1d17e02044cee0f810eff795d32c201c4da
Gerrit-Change-Number: 842906
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/+/582299 )
Change subject: [tests] decorate MW version
......................................................................
[tests] decorate MW version
Bug: T130516
Change-Id: Ic3790694f540614828b0c4303de4091bdd613c48
---
M tests/README.rst
M tests/api_tests.py
M tests/aspects.py
M tests/edit_tests.py
M tests/site_generators_tests.py
5 files changed, 71 insertions(+), 23 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/tests/README.rst b/tests/README.rst
index 7c62773..acc4b21 100644
--- a/tests/README.rst
+++ b/tests/README.rst
@@ -207,6 +207,17 @@
@require_modules(['important1', 'musthave2'])
def test_require_modules(self):
+(a)tests.aspects.require_version
+------------------------------
+Require a given MediaWiki version
+
+::
+
+ from tests.aspects import require_version
+ [......]
+ @require_version('>=1.27.0')
+ def test_require_version(self):
+
@unittest.mock.patch
-----------------------
Replaces `target` with object specified in `new`. Refer to mock's documentation.
diff --git a/tests/api_tests.py b/tests/api_tests.py
index e945abd..560356e 100755
--- a/tests/api_tests.py
+++ b/tests/api_tests.py
@@ -18,7 +18,9 @@
from pywikibot.exceptions import APIError, NoUsernameError
from pywikibot.throttle import Throttle
from pywikibot.tools import suppress_warnings
+
from tests.aspects import (
+ require_version,
DefaultDrySiteTestCase,
DefaultSiteTestCase,
TestCase,
@@ -292,13 +294,10 @@
self.assertIn('query+revisions', pi.prefix_map)
+ @require_version('>=1.25wmf4', 'support the new paraminfo api')
def test_new_mode(self):
"""Test the new modules-only mode explicitly."""
site = self.get_site()
- if site.mw_version < '1.25wmf4':
- self.skipTest(
- "version {} doesn't support the new paraminfo api"
- .format(site.mw_version))
pi = api.ParamInfo(site, modules_only_mode=True)
pi.fetch(['info'])
self.assertIn('query+info', pi._paraminfo)
diff --git a/tests/aspects.py b/tests/aspects.py
index 36709de..60c442d 100644
--- a/tests/aspects.py
+++ b/tests/aspects.py
@@ -19,6 +19,7 @@
import warnings
from collections.abc import Sized
from contextlib import contextmanager, suppress
+from functools import wraps
from http import HTTPStatus
from unittest.util import safe_repr
@@ -35,6 +36,7 @@
from pywikibot.family import WikimediaFamily
from pywikibot.site import BaseSite
from pywikibot.tools import suppress_warnings
+from pywikibot.tools import MediaWikiVersion # noqa: F401 (used by f-string)
from tests import (
WARN_SITE_CODE,
patch_request,
@@ -311,6 +313,59 @@
return test_requirement
+def require_version(version_needed: str, reason: str = ''):
+ """Require minimum MediaWiki version to be queried.
+
+ The version needed for the test; must be given with a preleading rich
+ comparisons operator like ``<1.27wmf4`` or ``>=1.39``. If the
+ comparison does not match the test will be skipped.
+
+ This decorator can only be used for TestCase having a single site.
+ It cannot be used for DrySite tests. In addition version comparison
+ for other than the current site e.g. for the related data or image
+ repositoy of the current site is ot possible.
+
+ .. versionadded:: 8.0.0
+
+ :param version_needed: The version needed
+ :param reason: A reason for skipping the test.
+ :raises Exception: Usage validation fails
+ """
+ def test_requirement(method):
+ """Test the requirement and return an optionally decorated object."""
+ @wraps(method)
+ def wrapper(self, *args, **kwargs):
+ """Validate environment."""
+ if not isinstance(self.site, BaseSite) \
+ or isinstance(self.site, DrySite):
+ raise Exception(
+ f'{type(self).__name__}.site must be a BaseSite not '
+ f'{type(self.site).__name__}.')
+
+ if args or kwargs:
+ raise Exception(
+ f'Test method {method.__name__!r} has parameters which is '
+ f'not supported with require_version decorator.')
+
+ _, op, version = re.split('([<>]=?)', version_needed)
+ if not op:
+ raise Exception(f'There is no valid operator given with '
+ f'version {version_needed!r}')
+
+ skip = not eval(
+ f'self.site.mw_version {op} MediaWikiVersion(version)')
+ if not skip:
+ return method(self, *args, **kwargs)
+
+ myreason = ' to ' + reason if reason else ''
+ raise unittest.SkipTest(
+ f'MediaWiki {op} v{version} required{myreason}.')
+
+ return wrapper
+
+ return test_requirement
+
+
class DisableSiteMixin(TestCaseBase):
"""Test cases not connected to a Site object.
diff --git a/tests/edit_tests.py b/tests/edit_tests.py
index 6fb8834..e967087 100755
--- a/tests/edit_tests.py
+++ b/tests/edit_tests.py
@@ -12,7 +12,7 @@
import pywikibot
from pywikibot import config, page_put_queue
from pywikibot.exceptions import Error
-from tests.aspects import TestCase
+from tests.aspects import TestCase, require_version
from tests.oauth_tests import OAuthSiteTestCase
@@ -79,17 +79,13 @@
write = True
rights = 'mergehistory'
+ @require_version('>=1.27.0wmf.13', 'support the history merge API')
def setup_test_pages(self):
"""Helper function to set up pages that we will use in these tests."""
site = self.get_site()
source = pywikibot.Page(site, 'User:Sn1per/MergeTest1')
dest = pywikibot.Page(site, 'User:Sn1per/MergeTest2')
- # Make sure the wiki supports action=mergehistory
- if site.mw_version < '1.27.0-wmf.13':
- self.skipTest('Wiki version must be 1.27.0-wmf.13 or newer to '
- 'support the history merge API.')
-
if source.exists():
source.delete('Pywikibot merge history unit test')
if dest.exists():
diff --git a/tests/site_generators_tests.py b/tests/site_generators_tests.py
index ba0b11c..7f02d86 100644
--- a/tests/site_generators_tests.py
+++ b/tests/site_generators_tests.py
@@ -110,9 +110,6 @@
def test_page_redirects(self):
"""Test Site.page_redirects."""
- if self.get_site().mw_version < '1.24':
- self.skipTest('site.page_redirects() needs mw 1.24')
-
redirects_ns_0 = set(self.site.page_redirects(
self.mainpage,
namespaces=0,
@@ -1262,13 +1259,6 @@
login = True
- @classmethod
- def setUpClass(cls):
- """Skip test if necessary."""
- super().setUpClass()
- if cls.site.mw_version < '1.25':
- cls.skipTest(cls, 'site.alldeletedrevisions() needs mw 1.25')
-
def test_basic(self):
"""Test the site.alldeletedrevisions() method."""
mysite = self.get_site()
@@ -1430,9 +1420,6 @@
def test_prefix(self):
"""Test the site.alldeletedrevisions() method with prefix."""
mysite = self.get_site()
- if mysite.mw_version < '1.25':
- self.skipTest('site.alldeletedrevisions() needs mw 1.25')
-
for data in mysite.alldeletedrevisions(prefix='John', total=5):
self.assertIsInstance(data, dict)
for key in ('title', 'ns', 'revisions'):
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/582299
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: Ic3790694f540614828b0c4303de4091bdd613c48
Gerrit-Change-Number: 582299
Gerrit-PatchSet: 20
Gerrit-Owner: Dvorapa <dvorapa(a)seznam.cz>
Gerrit-Reviewer: Dvorapa <dvorapa(a)seznam.cz>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
Xqt has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/843504 )
Change subject: [doc] Fix some documentation parts
......................................................................
[doc] Fix some documentation parts
Change-Id: I29c3b42b18c6baa0088b5691134af2d6833f1dc9
---
M pywikibot/page/_category.py
1 file changed, 2 insertions(+), 2 deletions(-)
Approvals:
Xqt: Verified; Looks good to me, approved
diff --git a/pywikibot/page/_category.py b/pywikibot/page/_category.py
index 4a7e718..fbb5fe7 100644
--- a/pywikibot/page/_category.py
+++ b/pywikibot/page/_category.py
@@ -151,10 +151,10 @@
first-level subcats, but no deeper.)
:param total: iterate no more than this number of pages in
total (at all levels)
- :param kwargs: Additional parameters. Refer
+ :param kwargs: Additional parameters. Refer to
:meth:`APISite.categorymembers()
<pywikibot.site._generators.GeneratorsMixin.categorymembers>`
- for them except of *member_type*.
+ for complete list (*member_type* excluded).
"""
if kwargs.pop('member_type', False):
raise TypeError(
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/843504
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: I29c3b42b18c6baa0088b5691134af2d6833f1dc9
Gerrit-Change-Number: 843504
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-MessageType: merged
jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/841471 )
Change subject: [doc] Refer APISite.categorymembers for Category.articles parameters
......................................................................
[doc] Refer APISite.categorymembers for Category.articles parameters
- Only allow keyword arguments with Category.articles()
- use **kwargs to pass parameters to the underlying APISite.categorymembers()
- refer to categorymembers for parameter documentation
- raise TypeError instead of pywikibot.Error in categorymembers()
if category is not a Category page.
- update documentation
Bug: T320455
Change-Id: I83468a5cd3c062214c82542d6371a0daa84260d3
---
M pywikibot/page/_category.py
M pywikibot/site/_generators.py
2 files changed, 75 insertions(+), 75 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/page/_category.py b/pywikibot/page/_category.py
index 398cd3c..4a7e718 100644
--- a/pywikibot/page/_category.py
+++ b/pywikibot/page/_category.py
@@ -5,10 +5,10 @@
# Distributed under the terms of the MIT license.
#
from collections import defaultdict
-from typing import Optional, Union
+from typing import Any, Optional, Union
import pywikibot
-from pywikibot.backports import Generator, List
+from pywikibot.backports import Generator, Iterable
from pywikibot.page._page import Page
@@ -119,61 +119,52 @@
if total == 0:
return
- def articles(self,
+ def articles(self, *,
recurse: Union[int, bool] = False,
total: Optional[int] = None,
- content: bool = False,
- namespaces: Union[int, List[int]] = None,
- sortby: Optional[str] = None,
- reverse: bool = False,
- starttime=None, endtime=None,
- startprefix: Optional[str] = None,
- endprefix: Optional[str] = None):
+ **kwargs: Any) -> Iterable[Page]:
"""
Yield all articles in the current category.
- By default, yields all *pages* in the category that are not
- subcategories!
+ By default, yields all pages in the category that are not
+ subcategories.
+
+ **Usage:**
+
+ >>> site = pywikibot.Site('wikipedia:test')
+ >>> cat = pywikibot.Category(site, 'Pywikibot')
+ >>> list(cat.articles())
+ [Page('Pywikibot nobots test')]
+ >>> for p in cat.articles(recurse=1, namespaces=2, total=3):
+ ... print(p.depth)
+ ...
+ 2
+ 3
+ 4
+
+ .. versionchanged:: 8.0.0
+ all parameters are keyword arguments only.
:param recurse: if not False or 0, also iterate articles in
subcategories. If an int, limit recursion to this number of
- levels. (Example: recurse=1 will iterate articles in first-level
- subcats, but no deeper.)
+ levels. (Example: ``recurse=1`` will iterate articles in
+ first-level subcats, but no deeper.)
:param total: iterate no more than this number of pages in
total (at all levels)
- :param namespaces: only yield pages in the specified namespaces
- :param content: if True, retrieve the content of the current version
- of each page (default False)
- :param sortby: determines the order in which results are generated,
- valid values are "sortkey" (default, results ordered by category
- sort key) or "timestamp" (results ordered by time page was
- added to the category). This applies recursively.
- :param reverse: if True, generate results in reverse order
- (default False)
- :param starttime: if provided, only generate pages added after this
- time; not valid unless sortby="timestamp"
- :type starttime: pywikibot.Timestamp
- :param endtime: if provided, only generate pages added before this
- time; not valid unless sortby="timestamp"
- :type endtime: pywikibot.Timestamp
- :param startprefix: if provided, only generate pages >= this title
- lexically; not valid if sortby="timestamp"
- :param endprefix: if provided, only generate pages < this title
- lexically; not valid if sortby="timestamp"
- :rtype: typing.Iterable[pywikibot.Page]
+ :param kwargs: Additional parameters. Refer
+ :meth:`APISite.categorymembers()
+ <pywikibot.site._generators.GeneratorsMixin.categorymembers>`
+ for them except of *member_type*.
"""
+ if kwargs.pop('member_type', False):
+ raise TypeError(
+ "articles() got an unexpected keyword argument 'member_type'")
+
seen = set()
for member in self.site.categorymembers(self,
- namespaces=namespaces,
total=total,
- content=content,
- sortby=sortby,
- reverse=reverse,
- starttime=starttime,
- endtime=endtime,
- startprefix=startprefix,
- endprefix=endprefix,
- member_type=['page', 'file']):
+ member_type=['page', 'file'],
+ **kwargs):
if recurse:
seen.add(hash(member))
yield member
@@ -188,14 +179,7 @@
for subcat in self.subcategories():
for article in subcat.articles(recurse=recurse,
total=total,
- content=content,
- namespaces=namespaces,
- sortby=sortby,
- reverse=reverse,
- starttime=starttime,
- endtime=endtime,
- startprefix=startprefix,
- endprefix=endprefix):
+ **kwargs):
hash_value = hash(article)
if hash_value in seen:
continue
diff --git a/pywikibot/site/_generators.py b/pywikibot/site/_generators.py
index b3d6621..25f205f 100644
--- a/pywikibot/site/_generators.py
+++ b/pywikibot/site/_generators.py
@@ -461,19 +461,33 @@
titles=tltitle, namespaces=namespaces,
total=total, g_content=content)
- def categorymembers(self, category, *,
- namespaces=None,
- sortby: Optional[str] = None,
- reverse: bool = False,
- starttime=None,
- endtime=None,
- total: Optional[int] = None,
- content: bool = False,
- member_type=None,
- startprefix: Optional[str] = None,
- endprefix: Optional[str] = None):
+ def categorymembers(
+ self,
+ category: 'pywikibot.Category', *,
+ namespaces=None,
+ sortby: Optional[str] = None,
+ reverse: bool = False,
+ starttime: Optional[pywikibot.time.Timestamp] = None,
+ endtime: Optional[pywikibot.time.Timestamp] = None,
+ total: Optional[int] = None,
+ startprefix: Optional[str] = None,
+ endprefix: Optional[str] = None,
+ content: bool = False,
+ member_type: Union[str, Iterable[str], None] = None
+ ) -> Iterable['pywikibot.Page']:
"""Iterate members of specified category.
+ You should not use this method directly; instead use one of the
+ following:
+
+ - :meth:`pywikibot.Category.articles`
+ - :meth:`pywikibot.Category.members`
+ - :meth:`pywikibot.Category.subcategories`
+
+ .. versionchanged:: 4.0.0
+ parameters except *category* are keyword arguments only.
+ .. versionchanged:: 8.0.0
+ raises TypeError instead of Error if no Category is specified
.. seealso:: :api:`Categorymembers`
:param category: The Category to iterate.
@@ -491,7 +505,6 @@
(default False)
:param starttime: if provided, only generate pages added after this
time; not valid unless sortby="timestamp"
- :type starttime: time.Timestamp
:param endtime: if provided, only generate pages added before this
time; not valid unless sortby="timestamp"
:param startprefix: if provided, only generate pages >= this title
@@ -500,19 +513,20 @@
lexically; not valid if sortby="timestamp"
:param content: if True, load the current content of each iterated page
(default False)
- :param member_type: member type; if member_type includes 'page' and is
- used in conjunction with sortby="timestamp", the API may limit
- results to only pages in the first 50 namespaces.
- :type member_type: str or iterable of str;
- values: page, subcat, file
- :rtype: typing.Iterable[pywikibot.Page]
+ :param member_type: member type; values must be ``page``,
+ ``subcat``, ``file``. If member_type includes ``page`` and
+ is used in conjunction with sortby="timestamp", the API may
+ limit results to only pages in the first 50 namespaces.
+
:raises KeyError: a namespace identifier was not resolved
:raises TypeError: a namespace identifier has an inappropriate
type such as NoneType or bool
+ :raises TypeError: no Category is specified
+ :raises ValueError: invalid values given
"""
if category.namespace() != 14:
- raise Error('categorymembers: non-Category page {!r} specified'
- .format(category))
+ raise TypeError(
+ f'categorymembers: non-Category page {category!r} specified')
cmtitle = category.title(with_section=False).encode(self.encoding())
cmargs = {
@@ -524,12 +538,13 @@
if sortby in ['sortkey', 'timestamp']:
cmargs['gcmsort'] = sortby
elif sortby:
- raise ValueError('categorymembers: invalid sortby value {!r}'
- .format(sortby))
+ raise ValueError(
+ f'categorymembers: invalid sortby value {sortby!r}')
if starttime and endtime and starttime > endtime:
raise ValueError(
'categorymembers: starttime must be before endtime')
+
if startprefix and endprefix and startprefix > endprefix:
raise ValueError(
'categorymembers: startprefix must be less than endprefix')
@@ -543,6 +558,7 @@
if 'page' in member_type:
excluded_namespaces = set()
+
if 'file' not in member_type:
excluded_namespaces.add(6)
if 'subcat' not in member_type:
@@ -551,8 +567,8 @@
if namespaces:
if excluded_namespaces.intersection(namespaces):
raise ValueError(
- 'incompatible namespaces {!r} and member_type {!r}'
- .format(namespaces, member_type))
+ f'incompatible namespaces {namespaces!r} and '
+ f'member_type {member_type!r}')
# All excluded namespaces are not present in `namespaces`.
else:
# If the number of namespaces is greater than permitted by
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/841471
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: I83468a5cd3c062214c82542d6371a0daa84260d3
Gerrit-Change-Number: 841471
Gerrit-PatchSet: 5
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: RoySmith <roy(a)panix.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged
Xqt has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/842951 )
Change subject: [fix] fix make_dist usage
......................................................................
[fix] fix make_dist usage
Change-Id: If0850e1880ac9509c172d437b61b633a277bd22c
---
M setup.py
1 file changed, 1 insertion(+), 1 deletion(-)
Approvals:
Xqt: Verified; Looks good to me, approved
diff --git a/setup.py b/setup.py
index 6e1550c..e0e424e 100755
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@
by the corresponding final release
- create the package with::
- make_dist remote
+ make_dist -remote
- create a new tag with the version number of the final release
- synchronize the local tags with the remote repositoy
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/core/+/842951
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: If0850e1880ac9509c172d437b61b633a277bd22c
Gerrit-Change-Number: 842951
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-MessageType: merged
jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/i18n/+/842930 )
Change subject: [doc] Update init docstring
......................................................................
[doc] Update init docstring
Change-Id: Ia820637f946d44c733758f5bf73e747da1dbc7b7
---
M __init__.py
1 file changed, 4 insertions(+), 3 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/__init__.py b/__init__.py
index 17fce48..8bd476e 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,6 +1,7 @@
-"""
-This is a fake __init__.py to help pkgutil find the i18n data. There
-is no actual python code in this package.
+"""Folder containing i18n translations bundles.
+
+This file exists to help pkgutil find the i18n data. There is no actual
+python code in this package.
"""
#
# (C) Pywikibot team, 2011-2022
--
To view, visit https://gerrit.wikimedia.org/r/c/pywikibot/i18n/+/842930
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/i18n
Gerrit-Branch: master
Gerrit-Change-Id: Ia820637f946d44c733758f5bf73e747da1dbc7b7
Gerrit-Change-Number: 842930
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged