summaryrefslogtreecommitdiffstats
path: root/scripts/jira/jira-bug-closer/bot/bot.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/jira/jira-bug-closer/bot/bot.py')
-rw-r--r--scripts/jira/jira-bug-closer/bot/bot.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/scripts/jira/jira-bug-closer/bot/bot.py b/scripts/jira/jira-bug-closer/bot/bot.py
new file mode 100644
index 00000000..ac755dda
--- /dev/null
+++ b/scripts/jira/jira-bug-closer/bot/bot.py
@@ -0,0 +1,90 @@
+#############################################################################
+##
+## Copyright (C) 2019 The Qt Company Ltd.
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of the Quality Assurance module of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:GPL-EXCEPT$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 3 as published by the Free Software
+## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+import asyncio
+from typing import Optional
+from gerrit import GerritStreamEvents, GerritStreamParser
+from logger import logger
+from git import Repository
+from jiracloser import JiraCloser
+from config import Config
+from .args import Args
+
+
+log = logger("bot")
+
+
+class Bot:
+ def __init__(self) -> None:
+ self.loop = asyncio.get_event_loop()
+ self.g = GerritStreamEvents()
+ self.parser = GerritStreamParser()
+ self.args = Args()
+ log.info("Using '%s' configuration", self.args.config_section)
+ config = Config(self.args.config_section)
+ self.jira_closer = JiraCloser(config)
+
+ async def update_project(self, name: str, since: Optional[str] = None) -> None:
+ async with Repository(name) as repo:
+ changes = await repo.new_changes(since=since)
+ for change in changes:
+ log.info("Checking changes for relevant tags: '%s'", change)
+ # check commit message
+ fixes = await repo.parse_commit_messages(change)
+ for fix in fixes:
+ # do jira magic
+ self.jira_closer.run(fix)
+
+ async def event_handler(self, data: str) -> None:
+ event = self.parser.parse(data)
+ log.debug(event)
+ log.debug("Raw data: >>>%s<<<", data)
+ if event and event.type == 'ref-updated' and 'staging' not in event.branch:
+ log.info(event)
+ await self.update_project(event.project)
+
+ async def check_gerrit_projects(self) -> None:
+ projects = await(self.g.list_all_projects())
+ # we could parallelize, but we cannot have too many git connections
+ # at the same time, and this is not the common case, so do it sequential for now.
+ # updates = []
+ # for project in projects:
+ # updates.append(self.update_project(project))
+ # await asyncio.gather(*updates)
+ for project in projects:
+ await self.update_project(project, since=self.args.since)
+
+ def run(self) -> None:
+ while True:
+ try:
+ check_projects_on_startup = asyncio.ensure_future(self.check_gerrit_projects())
+ self.g.setDataCallback(self.event_handler)
+ run_monitor = asyncio.ensure_future(self.g.run())
+ self.loop.run_until_complete(asyncio.gather(check_projects_on_startup, run_monitor))
+ except Exception as exc:
+ log.exception('Caught exception: ' + str(exc))