summaryrefslogtreecommitdiffstats
path: root/pym/output.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-07-05 00:56:33 +0000
committerZac Medico <zmedico@gentoo.org>2007-07-05 00:56:33 +0000
commit0024e08c303c9398091199da86422de7d85c6577 (patch)
treeff747f9dc5c56fca594bf401a6b3922cfb3dc1b7 /pym/output.py
parent3ca097fa6a0525303b703f950bcd51ab9b964b5c (diff)
downloadportage-0024e08c303c9398091199da86422de7d85c6577.tar.gz
portage-0024e08c303c9398091199da86422de7d85c6577.tar.bz2
portage-0024e08c303c9398091199da86422de7d85c6577.zip
For bug #183861, allow a color class in color.map to specify a space separated list of attributes so that any combination of foreground, background, and other attributes is possible. Also make color class handling for package sets more consistent. Thanks to Arfrever Frehtes Taifersar Arahesis <Arfrever.FTA@GMail.Com>.
svn path=/main/branches/2.1.2/; revision=7151
Diffstat (limited to 'pym/output.py')
-rw-r--r--pym/output.py88
1 files changed, 68 insertions, 20 deletions
diff --git a/pym/output.py b/pym/output.py
index 2336e0fc2..2079bf6d9 100644
--- a/pym/output.py
+++ b/pym/output.py
@@ -73,6 +73,7 @@ codes["standout"] = esc_seq + "03m"
codes["underline"] = esc_seq + "04m"
codes["blink"] = esc_seq + "05m"
codes["overline"] = esc_seq + "06m" # Who made this up? Seriously.
+codes["reverse"] = esc_seq + "07m"
ansi_color_codes = []
for x in xrange(30, 38):
@@ -119,6 +120,15 @@ codes["darkyellow"] = codes["0xAAAA00"]
codes["fuscia"] = codes["fuchsia"]
codes["white"] = codes["bold"]
+codes["bg_black"] = esc_seq + "40m"
+codes["bg_red"] = esc_seq + "41m"
+codes["bg_green"] = esc_seq + "42m"
+codes["bg_brown"] = esc_seq + "43m"
+codes["bg_blue"] = esc_seq + "44m"
+codes["bg_magenta"] = esc_seq + "45m"
+codes["bg_cyan"] = esc_seq + "46m"
+codes["bg_white"] = esc_seq + "47m"
+
# Colors from /sbin/functions.sh
codes["GOOD"] = codes["green"]
codes["WARN"] = codes["yellow"]
@@ -127,20 +137,33 @@ codes["HILITE"] = codes["teal"]
codes["BRACKET"] = codes["blue"]
# Portage functions
-codes["INFORM"] = codes["darkgreen"]
-codes["UNMERGE_WARN"] = codes["red"]
-codes["SECURITY_WARN"] = codes["red"]
-codes["MERGE_LIST_PROGRESS"] = codes["yellow"]
-codes["PKG_MERGE"] = codes["darkgreen"]
-codes["PKG_MERGE_ARG"] = codes["darkgreen"]
-codes["PKG_MERGE_SYSTEM"] = codes["green"]
-codes["PKG_MERGE_WORLD"] = codes["green"]
-codes["PKG_NOMERGE"] = codes["darkblue"]
-codes["PKG_NOMERGE_ARG"] = codes["darkblue"]
-codes["PKG_NOMERGE_SYSTEM"] = codes["blue"]
-codes["PKG_NOMERGE_WORLD"] = codes["blue"]
-
-def parse_color_map():
+codes["INFORM"] = codes["darkgreen"]
+codes["UNMERGE_WARN"] = codes["red"]
+codes["SECURITY_WARN"] = codes["red"]
+codes["MERGE_LIST_PROGRESS"] = codes["yellow"]
+codes["PKG_MERGE"] = codes["darkgreen"]
+codes["PKG_MERGE_ARG"] = codes["darkgreen"]
+codes["PKG_MERGE_SYSTEM"] = codes["green"]
+codes["PKG_MERGE_WORLD"] = codes["green"]
+codes["PKG_MERGE_ARG_SYSTEM"] = codes["green"]
+codes["PKG_MERGE_ARG_WORLD"] = codes["green"]
+codes["PKG_NOMERGE"] = codes["darkblue"]
+codes["PKG_NOMERGE_ARG"] = codes["darkblue"]
+codes["PKG_NOMERGE_SYSTEM"] = codes["blue"]
+codes["PKG_NOMERGE_WORLD"] = codes["blue"]
+codes["PKG_NOMERGE_ARG_SYSTEM"] = codes["blue"]
+codes["PKG_NOMERGE_ARG_WORLD"] = codes["blue"]
+
+def parse_color_map(onerror=None):
+ """
+ Parse /etc/portage/color.map and return a dict of error codes.
+
+ @param onerror: an optional callback to handle any ParseError that would
+ otherwise be raised
+ @type onerror: callable
+ @rtype: dict
+ @return: a dictionary mapping color classes to color codes
+ """
myfile = COLOR_MAP_FILE
ansi_code_pattern = re.compile("^[0-9;]*m$")
def strip_quotes(token, quotes):
@@ -156,16 +179,41 @@ def parse_color_map():
if k is s.eof:
break
if o != "=":
- raise ParseError("%s%s'%s'" % (s.error_leader(myfile, s.lineno), "expected '=' operator: ", o))
+ e = ParseError("%s%s'%s'" % (
+ s.error_leader(myfile, s.lineno),
+ "expected '=' operator: ", o))
+ if onerror:
+ onerror(e)
+ else:
+ raise e
+ continue
k = strip_quotes(k, s.quotes)
v = strip_quotes(v, s.quotes)
+ if not k in codes:
+ e = ParseError("%s%s'%s'" % (
+ s.error_leader(myfile, s.lineno),
+ "Unknown variable: ", k))
+ if onerror:
+ onerror(e)
+ else:
+ raise e
+ continue
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))
+ code_list = []
+ for x in v.split(" "):
+ if x in codes:
+ code_list.append(codes[x])
+ else:
+ e = ParseError("%s%s'%s'" % (
+ s.error_leader(myfile, s.lineno),
+ "Undefined: ", x))
+ if onerror:
+ onerror(e)
+ else:
+ raise e
+ codes[k] = "".join(code_list)
except (IOError, OSError), e:
if e.errno == errno.ENOENT:
raise FileNotFound(myfile)
@@ -174,7 +222,7 @@ def parse_color_map():
raise
try:
- parse_color_map()
+ parse_color_map(onerror=lambda e: writemsg("%s\n" % str(e), noiselevel=-1))
except FileNotFound, e:
pass
except PortageException, e: