commit:     f664663c8bebcd6700c90e2ca445d82bdf9b8432
Author:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
AuthorDate: Sat Jun 10 09:53:48 2023 +0000
Commit:     Magnus Granberg <zorry <AT> gentoo <DOT> org>
CommitDate: Sat Jun 10 09:53:48 2023 +0000
URL:        
https://gitweb.gentoo.org/proj/tinderbox-cluster.git/commit/?id=f664663c

Add support for Post, Modify and Attach bugs

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

 buildbot_gentoo_ci/steps/bugs.py | 178 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 173 insertions(+), 5 deletions(-)

diff --git a/buildbot_gentoo_ci/steps/bugs.py b/buildbot_gentoo_ci/steps/bugs.py
index 6c85aac..ad87be9 100644
--- a/buildbot_gentoo_ci/steps/bugs.py
+++ b/buildbot_gentoo_ci/steps/bugs.py
@@ -1,7 +1,12 @@
-# Copyright 2022 Gentoo Authors
+# Copyright 2023 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
+# Origins: bugz.cli
+# Modifyed by Gentoo Authors.
+
 import re
+import os
+import xmlrpc
 
 from twisted.internet import defer
 
@@ -9,6 +14,7 @@ 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 buildbot.plugins import util
 
 from bugz.cli import check_bugz_token, login, list_bugs
 from bugz.cli_argparser import make_arg_parser
@@ -19,8 +25,6 @@ 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()
@@ -69,6 +73,32 @@ def search_bugz(args):
         list_bugs(result, settings)
         return result
 
+# post
+def post_bugs(args, params):
+    """Post a new bug"""
+    settings = main_bugz(args)
+    result = settings.call_bz(settings.bz.Bug.create, params)
+    log_info('Bug %d submitted' % result['id'])
+    return result
+
+# modify
+def modify_bugs(args, params):
+    """Modify an existing bug (eg. adding a comment or changing resolution.)"""
+    settings = main_bugz(args)
+    if len(params) < 2:
+        raise BugzError('No changes were specified')
+    result = settings.call_bz(settings.bz.Bug.update, params)
+    return result
+
+def attach_bugs(args, params):
+    """ Attach a file to a bug given a filename. """
+    settings = main_bugz(args)
+    fd = open(params['filename'], 'rb')
+    params['data'] = xmlrpc.client.Binary(fd.read())
+    fd.close()
+    result =  settings.call_bz(settings.bz.Bug.add_attachment, params)
+    return result
+
 class GetBugs(BuildStep):
     
     name = 'GetBugs'
@@ -107,8 +137,9 @@ class GetBugs(BuildStep):
             yield log.addStdout('Match bug: YES\n')
             yield log.addStdout(f"Bug: {str(match['id'])} Summary: 
{match['summary']}\n")
             self.setProperty("bgo", match, 'bgo')
-            return
+            return match
         yield log.addStdout('Match bug: NO\n')
+        return match
 
     @defer.inlineCallbacks
     def run(self):
@@ -128,5 +159,142 @@ class GetBugs(BuildStep):
         print(args)
         buglist = search_bugz(args)
         print(buglist)
-        self.find_match(buglist)
+        match = self.find_match(buglist)
+        #FIXME: set bug id on build in db
+        return SUCCESS
+
+class Post(BuildStep):
+
+    name = 'Post bug'
+    description = 'Running'
+    descriptionSuffix = None
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, bug_args, bugs_params, **kwargs):
+        self.bug_args = bug_args
+        self.bugs_params = bugs_params
+        super().__init__(**kwargs)
+
+    @defer.inlineCallbacks
+    def run(self):
+        #self.gentooci = 
self.master.namedServices['services'].namedServices['gentooci']
+        #bug_config = self.gentooci.config.project['bug_config']
+        args = []
+        args.append('-u')
+        args.append(self.bug_args['user'])
+        args.append('-p')
+        args.append(self.bug_args['passwd'])
+        args.append('post')
+        params = {}
+        params['product'] = "Gentoo Linux"
+        params['component'] = "Current packages"
+        params['version'] = "unspecified"
+        params['op_sys'] = "Linux"
+        params['platform'] = "All"
+        params['priority'] = "Normal"
+        params['description'] = self.bugs_params['description']
+        params['summary'] = self.bugs_params['summary']
+        params['assigned_to'] = self.bugs_params['assigned_to']
+        #params['cc'] = settings.cc
+        params['url'] = self.bugs_params['url']
+        bug_info = yield post_bugs(args, params)
+        match = {}
+        match['match'] = True
+        match['id'] = bug_info['id']
+        match['summary'] = self.bugs_params['summary']
+        self.setProperty("bgo", match, 'bgo')
+        print(match)
+        self.descriptionDone = f"Bug: {bug_info['id']} submitted"
+        #FIXME: update build with bug id
+        return SUCCESS
+
+class Modify(BuildStep):
+    name = 'Modify'
+    description = 'Running'
+    descriptionSuffix = None
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, bug_args, bug_params, **kwargs):
+        self.bug_args = bug_args
+        self.bug_params = bug_params
+        super().__init__(**kwargs)
+
+    @defer.inlineCallbacks
+    def run(self):
+        bugid = str(self.getProperty('bgo')['id'])
+        args = []
+        args.append('-u')
+        args.append(self.bug_args['user'])
+        args.append('-p')
+        args.append(self.bug_args['passwd'])
+        args.append('modify')
+        args.append(bugid)
+        params = {}
+        if self.bug_params['comment'] is not None:
+            params['comment'] = {}
+            params['comment']['body'] = self.bug_params['comment']
+        params['ids'] = [bugid]
+        print(params)
+        bug_info = yield modify_bugs(args, params)
+        for bug in bug_info['bugs']:
+            changes = bug['changes']
+            if not len(changes):
+                log_info('Added comment to bug %s' % bug['id'])
+            else:
+                log_info('Modified the following fields in bug %s' % bug['id'])
+                for key in changes:
+                    log_info('%-12s: removed %s' %(key, 
changes[key]['removed']))
+                    log_info('%-12s: added %s' %(key, changes[key]['added']))
+        self.descriptionDone = f"Modified bug {self.getProperty('bgo')['id']}"
+        return SUCCESS
+
+class Attach(BuildStep):
+    name = 'Attach'
+    description = 'Running'
+    descriptionSuffix = None
+    haltOnFailure = True
+    flunkOnFailure = True
+
+    def __init__(self, bug_args, bug_params, **kwargs):
+        self.bug_args = bug_args
+        self.bug_params = bug_params
+        super().__init__(**kwargs)
+
+    @defer.inlineCallbacks
+    def run(self):
+        bugid = str(self.getProperty('bgo')['id'])
+        args = []
+        args.append('-u')
+        args.append(self.bug_args['user'])
+        args.append('-p')
+        args.append(self.bug_args['passwd'])
+        args.append('attach')
+        args.append(bugid)
+        args.append(self.bug_params['filename'])
+        summary = os.path.basename(self.bug_params['filename'])
+
+        if not os.path.exists(self.bug_params['filename']):
+            raise BugzError('File not found: %s' % self.bug_params['filename'])
+
+        params = {}
+        params['ids'] = bugid
+        params['file_name'] = summary
+        params['summary'] = summary
+        if self.bug_params['filename'].endswith('gz'):
+            params['content_type'] = 'application/gzip'
+        elif self.bug_params['filename'].endswith('bz2'):
+            params['content_type'] = 'application/x-bzip'
+        elif self.bug_params['filename'].endswith('xz'):
+            params['content_type'] = 'application/x-xz'
+        else:
+            params['content_type'] = 'text/plain'
+        #params['comment'] = self.bug_params['comment']
+        params['filename'] = self.bug_params['filename']
+        print(f"Add params['filename'] to bug {bugid}")
+        #params['is_patch'] = is_patch
+        bug_info = yield attach_bugs(args, params)
+        log_info("'%s' has been attached to bug %s" % (params['filename'], 
bugid))
+        self.descriptionDone = f"{os.path.basename(params['filename'])} has 
been attached to bug {bugid}"
         return SUCCESS

Reply via email to