summaryrefslogtreecommitdiff
blob: f9b170ccffbff27bb74d706338637d2ebaa9a5f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env python3
# Copyright 2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

import glob
import itertools
import optparse
import os
import pickle
import re
import shutil
import subprocess
import sys
import xmlrpc.client

from common import login
import portage.versions
from portage.xml.metadata import MetaDataXML

def save_state(done_cpvs):
	with open('file-stabilization-bugs.state', 'wb') as state_file:
		pickle.dump(done_cpvs, state_file)

if __name__ == "__main__":
	exit_code = 0

	parser = optparse.OptionParser()
	parser.add_option("-i", "--input", dest="input_filename", default="stabilization-candidates.txt", help="Input filename [default=%default]")
	parser.add_option("--repo", dest="repo", help="Path to portage CVS repository")

	(options, args) = parser.parse_args()
	if not options.input_filename:
		parser.error("--input option is required")
	if not options.repo:
		parser.error("--repo option is required")
	if args:
		parser.error("unrecognized command-line args")

	done_cpvs = []
	if os.path.exists('file-stabilization-bugs.state'):
		with open('file-stabilization-bugs.state', 'rb') as state_file:
			done_cpvs = pickle.load(state_file, fix_imports=True)

	url = 'https://bugs.gentoo.org/xmlrpc.cgi'
	print('You will be prompted for your Gentoo Bugzilla username and password (%s).' % url)
	bugzilla = xmlrpc.client.ServerProxy(url)
	user, login_data = login(bugzilla)
	
	with open(options.input_filename, "r") as input_file:
		for line in input_file:
			line = line.strip()

			# Skip empty/whitespace/comment lines.
			if not line or line.startswith("#"):
				continue

			cpv = line
			if cpv in done_cpvs:
				print('Skipping %s because it\'s marked as done' % cpv)
				continue

			cp = portage.versions.pkgsplit(cpv)[0]

			cvs_path = os.path.join(options.repo, cp)
			metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml')
			maintainer_split = metadata.format_maintainer_string().split(' ', 1)
			maintainer = maintainer_split[0]
			if len(maintainer_split) > 1:
				other_maintainers = maintainer_split[1].split(',')
			else:
				other_maintainers = []

			description = ('Is it OK to stabilize =%s ?\n' % cpv +
				       'If so, please CC all arches which have stable keywords\n' +
				       'for older versions of this package.')
			params = {}
			params['Bugzilla_token'] = login_data['token']
			params['product'] = 'Gentoo Linux'
			params['version'] = 'unspecified'
			params['component'] = 'Keywording and Stabilization'
			params['summary'] = '%s: stabilization request' % cpv
			params['description'] = description
			params['assigned_to'] = maintainer
			params['cc'] = other_maintainers
			params['severity'] = 'enhancement'
			try:
				bug_id = bugzilla.Bug.create(params)['id']
				print('Submitted bug #%d for %s. ;-)' % (bug_id, cpv))
				done_cpvs += cpv
				save_state(done_cpvs)
				try:
					params = {}
					params['Bugzilla_token'] = login_data['token']
					params['ids'] = [bug_id]
					params['keywords'] = {'set': 'STABLEREQ'}
					bugzilla.Bug.update(params)
				except xmlrpc.client.Fault as f:
					exit_code = 1
					print(f)
					print('Failed to add STABLEREQ keyword for %s. :-/' % cpv)
			except xmlrpc.client.Fault as f:
				exit_code = 1
				print(f)
				print('Failed to submit bug for %s. :-(' % cpv)
	
	if exit_code == 0 and os.path.exists('file-stabilization-bugs.state'):
		os.remove('file-stabilization-bugs.state')
	
	params = {}
	params['Bugzilla_token'] = login_data['token']
	bugzilla.User.logout(params)

	sys.exit(exit_code)