aboutsummaryrefslogtreecommitdiff
blob: 9eae4d5bc4c8a4403967d9f373a9876089a2e4a6 (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
#!/usr/bin/python

# Output like:
# setuptools-0.6_rc9.ebuild
# < KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~sparc-fbsd -x86 ~x86-fbsd"
# ---
# > KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~sparc-fbsd x86 ~x86-fbsd"

from __future__ import with_statement
from sys import argv
from fnmatch import fnmatch
from shutil import copyfile
from portage import settings

import re

STABLE_KEYWORDS = frozenset(settings["PORTAGE_ARCHLIST"].split())
TEST_KEYWORDS = frozenset(['~'+k for k in STABLE_KEYWORDS])
KNOWN_KEYWORDS = STABLE_KEYWORDS | TEST_KEYWORDS

kw_re = re.compile(r'KEYWORDS="([^"]*)"')
ebuilds = set([x for x in argv[1:] if fnmatch(x, '*.ebuild')])
pretend = not bool(set(('-p', '--pretend',)) - set(argv))
keywords = frozenset(argv[1:]) - ebuilds - set(('-p', '--pretend'))

if not ebuilds:
	print 'usage: ekeyword [-p|--pretend] [~] [[~|-]arch [[~|-]arch]...] ebuild [ebuild...]'

for e in ebuilds:
	# TODO: error handling for file I/O
	kw = set(keywords)
	if not pretend:
		try:
			copyfile(e, e+'.orig')
		except IOError:
			print "Can't copy file %s. Check permissions." % e
			exit(1)
	try:
		with open(e) as c:
			ebuild = c.read()
	except IOError:
		print "Can't open file %s. Aborting." % e
		exit(1)
	
	orig = kw_re.search(ebuild)
	curkw = set(orig.groups()[0].split())

	if '~' in kw:
		kw.remove('~')
		curkw = set(['~'+k if k in STABLE_KEYWORDS else k for k in curkw])

	for k in kw:
		if k[0] == '-':
			curkw -= set(('~'+k[1:], k[1:],))
		elif k[0] == '~':
			curkw -= set((k[1:],))
			curkw |= set((k,))
		else:
			curkw -= set(('~'+k,))
			curkw |= set((k,))

	result = 'KEYWORDS="%s"' % ' '.join(sorted(curkw))
	if not pretend:
		try:
			with open(e, 'w') as rebuild:
				rebuild.write(kw_re.sub(result, ebuild))
		except IOError:
			print "Can't write file %s. Aborting." % e
			exit(1)

	unknown_keywords = curkw - KNOWN_KEYWORDS
	if unknown_keywords:
		print "\nWarning: Unknown keywords '%s'.\n" % ', '.join(sorted(unknown_keywords))

	print '<<< %s' % orig.group()
	print '>>> %s' % result