|  | #!/usr/bin/env python3 | 
|  | # | 
|  | # Script to mark bunch of PRs as spam | 
|  | # | 
|  | # This file is part of GCC. | 
|  | # | 
|  | # GCC is free software; you can redistribute it and/or modify it under | 
|  | # the terms of the GNU General Public License as published by the Free | 
|  | # Software Foundation; either version 3, or (at your option) any later | 
|  | # version. | 
|  | # | 
|  | # GCC is distributed in the hope that it will be useful, but WITHOUT ANY | 
|  | # WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|  | # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|  | # for more details. | 
|  | # | 
|  | # You should have received a copy of the GNU General Public License | 
|  | # along with GCC; see the file COPYING3.  If not see | 
|  | # <http://www.gnu.org/licenses/>.  */ | 
|  | # | 
|  | # | 
|  | # | 
|  |  | 
|  | import requests | 
|  | import json | 
|  | import argparse | 
|  |  | 
|  | base_url = 'https://gcc.gnu.org/bugzilla/rest.cgi/' | 
|  |  | 
|  | def mark_as_spam(id, api_key, verbose): | 
|  | print('Marking as spam: PR%d' % id) | 
|  | # 1) get bug info to find 'cc' | 
|  | u = base_url + 'bug/' + str(id) | 
|  | r = requests.get(u) | 
|  | response = json.loads(r.text) | 
|  |  | 
|  | if 'error' in response and response['error']: | 
|  | print(response['message']) | 
|  | return | 
|  |  | 
|  | # 2) mark the bug as spam | 
|  | bug = response['bugs'][0] | 
|  | creator = bug['creator'] | 
|  | cc_list = bug['cc'] | 
|  | data = { | 
|  | 'status': 'RESOLVED', | 
|  | 'resolution': 'INVALID', | 
|  | 'summary': 'spam', | 
|  | 'ids': [id], | 
|  | 'api_key': api_key, | 
|  | 'comment': { 'comment': 'spam'}, | 
|  | 'product': 'gcc', | 
|  | 'component': 'spam', | 
|  | 'version': 'unknown', | 
|  | 'cc': {'remove': cc_list}, | 
|  | 'priority': 'P5', | 
|  | 'severity': 'trivial', | 
|  | 'url': '', | 
|  | 'assigned_to': 'unassigned@gcc.gnu.org' } | 
|  |  | 
|  | r = requests.put(u, json = data) | 
|  | if verbose: | 
|  | print(r) | 
|  | print(r.text) | 
|  |  | 
|  | # 3) mark the first comment as spam | 
|  | r = requests.get(u + '/comment') | 
|  | response = json.loads(r.text) | 
|  | for c in response['bugs'][str(id)]['comments']: | 
|  | if c['creator'] == creator: | 
|  | comment_id = c['id'] | 
|  | u2 = '%sbug/comment/%d/tags' % (base_url, comment_id) | 
|  | print(u2) | 
|  | r = requests.put(u2, json = {'comment_id': comment_id, 'add': ['spam'], 'api_key': api_key}) | 
|  | if verbose: | 
|  | print(r) | 
|  | print(r.text) | 
|  |  | 
|  | # 4) mark all attachments as spam | 
|  | r = requests.get(u + '/attachment') | 
|  | response = json.loads(r.text) | 
|  | attachments = response['bugs'][str(id)] | 
|  | for a in attachments: | 
|  | attachment_id = a['id'] | 
|  | url = '%sbug/attachment/%d' % (base_url, attachment_id) | 
|  | r = requests.put(url, json = {'ids': [attachment_id], | 
|  | 'summary': 'spam', | 
|  | 'file_name': 'spam', | 
|  | 'content_type': 'application/x-spam', | 
|  | 'is_obsolete': True, | 
|  | 'api_key': api_key}) | 
|  | if verbose: | 
|  | print(r) | 
|  | print(r.text) | 
|  |  | 
|  | parser = argparse.ArgumentParser(description='Mark Bugzilla issues as spam.') | 
|  | parser.add_argument('api_key', help = 'API key') | 
|  | parser.add_argument('range', help = 'Range of IDs, e.g. 10-23,24,25,27') | 
|  | parser.add_argument('--verbose', action = 'store_true', help = 'Verbose logging') | 
|  |  | 
|  | args = parser.parse_args() | 
|  |  | 
|  | chunks = args.range.split(',') | 
|  | for c in chunks: | 
|  | parts = list(map(lambda x: int(x), c.split('-'))) | 
|  | if len(parts) == 1: | 
|  | r = [parts[0]] | 
|  | else: | 
|  | r = range(parts[0], parts[1] + 1) | 
|  |  | 
|  | for id in r: | 
|  | mark_as_spam(id, args.api_key, args.verbose) |