1*3ad841b2Smrg#!/usr/bin/env python3 2*3ad841b2Smrg# 3*3ad841b2Smrg# Script to mark bunch of PRs as spam 4*3ad841b2Smrg# 5*3ad841b2Smrg# This file is part of GCC. 6*3ad841b2Smrg# 7*3ad841b2Smrg# GCC is free software; you can redistribute it and/or modify it under 8*3ad841b2Smrg# the terms of the GNU General Public License as published by the Free 9*3ad841b2Smrg# Software Foundation; either version 3, or (at your option) any later 10*3ad841b2Smrg# version. 11*3ad841b2Smrg# 12*3ad841b2Smrg# GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13*3ad841b2Smrg# WARRANTY; without even the implied warranty of MERCHANTABILITY or 14*3ad841b2Smrg# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15*3ad841b2Smrg# for more details. 16*3ad841b2Smrg# 17*3ad841b2Smrg# You should have received a copy of the GNU General Public License 18*3ad841b2Smrg# along with GCC; see the file COPYING3. If not see 19*3ad841b2Smrg# <http://www.gnu.org/licenses/>. */ 20*3ad841b2Smrg# 21*3ad841b2Smrg# 22*3ad841b2Smrg# 23*3ad841b2Smrg 24*3ad841b2Smrgimport requests 25*3ad841b2Smrgimport json 26*3ad841b2Smrgimport argparse 27*3ad841b2Smrg 28*3ad841b2Smrgbase_url = 'https://gcc.gnu.org/bugzilla/rest.cgi/' 29*3ad841b2Smrg 30*3ad841b2Smrgdef mark_as_spam(id, api_key, verbose): 31*3ad841b2Smrg print('Marking as spam: PR%d' % id) 32*3ad841b2Smrg # 1) get bug info to find 'cc' 33*3ad841b2Smrg u = base_url + 'bug/' + str(id) 34*3ad841b2Smrg r = requests.get(u) 35*3ad841b2Smrg response = json.loads(r.text) 36*3ad841b2Smrg 37*3ad841b2Smrg if 'error' in response and response['error']: 38*3ad841b2Smrg print(response['message']) 39*3ad841b2Smrg return 40*3ad841b2Smrg 41*3ad841b2Smrg # 2) mark the bug as spam 42*3ad841b2Smrg bug = response['bugs'][0] 43*3ad841b2Smrg creator = bug['creator'] 44*3ad841b2Smrg cc_list = bug['cc'] 45*3ad841b2Smrg data = { 46*3ad841b2Smrg 'status': 'RESOLVED', 47*3ad841b2Smrg 'resolution': 'INVALID', 48*3ad841b2Smrg 'summary': 'spam', 49*3ad841b2Smrg 'ids': [id], 50*3ad841b2Smrg 'api_key': api_key, 51*3ad841b2Smrg 'comment': { 'comment': 'spam'}, 52*3ad841b2Smrg 'product': 'gcc', 53*3ad841b2Smrg 'component': 'spam', 54*3ad841b2Smrg 'version': 'unknown', 55*3ad841b2Smrg 'cc': {'remove': cc_list}, 56*3ad841b2Smrg 'priority': 'P5', 57*3ad841b2Smrg 'severity': 'trivial', 58*3ad841b2Smrg 'url': '', 59*3ad841b2Smrg 'assigned_to': 'unassigned@gcc.gnu.org' } 60*3ad841b2Smrg 61*3ad841b2Smrg r = requests.put(u, json = data) 62*3ad841b2Smrg if verbose: 63*3ad841b2Smrg print(r) 64*3ad841b2Smrg print(r.text) 65*3ad841b2Smrg 66*3ad841b2Smrg # 3) mark the first comment as spam 67*3ad841b2Smrg r = requests.get(u + '/comment') 68*3ad841b2Smrg response = json.loads(r.text) 69*3ad841b2Smrg for c in response['bugs'][str(id)]['comments']: 70*3ad841b2Smrg if c['creator'] == creator: 71*3ad841b2Smrg comment_id = c['id'] 72*3ad841b2Smrg u2 = '%sbug/comment/%d/tags' % (base_url, comment_id) 73*3ad841b2Smrg print(u2) 74*3ad841b2Smrg r = requests.put(u2, json = {'comment_id': comment_id, 'add': ['spam'], 'api_key': api_key}) 75*3ad841b2Smrg if verbose: 76*3ad841b2Smrg print(r) 77*3ad841b2Smrg print(r.text) 78*3ad841b2Smrg 79*3ad841b2Smrg # 4) mark all attachments as spam 80*3ad841b2Smrg r = requests.get(u + '/attachment') 81*3ad841b2Smrg response = json.loads(r.text) 82*3ad841b2Smrg attachments = response['bugs'][str(id)] 83*3ad841b2Smrg for a in attachments: 84*3ad841b2Smrg attachment_id = a['id'] 85*3ad841b2Smrg url = '%sbug/attachment/%d' % (base_url, attachment_id) 86*3ad841b2Smrg r = requests.put(url, json = {'ids': [attachment_id], 87*3ad841b2Smrg 'summary': 'spam', 88*3ad841b2Smrg 'file_name': 'spam', 89*3ad841b2Smrg 'content_type': 'application/x-spam', 90*3ad841b2Smrg 'is_obsolete': True, 91*3ad841b2Smrg 'api_key': api_key}) 92*3ad841b2Smrg if verbose: 93*3ad841b2Smrg print(r) 94*3ad841b2Smrg print(r.text) 95*3ad841b2Smrg 96*3ad841b2Smrgparser = argparse.ArgumentParser(description='Mark Bugzilla issues as spam.') 97*3ad841b2Smrgparser.add_argument('api_key', help = 'API key') 98*3ad841b2Smrgparser.add_argument('range', help = 'Range of IDs, e.g. 10-23,24,25,27') 99*3ad841b2Smrgparser.add_argument('--verbose', action = 'store_true', help = 'Verbose logging') 100*3ad841b2Smrg 101*3ad841b2Smrgargs = parser.parse_args() 102*3ad841b2Smrg 103*3ad841b2Smrgchunks = args.range.split(',') 104*3ad841b2Smrgfor c in chunks: 105*3ad841b2Smrg parts = list(map(lambda x: int(x), c.split('-'))) 106*3ad841b2Smrg if len(parts) == 1: 107*3ad841b2Smrg r = [parts[0]] 108*3ad841b2Smrg else: 109*3ad841b2Smrg r = range(parts[0], parts[1] + 1) 110*3ad841b2Smrg 111*3ad841b2Smrg for id in r: 112*3ad841b2Smrg mark_as_spam(id, args.api_key, args.verbose) 113