-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBuildLog.cs
More file actions
164 lines (139 loc) · 5.16 KB
/
BuildLog.cs
File metadata and controls
164 lines (139 loc) · 5.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
using JD.Efcpt.Build.Tasks.Extensions;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace JD.Efcpt.Build.Tasks;
/// <summary>
/// Abstraction for build logging operations.
/// </summary>
/// <remarks>
/// This interface enables testability by allowing log implementations to be substituted
/// in unit tests without requiring MSBuild infrastructure.
/// </remarks>
public interface IBuildLog
{
/// <summary>
/// Logs an informational message with high importance.
/// </summary>
/// <param name="message">The message to log.</param>
void Info(string message);
/// <summary>
/// Logs a detailed message that only appears when verbosity is set to "detailed".
/// </summary>
/// <param name="message">The message to log.</param>
void Detail(string message);
/// <summary>
/// Logs a warning message.
/// </summary>
/// <param name="message">The warning message.</param>
void Warn(string message);
/// <summary>
/// Logs a warning message with a specific warning code.
/// </summary>
/// <param name="code">The warning code.</param>
/// <param name="message">The warning message.</param>
void Warn(string code, string message);
/// <summary>
/// Logs an error message.
/// </summary>
/// <param name="message">The error message.</param>
void Error(string message);
/// <summary>
/// Logs an error message with a specific error code.
/// </summary>
/// <param name="code">The error code.</param>
/// <param name="message">The error message.</param>
void Error(string code, string message);
/// <summary>
/// Logs a message at the specified severity level with an optional code.
/// </summary>
/// <param name="level">The message severity level.</param>
/// <param name="message">The message to log.</param>
/// <param name="code">Optional message code.</param>
void Log(MessageLevel level, string message, string? code = null);
}
/// <summary>
/// MSBuild-backed implementation of <see cref="IBuildLog"/>.
/// </summary>
/// <remarks>
/// This is the production implementation that writes to the MSBuild task logging helper.
/// </remarks>
internal sealed class BuildLog(TaskLoggingHelper log, string verbosity) : IBuildLog
{
private readonly string _verbosity = string.IsNullOrWhiteSpace(verbosity) ? "minimal" : verbosity;
/// <inheritdoc />
public void Info(string message) => log.LogMessage(MessageImportance.High, message);
/// <inheritdoc />
public void Detail(string message)
{
if (_verbosity.EqualsIgnoreCase("detailed"))
log.LogMessage(MessageImportance.Normal, message);
}
/// <inheritdoc />
public void Warn(string message) => log.LogWarning(message);
/// <inheritdoc />
public void Warn(string code, string message)
=> log.LogWarning(subcategory: null, code, helpKeyword: null,
file: null, lineNumber: 0, columnNumber: 0,
endLineNumber: 0, endColumnNumber: 0, message);
/// <inheritdoc />
public void Error(string message) => log.LogError(message);
/// <inheritdoc />
public void Error(string code, string message)
=> log.LogError(subcategory: null, code, helpKeyword: null,
file: null, lineNumber: 0, columnNumber: 0,
endLineNumber: 0, endColumnNumber: 0, message);
/// <inheritdoc />
public void Log(MessageLevel level, string message, string? code = null)
{
switch (level)
{
case MessageLevel.None:
// Do nothing
break;
case MessageLevel.Info:
log.LogMessage(MessageImportance.High, message);
break;
case MessageLevel.Warn:
if (!string.IsNullOrEmpty(code))
Warn(code, message);
else
Warn(message);
break;
case MessageLevel.Error:
if (!string.IsNullOrEmpty(code))
Error(code, message);
else
Error(message);
break;
}
}
}
/// <summary>
/// No-op implementation of <see cref="IBuildLog"/> for testing scenarios.
/// </summary>
/// <remarks>
/// Use this implementation when testing code that requires an <see cref="IBuildLog"/>
/// but where actual logging output is not needed.
/// </remarks>
internal sealed class NullBuildLog : IBuildLog
{
/// <summary>
/// Singleton instance of <see cref="NullBuildLog"/>.
/// </summary>
public static readonly NullBuildLog Instance = new();
private NullBuildLog() { }
/// <inheritdoc />
public void Info(string message) { }
/// <inheritdoc />
public void Detail(string message) { }
/// <inheritdoc />
public void Warn(string message) { }
/// <inheritdoc />
public void Warn(string code, string message) { }
/// <inheritdoc />
public void Error(string message) { }
/// <inheritdoc />
public void Error(string code, string message) { }
/// <inheritdoc />
public void Log(MessageLevel level, string message, string? code = null) { }
}