diff --git a/build.cake b/build.cake index 16525d3f19..055da2e1b0 100644 --- a/build.cake +++ b/build.cake @@ -234,6 +234,25 @@ Task("Copy-Files") MSBuildSettings = parameters.MSBuildSettings }); + DotNetCorePublish("./src/GitVersion.MsBuild/GitVersion.MsBuild.csproj", new DotNetCorePublishSettings + { + Framework = parameters.FullFxVersion, + NoBuild = true, + NoRestore = true, + Configuration = parameters.Configuration, + MSBuildSettings = parameters.MSBuildSettings + }); + + // .NET Core + DotNetCorePublish("./src/GitVersion.MsBuild/GitVersion.MsBuild.csproj", new DotNetCorePublishSettings + { + Framework = parameters.CoreFxVersion, + NoBuild = true, + NoRestore = true, + Configuration = parameters.Configuration, + MSBuildSettings = parameters.MSBuildSettings + }); + var ilMergeDir = parameters.Paths.Directories.ArtifactsBinFullFxILMerge; var portableDir = parameters.Paths.Directories.ArtifactsBinFullFxPortable.Combine("tools"); var cmdlineDir = parameters.Paths.Directories.ArtifactsBinFullFxCmdline.Combine("tools"); @@ -357,9 +376,9 @@ Task("Pack-Nuget") MSBuildSettings = parameters.MSBuildSettings }; - // GitVersionCore, GitVersionTask, & global tool + // GitVersionCore, GitVersion.MsBuild, & global tool DotNetCorePack("./src/GitVersionCore", settings); - DotNetCorePack("./src/GitVersionTask", settings); + DotNetCorePack("./src/GitVersion.MsBuild", settings); DotNetCorePack("./src/GitVersionExe/GitVersion.Tool.csproj", settings); }); diff --git a/build/parameters.cake b/build/parameters.cake index 82f8498a8a..10216896bd 100644 --- a/build/parameters.cake +++ b/build/parameters.cake @@ -98,7 +98,7 @@ public class BuildParameters Packages = BuildPackages.GetPackages( Paths.Directories.NugetRoot, Version.SemVersion, - new [] { "GitVersion.CommandLine.DotNetCore", "GitVersion.CommandLine", "GitVersionCore", "GitVersionTask", "GitVersion.Tool" }, + new [] { "GitVersion.CommandLine.DotNetCore", "GitVersion.CommandLine", "GitVersionCore", "GitVersion.MsBuild", "GitVersion.Tool" }, new [] { "GitVersion.Portable" }); var files = Paths.Files; @@ -116,8 +116,7 @@ public class BuildParameters { ["GitVersion.CommandLine.DotNetCore"] = Paths.Directories.ArtifactsBinCoreFx, ["GitVersion.CommandLine"] = Paths.Directories.ArtifactsBinFullFxCmdline, - ["GitVersion.Portable"] = Paths.Directories.ArtifactsBinFullFxPortable, - ["GitVersion.Tool"] = Paths.Directories.ArtifactsBinCoreFx, + ["GitVersion.Portable"] = Paths.Directories.ArtifactsBinFullFxPortable }; Credentials = BuildCredentials.GetCredentials(context); diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 851ff3633a..b00181195e 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -14,8 +14,7 @@ - 0.25.0-preview-0033 - [1.0.185] + 0.26.0 2019.1.1 6.0.0 diff --git a/src/Docker/net472/linux/debian-9/Dockerfile b/src/Docker/net472/linux/debian-9/Dockerfile index fe3ded82a8..fe2779cb31 100644 --- a/src/Docker/net472/linux/debian-9/Dockerfile +++ b/src/Docker/net472/linux/debian-9/Dockerfile @@ -2,10 +2,6 @@ FROM mono:5.14 LABEL maintainers="GitTools Maintainers" ARG contentFolder -RUN sed -i '/jessie-updates/d' /etc/apt/sources.list && apt-get update && \ - apt-get install -y libgit2-dev && \ - ln -s /usr/lib/x86_64-linux-gnu/libgit2.so /lib/x86_64-linux-gnu/libgit2-15e1193.so - WORKDIR /app COPY $contentFolder/ ./ diff --git a/src/Docker/netcoreapp2.1/linux/centos-7/Dockerfile b/src/Docker/netcoreapp2.1/linux/centos-7/Dockerfile index 232b07ac9c..2851e09fc0 100644 --- a/src/Docker/netcoreapp2.1/linux/centos-7/Dockerfile +++ b/src/Docker/netcoreapp2.1/linux/centos-7/Dockerfile @@ -1,7 +1,7 @@ FROM centos:7 LABEL maintainers="GitTools Maintainers" -ENV DOTNET_VERSION='2.1' +ENV DOTNET_VERSION='2.1' ARG contentFolder # https://dotnet.microsoft.com/download/linux-package-manager/rhel/sdk-current @@ -9,13 +9,11 @@ RUN rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-pro && yum update cache # if you need SDK use dotnet-sdk-$DOTNET_VERSION -RUN yum install -y dotnet-runtime-$DOTNET_VERSION.x86_64 unzip libgit2-devel.x86_64 \ +RUN yum install -y dotnet-runtime-$DOTNET_VERSION.x86_64 \ && yum clean all \ && rm -rf /tmp/* -RUN ln -s /usr/lib64/libgit2.so /usr/lib64/libgit2-15e1193.so - WORKDIR /app COPY $contentFolder/ ./ -ENTRYPOINT ["dotnet", "GitVersion.dll"] \ No newline at end of file +ENTRYPOINT ["dotnet", "GitVersion.dll"] diff --git a/src/Docker/netcoreapp2.1/linux/debian-9/Dockerfile b/src/Docker/netcoreapp2.1/linux/debian-9/Dockerfile index b9c29dbec3..f71693f154 100644 --- a/src/Docker/netcoreapp2.1/linux/debian-9/Dockerfile +++ b/src/Docker/netcoreapp2.1/linux/debian-9/Dockerfile @@ -2,10 +2,6 @@ FROM mcr.microsoft.com/dotnet/core/runtime:2.1 LABEL maintainers="GitTools Maintainers" ARG contentFolder -RUN apt-get update && \ - apt-get install -y libgit2-dev && \ - ln -s /usr/lib/x86_64-linux-gnu/libgit2.so /lib/x86_64-linux-gnu/libgit2-15e1193.so - WORKDIR /app COPY $contentFolder/ ./ diff --git a/src/Docker/netcoreapp2.1/linux/fedora-27/Dockerfile b/src/Docker/netcoreapp2.1/linux/fedora-27/Dockerfile index c97acb7606..ad12a1fca2 100644 --- a/src/Docker/netcoreapp2.1/linux/fedora-27/Dockerfile +++ b/src/Docker/netcoreapp2.1/linux/fedora-27/Dockerfile @@ -1,20 +1,18 @@ FROM fedora:27 LABEL maintainers="GitTools Maintainers" -ENV DOTNET_VERSION='2.1' +ENV DOTNET_VERSION='2.1' ARG contentFolder # https://dotnet.microsoft.com/download/linux-package-manager/rhel/sdk-current -RUN rpm -Uvh https://packages.microsoft.com/config/fedora/27/packages-microsoft-prod.rpm +RUN rpm -Uvh https://packages.microsoft.com/config/fedora/27/packages-microsoft-prod.rpm # if you need SDK use dotnet-sdk-$DOTNET_VERSION -RUN yum install -y dotnet-runtime-$DOTNET_VERSION.x86_64 unzip libgit2-devel.x86_64 \ +RUN yum install -y dotnet-runtime-$DOTNET_VERSION.x86_64\ && yum clean all \ && rm -rf /tmp/* -RUN ln -s /usr/lib64/libgit2.so /usr/lib64/libgit2-15e1193.so - WORKDIR /app COPY $contentFolder/ ./ -ENTRYPOINT ["dotnet", "GitVersion.dll"] \ No newline at end of file +ENTRYPOINT ["dotnet", "GitVersion.dll"] diff --git a/src/Docker/netcoreapp2.2/linux/centos-7/Dockerfile b/src/Docker/netcoreapp2.2/linux/centos-7/Dockerfile index 361051cafa..eb2928cd24 100644 --- a/src/Docker/netcoreapp2.2/linux/centos-7/Dockerfile +++ b/src/Docker/netcoreapp2.2/linux/centos-7/Dockerfile @@ -9,12 +9,10 @@ RUN rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-pro && yum update cache # if you need SDK use dotnet-sdk-$DOTNET_VERSION -RUN yum install -y dotnet-runtime-$DOTNET_VERSION.x86_64 unzip libgit2-devel.x86_64 \ +RUN yum install -y dotnet-runtime-$DOTNET_VERSION.x86_64 \ && yum clean all \ && rm -rf /tmp/* -RUN ln -s /usr/lib64/libgit2.so /usr/lib64/libgit2-15e1193.so - WORKDIR /app COPY $contentFolder/ ./ diff --git a/src/Docker/netcoreapp2.2/linux/debian-9/Dockerfile b/src/Docker/netcoreapp2.2/linux/debian-9/Dockerfile index 288a8b9bb8..bddb968314 100644 --- a/src/Docker/netcoreapp2.2/linux/debian-9/Dockerfile +++ b/src/Docker/netcoreapp2.2/linux/debian-9/Dockerfile @@ -2,10 +2,6 @@ FROM mcr.microsoft.com/dotnet/core/runtime:2.2 LABEL maintainers="GitTools Maintainers" ARG contentFolder -RUN apt-get update && \ - apt-get install -y libgit2-dev && \ - ln -s /usr/lib/x86_64-linux-gnu/libgit2.so /lib/x86_64-linux-gnu/libgit2-15e1193.so - WORKDIR /app COPY $contentFolder/ ./ diff --git a/src/Docker/netcoreapp2.2/linux/fedora-27/Dockerfile b/src/Docker/netcoreapp2.2/linux/fedora-27/Dockerfile index dece7f6f6f..fa628e82be 100644 --- a/src/Docker/netcoreapp2.2/linux/fedora-27/Dockerfile +++ b/src/Docker/netcoreapp2.2/linux/fedora-27/Dockerfile @@ -5,15 +5,13 @@ ENV DOTNET_VERSION='2.2' ARG contentFolder # https://dotnet.microsoft.com/download/linux-package-manager/rhel/sdk-current -RUN rpm -Uvh https://packages.microsoft.com/config/fedora/27/packages-microsoft-prod.rpm +RUN rpm -Uvh https://packages.microsoft.com/config/fedora/27/packages-microsoft-prod.rpm # if you need SDK use dotnet-sdk-$DOTNET_VERSION -RUN yum install -y dotnet-runtime-$DOTNET_VERSION.x86_64 unzip libgit2-devel.x86_64 \ +RUN yum install -y dotnet-runtime-$DOTNET_VERSION.x86_64 \ && yum clean all \ && rm -rf /tmp/* -RUN ln -s /usr/lib64/libgit2.so /usr/lib64/libgit2-15e1193.so - WORKDIR /app COPY $contentFolder/ ./ diff --git a/src/GitVersionTask.Tests/AssemblyLocation.cs b/src/GitVersion.MsBuild.Task.Tests/AssemblyLocation.cs similarity index 100% rename from src/GitVersionTask.Tests/AssemblyLocation.cs rename to src/GitVersion.MsBuild.Task.Tests/AssemblyLocation.cs diff --git a/src/GitVersionTask.Tests/AssemblyParallelizable.cs b/src/GitVersion.MsBuild.Task.Tests/AssemblyParallelizable.cs similarity index 100% rename from src/GitVersionTask.Tests/AssemblyParallelizable.cs rename to src/GitVersion.MsBuild.Task.Tests/AssemblyParallelizable.cs diff --git a/src/GitVersionTask.Tests/GetVersionTaskTests.cs b/src/GitVersion.MsBuild.Task.Tests/GetVersionTaskTests.cs similarity index 95% rename from src/GitVersionTask.Tests/GetVersionTaskTests.cs rename to src/GitVersion.MsBuild.Task.Tests/GetVersionTaskTests.cs index a3f6d5c7d1..01c03af23b 100644 --- a/src/GitVersionTask.Tests/GetVersionTaskTests.cs +++ b/src/GitVersion.MsBuild.Task.Tests/GetVersionTaskTests.cs @@ -1,5 +1,6 @@ using System.Linq; using GitVersion; +using GitVersion.MsBuild.Task; using GitVersionTask; using Microsoft.Build.Framework; using NUnit.Framework; diff --git a/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj b/src/GitVersion.MsBuild.Task.Tests/GitVersion.MsBuild.Task.Tests.csproj similarity index 94% rename from src/GitVersionTask.Tests/GitVersionTask.Tests.csproj rename to src/GitVersion.MsBuild.Task.Tests/GitVersion.MsBuild.Task.Tests.csproj index bbcb2148c7..a2543784c4 100644 --- a/src/GitVersionTask.Tests/GitVersionTask.Tests.csproj +++ b/src/GitVersion.MsBuild.Task.Tests/GitVersion.MsBuild.Task.Tests.csproj @@ -23,7 +23,7 @@ - + diff --git a/src/GitVersionTask.Tests/GitVersionTaskDirectoryTests.cs b/src/GitVersion.MsBuild.Task.Tests/GitVersionTaskDirectoryTests.cs similarity index 100% rename from src/GitVersionTask.Tests/GitVersionTaskDirectoryTests.cs rename to src/GitVersion.MsBuild.Task.Tests/GitVersionTaskDirectoryTests.cs diff --git a/src/GitVersionTask.Tests/Helpers/DirectoryHelper.cs b/src/GitVersion.MsBuild.Task.Tests/Helpers/DirectoryHelper.cs similarity index 100% rename from src/GitVersionTask.Tests/Helpers/DirectoryHelper.cs rename to src/GitVersion.MsBuild.Task.Tests/Helpers/DirectoryHelper.cs diff --git a/src/GitVersionTask.Tests/Helpers/IPostTestDirectoryRemover.cs b/src/GitVersion.MsBuild.Task.Tests/Helpers/IPostTestDirectoryRemover.cs similarity index 100% rename from src/GitVersionTask.Tests/Helpers/IPostTestDirectoryRemover.cs rename to src/GitVersion.MsBuild.Task.Tests/Helpers/IPostTestDirectoryRemover.cs diff --git a/src/GitVersionTask.Tests/Helpers/PathHelper.cs b/src/GitVersion.MsBuild.Task.Tests/Helpers/PathHelper.cs similarity index 100% rename from src/GitVersionTask.Tests/Helpers/PathHelper.cs rename to src/GitVersion.MsBuild.Task.Tests/Helpers/PathHelper.cs diff --git a/src/GitVersionTask.Tests/Helpers/Scrubbers.cs b/src/GitVersion.MsBuild.Task.Tests/Helpers/Scrubbers.cs similarity index 100% rename from src/GitVersionTask.Tests/Helpers/Scrubbers.cs rename to src/GitVersion.MsBuild.Task.Tests/Helpers/Scrubbers.cs diff --git a/src/GitVersionTask.Tests/Helpers/SelfCleaningDirectory.cs b/src/GitVersion.MsBuild.Task.Tests/Helpers/SelfCleaningDirectory.cs similarity index 100% rename from src/GitVersionTask.Tests/Helpers/SelfCleaningDirectory.cs rename to src/GitVersion.MsBuild.Task.Tests/Helpers/SelfCleaningDirectory.cs diff --git a/src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs b/src/GitVersion.MsBuild.Task.Tests/Helpers/TestEffectiveConfiguration.cs similarity index 100% rename from src/GitVersionTask.Tests/Helpers/TestEffectiveConfiguration.cs rename to src/GitVersion.MsBuild.Task.Tests/Helpers/TestEffectiveConfiguration.cs diff --git a/src/GitVersionTask.Tests/Helpers/TestFileSystem.cs b/src/GitVersion.MsBuild.Task.Tests/Helpers/TestFileSystem.cs similarity index 100% rename from src/GitVersionTask.Tests/Helpers/TestFileSystem.cs rename to src/GitVersion.MsBuild.Task.Tests/Helpers/TestFileSystem.cs diff --git a/src/GitVersionTask.Tests/Helpers/TestStream.cs b/src/GitVersion.MsBuild.Task.Tests/Helpers/TestStream.cs similarity index 100% rename from src/GitVersionTask.Tests/Helpers/TestStream.cs rename to src/GitVersion.MsBuild.Task.Tests/Helpers/TestStream.cs diff --git a/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs b/src/GitVersion.MsBuild.Task.Tests/InvalidFileCheckerTests.cs similarity index 99% rename from src/GitVersionTask.Tests/InvalidFileCheckerTests.cs rename to src/GitVersion.MsBuild.Task.Tests/InvalidFileCheckerTests.cs index e8877d2f94..ff2cda6e00 100644 --- a/src/GitVersionTask.Tests/InvalidFileCheckerTests.cs +++ b/src/GitVersion.MsBuild.Task.Tests/InvalidFileCheckerTests.cs @@ -1,6 +1,7 @@ using System; using System.IO; using GitVersion; +using GitVersion.MsBuild; using GitVersionTask.Tests.Mocks; using Microsoft.Build.Framework; using NUnit.Framework; diff --git a/src/GitVersionTask.Tests/Mocks/MockBuildEngine.cs b/src/GitVersion.MsBuild.Task.Tests/Mocks/MockBuildEngine.cs similarity index 100% rename from src/GitVersionTask.Tests/Mocks/MockBuildEngine.cs rename to src/GitVersion.MsBuild.Task.Tests/Mocks/MockBuildEngine.cs diff --git a/src/GitVersionTask.Tests/Mocks/MockTaskItem.cs b/src/GitVersion.MsBuild.Task.Tests/Mocks/MockTaskItem.cs similarity index 100% rename from src/GitVersionTask.Tests/Mocks/MockTaskItem.cs rename to src/GitVersion.MsBuild.Task.Tests/Mocks/MockTaskItem.cs diff --git a/src/GitVersionTask.Tests/ModuleInitializer.cs b/src/GitVersion.MsBuild.Task.Tests/ModuleInitializer.cs similarity index 100% rename from src/GitVersionTask.Tests/ModuleInitializer.cs rename to src/GitVersion.MsBuild.Task.Tests/ModuleInitializer.cs diff --git a/src/GitVersionTask.Tests/TestBase.cs b/src/GitVersion.MsBuild.Task.Tests/TestBase.cs similarity index 100% rename from src/GitVersionTask.Tests/TestBase.cs rename to src/GitVersion.MsBuild.Task.Tests/TestBase.cs diff --git a/src/GitVersion.MsBuild.Task/GenerateGitVersionInformation.cs b/src/GitVersion.MsBuild.Task/GenerateGitVersionInformation.cs new file mode 100644 index 0000000000..0abdc67259 --- /dev/null +++ b/src/GitVersion.MsBuild.Task/GenerateGitVersionInformation.cs @@ -0,0 +1,21 @@ +namespace GitVersion.MsBuild.Task +{ + using Microsoft.Build.Framework; + + public class GenerateGitVersionInformation : GitVersionTaskBase + { + [Required] + public string ProjectFile { get; set; } + + [Required] + public string IntermediateOutputPath { get; set; } + + [Required] + public string Language { get; set; } + + [Output] + public string GitVersionInformationFilePath { get; set; } + + public override bool Execute() => TaskProxy.GenerateGitVersionInformation(this); + } +} diff --git a/src/GitVersionTask/GetVersion.cs b/src/GitVersion.MsBuild.Task/GetVersion.cs similarity index 84% rename from src/GitVersionTask/GetVersion.cs rename to src/GitVersion.MsBuild.Task/GetVersion.cs index 5b8dcb0244..aac4cab9dc 100644 --- a/src/GitVersionTask/GetVersion.cs +++ b/src/GitVersion.MsBuild.Task/GetVersion.cs @@ -1,4 +1,4 @@ -namespace GitVersionTask +namespace GitVersion.MsBuild.Task { using Microsoft.Build.Framework; @@ -94,15 +94,6 @@ public class GetVersion : GitVersionTaskBase [Output] public string CommitsSinceVersionSourcePadded { get; set; } - protected override void InnerExecute() - { - if (GetVersionVariables(out var versionVariables)) return; - - var thisType = typeof(GetVersion); - foreach (var variable in versionVariables) - { - thisType.GetProperty(variable.Key)?.SetValue(this, variable.Value, null); - } - } + public override bool Execute() => TaskProxy.GetVersion(this); } } diff --git a/src/GitVersion.MsBuild.Task/GitVersion.MsBuild.Task.csproj b/src/GitVersion.MsBuild.Task/GitVersion.MsBuild.Task.csproj new file mode 100644 index 0000000000..c46e9f8907 --- /dev/null +++ b/src/GitVersion.MsBuild.Task/GitVersion.MsBuild.Task.csproj @@ -0,0 +1,21 @@ + + + + net461;netstandard2.0 + + + + + + + + + + + + + + + + + diff --git a/src/GitVersion.MsBuild.Task/GitVersionTaskBase.cs b/src/GitVersion.MsBuild.Task/GitVersionTaskBase.cs new file mode 100644 index 0000000000..e32e6ed5c1 --- /dev/null +++ b/src/GitVersion.MsBuild.Task/GitVersionTaskBase.cs @@ -0,0 +1,13 @@ +namespace GitVersion.MsBuild.Task +{ + using Microsoft.Build.Framework; + using Microsoft.Build.Utilities; + + public abstract class GitVersionTaskBase : Task + { + [Required] + public string SolutionDirectory { get; set; } + + public bool NoFetch { get; set; } + } +} diff --git a/src/GitVersion.MsBuild.Task/LibGit2Sharp/GitLoaderContext.cs b/src/GitVersion.MsBuild.Task/LibGit2Sharp/GitLoaderContext.cs new file mode 100644 index 0000000000..473eeec8d4 --- /dev/null +++ b/src/GitVersion.MsBuild.Task/LibGit2Sharp/GitLoaderContext.cs @@ -0,0 +1,87 @@ +// This code originally copied from https://raw.githubusercontent.com/dotnet/sourcelink/master/src/Microsoft.Build.Tasks.Git/GitLoaderContext.cs +#if !NET461 +namespace GitVersion.MsBuild.Task.LibGit2Sharp +{ + using System; + using System.IO; + using System.Linq; + using System.Reflection; + using System.Runtime.InteropServices; + using System.Runtime.Loader; + using RuntimeEnvironment = Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment; + + public sealed class GitLoaderContext : AssemblyLoadContext + { + private readonly string[] assemblies; + public static GitLoaderContext Instance { get; private set; } + + private GitLoaderContext(string[] assemblies) => this.assemblies = assemblies; + + public static void Init(params string[] assemblies) => Instance = new GitLoaderContext(assemblies); + + protected override Assembly Load(AssemblyName assemblyName) + { + if (assemblies.Contains(assemblyName.Name)) + { + var path = Path.Combine(Path.GetDirectoryName(typeof(GitLoaderContext).Assembly.Location), assemblyName.Name + ".dll"); + return LoadFromAssemblyPath(path); + } + + return Default.LoadFromAssemblyName(assemblyName); + } + + protected override IntPtr LoadUnmanagedDll(string unmanagedDllName) + { + var modulePtr = IntPtr.Zero; + + if (unmanagedDllName.StartsWith("git2-", StringComparison.Ordinal) || + unmanagedDllName.StartsWith("libgit2-", StringComparison.Ordinal)) + { + var directory = GetNativeLibraryDirectory(); + var extension = GetNativeLibraryExtension(); + + if (!unmanagedDllName.EndsWith(extension, StringComparison.Ordinal)) + { + unmanagedDllName += extension; + } + + var nativeLibraryPath = Path.Combine(directory, unmanagedDllName); + if (!File.Exists(nativeLibraryPath)) + { + nativeLibraryPath = Path.Combine(directory, "lib" + unmanagedDllName); + } + + modulePtr = LoadUnmanagedDllFromPath(nativeLibraryPath); + } + + return modulePtr != IntPtr.Zero ? modulePtr : base.LoadUnmanagedDll(unmanagedDllName); + } + + internal static string GetNativeLibraryDirectory() + { + var dir = Path.GetDirectoryName(typeof(GitLoaderContext).Assembly.Location); + return Path.Combine(dir, "runtimes", RuntimeIdMap.GetNativeLibraryDirectoryName(RuntimeEnvironment.GetRuntimeIdentifier()), "native"); + } + + private static string GetNativeLibraryExtension() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return ".dll"; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return ".dylib"; + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return ".so"; + } + + throw new PlatformNotSupportedException(); + } + } +} +#endif diff --git a/src/GitVersion.MsBuild.Task/LibGit2Sharp/LibGit2SharpLoader.cs b/src/GitVersion.MsBuild.Task/LibGit2Sharp/LibGit2SharpLoader.cs new file mode 100644 index 0000000000..9c3f64fa10 --- /dev/null +++ b/src/GitVersion.MsBuild.Task/LibGit2Sharp/LibGit2SharpLoader.cs @@ -0,0 +1,90 @@ +// This code originally copied and adapted from https://raw.githubusercontent.com/dotnet/sourcelink/master/src/Microsoft.Build.Tasks.Git/TaskImplementation.cs + +namespace GitVersion.MsBuild.Task.LibGit2Sharp +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Reflection; + + public class LibGit2SharpLoader + { + private static string taskDirectory; + + public static LibGit2SharpLoader Instance { get; private set; } + public Assembly Assembly { get; } + + public static void LoadAssembly(string tasksAssembly) => Instance = new LibGit2SharpLoader(tasksAssembly); + + private LibGit2SharpLoader(string tasksAssembly) + { + taskDirectory = Path.GetDirectoryName(typeof(LibGit2SharpLoader).Assembly.Location); +#if NET461 + nullVersion = new Version(0, 0, 0, 0); + loaderLog = new List(); + + AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve; + + var assemblyName = typeof(LibGit2SharpLoader).Assembly.GetName(); + assemblyName.Name = tasksAssembly; + Assembly = Assembly.Load(assemblyName); +#else + var operationsPath = Path.Combine(taskDirectory, tasksAssembly + ".dll"); + Assembly = GitLoaderContext.Instance.LoadFromAssemblyPath(operationsPath); +#endif + } + + +#if NET461 + + private static Version nullVersion; + + private static List loaderLog; + + private static void Log(ResolveEventArgs args, string outcome) + { + lock (loaderLog) + { + loaderLog.Add($"Loading '{args.Name}' referenced by '{args.RequestingAssembly}': {outcome}."); + } + } + + public static string[] GetLog() + { + lock (loaderLog) + { + return loaderLog.ToArray(); + } + } + + private static Assembly AssemblyResolve(object sender, ResolveEventArgs args) + { + // Limit resolution scope to minimum to affect the rest of msbuild as little as possible. + // Only resolve System.* assemblies from the task directory that are referenced with 0.0.0.0 version (from netstandard.dll). + + var referenceName = new AssemblyName(args.Name); + if (!referenceName.Name.StartsWith("System.", StringComparison.OrdinalIgnoreCase)) + { + Log(args, "not System"); + return null; + } + + if (referenceName.Version != nullVersion) + { + Log(args, "not null version"); + return null; + } + + var referencePath = Path.Combine(taskDirectory, referenceName.Name + ".dll"); + if (!File.Exists(referencePath)) + { + Log(args, $"file '{referencePath}' not found"); + return null; + } + + Log(args, $"loading from '{referencePath}'"); + return Assembly.Load(AssemblyName.GetAssemblyName(referencePath)); + } +#endif + } +} diff --git a/src/GitVersion.MsBuild.Task/LibGit2Sharp/RuntimeIdMap.cs b/src/GitVersion.MsBuild.Task/LibGit2Sharp/RuntimeIdMap.cs new file mode 100644 index 0000000000..a2a04aef3a --- /dev/null +++ b/src/GitVersion.MsBuild.Task/LibGit2Sharp/RuntimeIdMap.cs @@ -0,0 +1,374 @@ +// This code originally copied from https://raw.githubusercontent.com/dotnet/sourcelink/master/src/Microsoft.Build.Tasks.Git/RuntimeIdMap.cs +#if !NET461 + +namespace GitVersion.MsBuild.Task.LibGit2Sharp +{ + using System; + using System.Diagnostics; + + internal static class RuntimeIdMap + { + // This functionality needs to be provided as .NET Core API. + // Releated issues: + // https://github.com/dotnet/core-setup/issues/1846 + // https://github.com/NuGet/Home/issues/5862 + + public static string GetNativeLibraryDirectoryName(string runtimeIdentifier) + { +#if DEBUG + Debug.Assert(s_directories.Length == s_rids.Length); + + for (int i = 1; i < s_rids.Length; i++) + { + Debug.Assert(StringComparer.Ordinal.Compare(s_rids[i - 1], s_rids[i]) < 0); + } +#endif + int index = Array.BinarySearch(s_rids, runtimeIdentifier, StringComparer.Ordinal); + if (index < 0) + { + // Take the runtime id with highest version of matching OS. + // The runtimes in the table are currently sorted so that this works. + + ParseRuntimeId(runtimeIdentifier, out var runtimeOS, out var runtimeVersion, out var runtimeQualifiers); + + // find version-less rid: + int bestMatchIndex = -1; + string[] bestVersion = null; + + void FindBestCandidate(int startIndex, int increment) + { + int i = startIndex; + while (i >= 0 && i < s_rids.Length) + { + string candidate = s_rids[i]; + ParseRuntimeId(candidate, out var candidateOS, out var candidateVersion, out var candidateQualifiers); + if (candidateOS != runtimeOS) + { + break; + } + + // Find the highest available version that is lower than or equal to the runtime version + // among candidates that have the same qualifiers. + if (candidateQualifiers == runtimeQualifiers && + CompareVersions(candidateVersion, runtimeVersion) <= 0 && + (bestVersion == null || CompareVersions(candidateVersion, bestVersion) > 0)) + { + bestMatchIndex = i; + bestVersion = candidateVersion; + } + + i += increment; + } + } + + FindBestCandidate(~index - 1, -1); + FindBestCandidate(~index, +1); + + if (bestMatchIndex < 0) + { + throw new PlatformNotSupportedException(runtimeIdentifier); + } + + index = bestMatchIndex; + } + + return s_directories[index]; + } + + internal static int CompareVersions(string[] left, string[] right) + { + for (int i = 0; i < Math.Max(left.Length, right.Length); i++) + { + // pad with zeros (consider "1.2" == "1.2.0") + var leftPart = (i < left.Length) ? left[i] : "0"; + var rightPart = (i < right.Length) ? right[i] : "0"; + + int result; + if (!int.TryParse(leftPart, out var leftNumber) || !int.TryParse(rightPart, out var rightNumber)) + { + // alphabetical order: + result = StringComparer.Ordinal.Compare(leftPart, rightPart); + } + else + { + // numerical order: + result = leftNumber.CompareTo(rightNumber); + } + + if (result != 0) + { + return result; + } + } + + return 0; + } + + internal static void ParseRuntimeId(string runtimeId, out string osName, out string[] version, out string qualifiers) + { + // We use the following convention in all newly-defined RIDs. Some RIDs (win7-x64, win8-x64) predate this convention and don't follow it, but all new RIDs should follow it. + // [os name].[version]-[architecture]-[additional qualifiers] + // See https://github.com/dotnet/corefx/blob/master/pkg/Microsoft.NETCore.Platforms/readme.md#naming-convention + + int versionSeparator = runtimeId.IndexOf('.'); + if (versionSeparator >= 0) + { + osName = runtimeId.Substring(0, versionSeparator); + } + else + { + osName = null; + } + + int architectureSeparator = runtimeId.IndexOf('-', versionSeparator + 1); + if (architectureSeparator >= 0) + { + if (versionSeparator >= 0) + { + version = runtimeId.Substring(versionSeparator + 1, architectureSeparator - versionSeparator - 1).Split('.'); + } + else + { + osName = runtimeId.Substring(0, architectureSeparator); + version = Array.Empty(); + } + + qualifiers = runtimeId.Substring(architectureSeparator + 1); + } + else + { + if (versionSeparator >= 0) + { + version = runtimeId.Substring(versionSeparator + 1).Split('.'); + } + else + { + osName = runtimeId; + version = Array.Empty(); + } + + qualifiers = string.Empty; + } + } + + // The following tables were generated by scripts/RuntimeIdMapGenerator.csx. + // Regenerate when upgrading LibGit2Sharp to a new version that supports more platforms. + + private static readonly string[] s_rids = new[] + { + "alpine-x64", + "alpine.3.6-x64", + "alpine.3.7-x64", + "centos-x64", + "centos.7-x64", + "debian-x64", + "debian.8-x64", + "debian.9-x64", + "fedora-x64", + "fedora.23-x64", + "fedora.24-x64", + "fedora.25-x64", + "fedora.26-x64", + "fedora.27-x64", + "fedora.28-x64", + "fedora.29-x64", + "gentoo-x64", + "linux-musl-x64", + "linux-x64", + "linuxmint.17-x64", + "linuxmint.17.1-x64", + "linuxmint.17.2-x64", + "linuxmint.17.3-x64", + "linuxmint.18-x64", + "linuxmint.18.1-x64", + "linuxmint.18.2-x64", + "linuxmint.18.3-x64", + "linuxmint.19-x64", + "ol-x64", + "ol.7-x64", + "ol.7.0-x64", + "ol.7.1-x64", + "ol.7.2-x64", + "ol.7.3-x64", + "ol.7.4-x64", + "ol.7.5-x64", + "ol.7.6-x64", + "opensuse-x64", + "opensuse.13.2-x64", + "opensuse.15.0-x64", + "opensuse.42.1-x64", + "opensuse.42.2-x64", + "opensuse.42.3-x64", + "osx", + "osx-x64", + "osx.10.10", + "osx.10.10-x64", + "osx.10.11", + "osx.10.11-x64", + "osx.10.12", + "osx.10.12-x64", + "osx.10.13", + "osx.10.13-x64", + "osx.10.14", + "osx.10.14-x64", + "rhel-x64", + "rhel.6-x64", + "rhel.7-x64", + "rhel.7.0-x64", + "rhel.7.1-x64", + "rhel.7.2-x64", + "rhel.7.3-x64", + "rhel.7.4-x64", + "rhel.7.5-x64", + "rhel.7.6-x64", + "rhel.8-x64", + "rhel.8.0-x64", + "sles-x64", + "sles.12-x64", + "sles.12.1-x64", + "sles.12.2-x64", + "sles.12.3-x64", + "sles.15-x64", + "ubuntu-x64", + "ubuntu.14.04-x64", + "ubuntu.14.10-x64", + "ubuntu.15.04-x64", + "ubuntu.15.10-x64", + "ubuntu.16.04-x64", + "ubuntu.16.10-x64", + "ubuntu.17.04-x64", + "ubuntu.17.10-x64", + "ubuntu.18.04-x64", + "ubuntu.18.10-x64", + "win-x64", + "win-x64-aot", + "win-x86", + "win-x86-aot", + "win10-x64", + "win10-x64-aot", + "win10-x86", + "win10-x86-aot", + "win7-x64", + "win7-x64-aot", + "win7-x86", + "win7-x86-aot", + "win8-x64", + "win8-x64-aot", + "win8-x86", + "win8-x86-aot", + "win81-x64", + "win81-x64-aot", + "win81-x86", + "win81-x86-aot", + }; + + private static readonly string[] s_directories = new[] + { + "alpine-x64", + "alpine-x64", + "alpine-x64", + "rhel-x64", + "rhel-x64", + "linux-x64", + "linux-x64", + "debian.9-x64", + "fedora-x64", + "fedora-x64", + "fedora-x64", + "fedora-x64", + "fedora-x64", + "fedora-x64", + "fedora-x64", + "fedora-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "ubuntu.18.04-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "osx", + "osx", + "osx", + "osx", + "osx", + "osx", + "osx", + "osx", + "osx", + "osx", + "osx", + "osx", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "rhel-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "linux-x64", + "ubuntu.18.04-x64", + "linux-x64", + "win-x64", + "win-x64", + "win-x86", + "win-x86", + "win-x64", + "win-x64", + "win-x86", + "win-x86", + "win-x64", + "win-x64", + "win-x86", + "win-x86", + "win-x64", + "win-x64", + "win-x86", + "win-x86", + "win-x64", + "win-x64", + "win-x86", + "win-x86", + }; + } +} +#endif diff --git a/src/GitVersion.MsBuild.Task/TaskProxy.cs b/src/GitVersion.MsBuild.Task/TaskProxy.cs new file mode 100644 index 0000000000..85fc40ad78 --- /dev/null +++ b/src/GitVersion.MsBuild.Task/TaskProxy.cs @@ -0,0 +1,31 @@ +namespace GitVersion.MsBuild.Task +{ + using System; + using System.Reflection; + using GitVersion.MsBuild.Task.LibGit2Sharp; + + public static class TaskProxy + { + public static Func GetVersion; + public static Func GenerateGitVersionInformation; + public static Func UpdateAssemblyInfo; + public static Func WriteVersionInfoToBuildLog; + + static TaskProxy() + { +#if !NET461 + GitLoaderContext.Init("GitVersionCore", "LibGit2Sharp"); +#endif + LibGit2SharpLoader.LoadAssembly("GitVersion.MsBuild"); + + var type = LibGit2SharpLoader.Instance.Assembly.GetType("GitVersion.MsBuild.GitVersionTasks", throwOnError: true).GetTypeInfo(); + + GetVersion = GetMethod(type, nameof(GetVersion)); + GenerateGitVersionInformation = GetMethod(type, nameof(GenerateGitVersionInformation)); + UpdateAssemblyInfo = GetMethod(type, nameof(UpdateAssemblyInfo)); + WriteVersionInfoToBuildLog = GetMethod(type, nameof(WriteVersionInfoToBuildLog)); + } + + private static Func GetMethod(TypeInfo type, string name) => (Func)type.GetDeclaredMethod(name).CreateDelegate(typeof(Func)); + } +} diff --git a/src/GitVersion.MsBuild.Task/UpdateAssemblyInfo.cs b/src/GitVersion.MsBuild.Task/UpdateAssemblyInfo.cs new file mode 100644 index 0000000000..5570090df9 --- /dev/null +++ b/src/GitVersion.MsBuild.Task/UpdateAssemblyInfo.cs @@ -0,0 +1,24 @@ +namespace GitVersion.MsBuild.Task +{ + using Microsoft.Build.Framework; + + public class UpdateAssemblyInfo : GitVersionTaskBase + { + [Required] + public string ProjectFile { get; set; } + + [Required] + public string IntermediateOutputPath { get; set; } + + [Required] + public ITaskItem[] CompileFiles { get; set; } + + [Required] + public string Language { get; set; } + + [Output] + public string AssemblyInfoTempFilePath { get; set; } + + public override bool Execute() => TaskProxy.UpdateAssemblyInfo(this); + } +} diff --git a/src/GitVersion.MsBuild.Task/WriteVersionInfoToBuildLog.cs b/src/GitVersion.MsBuild.Task/WriteVersionInfoToBuildLog.cs new file mode 100644 index 0000000000..7694f1e653 --- /dev/null +++ b/src/GitVersion.MsBuild.Task/WriteVersionInfoToBuildLog.cs @@ -0,0 +1,7 @@ +namespace GitVersion.MsBuild.Task +{ + public class WriteVersionInfoToBuildLog : GitVersionTaskBase + { + public override bool Execute() => TaskProxy.WriteVersionInfoToBuildLog(this); + } +} diff --git a/src/GitVersion.MsBuild/GitVersion.MsBuild.csproj b/src/GitVersion.MsBuild/GitVersion.MsBuild.csproj new file mode 100644 index 0000000000..5f647191ef --- /dev/null +++ b/src/GitVersion.MsBuild/GitVersion.MsBuild.csproj @@ -0,0 +1,25 @@ + + + + net461;netcoreapp2.1 + + true + + GitVersion.MsBuild.nuspec + bin\$(Configuration) + 0.0.1-alpha-0001 + version=$(PackageVersion) + + true + + + + + + + + + + + + diff --git a/src/GitVersion.MsBuild/GitVersion.MsBuild.nuspec b/src/GitVersion.MsBuild/GitVersion.MsBuild.nuspec new file mode 100644 index 0000000000..e12ce84bf9 --- /dev/null +++ b/src/GitVersion.MsBuild/GitVersion.MsBuild.nuspec @@ -0,0 +1,45 @@ + + + + GitVersion.MsBuild + 1.0.0 + GitVersion.MsBuild + GitTools and Contributors + GitTools and Contributors + false + true + MIT + https://github.com/GitTools/GitVersion + https://raw.githubusercontent.com/GitTools/GitVersion/master/docs/img/package_icon.png + Stamps an assembly with git information based on SemVer. + https://github.com/GitTools/GitVersion/releases + Copyright GitTools 2019. + Git Versioning GitVersion GitFlowVersion GitFlow GitHubFlow SemVer + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/GitVersion.MsBuild/GitVersionTasks.cs b/src/GitVersion.MsBuild/GitVersionTasks.cs new file mode 100644 index 0000000000..5e227290fa --- /dev/null +++ b/src/GitVersion.MsBuild/GitVersionTasks.cs @@ -0,0 +1,155 @@ +namespace GitVersion.MsBuild +{ + using System; + using System.IO; + using GitVersion; + using GitVersion.Helpers; + using GitVersion.MsBuild.Task; + using Microsoft.Build.Framework; + + public static class GitVersionTasks + { + public static ExecuteCore ExecuteCore { get; } + + static GitVersionTasks() + { + var fileSystem = new FileSystem(); + ExecuteCore = new ExecuteCore(fileSystem); + } + + public static bool GetVersion(GetVersion task) + { + return Execute(task, t => + { + if (!GetVersionVariables(task, out var versionVariables)) return; + + var thisType = typeof(GetVersion); + foreach (var variable in versionVariables) + { + thisType.GetProperty(variable.Key)?.SetValue(task, variable.Value, null); + } + }); + } + + public static bool GenerateGitVersionInformation(GenerateGitVersionInformation task) + { + return Execute(task, t => + { + if (!GetVersionVariables(task, out var versionVariables)) return; + + var fileExtension = GetFileExtension(task.Language); + var fileName = $"GitVersionInformation.g.{fileExtension}"; + + if (task.IntermediateOutputPath == null) + { + fileName = $"GitVersionInformation_{Path.GetFileNameWithoutExtension(task.ProjectFile)}_{Path.GetRandomFileName()}.g.{fileExtension}"; + } + + var workingDirectory = task.IntermediateOutputPath ?? TempFileTracker.TempPath; + + task.GitVersionInformationFilePath = Path.Combine(workingDirectory, fileName); + + var generator = new GitVersionInformationGenerator(fileName, workingDirectory, versionVariables, new FileSystem()); + generator.Generate(); + }); + } + + public static bool UpdateAssemblyInfo(UpdateAssemblyInfo task) + { + return Execute(task, t => + { + TempFileTracker.DeleteTempFiles(); + InvalidFileChecker.CheckForInvalidFiles(task.CompileFiles, task.ProjectFile); + + if (!GetVersionVariables(task, out var versionVariables)) return; + + var fileExtension = GetFileExtension(task.Language); + var assemblyInfoFileName = $"GitVersionTaskAssemblyInfo.g.{fileExtension}"; + + if (task.IntermediateOutputPath == null) + { + assemblyInfoFileName = $"AssemblyInfo_{Path.GetFileNameWithoutExtension(task.ProjectFile)}_{Path.GetRandomFileName()}.g.{fileExtension}"; + } + + var workingDirectory = task.IntermediateOutputPath ?? TempFileTracker.TempPath; + + task.AssemblyInfoTempFilePath = Path.Combine(workingDirectory, assemblyInfoFileName); + + using (var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFileName, workingDirectory, versionVariables, new FileSystem(), true)) + { + assemblyInfoFileUpdater.Update(); + assemblyInfoFileUpdater.CommitChanges(); + } + }); + } + + public static bool WriteVersionInfoToBuildLog(WriteVersionInfoToBuildLog task) + { + return Execute(task, t => + { + if (!GetVersionVariables(task, out var versionVariables)) return; + var log = task.Log; + + foreach (var buildServer in BuildServerList.GetApplicableBuildServers()) + { + log.LogMessage($"Executing GenerateSetVersionMessage for '{buildServer.GetType().Name}'."); + log.LogMessage(buildServer.GenerateSetVersionMessage(versionVariables)); + log.LogMessage($"Executing GenerateBuildLogOutput for '{buildServer.GetType().Name}'."); + foreach (var buildParameter in BuildOutputFormatter.GenerateBuildLogOutput(buildServer, versionVariables)) + { + log.LogMessage(buildParameter); + } + } + }); + } + + private static bool Execute(T task, Action action) + where T : GitVersionTaskBase + { + void LogDebug(string message) => task.Log.LogMessage(MessageImportance.Low, message); + void LogInfo(string message) => task.Log.LogMessage(MessageImportance.Normal, message); + void LogWarning(string message) => task.Log.LogWarning(message); + void LogError(string message) => task.Log.LogError(message); + + Logger.SetLoggers(LogDebug, LogInfo, LogWarning, LogError); + var log = task.Log; + try + { + action(task); + } + catch (WarningException errorException) + { + log.LogWarningFromException(errorException); + return true; + } + catch (Exception exception) + { + log.LogErrorFromException(exception); + return false; + } + + return !log.HasLoggedErrors; + } + + private static bool GetVersionVariables(GitVersionTaskBase task, out VersionVariables versionVariables) + => ExecuteCore.TryGetVersion(task.SolutionDirectory, out versionVariables, task.NoFetch, new Authentication()); + + private static string GetFileExtension(string language) + { + switch(language) + { + case "C#": + return "cs"; + + case "F#": + return "fs"; + + case "VB": + return "vb"; + + default: + throw new Exception($"Unknown language detected: '{language}'"); + } + } + } +} diff --git a/src/GitVersion.MsBuild/InvalidFileChecker.cs b/src/GitVersion.MsBuild/InvalidFileChecker.cs new file mode 100644 index 0000000000..b625e42ebf --- /dev/null +++ b/src/GitVersion.MsBuild/InvalidFileChecker.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using Microsoft.Build.Framework; + +namespace GitVersion.MsBuild +{ + public static class InvalidFileChecker + { + private static readonly Dictionary> versionAttributeFinders = new Dictionary>() + { + { ".cs", CSharpFileContainsVersionAttribute }, + { ".vb", VisualBasicFileContainsVersionAttribute } + }; + + public static void CheckForInvalidFiles(IEnumerable compileFiles, string projectFile) + { + foreach (var compileFile in GetInvalidFiles(compileFiles, projectFile)) + { + throw new WarningException("File contains assembly version attributes which conflict with the attributes generated by GitVersion " + compileFile); + } + } + + static bool FileContainsVersionAttribute(string compileFile, string projectFile) + { + Func languageSpecificFileContainsVersionAttribute; + + var compileFileExtension = Path.GetExtension(compileFile); + + if (versionAttributeFinders.TryGetValue(compileFileExtension, out languageSpecificFileContainsVersionAttribute)) + { + return languageSpecificFileContainsVersionAttribute(compileFile, projectFile); + } + + throw new WarningException("File with name containing AssemblyInfo could not be checked for assembly version attributes which conflict with the attributes generated by GitVersion " + compileFile); + } + + static bool CSharpFileContainsVersionAttribute(string compileFile, string projectFile) + { + var combine = Path.Combine(Path.GetDirectoryName(projectFile), compileFile); + var allText = File.ReadAllText(combine); + + var blockComments = @"/\*(.*?)\*/"; + var lineComments = @"//(.*?)\r?\n"; + var strings = @"""((\\[^\n]|[^""\n])*)"""; + var verbatimStrings = @"@(""[^""]*"")+"; + + var noCommentsOrStrings = Regex.Replace(allText, + blockComments + "|" + lineComments + "|" + strings + "|" + verbatimStrings, + me => + { + if (me.Value.StartsWith("//")) + return Environment.NewLine; + + return ""; + }, + RegexOptions.Singleline); + + return Regex.IsMatch(noCommentsOrStrings, @"(?x) # IgnorePatternWhitespace + +\[\s*assembly\s*:\s* # The [assembly: part + +(System\s*\.\s*Reflection\s*\.\s*)? # The System.Reflection. part (optional) + +Assembly(File|Informational)?Version # The attribute AssemblyVersion, AssemblyFileVersion, or AssemblyInformationalVersion + +\s*\(\s*\)\s*\] # End brackets ()]"); + } + + static bool VisualBasicFileContainsVersionAttribute(string compileFile, string projectFile) + { + var combine = Path.Combine(Path.GetDirectoryName(projectFile), compileFile); + var allText = File.ReadAllText(combine); + + var lineComments = @"'(.*?)\r?\n"; + var strings = @"""((\\[^\n]|[^""\n])*)"""; + + var noCommentsOrStrings = Regex.Replace(allText, + lineComments + "|" + strings, + me => + { + if (me.Value.StartsWith("'")) + return Environment.NewLine; + + return ""; + }, + RegexOptions.Singleline); + + return Regex.IsMatch(noCommentsOrStrings, @"(?x) # IgnorePatternWhitespace + +\<\s*Assembly\s*:\s* # The # End brackets ()>"); + } + + static IEnumerable GetInvalidFiles(IEnumerable compileFiles, string projectFile) + { + return compileFiles.Select(x => x.ItemSpec) + .Where(compileFile => compileFile.Contains("AssemblyInfo")) + .Where(s => FileContainsVersionAttribute(s, projectFile)); + } + } +} diff --git a/src/GitVersion.MsBuild/TempFileTracker.cs b/src/GitVersion.MsBuild/TempFileTracker.cs new file mode 100644 index 0000000000..6c36e16ee8 --- /dev/null +++ b/src/GitVersion.MsBuild/TempFileTracker.cs @@ -0,0 +1,40 @@ +using System; +using System.IO; + +namespace GitVersion.MsBuild +{ + public static class TempFileTracker + { + public static string TempPath; + + static TempFileTracker() + { + TempPath = Path.Combine(Path.GetTempPath(), "GitVersionTask"); + Directory.CreateDirectory(TempPath); + } + + public static void DeleteTempFiles() + { + if (!Directory.Exists(TempPath)) + { + return; + } + + foreach (var file in Directory.GetFiles(TempPath)) + { + if (File.GetLastWriteTime(file) < DateTime.Now.AddDays(-1)) + { + try + { + File.Delete(file); + } + catch (UnauthorizedAccessException) + { + //ignore contention + } + } + } + } + + } +} \ No newline at end of file diff --git a/src/GitVersion.MsBuild/build/GitVersion.MsBuild.props b/src/GitVersion.MsBuild/build/GitVersion.MsBuild.props new file mode 100644 index 0000000000..cc3fd505bf --- /dev/null +++ b/src/GitVersion.MsBuild/build/GitVersion.MsBuild.props @@ -0,0 +1,37 @@ + + + + $(MSBuildThisFileDirectory)..\tools\net461\GitVersion.MsBuild.Task.dll + $(MSBuildThisFileDirectory)..\tools\netstandard2.0\GitVersion.MsBuild.Task.dll + + $(MSBuildProjectDirectory)\..\ + $(SolutionDir) + $(MSBuildProjectDirectory) + + false + + + true + + + true + + + true + + + true + + true + + $(MarkupCompilePass1DependsOn);GetVersion + $(GetPackageVersionDependsOn);GetVersion + + + true + false + + diff --git a/src/GitVersion.MsBuild/build/GitVersion.MsBuild.targets b/src/GitVersion.MsBuild/build/GitVersion.MsBuild.targets new file mode 100644 index 0000000000..d87cdc622e --- /dev/null +++ b/src/GitVersion.MsBuild/build/GitVersion.MsBuild.targets @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(GitVersion_FullSemVer) + $(GitVersion_MajorMinorPatch) + $(GitVersion_NuGetPreReleaseTag) + $(GitVersion_PreReleaseTag) + $(GitVersion_NuGetVersion) + $(GitVersion_FullSemVer) + $(GitVersion_InformationalVersion) + $(GitVersion_AssemblySemVer) + $(GitVersion_AssemblySemFileVer) + + + + GitVersion_Major=$(GitVersion_Major);$(DefineConstants) + GitVersion_Minor=$(GitVersion_Minor);$(DefineConstants) + GitVersion_Patch=$(GitVersion_Patch);$(DefineConstants) + GitVersion_PreReleaseTag=$(GitVersion_PreReleaseTag);$(DefineConstants) + GitVersion_PreReleaseTagWithDash=$(GitVersion_PreReleaseTagWithDash);$(DefineConstants) + GitVersion_PreReleaseLabel=$(GitVersion_PreReleaseLabel);$(DefineConstants) + GitVersion_PreReleaseNumber=$(GitVersion_PreReleaseNumber);$(DefineConstants) + GitVersion_BuildMetaData=$(GitVersion_BuildMetaData);$(DefineConstants) + GitVersion_BuildMetaDataPadded=$(GitVersion_BuildMetaDataPadded);$(DefineConstants) + GitVersion_FullBuildMetaData=$(GitVersion_FullBuildMetaData);$(DefineConstants) + GitVersion_MajorMinorPatch=$(GitVersion_MajorMinorPatch);$(DefineConstants) + GitVersion_SemVer=$(GitVersion_SemVer);$(DefineConstants) + GitVersion_LegacySemVer=$(GitVersion_LegacySemVer);$(DefineConstants) + GitVersion_LegacySemVerPadded=$(GitVersion_LegacySemVerPadded);$(DefineConstants) + GitVersion_AssemblySemVer=$(GitVersion_AssemblySemVer);$(DefineConstants) + GitVersion_AssemblySemFileVer=$(GitVersion_AssemblySemFileVer);$(DefineConstants) + GitVersion_FullSemVer=$(GitVersion_FullSemVer);$(DefineConstants) + GitVersion_InformationalVersion=$(GitVersion_InformationalVersion);$(DefineConstants) + GitVersion_BranchName=$(GitVersion_BranchName);$(DefineConstants) + GitVersion_Sha=$(GitVersion_Sha);$(DefineConstants) + GitVersion_NuGetVersionV2=$(GitVersion_NuGetVersionV2);$(DefineConstants) + GitVersion_NuGetVersion=$(GitVersion_NuGetVersion);$(DefineConstants) + GitVersion_NuGetPreReleaseTagV2=$(GitVersion_NuGetPreReleaseTagV2);$(DefineConstants) + GitVersion_NuGetPreReleaseTag=$(GitVersion_NuGetPreReleaseTag);$(DefineConstants) + GitVersion_CommitDate=$(GitVersion_CommitDate);$(DefineConstants) + GitVersion_CommitsSinceVersionSource=$(GitVersion_CommitsSinceVersionSource);$(DefineConstants) + GitVersion_CommitsSinceVersionSourcePadded=$(GitVersion_CommitsSinceVersionSourcePadded);$(DefineConstants) + + + + + diff --git a/src/GitVersion.MsBuild/buildMultiTargeting/GitVersion.MsBuild.props b/src/GitVersion.MsBuild/buildMultiTargeting/GitVersion.MsBuild.props new file mode 100644 index 0000000000..38b3a09ab9 --- /dev/null +++ b/src/GitVersion.MsBuild/buildMultiTargeting/GitVersion.MsBuild.props @@ -0,0 +1,4 @@ + + + + diff --git a/src/GitVersion.MsBuild/buildMultiTargeting/GitVersion.MsBuild.targets b/src/GitVersion.MsBuild/buildMultiTargeting/GitVersion.MsBuild.targets new file mode 100644 index 0000000000..a31cac6368 --- /dev/null +++ b/src/GitVersion.MsBuild/buildMultiTargeting/GitVersion.MsBuild.targets @@ -0,0 +1,68 @@ + + + + + + + + + + + + + UpdateAssemblyInfo + + + + + + + GenerateGitVersionInformation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(GitVersion_FullSemVer) + $(GitVersion_MajorMinorPatch) + $(GitVersion_NuGetPreReleaseTag) + $(GitVersion_PreReleaseTag) + $(GitVersion_NuGetVersion) + $(GitVersion_FullSemVer) + $(GitVersion_InformationalVersion) + $(GitVersion_AssemblySemVer) + $(GitVersion_AssemblySemFileVer) + + + + diff --git a/src/GitVersionTask/key.snk b/src/GitVersion.MsBuild/key.snk similarity index 100% rename from src/GitVersionTask/key.snk rename to src/GitVersion.MsBuild/key.snk diff --git a/src/GitVersion.sln b/src/GitVersion.sln index 905eca67b7..f0a34dfc67 100644 --- a/src/GitVersion.sln +++ b/src/GitVersion.sln @@ -2,12 +2,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.28714.193 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionExe", "GitVersionExe\GitVersionExe.csproj", "{C3578A7B-09A6-4444-9383-0DEAFA4958BD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionTask.Tests", "GitVersionTask.Tests\GitVersionTask.Tests.csproj", "{5A86453B-96FB-4B6E-A283-225BB9F753D3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionCore.Tests", "GitVersionCore.Tests\GitVersionCore.Tests.csproj", "{BF905F84-382C-440D-92F5-C61108626D8D}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3EFFC5D6-88D0-49D9-BB53-E1B7EB49DD45}" ProjectSection(SolutionItems) = preProject ..\.gitattributes = ..\.gitattributes @@ -26,14 +20,22 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\README.md = ..\README.md EndProjectSection EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionExe", "GitVersionExe\GitVersionExe.csproj", "{C3578A7B-09A6-4444-9383-0DEAFA4958BD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionCore.Tests", "GitVersionCore.Tests\GitVersionCore.Tests.csproj", "{BF905F84-382C-440D-92F5-C61108626D8D}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionCore", "GitVersionCore\GitVersionCore.csproj", "{F9741A0D-B9D7-4557-9A1C-A7252C1071F5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionExe.Tests", "GitVersionExe.Tests\GitVersionExe.Tests.csproj", "{75C2BE85-1DAF-4E34-8305-B17AFAA982A6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionTask", "GitVersionTask\GitVersionTask.csproj", "{F7AC0E71-3E9A-4F6D-B986-E004825A48E1}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersion.Tool", "GitVersionExe\GitVersion.Tool.csproj", "{929263FD-5CD2-42E1-BF3D-E0C1B0320DA4}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersion.MsBuild", "GitVersion.MsBuild\GitVersion.MsBuild.csproj", "{F7AC0E71-3E9A-4F6D-B986-E004825A48E1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GitVersion.MsBuild.Task", "GitVersion.MsBuild.Task\GitVersion.MsBuild.Task.csproj", "{F34414D6-903D-45FB-8F56-4F11A4DB41F1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersion.MsBuild.Task.Tests", "GitVersion.MsBuild.Task.Tests\GitVersion.MsBuild.Task.Tests.csproj", "{5A86453B-96FB-4B6E-A283-225BB9F753D3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -68,6 +70,10 @@ Global {929263FD-5CD2-42E1-BF3D-E0C1B0320DA4}.Debug|Any CPU.Build.0 = Debug|Any CPU {929263FD-5CD2-42E1-BF3D-E0C1B0320DA4}.Release|Any CPU.ActiveCfg = Release|Any CPU {929263FD-5CD2-42E1-BF3D-E0C1B0320DA4}.Release|Any CPU.Build.0 = Release|Any CPU + {F34414D6-903D-45FB-8F56-4F11A4DB41F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F34414D6-903D-45FB-8F56-4F11A4DB41F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F34414D6-903D-45FB-8F56-4F11A4DB41F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F34414D6-903D-45FB-8F56-4F11A4DB41F1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/GitVersionCore.Tests/Mocks/MockRepository.cs b/src/GitVersionCore.Tests/Mocks/MockRepository.cs index 33e8709a4d..4bd39d65a8 100644 --- a/src/GitVersionCore.Tests/Mocks/MockRepository.cs +++ b/src/GitVersionCore.Tests/Mocks/MockRepository.cs @@ -225,6 +225,7 @@ public IQueryableCommitLog Commits public ObjectDatabase ObjectDatabase { get; set; } public NoteCollection Notes { get; set; } public SubmoduleCollection Submodules { get; set; } + public WorktreeCollection Worktrees { get; set; } public Rebase Rebase { get; private set; } public Ignore Ignore diff --git a/src/GitVersionCore/GitVersionCore.csproj b/src/GitVersionCore/GitVersionCore.csproj index 2352f4f36b..331e4bf8df 100644 --- a/src/GitVersionCore/GitVersionCore.csproj +++ b/src/GitVersionCore/GitVersionCore.csproj @@ -19,8 +19,7 @@ - - + diff --git a/src/GitVersionTask.Tests/GitVersionTask.Tests.v2.ncrunchproject b/src/GitVersionTask.Tests/GitVersionTask.Tests.v2.ncrunchproject deleted file mode 100644 index a26995ad88..0000000000 --- a/src/GitVersionTask.Tests/GitVersionTask.Tests.v2.ncrunchproject +++ /dev/null @@ -1,32 +0,0 @@ - - true - 1000 - true - false - false - true - false - false - false - false - true - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - - - IntegrationTests - - - PostBuildEventDisabled;CopyReferencedAssembliesToWorkspaceIsOn - \ No newline at end of file diff --git a/src/GitVersionTask.Tests/Tests.v2.ncrunchproject b/src/GitVersionTask.Tests/Tests.v2.ncrunchproject deleted file mode 100644 index 0646644b82..0000000000 --- a/src/GitVersionTask.Tests/Tests.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - true - false - false - true - false - false - false - true - true - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - Resources\**.*;..\Packages\LibGit2Sharp.0.17.0.0\lib\net35\NativeBinaries\**.* - CopyReferencedAssembliesToWorkspaceIsOn - \ No newline at end of file diff --git a/src/GitVersionTask/GenerateGitVersionInformation.cs b/src/GitVersionTask/GenerateGitVersionInformation.cs deleted file mode 100644 index 6cb61e7034..0000000000 --- a/src/GitVersionTask/GenerateGitVersionInformation.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace GitVersionTask -{ - using System.IO; - using GitVersion; - using GitVersion.Helpers; - using Microsoft.Build.Framework; - - public class GenerateGitVersionInformation : GitVersionTaskBase - { - [Required] - public string ProjectFile { get; set; } - - [Required] - public string IntermediateOutputPath { get; set; } - - [Required] - public string Language { get; set; } - - [Output] - public string GitVersionInformationFilePath { get; set; } - - protected override void InnerExecute() - { - if (GetVersionVariables(out var versionVariables)) return; - - var fileExtension = TaskUtils.GetFileExtension(Language); - var fileName = $"GitVersionInformation.g.{fileExtension}"; - - if (IntermediateOutputPath == null) - { - fileName = $"GitVersionInformation_{Path.GetFileNameWithoutExtension(ProjectFile)}_{Path.GetRandomFileName()}.g.{fileExtension}"; - } - - var workingDirectory = IntermediateOutputPath ?? TempFileTracker.TempPath; - - GitVersionInformationFilePath = Path.Combine(workingDirectory, fileName); - - var generator = new GitVersionInformationGenerator(fileName, workingDirectory, versionVariables, new FileSystem()); - generator.Generate(); - } - } -} diff --git a/src/GitVersionTask/GitVersionTask.csproj b/src/GitVersionTask/GitVersionTask.csproj deleted file mode 100644 index 4aa0a34c77..0000000000 --- a/src/GitVersionTask/GitVersionTask.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - net461;netstandard2.0 - false - - GitVersionTask - GitVersionTask - - Stamps an assembly with git information based on SemVer. - - true - build - - NugetAssets\GitVersionTask.nuspec - 0.0.1-alpha-0001 - version=$(PackageVersion);configuration=$(Configuration);utilpackversion=$(PackageVersion_UtilPackNuGetMSBuild);libgit2sharpversion=$(PackageVersion_LibGit2Sharp);yamldotnetversion=$(PackageVersion_YamlDotNet) - - $(AssemblyName) - - - - - - - - build\ - - - - - - - All - - - - - all - runtime; build; native; contentfiles; analyzers - - - - - - - - - - - diff --git a/src/GitVersionTask/GitVersionTask.v2.ncrunchproject b/src/GitVersionTask/GitVersionTask.v2.ncrunchproject deleted file mode 100644 index fb541bb0b4..0000000000 --- a/src/GitVersionTask/GitVersionTask.v2.ncrunchproject +++ /dev/null @@ -1,26 +0,0 @@ - - 1000 - false - false - false - true - false - false - false - false - false - true - true - false - true - true - true - 60000 - - - - AutoDetect - STA - x86 - CopyReferencedAssembliesToWorkspaceIsOn;PostBuildEventDisabled - \ No newline at end of file diff --git a/src/GitVersionTask/GitVersionTaskBase.cs b/src/GitVersionTask/GitVersionTaskBase.cs deleted file mode 100644 index 37805297b5..0000000000 --- a/src/GitVersionTask/GitVersionTaskBase.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace GitVersionTask -{ - using System; - using GitVersion; - using GitVersion.Helpers; - - using Microsoft.Build.Framework; - using Microsoft.Build.Utilities; - - public abstract class GitVersionTaskBase : Task - { - protected GitVersionTaskBase() - { - var fileSystem = new FileSystem(); - ExecuteCore = new ExecuteCore(fileSystem); - GitVersion.Logger.SetLoggers(LogDebug, LogInfo, LogWarning, s => LogError(s)); - } - - public override bool Execute() - { - try - { - InnerExecute(); - return true; - } - catch (WarningException errorException) - { - LogWarning(errorException.Message); - return true; - } - catch (Exception exception) - { - LogError("Error occurred: " + exception); - return false; - } - } - - protected abstract void InnerExecute(); - - protected ExecuteCore ExecuteCore { get; } - - [Required] - public string SolutionDirectory { get; set; } - - public bool NoFetch { get; set; } - - public void LogDebug(string message) - { - BuildEngine.LogMessageEvent(new BuildMessageEventArgs(message, string.Empty, "GitVersionTask", MessageImportance.Low)); - } - - public void LogWarning(string message) - { - BuildEngine.LogWarningEvent(new BuildWarningEventArgs(string.Empty, string.Empty, null, 0, 0, 0, 0, message, string.Empty, "GitVersionTask")); - } - - public void LogInfo(string message) - { - BuildEngine.LogMessageEvent(new BuildMessageEventArgs(message, string.Empty, "GitVersionTask", MessageImportance.Normal)); - } - - public void LogError(string message, string file = null) - { - BuildEngine.LogErrorEvent(new BuildErrorEventArgs(string.Empty, string.Empty, file, 0, 0, 0, 0, message, string.Empty, "GitVersionTask")); - } - - protected bool GetVersionVariables(out VersionVariables versionVariables) - { - return !ExecuteCore.TryGetVersion(SolutionDirectory, out versionVariables, NoFetch, new Authentication()); - } - } -} diff --git a/src/GitVersionTask/InvalidFileChecker.cs b/src/GitVersionTask/InvalidFileChecker.cs deleted file mode 100644 index d20be03e56..0000000000 --- a/src/GitVersionTask/InvalidFileChecker.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using GitVersion; -using Microsoft.Build.Framework; - -public static class InvalidFileChecker -{ - private static readonly Dictionary> versionAttributeFinders = new Dictionary>() - { - { ".cs", CSharpFileContainsVersionAttribute }, - { ".vb", VisualBasicFileContainsVersionAttribute } - }; - - public static void CheckForInvalidFiles(IEnumerable compileFiles, string projectFile) - { - foreach (var compileFile in GetInvalidFiles(compileFiles, projectFile)) - { - throw new WarningException("File contains assembly version attributes which conflict with the attributes generated by GitVersion " + compileFile); - } - } - - static bool FileContainsVersionAttribute(string compileFile, string projectFile) - { - Func languageSpecificFileContainsVersionAttribute; - - var compileFileExtension = Path.GetExtension(compileFile); - - if (versionAttributeFinders.TryGetValue(compileFileExtension, out languageSpecificFileContainsVersionAttribute)) - { - return languageSpecificFileContainsVersionAttribute(compileFile, projectFile); - } - - throw new WarningException("File with name containing AssemblyInfo could not be checked for assembly version attributes which conflict with the attributes generated by GitVersion " + compileFile); - } - - static bool CSharpFileContainsVersionAttribute(string compileFile, string projectFile) - { - var combine = Path.Combine(Path.GetDirectoryName(projectFile), compileFile); - var allText = File.ReadAllText(combine); - - var blockComments = @"/\*(.*?)\*/"; - var lineComments = @"//(.*?)\r?\n"; - var strings = @"""((\\[^\n]|[^""\n])*)"""; - var verbatimStrings = @"@(""[^""]*"")+"; - - var noCommentsOrStrings = Regex.Replace(allText, - blockComments + "|" + lineComments + "|" + strings + "|" + verbatimStrings, - me => - { - if (me.Value.StartsWith("//")) - return Environment.NewLine; - - return ""; - }, - RegexOptions.Singleline); - - return Regex.IsMatch(noCommentsOrStrings, @"(?x) # IgnorePatternWhitespace - -\[\s*assembly\s*:\s* # The [assembly: part - -(System\s*\.\s*Reflection\s*\.\s*)? # The System.Reflection. part (optional) - -Assembly(File|Informational)?Version # The attribute AssemblyVersion, AssemblyFileVersion, or AssemblyInformationalVersion - -\s*\(\s*\)\s*\] # End brackets ()]"); - } - - static bool VisualBasicFileContainsVersionAttribute(string compileFile, string projectFile) - { - var combine = Path.Combine(Path.GetDirectoryName(projectFile), compileFile); - var allText = File.ReadAllText(combine); - - var lineComments = @"'(.*?)\r?\n"; - var strings = @"""((\\[^\n]|[^""\n])*)"""; - - var noCommentsOrStrings = Regex.Replace(allText, - lineComments + "|" + strings, - me => - { - if (me.Value.StartsWith("'")) - return Environment.NewLine; - - return ""; - }, - RegexOptions.Singleline); - - return Regex.IsMatch(noCommentsOrStrings, @"(?x) # IgnorePatternWhitespace - -\<\s*Assembly\s*:\s* # The # End brackets ()>"); - } - - static IEnumerable GetInvalidFiles(IEnumerable compileFiles, string projectFile) - { - return compileFiles.Select(x => x.ItemSpec) - .Where(compileFile => compileFile.Contains("AssemblyInfo")) - .Where(s => FileContainsVersionAttribute(s, projectFile)); - } -} diff --git a/src/GitVersionTask/NugetAssets/GitVersionTask.nuspec b/src/GitVersionTask/NugetAssets/GitVersionTask.nuspec deleted file mode 100644 index b3436fdce8..0000000000 --- a/src/GitVersionTask/NugetAssets/GitVersionTask.nuspec +++ /dev/null @@ -1,38 +0,0 @@ - - - - GitVersionTask - 1.0.0 - GitVersionTask - GitTools and Contributors - GitTools and Contributors - false - true - MIT - https://github.com/GitTools/GitVersion - https://raw.githubusercontent.com/GitTools/GitVersion/master/docs/img/package_icon.png - Stamps an assembly with git information based on SemVer. - https://github.com/GitTools/GitVersion/releases - Copyright GitTools 2019. - Git Versioning GitVersion GitFlowVersion GitFlow GitHubFlow SemVer - - - - - - - - - - - - - - - - - - - - - diff --git a/src/GitVersionTask/NugetAssets/build/GitVersionTask.targets b/src/GitVersionTask/NugetAssets/build/GitVersionTask.targets deleted file mode 100644 index d816d04563..0000000000 --- a/src/GitVersionTask/NugetAssets/build/GitVersionTask.targets +++ /dev/null @@ -1,13 +0,0 @@ - - - - false - true - - - - - - - - diff --git a/src/GitVersionTask/NugetAssets/build/Infrastructure.props b/src/GitVersionTask/NugetAssets/build/Infrastructure.props deleted file mode 100644 index e5ff8092e1..0000000000 --- a/src/GitVersionTask/NugetAssets/build/Infrastructure.props +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - $(MSBuildThisFileDirectory)functionality/ - $(GitVersionTaskBuildTools_FunctionalityDir)GitVersionBuild.targets - $(GitVersionTaskBuildTools_FunctionalityDir)GitVersionMultiTargetBuild.targets - $(GitVersionTaskBuildTools_FunctionalityDir)obj/ - - - - $(PackageVersion_UtilPackNuGetMSBuild) - $(MSBuildThisFileDirectory)../../../utilpack.nuget.msbuild/$(UtilPackVersion)/build/UtilPack.NuGet.MSBuild.props - $([System.IO.Path]::GetFullPath('$(UtilPackNuGetMSBuildPropsPath)')) - - - - - - true - - - - - .NETFramework - 4.6.1 - - - $(UtilPackTaskFactoryParametersXML) - true - GitVersionTask.dll - - - - - - - - - - diff --git a/src/GitVersionTask/NugetAssets/build/functionality/GitVersionBuild.targets b/src/GitVersionTask/NugetAssets/build/functionality/GitVersionBuild.targets deleted file mode 100644 index ff6c8923cf..0000000000 --- a/src/GitVersionTask/NugetAssets/build/functionality/GitVersionBuild.targets +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(GitVersion_FullSemVer) - $(GitVersion_MajorMinorPatch) - $(GitVersion_NuGetPreReleaseTag) - $(GitVersion_PreReleaseTag) - $(GitVersion_NuGetVersion) - $(GitVersion_FullSemVer) - $(GitVersion_InformationalVersion) - $(GitVersion_AssemblySemVer) - $(GitVersion_AssemblySemFileVer) - - - - GitVersion_Major=$(GitVersion_Major);$(DefineConstants) - GitVersion_Minor=$(GitVersion_Minor);$(DefineConstants) - GitVersion_Patch=$(GitVersion_Patch);$(DefineConstants) - GitVersion_PreReleaseTag=$(GitVersion_PreReleaseTag);$(DefineConstants) - GitVersion_PreReleaseTagWithDash=$(GitVersion_PreReleaseTagWithDash);$(DefineConstants) - GitVersion_PreReleaseLabel=$(GitVersion_PreReleaseLabel);$(DefineConstants) - GitVersion_PreReleaseNumber=$(GitVersion_PreReleaseNumber);$(DefineConstants) - GitVersion_BuildMetaData=$(GitVersion_BuildMetaData);$(DefineConstants) - GitVersion_BuildMetaDataPadded=$(GitVersion_BuildMetaDataPadded);$(DefineConstants) - GitVersion_FullBuildMetaData=$(GitVersion_FullBuildMetaData);$(DefineConstants) - GitVersion_MajorMinorPatch=$(GitVersion_MajorMinorPatch);$(DefineConstants) - GitVersion_SemVer=$(GitVersion_SemVer);$(DefineConstants) - GitVersion_LegacySemVer=$(GitVersion_LegacySemVer);$(DefineConstants) - GitVersion_LegacySemVerPadded=$(GitVersion_LegacySemVerPadded);$(DefineConstants) - GitVersion_AssemblySemVer=$(GitVersion_AssemblySemVer);$(DefineConstants) - GitVersion_AssemblySemFileVer=$(GitVersion_AssemblySemFileVer);$(DefineConstants) - GitVersion_FullSemVer=$(GitVersion_FullSemVer);$(DefineConstants) - GitVersion_InformationalVersion=$(GitVersion_InformationalVersion);$(DefineConstants) - GitVersion_BranchName=$(GitVersion_BranchName);$(DefineConstants) - GitVersion_Sha=$(GitVersion_Sha);$(DefineConstants) - GitVersion_NuGetVersionV2=$(GitVersion_NuGetVersionV2);$(DefineConstants) - GitVersion_NuGetVersion=$(GitVersion_NuGetVersion);$(DefineConstants) - GitVersion_NuGetPreReleaseTagV2=$(GitVersion_NuGetPreReleaseTagV2);$(DefineConstants) - GitVersion_NuGetPreReleaseTag=$(GitVersion_NuGetPreReleaseTag);$(DefineConstants) - GitVersion_CommitDate=$(GitVersion_CommitDate);$(DefineConstants) - GitVersion_CommitsSinceVersionSource=$(GitVersion_CommitsSinceVersionSource);$(DefineConstants) - GitVersion_CommitsSinceVersionSourcePadded=$(GitVersion_CommitsSinceVersionSourcePadded);$(DefineConstants) - - - - - - - - False - - - False - - - False - - - - diff --git a/src/GitVersionTask/NugetAssets/build/functionality/GitVersionCommon.props b/src/GitVersionTask/NugetAssets/build/functionality/GitVersionCommon.props deleted file mode 100644 index ebf736a940..0000000000 --- a/src/GitVersionTask/NugetAssets/build/functionality/GitVersionCommon.props +++ /dev/null @@ -1,85 +0,0 @@ - - - - $(MSBuildProjectDirectory)\..\ - $(SolutionDir) - $(MSBuildProjectDirectory) - $(SolutionDir)\GitVersionTask.targets - $(SolutionDir)\GitVersionTask.targets - - false - $(MSBuildProjectDirectory)\obj\$(Configuration)\ - - - false - true - - - false - false - true - - - false - true - - false - true - - false - true - - - $(MarkupCompilePass1DependsOn);GetVersion - - $(GetPackageVersionDependsOn);GetVersion - - - true - false - - - - - $(UtilPackTaskFactoryParametersXML) - - - - - $(UtilPackTaskFactoryParametersXML) - - - - - $(UtilPackTaskFactoryParametersXML) - - - - - $(UtilPackTaskFactoryParametersXML) - - - - True - - - \ No newline at end of file diff --git a/src/GitVersionTask/NugetAssets/build/functionality/GitVersionMultiTargetBuild.targets b/src/GitVersionTask/NugetAssets/build/functionality/GitVersionMultiTargetBuild.targets deleted file mode 100644 index 379ff192cb..0000000000 --- a/src/GitVersionTask/NugetAssets/build/functionality/GitVersionMultiTargetBuild.targets +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(GitVersion_FullSemVer) - $(GitVersion_MajorMinorPatch) - $(GitVersion_NuGetPreReleaseTag) - $(GitVersion_PreReleaseTag) - $(GitVersion_NuGetVersion) - $(GitVersion_FullSemVer) - $(GitVersion_InformationalVersion) - $(GitVersion_AssemblySemVer) - $(GitVersion_AssemblySemFileVer) - - - - diff --git a/src/GitVersionTask/TaskUtils.cs b/src/GitVersionTask/TaskUtils.cs deleted file mode 100644 index ad0be50887..0000000000 --- a/src/GitVersionTask/TaskUtils.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace GitVersionTask -{ - using System; - - public class TaskUtils - { - public static string GetFileExtension(string language) - { - switch(language) - { - case "C#": - return "cs"; - - case "F#": - return "fs"; - - case "VB": - return "vb"; - - default: - throw new Exception($"Unknown language detected: '{language}'"); - } - } - } -} \ No newline at end of file diff --git a/src/GitVersionTask/TempFileTracker.cs b/src/GitVersionTask/TempFileTracker.cs deleted file mode 100644 index 1335ef4e7f..0000000000 --- a/src/GitVersionTask/TempFileTracker.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.IO; - -public static class TempFileTracker -{ - public static string TempPath; - - static TempFileTracker() - { - TempPath = Path.Combine(Path.GetTempPath(), "GitVersionTask"); - Directory.CreateDirectory(TempPath); - } - - public static void DeleteTempFiles() - { - if (!Directory.Exists(TempPath)) - { - return; - } - - foreach (var file in Directory.GetFiles(TempPath)) - { - if (File.GetLastWriteTime(file) < DateTime.Now.AddDays(-1)) - { - try - { - File.Delete(file); - } - catch (UnauthorizedAccessException) - { - //ignore contention - } - } - } - } - -} \ No newline at end of file diff --git a/src/GitVersionTask/UpdateAssemblyInfo.cs b/src/GitVersionTask/UpdateAssemblyInfo.cs deleted file mode 100644 index e386bbae8f..0000000000 --- a/src/GitVersionTask/UpdateAssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -namespace GitVersionTask -{ - using System.IO; - - using GitVersion; - using GitVersion.Helpers; - using Microsoft.Build.Framework; - - public class UpdateAssemblyInfo : GitVersionTaskBase - { - [Required] - public string ProjectFile { get; set; } - - [Required] - public string IntermediateOutputPath { get; set; } - - [Required] - public ITaskItem[] CompileFiles { get; set; } - - [Required] - public string Language { get; set; } - - [Output] - public string AssemblyInfoTempFilePath { get; set; } - - protected override void InnerExecute() - { - TempFileTracker.DeleteTempFiles(); - - InvalidFileChecker.CheckForInvalidFiles(CompileFiles, ProjectFile); - - if (GetVersionVariables(out var versionVariables)) return; - - CreateTempAssemblyInfo(versionVariables); - } - - private void CreateTempAssemblyInfo(VersionVariables versionVariables) - { - var fileExtension = TaskUtils.GetFileExtension(Language); - var assemblyInfoFileName = $"GitVersionTaskAssemblyInfo.g.{fileExtension}"; - - if (IntermediateOutputPath == null) - { - assemblyInfoFileName = $"AssemblyInfo_{Path.GetFileNameWithoutExtension(ProjectFile)}_{Path.GetRandomFileName()}.g.{fileExtension}"; - } - - var workingDirectory = IntermediateOutputPath ?? TempFileTracker.TempPath; - - AssemblyInfoTempFilePath = Path.Combine(workingDirectory, assemblyInfoFileName); - - using (var assemblyInfoFileUpdater = new AssemblyInfoFileUpdater(assemblyInfoFileName, workingDirectory, versionVariables, new FileSystem(), true)) - { - assemblyInfoFileUpdater.Update(); - assemblyInfoFileUpdater.CommitChanges(); - } - } - } -} diff --git a/src/GitVersionTask/UtilPack.Version.props b/src/GitVersionTask/UtilPack.Version.props deleted file mode 100644 index 109fbf9d1e..0000000000 --- a/src/GitVersionTask/UtilPack.Version.props +++ /dev/null @@ -1,6 +0,0 @@ - - - 2.9.1 - - - diff --git a/src/GitVersionTask/WriteVersionInfoToBuildLog.cs b/src/GitVersionTask/WriteVersionInfoToBuildLog.cs deleted file mode 100644 index 03340b7947..0000000000 --- a/src/GitVersionTask/WriteVersionInfoToBuildLog.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace GitVersionTask -{ - using System.Collections.Generic; - using GitVersion; - - public class WriteVersionInfoToBuildLog : GitVersionTaskBase - { - protected override void InnerExecute() - { - if (GetVersionVariables(out var versionVariables)) return; - - WriteIntegrationParameters(BuildServerList.GetApplicableBuildServers(), versionVariables); - } - - private void WriteIntegrationParameters(IEnumerable applicableBuildServers, VersionVariables versionVariables) - { - foreach (var buildServer in applicableBuildServers) - { - LogInfo($"Executing GenerateSetVersionMessage for '{buildServer.GetType().Name}'."); - LogInfo(buildServer.GenerateSetVersionMessage(versionVariables)); - LogInfo($"Executing GenerateBuildLogOutput for '{buildServer.GetType().Name}'."); - foreach (var buildParameter in BuildOutputFormatter.GenerateBuildLogOutput(buildServer, versionVariables)) - { - LogInfo(buildParameter); - } - } - } - } -}