From 431947167a98f51ab342e732d63e7bf47dd1d7ff Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Wed, 8 Mar 2017 22:47:57 -0800 Subject: [PATCH] Add commit SHA to version information (#17537) --- build/Targets/GenerateAssemblyInfo.targets | 34 +------- build/Targets/Versions.props | 32 ++++++++ .../CSharp/Portable/CSharpCodeAnalysis.csproj | 5 ++ .../Test/CommandLine/CommandLineTests.cs | 46 ++++++++++- .../Core/Portable/CodeAnalysis.csproj | 1 + .../Portable/CommandLine/CommonCompiler.cs | 19 ++++- .../Core/Portable/CommitHashAttribute.cs | 16 ++++ .../Portable/BasicCodeAnalysis.vbproj | 5 ++ .../Test/CommandLine/CommandLineTests.vb | 81 +++++++++++-------- 9 files changed, 168 insertions(+), 71 deletions(-) create mode 100644 src/Compilers/Core/Portable/CommitHashAttribute.cs diff --git a/build/Targets/GenerateAssemblyInfo.targets b/build/Targets/GenerateAssemblyInfo.targets index f226393c0e5..44d346cdec6 100644 --- a/build/Targets/GenerateAssemblyInfo.targets +++ b/build/Targets/GenerateAssemblyInfo.targets @@ -1,38 +1,6 @@  - - - - - <developer build> - - - - - $(BUILD_SOURCEVERSION) - - - - - $(GIT_COMMIT) - - - - - Not found - $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../../.git')) - $([System.IO.File]::ReadAllText('$(DotGitDir)/HEAD').Trim()) - $(DotGitDir)/$(HeadFileContent.Substring(5)) - $([System.IO.File]::ReadAllText('$(RefPath)').Trim()) - $(HeadFileContent) - - - - $(IntermediateOutputPath)GeneratedAssemblyInfo_$(BuildVersion)$(DefaultLanguageSourceExtension) @@ -114,4 +82,4 @@ - \ No newline at end of file + diff --git a/build/Targets/Versions.props b/build/Targets/Versions.props index ebeaa2f6800..548467b0d76 100644 --- a/build/Targets/Versions.props +++ b/build/Targets/Versions.props @@ -72,4 +72,36 @@ + + + + + + <developer build> + + + + + $(BUILD_SOURCEVERSION) + + + + + $(GIT_COMMIT) + + + + + Not found + $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../../.git')) + $([System.IO.File]::ReadAllText('$(DotGitDir)/HEAD').Trim()) + $(DotGitDir)/$(HeadFileContent.Substring(5)) + $([System.IO.File]::ReadAllText('$(RefPath)').Trim()) + $(HeadFileContent) + + + diff --git a/src/Compilers/CSharp/Portable/CSharpCodeAnalysis.csproj b/src/Compilers/CSharp/Portable/CSharpCodeAnalysis.csproj index 0fec855da38..059d2f1220c 100644 --- a/src/Compilers/CSharp/Portable/CSharpCodeAnalysis.csproj +++ b/src/Compilers/CSharp/Portable/CSharpCodeAnalysis.csproj @@ -19,6 +19,11 @@ + + + <_Parameter1>$(GitHeadSha) + + {6da08f12-32f2-4dd9-bbad-982eb71a2c9b} diff --git a/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs b/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs index a698a74eb27..930f4710de5 100644 --- a/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs +++ b/src/Compilers/CSharp/Test/CommandLine/CommandLineTests.cs @@ -39,6 +39,8 @@ public class CommandLineTests : CSharpTestBase private static readonly string s_CSharpCompilerExecutable = typeof(Csc).GetTypeInfo().Assembly.Location; private static readonly string s_defaultSdkDirectory = RuntimeEnvironment.GetRuntimeDirectory(); private static readonly string s_compilerVersion = typeof(Csc).GetTypeInfo().Assembly.GetCustomAttribute().Version; + private static readonly string s_compilerShortCommitHash = + CommonCompiler.ExtractShortCommitHash(typeof(CSharpCompiler).GetTypeInfo().Assembly.GetCustomAttribute().Hash); private readonly string _baseDirectory = TempRoot.Root; @@ -5277,16 +5279,52 @@ class C var csc = new MockCSharpCompiler(null, dir.Path, new[] { "/target:library", "/preferreduilang:en", "a.cs" }); int exitCode = csc.Run(outWriter); Assert.Equal(0, exitCode); + + var patched = Regex.Replace(outWriter.ToString().Trim(), "version \\d+\\.\\d+\\.\\d+(\\.\\d+)?", "version A.B.C.D"); + patched = ReplaceCommitHash(patched); Assert.Equal(@" -Microsoft (R) Visual C# Compiler version A.B.C.D +Microsoft (R) Visual C# Compiler version A.B.C.D (HASH) Copyright (C) Microsoft Corporation. All rights reserved.".Trim(), - Regex.Replace(outWriter.ToString().Trim(), "version \\d+\\.\\d+\\.\\d+(\\.\\d+)?", "version A.B.C.D")); + patched); // Privately queued builds have 3-part version numbers instead of 4. Since we're throwing away the version number, // making the last part optional will fix this. CleanupAllGeneratedFiles(file.Path); } + [Theory, + InlineData("Microsoft (R) Visual C# Compiler version A.B.C.D ()", + "Microsoft (R) Visual C# Compiler version A.B.C.D (HASH)"), + InlineData("Microsoft (R) Visual C# Compiler version A.B.C.D (ABCDEF01)", + "Microsoft (R) Visual C# Compiler version A.B.C.D (HASH)"), + InlineData("Microsoft (R) Visual C# Compiler version A.B.C.D (abcdef90)", + "Microsoft (R) Visual C# Compiler version A.B.C.D (HASH)"), + InlineData("Microsoft (R) Visual C# Compiler version A.B.C.D (12345678)", + "Microsoft (R) Visual C# Compiler version A.B.C.D (HASH)")] + public void TestReplaceCommitHash(string orig, string expected) + { + Assert.Equal(expected, ReplaceCommitHash(orig)); + } + + private static string ReplaceCommitHash(string s) + { + // open paren, followed by either or 8 hex, followed by close paren + return Regex.Replace(s, "(\\((|[a-fA-F0-9]{8})\\))", "(HASH)"); + } + + [Fact] + public void ExtractShortCommitHash() + { + Assert.Null(CommonCompiler.ExtractShortCommitHash(null)); + Assert.Equal("", CommonCompiler.ExtractShortCommitHash("")); + Assert.Equal("<", CommonCompiler.ExtractShortCommitHash("<")); + Assert.Equal("", CommonCompiler.ExtractShortCommitHash("")); + Assert.Equal("1", CommonCompiler.ExtractShortCommitHash("1")); + Assert.Equal("1234567", CommonCompiler.ExtractShortCommitHash("1234567")); + Assert.Equal("12345678", CommonCompiler.ExtractShortCommitHash("12345678")); + Assert.Equal("12345678", CommonCompiler.ExtractShortCommitHash("123456789")); + } + private void CheckOutputFileName(string source1, string source2, string inputName1, string inputName2, string[] commandLineArguments, string expectedOutputName) { var dir = Temp.CreateDirectory(); @@ -6980,7 +7018,7 @@ public void FileShareDeleteCompatibility_Xplat() var output = ProcessUtilities.RunAndGetOutput(s_CSharpCompilerExecutable, $"/target:library /debug:portable {libSrc.Path}", startFolder: dir.ToString()); AssertEx.AssertEqualToleratingWhitespaceDifferences($@" -Microsoft (R) Visual C# Compiler version {s_compilerVersion} +Microsoft (R) Visual C# Compiler version {s_compilerVersion} ({s_compilerShortCommitHash }) Copyright (C) Microsoft Corporation. All rights reserved.", output); // reading original content from the memory map: @@ -8829,7 +8867,7 @@ public void PathMapParser() public void Version() { var folderName = Temp.CreateDirectory().ToString(); - var expected = FileVersionInfo.GetVersionInfo(typeof(CSharpCompiler).Assembly.Location).FileVersion; + var expected = $"{FileVersionInfo.GetVersionInfo(typeof(CSharpCompiler).Assembly.Location).FileVersion} ({s_compilerShortCommitHash})"; var argss = new[] { "/version", diff --git a/src/Compilers/Core/Portable/CodeAnalysis.csproj b/src/Compilers/Core/Portable/CodeAnalysis.csproj index 4a93b9d7c53..5a497c6c797 100644 --- a/src/Compilers/Core/Portable/CodeAnalysis.csproj +++ b/src/Compilers/Core/Portable/CodeAnalysis.csproj @@ -29,6 +29,7 @@ PreserveNewest false + diff --git a/src/Compilers/Core/Portable/CommandLine/CommonCompiler.cs b/src/Compilers/Core/Portable/CommandLine/CommonCompiler.cs index 8aeb8b35153..062041c9eb9 100644 --- a/src/Compilers/Core/Portable/CommandLine/CommonCompiler.cs +++ b/src/Compilers/Core/Portable/CommandLine/CommonCompiler.cs @@ -130,14 +130,29 @@ internal virtual string GetAssemblyFileVersion() { if (_clientDirectory != null) { - var name = $"{Type.GetTypeInfo().Assembly.GetName().Name}.dll"; + Assembly assembly = Type.GetTypeInfo().Assembly; + var name = $"{assembly.GetName().Name}.dll"; var filePath = Path.Combine(_clientDirectory, name); - return FileVersionInfo.GetVersionInfo(filePath).FileVersion; + var fileVersionInfo = FileVersionInfo.GetVersionInfo(filePath); + string hash = ExtractShortCommitHash(assembly.GetCustomAttribute()?.Hash); + + return $"{fileVersionInfo.FileVersion} ({hash})"; } return ""; } + internal static string ExtractShortCommitHash(string hash) + { + // leave "" alone, but truncate SHA to 8 characters + if (hash != null && hash.Length >= 8 && hash[0] != '<') + { + return hash.Substring(0, 8); + } + + return hash; + } + /// /// Tool name used, along with assembly version, for error logging. /// diff --git a/src/Compilers/Core/Portable/CommitHashAttribute.cs b/src/Compilers/Core/Portable/CommitHashAttribute.cs new file mode 100644 index 00000000000..cc3246ddf9d --- /dev/null +++ b/src/Compilers/Core/Portable/CommitHashAttribute.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.CodeAnalysis +{ + [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)] + internal sealed class CommitHashAttribute : Attribute + { + internal readonly string Hash; + public CommitHashAttribute(string hash) + { + Hash = hash; + } + } +} diff --git a/src/Compilers/VisualBasic/Portable/BasicCodeAnalysis.vbproj b/src/Compilers/VisualBasic/Portable/BasicCodeAnalysis.vbproj index 761f2285129..924ff675aea 100644 --- a/src/Compilers/VisualBasic/Portable/BasicCodeAnalysis.vbproj +++ b/src/Compilers/VisualBasic/Portable/BasicCodeAnalysis.vbproj @@ -16,6 +16,11 @@ $(NoWarn);42014 ..\BasicCodeAnalysisRules.ruleset + + + <_Parameter1>$(GitHeadSha) + + {6da08f12-32f2-4dd9-bbad-982eb71a2c9b} diff --git a/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb b/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb index 7d1d9b1232c..63e30a52155 100644 --- a/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb +++ b/src/Compilers/VisualBasic/Test/CommandLine/CommandLineTests.vb @@ -30,6 +30,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.CommandLine.UnitTests Private ReadOnly _baseDirectory As String = TempRoot.Root Private Shared ReadOnly s_basicCompilerExecutable As String = GetType(Vbc).Assembly.Location Private Shared ReadOnly s_defaultSdkDirectory As String = RuntimeEnvironment.GetRuntimeDirectory() + Private Shared ReadOnly s_compilerVersion As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion + Private Shared ReadOnly s_compilerShortCommitHash As String = + CommonCompiler.ExtractShortCommitHash(GetType(VisualBasicCompiler).GetTypeInfo().Assembly.GetCustomAttribute(Of CommitHashAttribute).Hash) Private Shared Function DefaultParse(args As IEnumerable(Of String), baseDirectory As String, Optional sdkDirectory As String = Nothing, Optional additionalReferenceDirectories As String = Nothing) As VisualBasicCommandLineArguments sdkDirectory = If(sdkDirectory, s_defaultSdkDirectory) @@ -228,18 +231,36 @@ End Class Dim exitCode = cmd.Run(output, Nothing) Assert.Equal(0, exitCode) + Dim patched As String = Regex.Replace(output.ToString().Trim(), "version \d+\.\d+\.\d+(\.\d+)?", "version A.B.C.D") + patched = ReplaceCommitHash(patched) Assert.Equal( -Microsoft (R) Visual Basic Compiler version A.B.C.D +Microsoft (R) Visual Basic Compiler version A.B.C.D (HASH) Copyright (C) Microsoft Corporation. All rights reserved. .Value.Replace(vbLf, vbCrLf).Trim, - Regex.Replace(output.ToString().Trim(), "version \d+\.\d+\.\d+(\.\d+)?", "version A.B.C.D")) + patched) ' Privately queued builds have 3-part version numbers instead of 4. Since we're throwing away the version number, ' making the last part optional will fix this. - CleanupAllGeneratedFiles(src) End Sub + )", + "Microsoft (R) Visual Basic Compiler version A.B.C.D (HASH)"), + InlineData("Microsoft (R) Visual Basic Compiler version A.B.C.D (ABCDEF01)", + "Microsoft (R) Visual Basic Compiler version A.B.C.D (HASH)"), + InlineData("Microsoft (R) Visual Basic Compiler version A.B.C.D (abcdef90)", + "Microsoft (R) Visual Basic Compiler version A.B.C.D (HASH)"), + InlineData("Microsoft (R) Visual Basic Compiler version A.B.C.D (12345678)", + "Microsoft (R) Visual Basic Compiler version A.B.C.D (HASH)")> + Public Sub TestReplaceCommitHash(orig As String, expected As String) + Assert.Equal(expected, ReplaceCommitHash(orig)) + End Sub + + Private Shared Function ReplaceCommitHash(s As String) As String + Return Regex.Replace(s, "(\((|[a-fA-F0-9]{8})\))", "(HASH)") + End Function + Public Sub VbcNologo_2a() Dim src As String = Temp.CreateFile().WriteAllText( @@ -253,15 +274,16 @@ End Class Dim exitCode = cmd.Run(output, Nothing) Assert.Equal(0, exitCode) + Dim patched As String = Regex.Replace(output.ToString().Trim(), "version \d+\.\d+\.\d+(\.\d+)?", "version A.B.C.D") + patched = ReplaceCommitHash(patched) Assert.Equal( -Microsoft (R) Visual Basic Compiler version A.B.C.D +Microsoft (R) Visual Basic Compiler version A.B.C.D (HASH) Copyright (C) Microsoft Corporation. All rights reserved. .Value.Replace(vbLf, vbCrLf).Trim, - Regex.Replace(output.ToString().Trim(), "version \d+\.\d+\.\d+(\.\d+)?", "version A.B.C.D")) + patched) ' Privately queued builds have 3-part version numbers instead of 4. Since we're throwing away the version number, ' making the last part optional will fix this. - CleanupAllGeneratedFiles(src) End Sub @@ -4831,7 +4853,7 @@ End Module Dim result = - Microsoft (R) Visual Basic Compiler version VERSION + Microsoft (R) Visual Basic Compiler version VERSION (HASH) Copyright (C) Microsoft Corporation. All rights reserved. PATH(5) : warning BC42024: Unused local variable: 'x'. @@ -4861,12 +4883,10 @@ PATH(11) : warning BC42105: Function 'foo' doesn't return a value on all code pa Dim vbc As New MockVisualBasicCompiler(Nothing, dir.Path, {fileName, "/preferreduilang:en"}) vbc.Run(output, Nothing) - Dim version As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion - Dim expected = result.Value.Replace("PATH", file.Path).Replace("VERSION", version).Replace(vbLf, vbCrLf).Trim() + Dim expected = ReplacePathAndVersionAndHash(result, file).Trim() Dim actual = output.ToString().Trim() Assert.Equal(expected, actual) - CleanupAllGeneratedFiles(file.Path) End Sub @@ -4898,7 +4918,7 @@ End Module Dim result = - Microsoft (R) Visual Basic Compiler version VERSION + Microsoft (R) Visual Basic Compiler version VERSION (HASH) Copyright (C) Microsoft Corporation. All rights reserved. PATH(9) : error BC36640: Instance of restricted type 'ArgIterator' cannot be used in a lambda expression. @@ -4916,8 +4936,7 @@ PATH(9) : error BC36640: Instance of restricted type 'ArgIterator' cannot be use Dim vbc As New MockVisualBasicCompiler(Nothing, dir.Path, {fileName, "/preferreduilang:en", "-imports:System"}) vbc.Run(output, Nothing) - Dim version As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion - Assert.Equal(result.Value.Replace("PATH", file.Path).Replace("VERSION", version).Replace(vbLf, vbCrLf), output.ToString()) + Assert.Equal(ReplacePathAndVersionAndHash(result, file), output.ToString()) CleanupAllGeneratedFiles(file.Path) End Sub @@ -4932,7 +4951,7 @@ PATH(9) : error BC36640: Instance of restricted type 'ArgIterator' cannot be use " End Sub" + vbCrLf + "End Module" + vbCrLf - Dim result = Microsoft (R) Visual Basic Compiler version VERSION + Dim result = Microsoft (R) Visual Basic Compiler version VERSION (HASH) Copyright (C) Microsoft Corporation. All rights reserved. PATH(3) : error BC30201: Expression expected. @@ -4954,8 +4973,7 @@ PATH(3) : error BC30004: Character constant must contain exactly one character. Dim vbc As New MockVisualBasicCompiler(Nothing, dir.Path, {fileName, "/preferreduilang:en"}) vbc.Run(output, Nothing) - Dim version As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion - Dim expected = result.Value.Replace("PATH", file.Path).Replace("VERSION", version).Replace(vbLf, vbCrLf).Trim() + Dim expected = ReplacePathAndVersionAndHash(result, file).Trim() Dim actual = output.ToString().Trim() Assert.Equal(expected, actual) @@ -4983,7 +5001,7 @@ End Module Dim result = - Microsoft (R) Visual Basic Compiler version VERSION + Microsoft (R) Visual Basic Compiler version VERSION (HASH) Copyright (C) Microsoft Corporation. All rights reserved. PATH(5) : error BC36593: Expression of type 'Integer()' is not queryable. Make sure you are not missing an assembly reference and/or namespace import for the LINQ provider. @@ -5005,8 +5023,7 @@ PATH(5) : error BC36593: Expression of type 'Integer()' is not queryable. Make s Dim vbc As New MockVisualBasicCompiler(Nothing, dir.Path, {fileName, "/preferreduilang:en"}) vbc.Run(output, Nothing) - Dim version As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion - Assert.Equal(result.Value.Replace("PATH", file.Path).Replace("VERSION", version).Replace(vbLf, vbCrLf), output.ToString()) + Assert.Equal(ReplacePathAndVersionAndHash(result, file), output.ToString()) CleanupAllGeneratedFiles(file.Path) End Sub @@ -5030,7 +5047,7 @@ Module _ Dim result = - Microsoft (R) Visual Basic Compiler version VERSION + Microsoft (R) Visual Basic Compiler version VERSION (HASH) Copyright (C) Microsoft Corporation. All rights reserved. PATH(3) : error BC30625: 'Module' statement must end with a matching 'End Module'. @@ -5050,8 +5067,7 @@ Module _ Dim vbc As New MockVisualBasicCompiler(Nothing, dir.Path, {fileName, "/preferreduilang:en"}) vbc.Run(output, Nothing) - Dim version As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion - Assert.Equal(result.Value.Replace("PATH", file.Path).Replace("VERSION", version).Replace(vbLf, vbCrLf), output.ToString()) + Assert.Equal(ReplacePathAndVersionAndHash(result, file), output.ToString()) CleanupAllGeneratedFiles(file.Path) End Sub @@ -5081,7 +5097,7 @@ End Module Dim result = - Microsoft (R) Visual Basic Compiler version VERSION + Microsoft (R) Visual Basic Compiler version VERSION (HASH) Copyright (C) Microsoft Corporation. All rights reserved. PATH(7) : error BC37220: Name 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeEventHandler' exceeds the maximum length allowed in metadata. @@ -5099,8 +5115,7 @@ PATH(7) : error BC37220: Name 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee Dim vbc As New MockVisualBasicCompiler(Nothing, dir.Path, {fileName, "/preferreduilang:en"}) vbc.Run(output, Nothing) - Dim version As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion - Assert.Equal(result.Value.Replace("PATH", file.Path).Replace("VERSION", version).Replace(vbLf, vbCrLf), output.ToString()) + Assert.Equal(ReplacePathAndVersionAndHash(result, file), output.ToString()) CleanupAllGeneratedFiles(file.Path) End Sub @@ -5124,7 +5139,7 @@ End Class]]> Dim result = - Microsoft (R) Visual Basic Compiler version VERSION + Microsoft (R) Visual Basic Compiler version VERSION (HASH) Copyright (C) Microsoft Corporation. All rights reserved. PATH(4) : error BC30625: 'Module' statement must end with a matching 'End Module'. @@ -5146,8 +5161,7 @@ End Class Dim vbc As New MockVisualBasicCompiler(Nothing, dir.Path, {fileName, "/preferreduilang:en"}) vbc.Run(output, Nothing) - Dim version As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion - Assert.Equal(result.Value.Replace("PATH", file.Path).Replace("VERSION", version).Replace(vbLf, vbCrLf), output.ToString()) + Assert.Equal(ReplacePathAndVersionAndHash(result, file), output.ToString()) CleanupAllGeneratedFiles(file.Path) End Sub @@ -5171,7 +5185,7 @@ End Module Dim result = - Microsoft (R) Visual Basic Compiler version VERSION + Microsoft (R) Visual Basic Compiler version VERSION (HASH) Copyright (C) Microsoft Corporation. All rights reserved. PATH(6) : error BC30203: Identifier expected. @@ -5189,12 +5203,15 @@ PATH(6) : error BC30203: Identifier expected. Dim vbc As New MockVisualBasicCompiler(Nothing, dir.Path, {fileName, "/preferreduilang:en"}) vbc.Run(output, Nothing) - Dim version As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion - Assert.Equal(result.Value.Replace("PATH", file.Path).Replace("VERSION", version).Replace(vbLf, vbCrLf), output.ToString()) + Assert.Equal(ReplacePathAndVersionAndHash(result, file), output.ToString()) CleanupAllGeneratedFiles(file.Path) End Sub + Private Shared Function ReplacePathAndVersionAndHash(result As XElement, file As TempFile) As String + Return result.Value.Replace("PATH", file.Path).Replace("VERSION", s_compilerVersion).Replace("HASH", s_compilerShortCommitHash).Replace(vbLf, vbCrLf) + End Function + Public Sub CompilationWithNonExistingOutPath() @@ -7959,7 +7976,7 @@ End Class Public Sub Version() Dim folderName = Temp.CreateDirectory().ToString() - Dim expected As String = FileVersionInfo.GetVersionInfo(GetType(VisualBasicCompiler).Assembly.Location).FileVersion + Dim expected As String = $"{s_compilerVersion} ({s_compilerShortCommitHash})" Dim argss = { "/version", -- GitLab