Skip to content

Instantly share code, notes, and snippets.

@fuzzy
Last active August 29, 2015 14:16
Show Gist options
  • Save fuzzy/0ac7cb192ff0906ea81a to your computer and use it in GitHub Desktop.
Save fuzzy/0ac7cb192ff0906ea81a to your computer and use it in GitHub Desktop.
A Basic USe EDitor for gentoo. drop abused.py into your path, and use it in place of emerge when doing installs. It will allow you to edit your use flags on the fly.
#!/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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment