jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/477409 )
Change subject: [doc] Prepare next release
......................................................................
[doc] Prepare next release
Change-Id: Iafa955a54e2d581f120209e8147dca888ec28f1a
---
M HISTORY.rst
M docs/conf.py
2 files changed, 7 insertions(+), 1 deletion(-)
Approvals:
Framawiki: Looks good to me, approved
jenkins-bot: Verified
diff --git a/HISTORY.rst b/HISTORY.rst
index 9a8034c..c525497 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -4,6 +4,12 @@
Current release
---------------
+* Bugfixes and improvements
+* Localisation updates
+
+3.0.20181203
+------------
+
* Remove compat module references from autogenerated docs (T183085)
* site.preloadpages: split pagelist in most max_ids elements (T209111)
* Disable empty sections in cosmetic_changes for user namespace
diff --git a/docs/conf.py b/docs/conf.py
index 4854e2d..5bdf21b 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -71,7 +71,7 @@
# The short X.Y version.
version = '3.0'
# The full version, including alpha/beta/rc tags.
-release = '3.0.20180922'
+release = '3.0.20181203'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
--
To view, visit https://gerrit.wikimedia.org/r/477409
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Iafa955a54e2d581f120209e8147dca888ec28f1a
Gerrit-Change-Number: 477409
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Framawiki <framawiki(a)tools.wmflabs.org>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/475613 )
Change subject: proofreadpage.py: OCR needs BeautifulSoup
......................................................................
proofreadpage.py: OCR needs BeautifulSoup
In proofreadpage.py, OCR needs BeautifulSoup in:
- url_image()
- _do_hocr()
Soup() is defined at import time only if bs4 is available.
Define it also when bs4 is not avaiable and make it raise
ImportError when called.
Rename Soup() to _bs4_soup() to comply with function naming rules.
OCR tests if bs4 is not available are already skipped:
- see Iaeabb046660b294fa19025282a344356f756c5bf
Bug: T210335
Change-Id: I5e3d235cdb1cba9b4ed52ba2442a9bfb1802d9bf
---
M pywikibot/proofreadpage.py
1 file changed, 18 insertions(+), 7 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/proofreadpage.py b/pywikibot/proofreadpage.py
index e22c2e6..5432d70 100644
--- a/pywikibot/proofreadpage.py
+++ b/pywikibot/proofreadpage.py
@@ -38,20 +38,29 @@
from bs4 import BeautifulSoup, FeatureNotFound
except ImportError as e:
BeautifulSoup = e
+
+ def _bs4_soup(*args, **kwargs):
+ """Raise BeautifulSoup when called, if bs4 is not available."""
+ raise BeautifulSoup
else:
try:
BeautifulSoup('', 'lxml')
except FeatureNotFound:
- Soup = partial(BeautifulSoup, features='html.parser')
+ _bs4_soup = partial(BeautifulSoup, features='html.parser')
else:
- Soup = partial(BeautifulSoup, features='lxml')
+ _bs4_soup = partial(BeautifulSoup, features='lxml')
import pywikibot
from pywikibot.comms import http
from pywikibot.data.api import Request
+from pywikibot.tools import ModuleDeprecationWrapper
_logger = 'proofreadpage'
+wrapper = ModuleDeprecationWrapper(__name__)
+wrapper._add_deprecated_attr('Soup', _bs4_soup, replacement_name='_bs4_soup',
+ since='20181128')
+
class FullHeader(object):
@@ -524,9 +533,10 @@
@rtype: str/unicode
@raises Exception: in case of http errors
+ @raise ImportError: if bs4 is not installed, _bs4_soup() will raise
@raises ValueError: in case of no prp_page_image src found for scan
"""
- # wrong link fail with various possible Exceptions.
+ # wrong link fails with various possible Exceptions.
if not hasattr(self, '_url_image'):
if self.exists():
@@ -541,7 +551,7 @@
pywikibot.error('Error fetching HTML for %s.' % self)
raise
- soup = Soup(response.text)
+ soup = _bs4_soup(response.text)
try:
self._url_image = soup.find(class_='prp-page-image')
@@ -623,10 +633,11 @@
This is the main method for 'phetools'.
Fallback method is ocr.
+ @raise ImportError: if bs4 is not installed, _bs4_soup() will raise
"""
def parse_hocr_text(txt):
"""Parse hocr text."""
- soup = Soup(txt)
+ soup = _bs4_soup(txt)
res = []
for ocr_page in soup.find_all(class_='ocr_page'):
@@ -823,7 +834,7 @@
del self._parsed_text
self._parsed_text = self._get_parsed_page()
- self._soup = Soup(self._parsed_text)
+ self._soup = _bs4_soup(self._parsed_text)
# Do not search for "new" here, to avoid to skip purging if links
# to non-existing pages are present.
attrs = {'class': re.compile('prp-pagequality')}
@@ -845,7 +856,7 @@
self.purge()
del self._parsed_text
self._parsed_text = self._get_parsed_page()
- self._soup = Soup(self._parsed_text)
+ self._soup = _bs4_soup(self._parsed_text)
if not self._soup.find_all('a', attrs=attrs):
raise ValueError(
'Missing class="qualityN prp-pagequality-N" or '
--
To view, visit https://gerrit.wikimedia.org/r/475613
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I5e3d235cdb1cba9b4ed52ba2442a9bfb1802d9bf
Gerrit-Change-Number: 475613
Gerrit-PatchSet: 6
Gerrit-Owner: Mpaa <mpaa.wiki(a)gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Mpaa <mpaa.wiki(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/474727 )
Change subject: [cleanup] Remove unused code in 4 files
......................................................................
[cleanup] Remove unused code in 4 files
Removed errors reported by vulture in files:
* pywikibot/family.py (unused variable (function argument))
* pywikibot/login.py (unused variable (function argument))
* pywikibot/page.py (unused variable (function argument))
For the 3 unused arguments removed mentioned above, their corresponding
entries in the decorator @remove_last_args() were added.
Documentation was updated for each method updated.
The class YahooSearchPageGenerator has been removed. The corresponding
decorator ModuleDeprecationWrapper was used to indicate its deprecation.
The argument to use YahooSearchPageGenerator has been deprecated as well
and its documentation.
Bug: T203395
Bug: T106085
Change-Id: Ie1d412cc3a6316da3781865931feead65576d0c3
---
M pywikibot/family.py
M pywikibot/login.py
M pywikibot/page.py
M pywikibot/pagegenerators.py
4 files changed, 16 insertions(+), 77 deletions(-)
Approvals:
D3r1ck01: Looks good to me, but someone else must approve
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/family.py b/pywikibot/family.py
index 6802abb..b3276ca 100644
--- a/pywikibot/family.py
+++ b/pywikibot/family.py
@@ -22,7 +22,7 @@
from pywikibot import config
from pywikibot.exceptions import UnknownFamily, FamilyMaintenanceWarning
from pywikibot.tools import (
- deprecated, deprecated_args, issue_deprecation_warning,
+ deprecated, deprecated_args, remove_last_args, issue_deprecation_warning,
FrozenDict, classproperty
)
@@ -1416,7 +1416,8 @@
return (None, None)
# Deprecated via __getattribute__
- def shared_data_repository(self, code, transcluded=False):
+ @remove_last_args(['transcluded'])
+ def shared_data_repository(self, code):
"""Return the shared Wikibase repository, if any."""
repo = pywikibot.Site(code, self).data_repository()
if repo is not None:
diff --git a/pywikibot/login.py b/pywikibot/login.py
index 7161118..bb8e954 100644
--- a/pywikibot/login.py
+++ b/pywikibot/login.py
@@ -26,7 +26,8 @@
from pywikibot import config, __url__
from pywikibot.exceptions import NoUsername
-from pywikibot.tools import deprecated_args, normalize_username, PY2
+from pywikibot.tools import (deprecated_args, remove_last_args,
+ normalize_username, PY2)
if not PY2:
unicode = basestring = str
@@ -179,15 +180,11 @@
# No bot policies on other sites
return True
- def getCookie(self, remember=True, captcha=None):
+ @remove_last_args(['remember', 'captcha'])
+ def getCookie(self):
"""
Login to the site.
- @param remember: Remember login (default: True)
- @type remember: bool
- @param captchaId: A dictionary containing the captcha id and answer,
- if any
-
@return: cookie data if successful, None otherwise.
"""
# THIS IS OVERRIDDEN IN data/api.py
diff --git a/pywikibot/page.py b/pywikibot/page.py
index 6d51e2c..f5f053f 100644
--- a/pywikibot/page.py
+++ b/pywikibot/page.py
@@ -1859,8 +1859,9 @@
@deprecated_args(
throttle=None, deleteAndMove='noredirect', movetalkpage='movetalk')
+ @remove_last_args(['safe'])
def move(self, newtitle, reason=None, movetalk=True, sysop=False,
- noredirect=False, safe=True):
+ noredirect=False):
"""
Move this page to a new title.
@@ -1870,14 +1871,11 @@
@param sysop: Try to move using sysop account, if available
@param noredirect: if move succeeds, delete the old page
(usually requires sysop privileges, depending on wiki settings)
- @param safe: If false, attempt to delete existing page at newtitle
- (if there is one) and then move this page to that title
"""
if reason is None:
pywikibot.output('Moving %s to [[%s]].'
% (self.title(as_link=True), newtitle))
reason = pywikibot.input('Please enter a reason for the move:')
- # TODO: implement "safe" parameter (Is this necessary ?)
# TODO: implement "sysop" parameter
return self.site.movepage(self, newtitle, reason,
movetalk=movetalk,
diff --git a/pywikibot/pagegenerators.py b/pywikibot/pagegenerators.py
index 14fe1fd..9555c39 100644
--- a/pywikibot/pagegenerators.py
+++ b/pywikibot/pagegenerators.py
@@ -43,6 +43,7 @@
issue_deprecation_warning,
IteratorNextMixin,
itergroup,
+ ModuleDeprecationWrapper,
redirect_func,
)
@@ -283,10 +284,6 @@
config.py for instructions.
Argument can also be given as "-google:searchstring".
--yahoo Work on all pages that are found in a Yahoo search.
- Depends on python module pYsearch. See yahoo_appid in
- config.py for instructions.
-
-page Work on a single page. Argument can also be given as
"-page:pagetitle", and supplied multiple times for
multiple pages.
@@ -1110,7 +1107,8 @@
def _handle_yahoo(self, value):
"""Handle `-yahoo` argument."""
- return YahooSearchPageGenerator(value, site=self.site)
+ issue_deprecation_warning('-yahoo', None, 3,
+ ArgumentDeprecationWarning, since='20181125')
@staticmethod
def _handle_untagged(value):
@@ -2643,65 +2641,6 @@
# following classes just ported from version 1 without revision; not tested
-class YahooSearchPageGenerator(object):
-
- """
- Page generator using Yahoo! search results.
-
- To use this generator, you need to install the package 'pYsearch'.
- https://pypi.org/project/pYsearch
-
- To use this generator, install pYsearch
- """
-
- @deprecated_args(count='total')
- def __init__(self, query=None, total=100, site=None):
- """
- Initializer.
-
- @param site: Site for generator results.
- @type site: L{pywikibot.site.BaseSite}
- """
- raise RuntimeError(
- 'pagegenerator YahooSearchPageGenerator is not functional.\n'
- 'See https://phabricator.wikimedia.org/T106085')
-
- self.query = query or pywikibot.input('Please enter the search query:')
- self.total = total
- if site is None:
- site = pywikibot.Site()
- self.site = site
-
- def queryYahoo(self, query):
- """Perform a query using python package 'pYsearch'."""
- try:
- from yahoo.search.web import WebSearch
- except ImportError:
- pywikibot.error('ERROR: generator YahooSearchPageGenerator '
- "depends on package 'pYsearch'.\n"
- 'To install, please run: pip install pYsearch')
- exit(1)
-
- srch = WebSearch(config.yahoo_appid, query=query, results=self.total)
- dom = srch.get_results()
- results = srch.parse_results(dom)
- for res in results:
- url = res.Url
- yield url
-
- def __iter__(self):
- """Iterate results."""
- # restrict query to local site
- localQuery = '%s site:%s' % (self.query, self.site.hostname())
- base = 'http://%s%s' % (self.site.hostname(),
- self.site.article_path)
- for url in self.queryYahoo(localQuery):
- if url[:len(base)] == base:
- title = url[len(base):]
- page = pywikibot.Page(pywikibot.Link(title, pywikibot.Site()))
- yield page
-
-
class GoogleSearchPageGenerator(object):
"""
@@ -3146,3 +3085,7 @@
if __name__ == '__main__':
pywikibot.output('Pagegenerators cannot be run as script - are you '
'looking for listpages.py?')
+
+wrapper = ModuleDeprecationWrapper(__name__)
+wrapper._add_deprecated_attr('YahooSearchPageGenerator', replacement_name='',
+ since='20181128')
--
To view, visit https://gerrit.wikimedia.org/r/474727
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Ie1d412cc3a6316da3781865931feead65576d0c3
Gerrit-Change-Number: 474727
Gerrit-PatchSet: 6
Gerrit-Owner: Nils ANDRE <nils.andre.chang(a)gmail.com>
Gerrit-Reviewer: D3r1ck01 <alangiderick(a)gmail.com>
Gerrit-Reviewer: Dvorapa <dvorapa(a)seznam.cz>
Gerrit-Reviewer: Framawiki <framawiki(a)tools.wmflabs.org>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Nils ANDRE <nils.andre.chang(a)gmail.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/477172 )
Change subject: [cleanup] use site.mw_version instead of MediaWikiVersion(site.version())
......................................................................
[cleanup] use site.mw_version instead of MediaWikiVersion(site.version())
Change-Id: I2ab5b1b40d4542cc0b1a6d7ae56576067f0f3c95
---
M pywikibot/data/api.py
1 file changed, 6 insertions(+), 9 deletions(-)
Approvals:
Dalba: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py
index 64223ce..9995a9c 100644
--- a/pywikibot/data/api.py
+++ b/pywikibot/data/api.py
@@ -38,7 +38,7 @@
Error, TimeoutError, InvalidTitle, UnsupportedPage
)
from pywikibot.tools import (
- MediaWikiVersion, deprecated, itergroup, ip, PY2, PYTHON_VERSION,
+ deprecated, itergroup, ip, PY2, PYTHON_VERSION,
getargspec, UnicodeType, remove_last_args
)
from pywikibot.tools.formatter import color_format
@@ -366,7 +366,7 @@
],
}
- if _mw_ver >= MediaWikiVersion('1.12'):
+ if _mw_ver >= '1.12':
return
query_help_list_prefix = "Values (separate with '|'): "
@@ -1692,14 +1692,11 @@
# When neither 'continue' nor 'rawcontinue' is present and the
# version number is at least 1.25wmf5 we add a dummy rawcontinue
# parameter. Querying siteinfo is save as it adds 'continue'.
- if ('continue' not in self._params and
- 'rawcontinue' not in self._params and
- MediaWikiVersion(
- self.site.version()) >= MediaWikiVersion('1.25wmf5')):
+ if ('continue' not in self._params
+ and 'rawcontinue' not in self._params
+ and self.site.mw_version >= '1.25wmf5'):
self._params['rawcontinue'] = ['']
- elif (self.action == 'help'
- and MediaWikiVersion(self.site.version())
- > MediaWikiVersion('1.24')):
+ elif self.action == 'help' and self.site.mw_version > '1.24':
self._params['wrap'] = ['']
if 'maxlag' not in self._params and config.maxlag:
--
To view, visit https://gerrit.wikimedia.org/r/477172
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I2ab5b1b40d4542cc0b1a6d7ae56576067f0f3c95
Gerrit-Change-Number: 477172
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Dalba <dalba.wiki(a)gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/476294 )
Change subject: [IMPR] Let maximum retry wait time be configurable
......................................................................
[IMPR] Let maximum retry wait time be configurable
Introduce retry_max variable in config2.py and use it in several modules
Change-Id: Ie85ee8a76fad9bc553fb8a8f783c002649005a31
---
M pywikibot/config2.py
M pywikibot/data/api.py
M pywikibot/data/sparql.py
M pywikibot/throttle.py
4 files changed, 10 insertions(+), 8 deletions(-)
Approvals:
Framawiki: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/config2.py b/pywikibot/config2.py
index 695ef98..dcda22f 100644
--- a/pywikibot/config2.py
+++ b/pywikibot/config2.py
@@ -672,6 +672,8 @@
max_retries = 15
# Minimum time to wait before resubmitting a failed API request.
retry_wait = 5
+# Maximum time to wait before resubmitting a failed API request.
+retry_max = 120
# ############# TABLE CONVERSION BOT SETTINGS ##############
diff --git a/pywikibot/data/api.py b/pywikibot/data/api.py
index 64223ce..bb02747 100644
--- a/pywikibot/data/api.py
+++ b/pywikibot/data/api.py
@@ -1360,7 +1360,7 @@
errors, defaults to config.max_retries.
@param retry_wait: (optional) Minimum time in seconds to wait after an
error, defaults to config.retry_wait seconds (doubles each retry
- until max of 120 seconds is reached).
+ until config.retry_max seconds is reached).
@param use_get: (optional) Use HTTP GET request if possible. If False
it uses a POST request. If None, it'll try to determine via
action=paraminfo if the action requires a POST.
@@ -2282,8 +2282,8 @@
pywikibot.warning('Waiting %s seconds before retrying.'
% self.retry_wait)
pywikibot.sleep(self.retry_wait)
- # double the next wait, but do not exceed 120 seconds
- self.retry_wait = min(120, self.retry_wait * 2)
+ # double the next wait, but do not exceed config.retry_max seconds
+ self.retry_wait = min(config.retry_max, self.retry_wait * 2)
class CachedRequest(Request):
diff --git a/pywikibot/data/sparql.py b/pywikibot/data/sparql.py
index 9b9eb0e..ebe6605 100644
--- a/pywikibot/data/sparql.py
+++ b/pywikibot/data/sparql.py
@@ -52,7 +52,7 @@
@type max_retries: int
@param retry_wait: (optional) Minimum time in seconds to wait after an
error, defaults to config.retry_wait seconds (doubles each retry
- until max of 120 seconds is reached).
+ until config.retry_max is reached).
@type retry_wait: float
"""
# default to Wikidata
@@ -162,8 +162,8 @@
raise TimeoutError('Maximum retries attempted without success.')
warning('Waiting {0} seconds before retrying.'.format(self.retry_wait))
sleep(self.retry_wait)
- # double the next wait, but do not exceed 120 seconds
- self.retry_wait = min(120, self.retry_wait * 2)
+ # double the next wait, but do not exceed config.retry_max seconds
+ self.retry_wait = min(config.retry_max, self.retry_wait * 2)
def ask(self, query, headers=DEFAULT_HEADERS):
"""
diff --git a/pywikibot/throttle.py b/pywikibot/throttle.py
index 042c6e5..23930ab 100644
--- a/pywikibot/throttle.py
+++ b/pywikibot/throttle.py
@@ -301,8 +301,8 @@
started = time.time()
with self.lock:
waittime = self.retry_after or lagtime or 5
- # wait not more than 120 seconds
- delay = min(waittime, 120)
+ # wait not more than retry_max seconds
+ delay = min(waittime, config.retry_max)
# account for any time we waited while acquiring the lock
wait = delay - (time.time() - started)
self.wait(wait)
--
To view, visit https://gerrit.wikimedia.org/r/476294
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Ie85ee8a76fad9bc553fb8a8f783c002649005a31
Gerrit-Change-Number: 476294
Gerrit-PatchSet: 1
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Framawiki <framawiki(a)tools.wmflabs.org>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: jenkins-bot (75)
jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/476277 )
Change subject: [doc] Remove compat speech "get_throttle"
......................................................................
[doc] Remove compat speech "get_throttle"
get_thottle Throttle object isn't implemented at core.
Change-Id: If8ae1a5bb5d0363b6601cc18adc4725087215e18
---
M pywikibot/config2.py
1 file changed, 2 insertions(+), 3 deletions(-)
Approvals:
Framawiki: Looks good to me, approved
jenkins-bot: Verified
diff --git a/pywikibot/config2.py b/pywikibot/config2.py
index 695ef98..1360461 100644
--- a/pywikibot/config2.py
+++ b/pywikibot/config2.py
@@ -640,9 +640,8 @@
# but never more than 'maxthrottle' seconds. However - if you are running
# more than one bot in parallel the times are lengthened.
#
-# By default, the get_throttle is turned off, and 'maxlag' is used to
-# control the rate of server access. Set minthrottle to non-zero to use a
-# throttle on read access.
+# 'maxlag' is used to control the rate of server access (see below).
+# Set minthrottle to non-zero to use a throttle on read access.
minthrottle = 0
maxthrottle = 60
--
To view, visit https://gerrit.wikimedia.org/r/476277
To unsubscribe, or for help writing mail filters, visit https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: If8ae1a5bb5d0363b6601cc18adc4725087215e18
Gerrit-Change-Number: 476277
Gerrit-PatchSet: 2
Gerrit-Owner: Xqt <info(a)gno.de>
Gerrit-Reviewer: Framawiki <framawiki(a)tools.wmflabs.org>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: jenkins-bot (75)