Add support for user configuration of colors in the output module for bug #125120...
authorZac Medico <zmedico@gentoo.org>
Tue, 4 Apr 2006 21:13:55 +0000 (21:13 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 4 Apr 2006 21:13:55 +0000 (21:13 -0000)
svn path=/main/trunk/; revision=3072

pym/output.py
pym/portage_const.py
pym/portage_exception.py

index e735d4d4762d18203fd73462cb6eb7edcb934f25..89821e52d7e8e12525ea7244f59a6c6044a17956 100644 (file)
@@ -3,7 +3,10 @@
 # $Id: /var/cvsroot/gentoo-src/portage/pym/output.py,v 1.24.2.4 2005/04/17 09:01:55 jstubbs Exp $
 
 
-import commands,os,sys,re
+import commands,errno,os,re,shlex,sys
+from portage_const import COLOR_MAP_FILE
+from portage_util import writemsg
+from portage_exception import PortageException, ParseError, PermissionDenied, FileNotFound
 
 havecolor=1
 dotitles=1
@@ -88,6 +91,46 @@ codes["brown"]     = esc_seq + "33m"
 codes["red"]       = esc_seq + "31;01m"
 codes["darkred"]   = esc_seq + "31m"
 
+def parse_color_map():
+       myfile = COLOR_MAP_FILE
+       ansi_code_pattern = re.compile("^[0-9;]*m$")
+       def strip_quotes(token, quotes):
+               if token[0] in quotes and token[0] == token[-1]:
+                       token = token[1:-1]
+               return token
+       try:
+               s = shlex.shlex(open(myfile))
+               s.wordchars = s.wordchars + ";" # for ansi codes
+               d = {}
+               while True:
+                       k, o, v = s.get_token(), s.get_token(), s.get_token()
+                       if k is s.eof:
+                               break
+                       if o != "=":
+                               raise ParseError("%s%s'%s'" % (s.error_leader(myfile, s.lineno), "expected '=' operator: ", o))
+                       k = strip_quotes(k, s.quotes)
+                       v = strip_quotes(v, s.quotes)
+                       if ansi_code_pattern.match(v):
+                               codes[k] = esc_seq + v
+                       else:
+                               if v in codes:
+                                       codes[k] = codes[v]
+                               else:
+                                       raise ParseError("%s%s'%s'" % (s.error_leader(myfile, s.lineno), "Undefined: ", v))
+       except (IOError, OSError), e:
+               if e.errno == errno.ENOENT:
+                       raise FileNotFound(myfile)
+               elif e.errno == errno.EACCES:
+                       raise PermissionDenied(myfile)
+               raise
+
+try:
+       parse_color_map()
+except FileNotFound, e:
+       pass
+except PortageException, e:
+       writemsg("%s\n" % str(e))
+
 def nc_len(mystr):
        tmp = re.sub(esc_seq + "^m]+m", "", mystr);
        return len(tmp)
index af8aac8b7e58a41c93ccfdfc8de1373796c73db2..dc523b8791dd22025edac0ced2c1bfc32f632a9f 100644 (file)
@@ -39,6 +39,7 @@ EBUILD_SH_ENV_FILE      = USER_CONFIG_PATH+"/bashrc"
 INVALID_ENV_FILE        = "/etc/spork/is/not/valid/profile.env"
 CUSTOM_MIRRORS_FILE     = USER_CONFIG_PATH+"/mirrors"
 CONFIG_MEMORY_FILE      = PRIVATE_PATH + "/config"
+COLOR_MAP_FILE          = USER_CONFIG_PATH + "/color.map"
 
 INCREMENTALS=["USE","USE_EXPAND","USE_EXPAND_HIDDEN","FEATURES","ACCEPT_KEYWORDS","ACCEPT_LICENSE","CONFIG_PROTECT_MASK","CONFIG_PROTECT","PRELINK_PATH","PRELINK_PATH_MASK"]
 STICKIES=["KEYWORDS_ACCEPT","USE","CFLAGS","CXXFLAGS","MAKEOPTS","EXTRA_ECONF","EXTRA_EINSTALL","EXTRA_EMAKE"]
index c00965d6e54e0f9003237b8f425db048cb9d06c6..c90b1756712b03cfc978b3a7fc908a0ad6093e87 100644 (file)
@@ -49,6 +49,9 @@ class DirectoryNotFound(InvalidLocation):
 class OperationNotPermitted(PortageException):
        """An operation was not permitted operating system"""
 
+class PermissionDenied(PortageException):
+       """Permission denied"""
+
 class ReadOnlyFileSystem(PortageException):
        """Read-only file system"""