#!/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