commit:     0486f29cc0842870d85029553f2c229799896fa5
Author:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
AuthorDate: Mon Jul  4 17:43:38 2022 +0000
Commit:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
CommitDate: Mon Jul  4 17:43:38 2022 +0000
URL:        
https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=0486f29c

Add support for search bugs on b.g.o

Signed-off-by: Magnus Granberg <zorry <AT> gentoo.org>

 buildbot_gentoo_ci/steps/bugs.py | 124 +++++++++++++++++++++++++++++++++++++++
 buildbot_gentoo_ci/steps/logs.py |  14 ++++-
 2 files changed, 135 insertions(+), 3 deletions(-)

diff --git a/buildbot_gentoo_ci/steps/bugs.py b/buildbot_gentoo_ci/steps/bugs.py
new file mode 100644
index 0000000..e43c926
--- /dev/null
+++ b/buildbot_gentoo_ci/steps/bugs.py
@@ -0,0 +1,124 @@
+# Copyright 2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+import re
+
+from twisted.internet import defer
+
+from buildbot.process.buildstep import BuildStep
+from buildbot.process.results import SUCCESS
+from buildbot.process.results import FAILURE
+from buildbot.process.results import SKIPPED
+
+from bugz.cli import check_bugz_token, login, list_bugs
+from bugz.cli_argparser import make_arg_parser
+from bugz.configfile import load_config
+from bugz.settings import Settings
+from bugz.exceptions import BugzError
+from bugz.log import log_error, log_info
+
+from portage.versions import cpv_getversion, pkgsplit, catpkgsplit
+
+# Origins: bugz.cli
+# Modifyed by Gentoo Authors.
+# main
+def main_bugz(args):
+    ArgParser = make_arg_parser()
+    opt = ArgParser.parse_args(args)
+
+    ConfigParser = load_config(getattr(opt, 'config_file', None))
+
+    check_bugz_token()
+    settings = Settings(opt, ConfigParser)
+    return settings
+
+# search
+def search_bugz(args):
+    settings = main_bugz(args)
+    valid_keys = ['alias', 'assigned_to', 'component', 'creator',
+                'limit', 'offset', 'op_sys', 'platform',
+                'priority', 'product', 'resolution', 'severity',
+                'version', 'whiteboard', 'cc']
+
+    params = {}
+    d = vars(settings)
+    for key in d:
+        if key in valid_keys:
+            params[key] = d[key]
+    if 'search_statuses' in d:
+        if 'all' not in d['search_statuses']:
+            params['status'] = d['search_statuses']
+    if 'terms' in d:
+        params['summary'] = d['terms']
+
+    if not params:
+        raise BugzError('Please give search terms or options.')
+
+    log_info('Searching for bugs meeting the following criteria:')
+    for key in params:
+        log_info('   {0:<20} = {1}'.format(key, params[key]))
+
+    login(settings)
+
+    result = settings.call_bz(settings.bz.Bug.search, params)['bugs']
+
+    if not len(result):
+        log_info('No bugs found.')
+        return []
+    else:
+        list_bugs(result, settings)
+        return result
+
+class GetBugs(BuildStep):
+    
+    name = 'GetBugs'
+    description = 'Running'
+    descriptionDone = 'Ran'
+    descriptionSuffix = None
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, **kwargs):
+        super().__init__(**kwargs)
+
+    @defer.inlineCallbacks
+    def find_match(self, buglist):
+        log = yield self.addLog('Bugs')
+        yield log.addStdout('Open Bugs\n')
+        match = False
+        for bug in buglist:
+            yield log.addStdout('Bug: ' + str(bug['id']) + ' Summary: ' + 
bug['summary'] +'\n')
+            if re.search(self.getProperty('error_dict')['title_phase'][:20], 
bug['summary']):
+                print('Bug found')
+                print(bug)
+                match = {}
+                match['id'] = bug['id']
+                match['summary'] = bug['summary']
+        if match:
+            yield log.addStdout('Match bug found\n')
+            yield log.addStdout('Bug: ' + str(match['id']) + ' Summary: ' + 
match['summary'] +'\n')
+            self.setProperty("bgo", match, 'bgo')
+            return
+        yield log.addStdout('NO Match bug found\n')
+        self.setProperty("bgo", False, 'bgo')
+
+    @defer.inlineCallbacks
+    def run(self):
+        # self.gentooci = 
self.master.namedServices['services'].namedServices['gentooci']
+        cpv = self.getProperty('error_dict')['cpv']
+        c = yield catpkgsplit(cpv)[0]
+        p = yield catpkgsplit(cpv)[1]
+        cp = c + '/' + p
+        # search for open bugs
+        args = []
+        args.append('--skip-auth')
+        args.append('search')
+        # set limit
+        # set date last 30 days
+        # search for cp
+        args.append(cp)
+        print(args)
+        buglist = search_bugz(args)
+        print(buglist)
+        self.find_match(buglist)
+        return SUCCESS

diff --git a/buildbot_gentoo_ci/steps/logs.py b/buildbot_gentoo_ci/steps/logs.py
index d6ee705..7a63658 100644
--- a/buildbot_gentoo_ci/steps/logs.py
+++ b/buildbot_gentoo_ci/steps/logs.py
@@ -22,6 +22,7 @@ from buildbot.plugins import steps
 
 from buildbot_gentoo_ci.steps import minio
 from buildbot_gentoo_ci.steps import master as master_steps
+from buildbot_gentoo_ci.steps import bugs
 
 def PersOutputOfLogParser(rc, stdout, stderr):
     build_summery_output = {}
@@ -299,6 +300,7 @@ class MakeIssue(BuildStep):
             cpv = self.getProperty('faild_cpv')
         else:
             cpv = self.getProperty('cpv')
+        self.error_dict['cpv'] = cpv
         yield log.addStdout('Titel:' + '\n')
         yield log.addStdout(separator2.join([cpv, '-', 
self.error_dict['title']]) + separator1)
         yield log.addStdout('Summary:' + '\n')
@@ -358,10 +360,11 @@ class MakeIssue(BuildStep):
         warning = False
         self.summary_log_list = []
         self.error_dict = {}
-        self.error_dict['hash'] = hashlib.sha256()
+        self.aftersteps_list = []
+        #self.error_dict['hash'] = hashlib.sha256()
         for k, v in sorted(self.summary_log_dict.items()):
             self.summary_log_list.append(v['text'])
-            self.error_dict['hash'].update(v['text'].encode('utf-8'))
+            #self.error_dict['hash'].update(v['text'].encode('utf-8'))
             if v['status'] == 'warning':
                 warning = True
             # check if the build did fail
@@ -377,9 +380,14 @@ class MakeIssue(BuildStep):
             print(self.error_dict)
             yield self.logIssue()
             self.setProperty("status", 'failed', 'status')
-        self.setProperty("summary_log_list", self.summary_log_list, 
'summary_log_list')
+            self.setProperty("error_dict", self.error_dict, 'error_dict')
+            self.aftersteps_list.append(bugs.GetBugs())
         if warning:
             self.setProperty("status", 'warning', 'status')
+            self.setProperty("bgo", False, 'bgo')
+        self.setProperty("summary_log_list", self.summary_log_list, 
'summary_log_list')
+        if self.aftersteps_list is not []:
+            yield self.build.addStepsAfterCurrentStep(self.aftersteps_list)
         return SUCCESS
 
 class setBuildbotLog(BuildStep):

Reply via email to