Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 274279 | Differences between
and this patch

Collapse All | Expand All

(-)pym/portage/__init__.py (-1 / +1 lines)
Lines 5431-5437 Link Here
5431
	# Allow color.map to control colors associated with einfo, ewarn, etc...
5431
	# Allow color.map to control colors associated with einfo, ewarn, etc...
5432
	mycolors = []
5432
	mycolors = []
5433
	for c in ("GOOD", "WARN", "BAD", "HILITE", "BRACKET"):
5433
	for c in ("GOOD", "WARN", "BAD", "HILITE", "BRACKET"):
5434
		mycolors.append("%s=$'%s'" % (c, portage.output.codes[c]))
5434
		mycolors.append("%s=$'%s'" % (c, portage.output.map_code_to_color_code(c)))
5435
	mysettings["PORTAGE_COLORMAP"] = "\n".join(mycolors)
5435
	mysettings["PORTAGE_COLORMAP"] = "\n".join(mycolors)
5436
5436
5437
def prepare_build_dirs(myroot, mysettings, cleanup):
5437
def prepare_build_dirs(myroot, mysettings, cleanup):
(-)pym/portage/output.py (-140 / +145 lines)
Lines 24-92 Link Here
24
havecolor=1
24
havecolor=1
25
dotitles=1
25
dotitles=1
26
26
27
codes={}
28
color_codes={}
29
27
esc_seq = "\x1b["
30
esc_seq = "\x1b["
28
31
29
g_attr = {}
32
color_codes["normal"]       =  esc_seq + "0m"
30
g_attr["normal"]       =  0
33
color_codes["reset"]     	=  esc_seq + "39;49;00m"
31
34
32
g_attr["bold"]         =  1
35
color_codes["bold"]         =  esc_seq + "01m"
33
g_attr["faint"]        =  2
36
color_codes["faint"]        =  esc_seq + "02m"
34
g_attr["standout"]     =  3
37
color_codes["standout"]     =  esc_seq + "03m"
35
g_attr["underline"]    =  4
38
color_codes["underline"]    =  esc_seq + "04m"
36
g_attr["blink"]        =  5
39
color_codes["blink"]        =  esc_seq + "05m"
37
g_attr["overline"]     =  6  # Why is overline actually useful?
40
color_codes["overline"]     =  esc_seq + "06m"
38
g_attr["reverse"]      =  7
41
color_codes["reverse"]      =  esc_seq + "07m"
39
g_attr["invisible"]    =  8
42
color_codes["invisible"]    =  esc_seq + "08m"
40
43
41
g_attr["no-attr"]      = 22
44
color_codes["no-attr"]      = esc_seq + "22m"
42
g_attr["no-standout"]  = 23
45
color_codes["no-standout"]  = esc_seq + "23m"
43
g_attr["no-underline"] = 24
46
color_codes["no-underline"] = esc_seq + "24m"
44
g_attr["no-blink"]     = 25
47
color_codes["no-blink"]     = esc_seq + "25m"
45
g_attr["no-overline"]  = 26
48
color_codes["no-overline"]  = esc_seq + "26m"
46
g_attr["no-reverse"]   = 27
49
color_codes["no-reverse"]   = esc_seq + "27m"
47
# 28 isn't defined?
48
# 29 isn't defined?
49
g_attr["black"]        = 30
50
g_attr["red"]          = 31
51
g_attr["green"]        = 32
52
g_attr["yellow"]       = 33
53
g_attr["blue"]         = 34
54
g_attr["magenta"]      = 35
55
g_attr["cyan"]         = 36
56
g_attr["white"]        = 37
57
# 38 isn't defined?
58
g_attr["default"]      = 39
59
g_attr["bg_black"]     = 40
60
g_attr["bg_red"]       = 41
61
g_attr["bg_green"]     = 42
62
g_attr["bg_yellow"]    = 43
63
g_attr["bg_blue"]      = 44
64
g_attr["bg_magenta"]   = 45
65
g_attr["bg_cyan"]      = 46
66
g_attr["bg_white"]     = 47
67
g_attr["bg_default"]   = 49
68
50
51
color_codes["bg_black"]      = esc_seq + "40m"
52
color_codes["bg_darkred"]    = esc_seq + "41m"
53
color_codes["bg_darkgreen"]  = esc_seq + "42m"
54
color_codes["bg_brown"]      = esc_seq + "43m"
55
color_codes["bg_darkblue"]   = esc_seq + "44m"
56
color_codes["bg_purple"]     = esc_seq + "45m"
57
color_codes["bg_teal"]       = esc_seq + "46m"
58
color_codes["bg_lightgray"]  = esc_seq + "47m"
59
color_codes["bg_default"]    = esc_seq + "49m"
60
color_codes["bg_darkyellow"] = color_codes["bg_brown"]
69
61
70
# make_seq("blue", "black", "normal")
71
def color(fg, bg="default", attr=["normal"]):
62
def color(fg, bg="default", attr=["normal"]):
72
	mystr = esc_seq[:] + "%02d" % g_attr[fg]
63
	mystr = color_codes[fg]
73
	for x in [bg]+attr:
64
	for x in [bg]+attr:
74
		mystr += ";%02d" % g_attr[x]
65
		mystr += color_codes[x]
75
	return mystr+"m"
66
	return mystr
76
67
77
68
78
79
codes={}
80
codes["reset"]     = esc_seq + "39;49;00m"
81
82
codes["bold"]      = esc_seq + "01m"
83
codes["faint"]     = esc_seq + "02m"
84
codes["standout"]  = esc_seq + "03m"
85
codes["underline"] = esc_seq + "04m"
86
codes["blink"]     = esc_seq + "05m"
87
codes["overline"]  = esc_seq + "06m"  # Who made this up? Seriously.
88
codes["reverse"]   = esc_seq + "07m"
89
90
ansi_color_codes = []
69
ansi_color_codes = []
91
for x in xrange(30, 38):
70
for x in xrange(30, 38):
92
	ansi_color_codes.append("%im" % x)
71
	ansi_color_codes.append("%im" % x)
Lines 97-172 Link Here
97
	'0xFF55FF', '0x00AAAA', '0x55FFFF', '0xAAAAAA', '0xFFFFFF']
76
	'0xFF55FF', '0x00AAAA', '0x55FFFF', '0xAAAAAA', '0xFFFFFF']
98
77
99
for x in xrange(len(rgb_ansi_colors)):
78
for x in xrange(len(rgb_ansi_colors)):
100
	codes[rgb_ansi_colors[x]] = esc_seq + ansi_color_codes[x]
79
	color_codes[rgb_ansi_colors[x]] = esc_seq + ansi_color_codes[x]
101
80
102
del x
81
del x
103
82
104
codes["black"]     = codes["0x000000"]
83
color_codes["black"]     = color_codes["0x000000"]
105
codes["darkgray"]  = codes["0x555555"]
84
color_codes["darkgray"]  = color_codes["0x555555"]
106
85
107
codes["red"]       = codes["0xFF5555"]
86
color_codes["red"]       = color_codes["0xFF5555"]
108
codes["darkred"]   = codes["0xAA0000"]
87
color_codes["darkred"]   = color_codes["0xAA0000"]
109
88
110
codes["green"]     = codes["0x55FF55"]
89
color_codes["green"]     = color_codes["0x55FF55"]
111
codes["darkgreen"] = codes["0x00AA00"]
90
color_codes["darkgreen"] = color_codes["0x00AA00"]
112
91
113
codes["yellow"]    = codes["0xFFFF55"]
92
color_codes["yellow"]    = color_codes["0xFFFF55"]
114
codes["brown"]     = codes["0xAA5500"]
93
color_codes["brown"]     = color_codes["0xAA5500"]
115
94
116
codes["blue"]      = codes["0x5555FF"]
95
color_codes["blue"]      = color_codes["0x5555FF"]
117
codes["darkblue"]  = codes["0x0000AA"]
96
color_codes["darkblue"]  = color_codes["0x0000AA"]
118
97
119
codes["fuchsia"]   = codes["0xFF55FF"]
98
color_codes["fuchsia"]   = color_codes["0xFF55FF"]
120
codes["purple"]    = codes["0xAA00AA"]
99
color_codes["purple"]    = color_codes["0xAA00AA"]
121
100
122
codes["turquoise"] = codes["0x55FFFF"]
101
color_codes["turquoise"] = color_codes["0x55FFFF"]
123
codes["teal"]      = codes["0x00AAAA"]
102
color_codes["teal"]      = color_codes["0x00AAAA"]
124
103
125
codes["white"]     = codes["0xFFFFFF"]
104
color_codes["white"]     = color_codes["0xFFFFFF"]
126
codes["lightgray"] = codes["0xAAAAAA"]
105
color_codes["lightgray"] = color_codes["0xAAAAAA"]
127
106
128
codes["darkteal"]   = codes["turquoise"]
107
color_codes["darkteal"]   = color_codes["turquoise"]
129
# Some terminals have darkyellow instead of brown.
108
# Some terminals have darkyellow instead of brown.
130
codes["0xAAAA00"]   = codes["brown"]
109
color_codes["0xAAAA00"]   = color_codes["brown"]
131
codes["darkyellow"] = codes["0xAAAA00"]
110
color_codes["darkyellow"] = color_codes["0xAAAA00"]
132
111
133
codes["bg_black"]      = esc_seq + "40m"
134
codes["bg_darkred"]    = esc_seq + "41m"
135
codes["bg_darkgreen"]  = esc_seq + "42m"
136
codes["bg_brown"]      = esc_seq + "43m"
137
codes["bg_darkblue"]   = esc_seq + "44m"
138
codes["bg_purple"]     = esc_seq + "45m"
139
codes["bg_teal"]       = esc_seq + "46m"
140
codes["bg_lightgray"]  = esc_seq + "47m"
141
112
142
codes["bg_darkyellow"] = codes["bg_brown"]
143
113
144
# Colors from /etc/init.d/functions.sh
114
# Colors from /etc/init.d/functions.sh
145
codes["NORMAL"]     = esc_seq + "0m"
115
codes["NORMAL"]     = [ "normal" ]
146
codes["GOOD"]       = codes["green"]
116
codes["GOOD"]       = [ "green" ]
147
codes["WARN"]       = codes["yellow"]
117
codes["WARN"]       = [ "yellow" ]
148
codes["BAD"]        = codes["red"]
118
codes["BAD"]        = [ "red" ]
149
codes["HILITE"]     = codes["teal"]
119
codes["HILITE"]     = [ "teal" ]
150
codes["BRACKET"]    = codes["blue"]
120
codes["BRACKET"]    = [ "blue" ]
151
121
152
# Portage functions
122
# Portage functions
153
codes["INFORM"]                  = codes["darkgreen"]
123
codes["INFORM"]                  = [ "darkgreen" ]
154
codes["UNMERGE_WARN"]            = codes["red"]
124
codes["UNMERGE_WARN"]            = [ "red" ]
155
codes["SECURITY_WARN"]           = codes["red"]
125
codes["SECURITY_WARN"]           = [ "red" ]
156
codes["MERGE_LIST_PROGRESS"]     = codes["yellow"]
126
codes["MERGE_LIST_PROGRESS"]     = [ "yellow" ]
157
codes["PKG_BLOCKER"]             = codes["red"]
127
codes["PKG_BLOCKER"]             = [ "red" ]
158
codes["PKG_BLOCKER_SATISFIED"]   = codes["darkblue"]
128
codes["PKG_BLOCKER_SATISFIED"]   = [ "darkblue" ]
159
codes["PKG_MERGE"]               = codes["darkgreen"]
129
codes["PKG_MERGE"]               = [ "darkgreen" ]
160
codes["PKG_MERGE_SYSTEM"]        = codes["darkgreen"]
130
codes["PKG_MERGE_SYSTEM"]        = [ "darkgreen" ]
161
codes["PKG_MERGE_WORLD"]         = codes["green"]
131
codes["PKG_MERGE_WORLD"]         = [ "green" ]
162
codes["PKG_UNINSTALL"]           = codes["red"]
132
codes["PKG_UNINSTALL"]           = [ "red" ]
163
codes["PKG_NOMERGE"]             = codes["darkblue"]
133
codes["PKG_NOMERGE"]             = [ "darkblue" ]
164
codes["PKG_NOMERGE_SYSTEM"]      = codes["darkblue"]
134
codes["PKG_NOMERGE_SYSTEM"]      = [ "darkblue" ]
165
codes["PKG_NOMERGE_WORLD"]       = codes["blue"]
135
codes["PKG_NOMERGE_WORLD"]       = [ "blue" ]
166
codes["PROMPT_CHOICE_DEFAULT"]   = codes["green"]
136
codes["PROMPT_CHOICE_DEFAULT"]   = [ "green" ]
167
codes["PROMPT_CHOICE_OTHER"]     = codes["red"]
137
codes["PROMPT_CHOICE_OTHER"]     = [ "red" ]
168
138
169
def parse_color_map(onerror=None):
139
def _parse_color_map(onerror=None):
170
	"""
140
	"""
171
	Parse /etc/portage/color.map and return a dict of error codes.
141
	Parse /etc/portage/color.map and return a dict of error codes.
172
142
Lines 183-208 Link Here
183
			token = token[1:-1]
153
			token = token[1:-1]
184
		return token
154
		return token
185
	try:
155
	try:
186
		s = shlex.shlex(open(myfile))
156
		lineno=0
187
		s.wordchars = s.wordchars + ";" # for ansi codes
157
		for line in open(COLOR_MAP_FILE):
188
		while True:
158
			lineno += 1
189
			k, o, v = s.get_token(), s.get_token(), s.get_token()
159
			
190
			if k is s.eof:
160
			print "line: ",
191
				break
161
			print line
192
			if o != "=":
162
			commenter_pos = line.find("#")
193
				e = ParseError("%s%s'%s'" % (
163
			line = line[:commenter_pos].strip()
194
					s.error_leader(myfile, s.lineno),
164
			print "processed line: '",
195
					"expected '=' operator: ", o))
165
			print line,
166
			print "'"
167
			
168
			if len(line) == 0:
169
				continue
170
			
171
			split_line = line.split("=")
172
			if len(split_line) != 2:
173
				e = ParseError("'%s', line %s: %s" % (
174
					myfile, lineno,
175
					"expected exactly one occurence of '=' operator"))
176
				raise e
196
				if onerror:
177
				if onerror:
197
					onerror(e)
178
					onerror(e)
198
				else:
179
				else:
199
					raise e
180
					raise e
200
				continue
181
				continue
201
			k = strip_quotes(k, s.quotes)
182
202
			v = strip_quotes(v, s.quotes)
183
			k = strip_quotes(split_line[0].strip(), "\"")
203
			if not k in codes:
184
			v = strip_quotes(split_line[1].strip(), "\"")
204
				e = ParseError("%s%s'%s'" % (
185
			if not k in codes and not k in color_codes:
205
					s.error_leader(myfile, s.lineno),
186
				e = ParseError("'%s', line %s: %s'%s'" % (
187
					myfile, lineno,
206
					"Unknown variable: ", k))
188
					"Unknown variable: ", k))
207
				if onerror:
189
				if onerror:
208
					onerror(e)
190
					onerror(e)
Lines 210-230 Link Here
210
					raise e
192
					raise e
211
				continue
193
				continue
212
			if ansi_code_pattern.match(v):
194
			if ansi_code_pattern.match(v):
213
				codes[k] = esc_seq + v
195
				if k in codes:
196
					codes[k] = [ esc_seq + v ]
197
				elif k in color_codes:
198
					color_codes[k] = esc_seq + v
214
			else:
199
			else:
215
				code_list = []
200
				code_list = []
216
				for x in v.split(" "):
201
				for x in v.split(" "):
217
					if x in codes:
202
					if x in color_codes:
218
						code_list.append(codes[x])
203
						if k in codes:
204
							code_list.append(x)
205
						elif k in color_codes:
206
							code_list.append(color_codes[x])
219
					else:
207
					else:
220
						e = ParseError("%s%s'%s'" % (
208
						e = ParseError("'%s', line %s: %s'%s'" % (
221
							s.error_leader(myfile, s.lineno),
209
							myfile, lineno,
222
							"Undefined: ", x))
210
							"Undefined: ", x))
223
						if onerror:
211
						if onerror:
224
							onerror(e)
212
							onerror(e)
225
						else:
213
						else:
226
							raise e
214
							raise e
227
				codes[k] = "".join(code_list)
215
				if k in codes:
216
					codes[k] = code_list
217
					print codes[k]
218
				elif k in color_codes:
219
					color_codes[k] = "".join(code_list)
228
	except (IOError, OSError), e:
220
	except (IOError, OSError), e:
229
		if e.errno == errno.ENOENT:
221
		if e.errno == errno.ENOENT:
230
			raise FileNotFound(myfile)
222
			raise FileNotFound(myfile)
Lines 232-248 Link Here
232
			raise PermissionDenied(myfile)
224
			raise PermissionDenied(myfile)
233
		raise
225
		raise
234
226
235
try:
236
	parse_color_map(onerror=lambda e: writemsg("%s\n" % str(e), noiselevel=-1))
237
except FileNotFound:
238
	pass
239
except PermissionDenied, e:
240
	writemsg("Permission denied: '%s'\n" % str(e), noiselevel=-1)
241
	del e
242
except PortageException, e:
243
	writemsg("%s\n" % str(e), noiselevel=-1)
244
	del e
245
246
def nc_len(mystr):
227
def nc_len(mystr):
247
	tmp = re.sub(esc_seq + "^m]+m", "", mystr);
228
	tmp = re.sub(esc_seq + "^m]+m", "", mystr);
248
	return len(tmp)
229
	return len(tmp)
Lines 308-319 Link Here
308
	havecolor=0
289
	havecolor=0
309
290
310
def resetColor():
291
def resetColor():
311
	return codes["reset"]
292
	return color_codes["reset"]
312
293
294
def map_code_to_color_code(code):
295
	#fix my bad python
296
	ret = ""
297
	for color_code in codes[code]:
298
		if color_code in color_codes:
299
			ret += color_codes[color_code]
300
	return ret
301
313
def colorize(color_key, text):
302
def colorize(color_key, text):
314
	global havecolor
303
	global havecolor
315
	if havecolor:
304
	if havecolor:
316
		return codes[color_key] + text + codes["reset"]
305
		if color_key in color_codes:
306
			return color_codes[color_key] + text + color_codes["reset"]
307
		elif color_key in codes:
308
			return map_code_to_color_code(color_key) + text + color_codes["reset"]
309
		else:
310
			return text
317
	else:
311
	else:
318
		return text
312
		return text
319
313
Lines 350-358 Link Here
350
		global havecolor
344
		global havecolor
351
		if havecolor and self._styles:
345
		if havecolor and self._styles:
352
			for style in self._styles:
346
			for style in self._styles:
353
				self._file.write(codes[style])
347
				self._file.write(color_codes[style])
354
			self._file.write(s)
348
			self._file.write(s)
355
			self._file.write(codes["reset"])
349
			self._file.write(color_codes["reset"])
356
		else:
350
		else:
357
			self._file.write(s)
351
			self._file.write(s)
358
		if self.write_listener:
352
		if self.write_listener:
Lines 715-717 Link Here
715
			image = image + "[" + (bar_width * "=") + \
709
			image = image + "[" + (bar_width * "=") + \
716
				">" + ((max_bar_width - bar_width) * " ") + "]"
710
				">" + ((max_bar_width - bar_width) * " ") + "]"
717
			return image
711
			return image
712
713
try:
714
	_parse_color_map(onerror=lambda e: writemsg("%s\n" % str(e), noiselevel=-1))
715
except FileNotFound:
716
	pass
717
except PermissionDenied, e:
718
	writemsg("Permission denied: '%s'\n" % str(e), noiselevel=-1)
719
	del e
720
except PortageException, e:
721
	writemsg("%s\n" % str(e), noiselevel=-1)
722
	del e
(-)man/color.map.5 (-2 / +27 lines)
Lines 10-17 Link Here
10
value defined internally.
10
value defined internally.
11
.SH "SYNTAX"
11
.SH "SYNTAX"
12
\fBVARIABLE\fR = \fI[space delimited list of attributes]\fR
12
\fBVARIABLE\fR = \fI[space delimited list of attributes]\fR
13
.TP
14
\fBATTRIBUTE\fR = \fI[space delimited list of attributes]\fR
13
.SH "VARIABLES"
15
.SH "VARIABLES"
14
.TP
16
.TP
17
\fBNORMAL\fR = \fI"normal"\fR
18
Defines color used for some words occuring in other contexts than those below.
19
.TP
15
\fBBAD\fR = \fI"red"\fR
20
\fBBAD\fR = \fI"red"\fR
16
Defines color used for some words occuring in bad context.
21
Defines color used for some words occuring in bad context.
17
.TP
22
.TP
Lines 89-98 Link Here
89
.TP
94
.TP
90
.B green
95
.B green
91
.TP
96
.TP
92
\fBbrown\fR = \fBdarkyellow\fR
97
.B brown
93
.TP
98
.TP
94
.B yellow
99
.B yellow
95
.TP
100
.TP
101
.B darkyellow
102
.TP
96
.B darkblue
103
.B darkblue
97
.TP
104
.TP
98
.B blue
105
.B blue
Lines 103-109 Link Here
103
.TP
110
.TP
104
.B teal
111
.B teal
105
.TP
112
.TP
106
.B turquoise
113
\fBturquoise\fR = \fBdarkteal\fR
107
.TP
114
.TP
108
.B lightgray
115
.B lightgray
109
.TP
116
.TP
Lines 133-138 Link Here
133
.B Other attributes
140
.B Other attributes
134
.RS
141
.RS
135
.TP
142
.TP
143
.B normal
144
.TP
145
.B no-attr
146
.TP
136
.B reset
147
.B reset
137
.TP
148
.TP
138
.B bold
149
.B bold
Lines 141-151 Link Here
141
.TP
152
.TP
142
.B standout
153
.B standout
143
.TP
154
.TP
155
.B no-standout
156
.TP
144
.B underline
157
.B underline
145
.TP
158
.TP
159
.B no-underline
160
.TP
146
.B blink
161
.B blink
147
.TP
162
.TP
163
.B no-blink
164
.TP
165
.B overline
166
.TP
167
.B no-overline
168
.TP
148
.B reverse
169
.B reverse
170
.TP
171
.B no-reverse
172
.TP
173
.B invisible
149
.RE
174
.RE
150
.SH "REPORTING BUGS"
175
.SH "REPORTING BUGS"
151
Please report bugs via http://bugs.gentoo.org/
176
Please report bugs via http://bugs.gentoo.org/

Return to bug 274279