--- /dev/null
+#!/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
+
+import re
+
+STABLE_KEYWORDS = frozenset((
+ 'alpha',
+ 'amd64',
+ 'amd64-fbsd',
+ 'arm',
+ 'hppa',
+ 'ia64',
+ 'mips',
+ 'm68k',
+ 'ppc',
+ 'ppc-macos',
+ 'ppc64',
+ 's390',
+ 'sparc',
+ 'sparc-fbsd',
+ 'sh',
+ 'x86',
+ 'x86-fbsd',
+))
+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