TeamCity.MSBuild.Logger/ParametersParser.cs (161 lines of code) (raw):
namespace TeamCity.MSBuild.Logger
{
using System;
using System.Diagnostics.CodeAnalysis;
using JetBrains.Annotations;
using Microsoft.Build.Framework;
// ReSharper disable once ClassNeverInstantiated.Global
internal class ParametersParser : IParametersParser
{
private static readonly char[] ParameterDelimiters = { ';' };
private static readonly char[] ParameterValueSplitCharacter = { '=' };
public bool TryParse(string parametersString, Parameters parameters, out string error)
{
if (parameters == null) throw new ArgumentNullException(nameof(parameters));
error = null;
if (parametersString == null)
{
return true;
}
foreach (var parameter in parametersString.Split(ParameterDelimiters))
{
if (parameter.Length <= 0)
{
continue;
}
var paramList = parameter.Split(ParameterValueSplitCharacter);
if(!ApplyParameter(parameters, paramList[0], paramList.Length > 1 ? paramList[1] : null, out error))
{
return false;
}
}
parameters.AlignMessages = false;
parameters.BufferWidth = -1;
if (parameters.ForceNoAlign)
{
return true;
}
try
{
parameters.BufferWidth = Console.BufferWidth;
parameters.AlignMessages = true;
}
catch (Exception)
{
parameters.AlignMessages = false;
}
return true;
}
[SuppressMessage("ReSharper", "StringLiteralTypo")]
private static bool ApplyParameter([NotNull] Parameters parameters, [NotNull] string parameterName, [CanBeNull] string parameterValue, out string error)
{
if (parameters == null) throw new ArgumentNullException(nameof(parameters));
if (parameterName == null) throw new ArgumentNullException(nameof(parameterName));
var parameterNameUpper = parameterName.ToUpperInvariant();
error = null;
switch (parameterNameUpper)
{
case "DEBUG":
parameters.Debug = true;
return true;
case "WARNINGSONLY":
parameters.ShowOnlyWarnings = true;
return true;
case "SHOWENVIRONMENT":
parameters.ShowEnvironment = true;
return true;
case "DISABLECONSOLECOLOR":
parameters.ColorMode = ColorMode.NoColor;
return true;
case "FORCECONSOLECOLOR":
parameters.ColorMode = ColorMode.AnsiColor;
return true;
case "TEAMCITY":
parameters.TeamCityMode = TeamCityMode.SupportHierarchy;
parameters.StatisticsMode = StatisticsMode.TeamCity;
parameters.ColorMode = ColorMode.TeamCity;
parameters.ColorThemeMode = ColorThemeMode.TeamCity;
parameters.ForceNoAlign = true;
parameters.AlignMessages = false;
parameters.ShowSummary = true;
return true;
case "V":
case "VERBOSITY":
// ReSharper disable once InvertIf
if (TryApplyVerbosityParameter(parameterValue, out error, out var verbosity))
{
parameters.Verbosity = verbosity;
return true;
}
return false;
case "PERFORMANCESUMMARY":
parameters.ShowPerfSummary = true;
return true;
case "NOITEMANDPROPERTYLIST":
parameters.ShowItemAndPropertyList = false;
return true;
case "NOSUMMARY":
parameters.ShowSummary = false;
return true;
case "ERRORSONLY":
parameters.ShowOnlyErrors = true;
return true;
// Do not use nested TeamCity service messages
case "PLAIN":
parameters.PlainServiceMessage = true;
return true;
case "SHOWPROJECTFILE":
parameters.ShowProjectFile = string.IsNullOrEmpty(parameterValue) || parameterValue.ToUpperInvariant() == "TRUE";
return true;
case "SUMMARY":
parameters.ShowSummary = true;
return true;
case "SHOWCOMMANDLINE":
parameters.ShowCommandLine = true;
return true;
case "SHOWTIMESTAMP":
parameters.ShowTimeStamp = true;
return true;
case "SHOWEVENTID":
parameters.ShowEventId = true;
return true;
case "FORCENOALIGN":
parameters.ForceNoAlign = true;
parameters.AlignMessages = false;
return true;
default:
error = $"Invalid parameter \"{parameterName}\"=\"{parameterValue ?? "null"}\"";
return false;
}
}
private static bool TryApplyVerbosityParameter(string parameterValue, out string error, out LoggerVerbosity verbosity)
{
var parameterValueUpper = parameterValue.ToUpperInvariant();
error = null;
switch (parameterValueUpper)
{
case "N":
case "NORMAL":
verbosity = LoggerVerbosity.Normal;
return true;
case "M":
case "MINIMAL":
verbosity = LoggerVerbosity.Minimal;
return true;
case "DIAG":
case "DIAGNOSTIC":
verbosity = LoggerVerbosity.Diagnostic;
return true;
case "D":
case "DETAILED":
verbosity = LoggerVerbosity.Detailed;
return true;
case "Q":
case "QUIET":
verbosity = LoggerVerbosity.Quiet;
return true;
default:
error = $"Invalid verbosity \"{parameterValue}\"";
verbosity = default;
return false;
}
}
}
}