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 / +141 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(myfile):
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
			commenter_pos = line.find("#")
191
				break
161
			line = line[:commenter_pos].strip()
192
			if o != "=":
162
			
193
				e = ParseError("%s%s'%s'" % (
163
			if len(line) == 0:
194
					s.error_leader(myfile, s.lineno),
164
				continue
195
					"expected '=' operator: ", o))
165
			
166
			split_line = line.split("=")
167
			if len(split_line) != 2:
168
				e = ParseError("'%s', line %s: %s" % (
169
					myfile, lineno,
170
					"expected exactly one occurence of '=' operator"))
171
				raise e
196
				if onerror:
172
				if onerror:
197
					onerror(e)
173
					onerror(e)
198
				else:
174
				else:
199
					raise e
175
					raise e
200
				continue
176
				continue
201
			k = strip_quotes(k, s.quotes)
177
202
			v = strip_quotes(v, s.quotes)
178
			k = strip_quotes(split_line[0].strip(), "\"")
203
			if not k in codes:
179
			v = strip_quotes(split_line[1].strip(), "\"")
204
				e = ParseError("%s%s'%s'" % (
180
			if not k in codes and not k in color_codes:
205
					s.error_leader(myfile, s.lineno),
181
				e = ParseError("'%s', line %s: %s'%s'" % (
182
					myfile, lineno,
206
					"Unknown variable: ", k))
183
					"Unknown variable: ", k))
207
				if onerror:
184
				if onerror:
208
					onerror(e)
185
					onerror(e)
Lines 210-230 Link Here
210
					raise e
187
					raise e
211
				continue
188
				continue
212
			if ansi_code_pattern.match(v):
189
			if ansi_code_pattern.match(v):
213
				codes[k] = esc_seq + v
190
				if k in codes:
191
					codes[k] = [ esc_seq + v ]
192
				elif k in color_codes:
193
					color_codes[k] = esc_seq + v
214
			else:
194
			else:
215
				code_list = []
195
				code_list = []
216
				for x in v.split(" "):
196
				for x in v.split(" "):
217
					if x in codes:
197
					if x in color_codes:
218
						code_list.append(codes[x])
198
						if k in codes:
199
							code_list.append(x)
200
						elif k in color_codes:
201
							code_list.append(color_codes[x])
219
					else:
202
					else:
220
						e = ParseError("%s%s'%s'" % (
203
						e = ParseError("'%s', line %s: %s'%s'" % (
221
							s.error_leader(myfile, s.lineno),
204
							myfile, lineno,
222
							"Undefined: ", x))
205
							"Undefined: ", x))
223
						if onerror:
206
						if onerror:
224
							onerror(e)
207
							onerror(e)
225
						else:
208
						else:
226
							raise e
209
							raise e
227
				codes[k] = "".join(code_list)
210
				if k in codes:
211
					codes[k] = code_list
212
				elif k in color_codes:
213
					color_codes[k] = "".join(code_list)
228
	except (IOError, OSError), e:
214
	except (IOError, OSError), e:
229
		if e.errno == errno.ENOENT:
215
		if e.errno == errno.ENOENT:
230
			raise FileNotFound(myfile)
216
			raise FileNotFound(myfile)
Lines 232-248 Link Here
232
			raise PermissionDenied(myfile)
218
			raise PermissionDenied(myfile)
233
		raise
219
		raise
234
220
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):
221
def nc_len(mystr):
247
	tmp = re.sub(esc_seq + "^m]+m", "", mystr);
222
	tmp = re.sub(esc_seq + "^m]+m", "", mystr);
248
	return len(tmp)
223
	return len(tmp)
Lines 308-319 Link Here
308
	havecolor=0
283
	havecolor=0
309
284
310
def resetColor():
285
def resetColor():
311
	return codes["reset"]
286
	return color_codes["reset"]
312
287
288
def map_code_to_color_code(code):
289
	ret = ""
290
	for color_code in codes[code]:
291
		if color_code in color_codes:
292
			ret += color_codes[color_code]
293
		else:
294
			#allow stuff that has found it's way through ansi_code_pattern
295
			ret += color_code
296
	return ret
297
313
def colorize(color_key, text):
298
def colorize(color_key, text):
314
	global havecolor
299
	global havecolor
315
	if havecolor:
300
	if havecolor:
316
		return codes[color_key] + text + codes["reset"]
301
		if color_key in color_codes:
302
			return color_codes[color_key] + text + color_codes["reset"]
303
		elif color_key in codes:
304
			return map_code_to_color_code(color_key) + text + color_codes["reset"]
305
		else:
306
			return text
317
	else:
307
	else:
318
		return text
308
		return text
319
309
Lines 350-358 Link Here
350
		global havecolor
340
		global havecolor
351
		if havecolor and self._styles:
341
		if havecolor and self._styles:
352
			for style in self._styles:
342
			for style in self._styles:
353
				self._file.write(codes[style])
343
				self._file.write(color_codes[style])
354
			self._file.write(s)
344
			self._file.write(s)
355
			self._file.write(codes["reset"])
345
			self._file.write(color_codes["reset"])
356
		else:
346
		else:
357
			self._file.write(s)
347
			self._file.write(s)
358
		if self.write_listener:
348
		if self.write_listener:
Lines 715-717 Link Here
715
			image = image + "[" + (bar_width * "=") + \
705
			image = image + "[" + (bar_width * "=") + \
716
				">" + ((max_bar_width - bar_width) * " ") + "]"
706
				">" + ((max_bar_width - bar_width) * " ") + "]"
717
			return image
707
			return image
708
709
try:
710
	_parse_color_map(onerror=lambda e: writemsg("%s\n" % str(e), noiselevel=-1))
711
except FileNotFound:
712
	pass
713
except PermissionDenied, e:
714
	writemsg("Permission denied: '%s'\n" % str(e), noiselevel=-1)
715
	del e
716
except PortageException, e:
717
	writemsg("%s\n" % str(e), noiselevel=-1)
718
	del e
(-)man/color.map.5 (-2 / +2 lines)
Lines 9-17 Link Here
9
of given color class is found in /etc/portage/color.map, Portage uses default
9
of given color class is found in /etc/portage/color.map, Portage uses default
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 or ansi code pattern]\fR
13
.TP
13
.TP
14
\fBATTRIBUTE\fR = \fI[space delimited list of attributes]\fR
14
\fBATTRIBUTE\fR = \fI[space delimited list of attributes or ansi code pattern]\fR
15
.SH "VARIABLES"
15
.SH "VARIABLES"
16
.TP
16
.TP
17
\fBNORMAL\fR = \fI"normal"\fR
17
\fBNORMAL\fR = \fI"normal"\fR

Return to bug 274279