#!/usr/bin/env python
import os
import re
import sys
import string
import subprocess
class Abused:
def __init__(self, args):
if args:
self.args = ' '.join(args)
else:
self.args = ''
self.pcmd = 'emerge -pv --color y'
self.rcmd = 'emerge -v --quiet-build --color y'
self.flags_d = []
self.flags_c = []
self.pkglines = []
# pretend so we can see the use flags
print 'Examining USE flags...'
self.__getUse()
# display the current USE flags, and allow some editin
while not self.__editor():
pass
# and fire off the real emerge
self.__doEmerge()
def __sanitize(self, data):
retv = ''
if data.find('\x1b') != -1:
tmp = filter(lambda x: x in string.printable, data)
retv += re.sub('(\{|\})', '', re.sub('\[[0-9\;]+m', '', tmp))
return retv
return False
def __getUse(self):
cmd_s = 'USE="%s" %s %s' % (
' '.join(self.flags_c),
self.pcmd,
self.args
)
cmd_p = subprocess.Popen(
cmd_s,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True,
executable="/bin/bash"
)
self.pkglines = []
self.flags_d = []
self.flags_c = []
self.longest_c = ''
self.longest_n = 0
buff = cmd_p.stdout.readline()
while buff:
if buff.strip().find('USE="') != -1:
self.pkglines.append(buff.strip())
flags_t = buff.strip().split('USE="')[1].split('"')[0].split()
for f in flags_t:
if f not in self.flags_d:
self.flags_d.append(f)
if len(f) > self.longest_n:
self.longest_n = len(f)
self.longest_c = f
buff = cmd_p.stdout.readline()
# And build our sanitized list of use flags
for f in self.flags_d:
t = self.__sanitize(f)
self.flags_c.append(t)
def __editor(self):
print
for l in self.pkglines:
print l
print
a = 0
for i in self.flags_d:
eval("sys.stdout.write('%%%ds' %% i)" % (self.longest_n+1))
if a < 4:
a += 1
else:
print
a = 0
sys.stdout.write("\n\n")
sys.stdout.write('>> ')
sys.stdout.flush()
data = sys.stdin.readline().strip().split()
if len(data) == 0:
return True
else:
# go through and replace the flags that are edited
for f in data:
for ix in range(0, len(self.flags_c)):
if self.flags_c[ix].find(f[1:]) != -1:
if f[0] == '-' and self.flags_c[ix][0] != '-':
tt = self.flags_c[ix]
self.flags_c[ix] = '-%s' % tt
elif f[0] != '-' and self.flags_c[ix][0] == '-':
tt = self.flags_c[ix][1:]
self.flags_c[ix] = tt
# then refresh the data
self.__getUse()
return False
def __doEmerge(self):
cmd_s = 'USE="%s" %s %s' % (
' '.join(self.flags_c),
self.rcmd,
self.args
)
cmd_p = subprocess.Popen(
cmd_s,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True,
executable="/bin/bash"
)
buff = cmd_p.stdout.readline()
while buff:
sys.stdout.write(buff)
sys.stdout.flush()
buff = cmd_p.stdout.readline()
if __name__ == '__main__':
try:
app = Abused(sys.argv[1:])
except KeyboardInterrupt:
sys.exit(1)