diff --git a/src/Build/BuildCheck/Infrastructure/EditorConfig/EditorConfigFile.cs b/src/Build/BuildCheck/Infrastructure/EditorConfig/EditorConfigFile.cs index d2f93664369..e0417966263 100644 --- a/src/Build/BuildCheck/Infrastructure/EditorConfig/EditorConfigFile.cs +++ b/src/Build/BuildCheck/Infrastructure/EditorConfig/EditorConfigFile.cs @@ -81,7 +81,7 @@ internal static EditorConfigFile Parse(string text) // dictionary, but we also use a case-insensitive key comparer when doing lookups var activeSectionProperties = ImmutableDictionary.CreateBuilder(StringComparer.OrdinalIgnoreCase); string activeSectionName = ""; - var lines = string.IsNullOrEmpty(text) ? Array.Empty() : text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); + var lines = string.IsNullOrEmpty(text) ? Array.Empty() : text.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None); foreach(var line in lines) { diff --git a/src/BuildCheck.UnitTests/EditorConfigParser_Tests.cs b/src/BuildCheck.UnitTests/EditorConfigParser_Tests.cs index 17bd60abbd1..459b06ab28a 100644 --- a/src/BuildCheck.UnitTests/EditorConfigParser_Tests.cs +++ b/src/BuildCheck.UnitTests/EditorConfigParser_Tests.cs @@ -81,7 +81,7 @@ public void EditorconfigFileDiscovery_RootTrue() """); var parser = new EditorConfigParser(); - var listOfEditorConfigFile = parser.DiscoverEditorConfigFiles(Path.Combine(workFolder1.Path, "subfolder", "projectfile.proj") ).ToList(); + var listOfEditorConfigFile = parser.DiscoverEditorConfigFiles(Path.Combine(workFolder1.Path, "subfolder", "projectfile.proj")).ToList(); // should be one because root=true so we do not need to go further listOfEditorConfigFile.Count.ShouldBe(1); listOfEditorConfigFile[0].IsRoot.ShouldBeTrue(); @@ -116,4 +116,31 @@ public void EditorconfigFileDiscovery_RootFalse() listOfEditorConfigFile[0].IsRoot.ShouldBeFalse(); listOfEditorConfigFile[0].NamedSections[0].Name.ShouldBe("*.csproj"); } + + [Fact] + public void Parse_HandlesDifferentLineEndings() + { + var mixedEndingsText = "root = true\r\n" + + "[*.cs]\n" + + "indent_style = space\r\n" + + "indent_size = 4\n" + + "[*.md]\r\n" + + "trim_trailing_whitespace = true"; + + var result = EditorConfigFile.Parse(mixedEndingsText); + + result.IsRoot.ShouldBeTrue("Root property should be true"); + result.NamedSections.Length.ShouldBe(2); + + var csSection = result.NamedSections.FirstOrDefault(s => s.Name == "*.cs"); + csSection.ShouldNotBeNull(); + csSection.Properties.Count.ShouldBe(2); + csSection.Properties["indent_style"].ShouldBe("space"); + csSection.Properties["indent_size"].ShouldBe("4"); + + var mdSection = result.NamedSections.FirstOrDefault(s => s.Name == "*.md"); + mdSection.ShouldNotBeNull(); + mdSection.Properties.Count.ShouldBe(1); + mdSection.Properties["trim_trailing_whitespace"].ShouldBe("true"); + } } diff --git a/src/MSBuild/TerminalLogger/TerminalLogger.cs b/src/MSBuild/TerminalLogger/TerminalLogger.cs index bcae846e898..038ec536f6b 100644 --- a/src/MSBuild/TerminalLogger/TerminalLogger.cs +++ b/src/MSBuild/TerminalLogger/TerminalLogger.cs @@ -221,6 +221,8 @@ public ProjectContext(BuildEventContext context) /// private bool _showCommandLine = false; + private uint? _originalConsoleMode; + /// /// Default constructor, used by the MSBuild logger infra. /// @@ -263,6 +265,8 @@ public void Initialize(IEventSource eventSource, int nodeCount) /// public void Initialize(IEventSource eventSource) { + (_, _, _originalConsoleMode) = NativeMethodsShared.QueryIsScreenAndTryEnableAnsiColorCodes(); + ParseParameters(); eventSource.BuildStarted += BuildStarted; @@ -358,6 +362,8 @@ private bool TryApplyShowCommandLineParameter(string? parameterValue) /// public void Shutdown() { + NativeMethodsShared.RestoreConsoleMode(_originalConsoleMode); + _cts.Cancel(); _refresher?.Join(); Terminal.Dispose();