@@ -5,7 +5,7 @@ module Fake.TraceListener
5
5
open System
6
6
7
7
/// Defines Tracing information for TraceListeners
8
- type TraceData =
8
+ type TraceData =
9
9
| StartMessage
10
10
| ImportantMessage of string
11
11
| ErrorMessage of string
@@ -36,11 +36,11 @@ type TraceData =
36
36
| CloseTag _ -> None
37
37
38
38
/// Defines a TraceListener interface
39
- type ITraceListener =
39
+ type ITraceListener =
40
40
abstract Write : TraceData -> unit
41
41
42
42
/// A default color map which maps TracePriorities to ConsoleColors
43
- let colorMap traceData =
43
+ let colorMap traceData =
44
44
match traceData with
45
45
| ImportantMessage _ -> ConsoleColor.Yellow
46
46
| ErrorMessage _ -> ConsoleColor.Red
@@ -53,86 +53,120 @@ let colorMap traceData =
53
53
/// ## Parameters
54
54
/// - `importantMessagesToStdErr` - Defines whether to trace important messages to StdErr.
55
55
/// - `colorMap` - A function which maps TracePriorities to ConsoleColors.
56
- type ConsoleTraceListener ( importantMessagesToStdErr , colorMap ) =
57
-
58
- let writeText toStdErr color newLine text =
56
+ type ConsoleTraceListener ( importantMessagesToStdErr , colorMap , useAnsiColorCodes ) =
57
+ let writeTextConsoleColor print color text =
59
58
let curColor = Console.ForegroundColor
60
59
try
61
60
try
62
61
if curColor <> color then Console.ForegroundColor <- color
63
- let printer =
64
- match toStdErr, newLine with
65
- | true , true -> eprintfn
66
- | true , false -> eprintf
67
- | false , true -> printfn
68
- | false , false -> printf
69
- printer " %s " text
62
+ print text
70
63
with
71
- | :? ArgumentException when EnvironmentHelper.isMono ->
64
+ | :? ArgumentException when EnvironmentHelper.isMono ->
72
65
printfn " * Color output has been disabled because of a bug in GNOME Terminal."
73
66
printfn " * Hint: To workaround this bug, please set environment property TERM=xterm-256color"
74
67
reraise()
75
68
finally
76
69
if curColor <> color then Console.ForegroundColor <- curColor
77
-
70
+
71
+ let writeTextAnsiColor print color text =
72
+ let colorCode = function
73
+ | ConsoleColor.Black -> [ 30 ]
74
+ | ConsoleColor.Blue -> [ 34 ]
75
+ | ConsoleColor.Cyan -> [ 36 ]
76
+ | ConsoleColor.Gray -> [ 37 ; 2 ]
77
+ | ConsoleColor.Green -> [ 32 ]
78
+ | ConsoleColor.Magenta -> [ 35 ]
79
+ | ConsoleColor.Red -> [ 31 ]
80
+ | ConsoleColor.White -> [ 37 ]
81
+ | ConsoleColor.Yellow -> [ 33 ]
82
+ | ConsoleColor.DarkBlue -> [ 34 ; 2 ]
83
+ | ConsoleColor.DarkCyan -> [ 36 ; 2 ]
84
+ | ConsoleColor.DarkGray -> [ 37 ; 2 ]
85
+ | ConsoleColor.DarkGreen -> [ 32 ; 2 ]
86
+ | ConsoleColor.DarkMagenta -> [ 35 ; 2 ]
87
+ | ConsoleColor.DarkRed -> [ 31 ; 2 ]
88
+ | ConsoleColor.DarkYellow -> [ 33 ; 2 ]
89
+ | _ -> [ 39 ]
90
+
91
+ let codeStr =
92
+ colorCode color
93
+ |> List.map ( sprintf " %i " )
94
+ |> String.concat " ;"
95
+
96
+ print <| sprintf " \x1b [%s m%s \x1b [0m" codeStr text
97
+
98
+ let printer toStdErr newLine =
99
+ match toStdErr, newLine with
100
+ | true , true -> eprintfn " %s "
101
+ | true , false -> eprintf " %s "
102
+ | false , true -> printfn " %s "
103
+ | false , false -> printf " %s "
104
+
78
105
interface ITraceListener with
79
106
/// Writes the given message to the Console.
80
- member this.Write msg =
107
+ member this.Write msg =
81
108
let color = colorMap msg
109
+ let writeText text printer =
110
+ if useAnsiColorCodes
111
+ then writeTextAnsiColor printer color text
112
+ else writeTextConsoleColor printer color text
82
113
match msg with
83
114
| StartMessage -> ()
84
115
| OpenTag _ -> ()
85
116
| CloseTag _ -> ()
86
117
| ImportantMessage text | ErrorMessage text ->
87
- writeText importantMessagesToStdErr color true text
118
+ printer importantMessagesToStdErr true |> writeText text
88
119
| LogMessage( text, newLine) | TraceMessage( text, newLine) ->
89
- writeText false color newLine text
120
+ printer false newLine |> writeText text
90
121
| FinishedMessage -> ()
91
122
92
123
// If we write the stderr on those build servers the build will fail.
93
124
let importantMessagesToStdErr = buildServer <> CCNet && buildServer <> AppVeyor && buildServer <> TeamCity
94
125
126
+ // stdout is piped to the logger, so colours are lost. AppVeyor supports ANSI color codes.
127
+ let useAnsiColors = buildServer = AppVeyor
128
+
95
129
/// The default TraceListener for Console.
96
130
let defaultConsoleTraceListener =
97
- ConsoleTraceListener( importantMessagesToStdErr, colorMap)
131
+ ConsoleTraceListener( importantMessagesToStdErr, colorMap, useAnsiColors )
98
132
99
133
/// Specifies if the XmlWriter should close tags automatically
100
134
let mutable AutoCloseXmlWriter = false
101
135
102
136
/// Implements a TraceListener which writes NAnt like XML files.
103
137
/// ## Parameters
104
138
/// - `xmlOutputFile` - Defines the xml output file.
105
- type NAntXmlTraceListener ( xmlOutputFile ) =
139
+ type NAntXmlTraceListener ( xmlOutputFile ) =
106
140
let xmlOutputPath = FullName xmlOutputFile
107
141
let getXmlWriter () = new IO.StreamWriter( xmlOutputPath, true , encoding)
108
142
let mutable xmlWriter : IO.StreamWriter = null
109
-
110
- let deleteOldFile () =
143
+
144
+ let deleteOldFile () =
111
145
let fi = fileInfo xmlOutputPath
112
- if fi.Exists then
146
+ if fi.Exists then
113
147
fi.IsReadOnly <- false
114
148
fi.Delete()
115
149
if not fi.Directory.Exists then fi.Directory.Create()
116
-
117
- let closeWriter () =
118
- if xmlWriter <> null then
150
+
151
+ let closeWriter () =
152
+ if xmlWriter <> null then
119
153
xmlWriter.Close()
120
154
xmlWriter <- null
121
-
122
- let getXml msg =
155
+
156
+ let getXml msg =
123
157
match msg with
124
158
| StartMessage -> " <?xml version=\" 1.0\" ?>\r\n <buildresults>"
125
159
| ImportantMessage text -> sprintf " <message level=\" Info\" ><![CDATA[%s ]]></message>" text // TODO: Set Level
126
160
| LogMessage( text, _) | TraceMessage( text, _) -> sprintf " <message level=\" Info\" ><![CDATA[%s ]]></message>" text
127
161
| FinishedMessage -> " </buildresults>"
128
162
| OpenTag( tag, name) -> sprintf " <%s name=\" %s \" >" tag name
129
163
| CloseTag tag -> sprintf " </%s >" tag
130
- | ErrorMessage text ->
164
+ | ErrorMessage text ->
131
165
sprintf " <failure><builderror><message level=\" Error\" ><![CDATA[%s ]]></message></builderror></failure>" text
132
-
166
+
133
167
interface ITraceListener with
134
168
/// Writes the given message to the xml file.
135
- member this.Write msg =
169
+ member this.Write msg =
136
170
if msg = StartMessage then deleteOldFile()
137
171
if xmlWriter = null then xmlWriter <- getXmlWriter()
138
172
msg
0 commit comments