xref: /netbsd-src/external/gpl3/gcc.old/dist/contrib/mark_spam.py (revision 3ad841b2f6c3e57f95d0e6cec2feda2e43f1ebd0)
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