Add ekeyword rewritten in python to repo
authorfuzzyray <fuzzyray@gentoo.org>
Fri, 1 May 2009 14:48:36 +0000 (14:48 -0000)
committerfuzzyray <fuzzyray@gentoo.org>
Fri, 1 May 2009 14:48:36 +0000 (14:48 -0000)
svn path=/; revision=567

trunk/src/ekeyword2/ekeyword2 [new file with mode: 0755]

diff --git a/trunk/src/ekeyword2/ekeyword2 b/trunk/src/ekeyword2/ekeyword2
new file mode 100755 (executable)
index 0000000..963fb5c
--- /dev/null
@@ -0,0 +1,93 @@
+#!/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