--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" InitialTargets="SetGitExe" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <!--
+ ==============================================================
+ Retrieves and exposes Git information
+
+ If the importing project has a C# or VB Language property,
+ by default a ThisAssembly file/class will be generated
+ containing assembly-level metadata for the git information,
+ as well as a ThisAssembly static class with constants for
+ all the available values.
+
+ Customization:
+
+ $(GitThisAssembly): set to 'false' to prevent assembly
+ metadata and constants generation.
+
+ $(GitThisAssemblyMetadata): set to 'false' to prevent assembly
+ metadata generation only. Defaults
+ to 'false'.
+
+ $(ThisAssemblyNamespace): allows overriding the namespace
+ for the ThisAssembly class.
+ Defaults to the global namespace.
+
+ $(GitDefaultBranch): determines the base branch used to
+ calculate commits on top of current branch.
+ Defaults to 'master'.
+
+ $(GitVersionFile): determines the name of a file in the Git
+ repository root used to provide the base
+ version info.
+ Defaults to 'GitInfo.txt'.
+
+ $(GitCommitsRelativeTo): optionally specifies an alternative directory
+ for counting commits on top of the base version.
+ Defaults to the $(GitVersionFile) directory.
+
+ $(GitInfoReportImportance): allows rendering all the retrieved
+ git information with the specified
+ message importance ('high', 'normal' or 'low').
+ Defaults to 'low'.
+
+ $(GitIgnoreBranchVersion) and $(GitIgnoreTagVersion): determines
+ whether the branch and tags (if any)
+ will be used to find a base version.
+ Defaults to empty value (no ignoring).
+
+ $(GitSkipCache): whether to cache the Git information determined
+ in a previous build in a GitInfo.cache for
+ performance reasons.
+ Defaults to empty value (no ignoring).
+
+ ==============================================================
+ -->
+
+ <PropertyGroup>
+ <!-- GitVersionFile allows overriding tags/branch names as a source for base version information -->
+ <GitVersionFile Condition="'$(GitVersionFile)' == ''">GitInfo.txt</GitVersionFile>
+ <!-- Default the lookup directory to the project directory unless overriden -->
+ <GitInfoBaseDir Condition="'$(GitInfoBaseDir)' == ''">$(MSBuildProjectDirectory)</GitInfoBaseDir>
+ <!-- Look it upwards and grab the first one we find. -->
+ <GitVersionFile Condition="'$([MSBuild]::GetDirectoryNameOfFileAbove($(GitInfoBaseDir), $(GitVersionFile)))' != ''">$([MSBuild]::GetDirectoryNameOfFileAbove($(GitInfoBaseDir), $(GitVersionFile)))\$(GitVersionFile)</GitVersionFile>
+
+ <GitDefaultBranch Condition="'$(GitDefaultBranch)' == ''">master</GitDefaultBranch>
+ <GitDefaultCommit Condition="'$(GitDefaultCommit)' == ''">0000000</GitDefaultCommit>
+ <GitDefaultVersion Condition="'$(GitDefaultVersion)' == ''">0.1.0</GitDefaultVersion>
+
+ <GitInfoThisAssemblyFile Condition="'$(GitInfoThisAssemblyFile)' == '' And '$(DefaultLanguageSourceExtension)' != ''">$(IntermediateOutputPath)ThisAssembly.GitInfo.g$(DefaultLanguageSourceExtension)</GitInfoThisAssemblyFile>
+ <GitThisAssembly Condition="'$(Language)' != 'C#' And '$(Language)' != 'VB'">false</GitThisAssembly>
+ <GitThisAssembly Condition="'$(GitThisAssembly)' == '' And '$(GitInfoThisAssemblyFile)' != ''">true</GitThisAssembly>
+ <GitInfoReportImportance Condition="'$(GitInfoReportImportance)' == ''">low</GitInfoReportImportance>
+ <GitThisAssemblyMetadataDefine Condition="'$(GitThisAssemblyMetadata)' == 'true'">ADDMETADATA</GitThisAssemblyMetadataDefine>
+ <GitThisAssemblyMetadataDefine Condition="'$(GitThisAssemblyMetadata)' != 'true'">NOMETADATA</GitThisAssemblyMetadataDefine>
+
+ <!-- Defaults if overrides are specified when building -->
+ <GitCommits Condition="'$(GitCommits)' == ''">0</GitCommits>
+ <GitSemVerSource Condition="'$(GitBaseVersion)' != ''">MSBuild</GitSemVerSource>
+
+ <GitSkipCache Condition="'$(GitSkipCache)' == ''">false</GitSkipCache>
+ <SkipReadGitCache Condition="'$(SkipReadGitCache)' == ''">$(GitSkipCache)</SkipReadGitCache>
+ <SkipWriteGitCache Condition="'$(SkipWriteGitCache)' == ''">$(GitSkipCache)</SkipWriteGitCache>
+
+ <GitMinVersion>2.5.0</GitMinVersion>
+ </PropertyGroup>
+
+ <!-- Private properties -->
+ <PropertyGroup>
+ <CoreCompileDependsOn>
+ GitInfo;
+ GitVersion;
+ GitThisAssembly;
+ GitInfoReport;
+ $(CoreCompileDependsOn)
+ </CoreCompileDependsOn>
+
+ <_GitBaseVersionExpr Condition="'$(_GitBaseVersionExpr)' == ''">^v?(?<MAJOR>\d+)\.(?<MINOR>\d+)\.(?<PATCH>\d+)(?:\-(?<LABEL>[\dA-Za-z\-\.]+))?$|^(?<LABEL>[\dA-Za-z\-\.]+)\-v?(?<MAJOR>\d+)\.(?<MINOR>\d+)\.(?<PATCH>\d+)$</_GitBaseVersionExpr>
+ <!-- Cache file used to avoid running all git commands. Only GitRoot will be retrieved to determine the path of this cache file. -->
+ <_GitInfoFile>$(IntermediateOutputPath)GitInfo.cache</_GitInfoFile>
+ </PropertyGroup>
+
+ <Target Name="GitInfoReport" DependsOnTargets="GitInfo;GitVersion">
+ <Message Importance="$(GitInfoReportImportance)" Text="Git Info:
+ GitInfoBaseDir: $(GitInfoBaseDir)
+ GitRoot: $(GitRoot)
+ GitBranch: $(GitBranch)
+ GitCommit: $(GitCommit)
+ GitSha: $(GitSha)
+ GitBaseVersion: $(GitBaseVersion)
+ GitBaseVersionSource: $(GitBaseVersionSource)
+ GitBaseVersionMajor: $(GitBaseVersionMajor)
+ GitBaseVersionMinor: $(GitBaseVersionMinor)
+ GitBaseVersionPatch: $(GitBaseVersionPatch)
+ GitCommits: $(GitCommits)
+ GitTag: $(GitTag)
+ GitBaseTag: $(GitBaseTag)
+ GitSemVerMajor: $(GitSemVerMajor)
+ GitSemVerMinor: $(GitSemVerMinor)
+ GitSemVerPatch: $(GitSemVerPatch)
+ GitSemVerLabel: $(GitSemVerLabel)
+ GitSemVerDashLabel: $(GitSemVerDashLabel)
+ GitSemVerSource: $(GitSemVerSource)
+"/>
+ </Target>
+
+ <PropertyGroup>
+ <GitInfoDependsOn>
+ SetGitExe;
+ _EnsureGit;
+ _GitRoot;
+ _GitInputs;
+ _GitClearCache;
+ _GitReadCache;
+ _GitBranch;
+ _GitCommit;
+ _GitPopulateInfo;
+ </GitInfoDependsOn>
+ </PropertyGroup>
+ <!-- Under Unix, we don't double %% the format. That only works on Windows. -->
+ <PropertyGroup Condition="'$(OS)' == 'Windows_NT'">
+ <_ShortShaFormat>%%h</_ShortShaFormat>
+ <_LongShaFormat>%%H</_LongShaFormat>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(OS)' != 'Windows_NT'">
+ <_ShortShaFormat>%h</_ShortShaFormat>
+ <_LongShaFormat>%H</_LongShaFormat>
+ </PropertyGroup>
+
+ <Target Name="GitInfo" DependsOnTargets="$(GitInfoDependsOn)" Returns="@(GitInfo)" />
+
+ <Target Name="_EnsureGit">
+ <Exec Command='$(GitExe) --version'
+ EchoOff='true'
+ ContinueOnError='true'
+ ConsoleToMSBuild='true'
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'>
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitOutput"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+ <Error Condition="'$(MSBuildLastExitCode)' != '0'" Text="Failed to run `git --version`. Git may not be properly installed: %0A $(_GitOutput)" />
+
+ <PropertyGroup>
+ <_GitCurrentVersion>$([System.Text.RegularExpressions.Regex]::Match("$(_GitOutput)", "\d+\.\d+\.\d+").Value)</_GitCurrentVersion>
+ </PropertyGroup>
+
+ <Error Condition="$([System.Version]::Parse('$(_GitCurrentVersion)').CompareTo($([System.Version]::Parse('$(GitMinVersion)')))) < 0"
+ Text="Required minimum git version is $(GitMinVersion) but found $(_GitCurrentVersion)." />
+ </Target>
+
+ <Target Name="_GitRoot" Returns="$(GitRoot)" Condition="'$(GitRoot)' == ''">
+
+ <Exec Command='$(GitExe) rev-parse --show-toplevel'
+ EchoOff='true'
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'
+ ConsoleToMSBuild='true'
+ WorkingDirectory='$(GitInfoBaseDir)'
+ ContinueOnError='true'>
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitOutput"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <PropertyGroup Condition="'$(MSBuildLastExitCode)' == '0'">
+ <GitRoot>$(_GitOutput.Trim())</GitRoot>
+ </PropertyGroup>
+
+ <!-- Account for cygwin/WSL separately -->
+ <Exec Command='"$(CygPathExe)" -w "$(_GitOutput)"'
+ EchoOff='true'
+ WorkingDirectory="$(GitInfoBaseDir)"
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'
+ ConsoleToMSBuild='true'
+ Condition="'$(MSBuildLastExitCode)' == '0' And '$(CygPathExe)' != ''">
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitOutput" />
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <PropertyGroup Condition="'$(MSBuildLastExitCode)' == '0'">
+ <GitRoot>$(_GitOutput.Trim())</GitRoot>
+ </PropertyGroup>
+
+ <!-- Determine the .git dir. In the simple case, this is just $(GitRoot)\.git.
+ But in the case of submodules, a .git *file* rather than a directory
+ will be present at that path, with a value like:
+ gitdir: ../../.git/modules/external/toq
+ Which points to the actual folder where the git info exists in the containing
+ repository. -->
+ <PropertyGroup>
+ <GitDir>$([System.IO.Path]::Combine('$(GitRoot)', '.git'))</GitDir>
+ <_IsGitFile>$([System.IO.File]::Exists('$(GitDir)'))</_IsGitFile>
+ </PropertyGroup>
+
+ <Exec Condition="'$(_IsGitFile)' == 'true'"
+ Command='$(GitExe) rev-parse --is-inside-work-tree'
+ EchoOff='true'
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'
+ ConsoleToMSBuild='true'
+ WorkingDirectory='$(GitInfoBaseDir)'
+ ContinueOnError='true'>
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitIsWorkTree"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <PropertyGroup Condition="'$(MSBuildLastExitCode)' == '0'">
+ <_IsGitWorkTree>$(_GitIsWorkTree.Trim())</_IsGitWorkTree>
+ </PropertyGroup>
+
+ <Exec Condition="'$(_IsGitFile)' == 'true' and '$(_IsGitWorkTree)' == 'true'"
+ Command='$(GitExe) rev-parse --git-common-dir'
+ EchoOff='true'
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'
+ ConsoleToMSBuild='true'
+ WorkingDirectory='$(GitInfoBaseDir)'
+ ContinueOnError='true'>
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitCommonDir"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <!-- Account for cygwin/WSL separately -->
+ <Exec Command='"$(CygPathExe)" -w "$(_GitCommonDir)"'
+ EchoOff='true'
+ WorkingDirectory="$(GitInfoBaseDir)"
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'
+ ConsoleToMSBuild='true'
+ Condition="'$(_IsGitFile)' == 'true' and '$(_IsGitWorkTree)' == 'true' And '$(MSBuildLastExitCode)' == '0' And '$(CygPathExe)' != ''">
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitCommonDir" />
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <PropertyGroup Condition="'$(_IsGitFile)' == 'true' and '$(_IsGitWorkTree)' == 'true'">
+ <GitDir>$(_GitCommonDir.Trim())</GitDir>
+ </PropertyGroup>
+
+ <PropertyGroup Condition="'$(_IsGitFile)' == 'true' and '$(_IsGitWorkTree)' != 'true'">
+ <_GitFileContents>$([System.IO.File]::ReadAllText('$(GitDir)'))</_GitFileContents>
+ <GitDir>$([System.String]::new('$(_GitFileContents)').Substring(7).Trim())</GitDir>
+ <GitDir>$([System.IO.Path]::Combine('$(GitRoot)', '$(GitDir)'))</GitDir>
+ <GitDir>$([System.IO.Path]::GetFullPath('$(GitDir)'))</GitDir>
+ </PropertyGroup>
+ <PropertyGroup>
+ <GitDir Condition="!HasTrailingSlash('$(GitDir)')">$(GitDir)$([System.IO.Path]::DirectorySeparatorChar)</GitDir>
+ </PropertyGroup>
+
+ <Message Text="Determined Git repository root as '$(GitRoot)'" Importance="$(GitInfoReportImportance)" Condition="'$(GitRoot)' != ''" />
+ <Message Text="Determined Git dir as '$(GitDir)'" Importance="$(GitInfoReportImportance)" Condition="'$(GitRoot)' != ''" />
+ <Warning Text="Directory $(GitInfoBaseDir) is not in a Git repository. Cannot determine Git repository root." Condition="'$(GitRoot)' == ''" />
+
+ <Exec Command='$(GitExe) diff-index --quiet HEAD'
+ Condition="'$(GitRoot)' != ''"
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ WorkingDirectory="$(GitRoot)"
+ IgnoreExitCode="true">
+ <Output TaskParameter="ExitCode" PropertyName="GitIsDirty" />
+ </Exec>
+ </Target>
+
+ <Target Name="_GitInputs" DependsOnTargets="_GitRoot" Returns="@(_GitInput)">
+ <ItemGroup>
+ <_GitInput Include="$(GitDir)HEAD" />
+ <_GitInput Include="$(GitVersionFile)" Condition="Exists('$(GitVersionFile)')" />
+ </ItemGroup>
+ <CreateItem Include="$([System.IO.Path]::Combine('$(GitDir)', 'packed-refs'))">
+ <Output ItemName="_GitInput" TaskParameter="Include" />
+ </CreateItem>
+ <CreateItem Include="$([System.IO.Path]::Combine('$(GitDir)', 'refs', 'heads', '**', '*.*'))">
+ <Output ItemName="_GitInput" TaskParameter="Include" />
+ </CreateItem>
+ <CreateItem Include="$([System.IO.Path]::Combine('$(GitDir)', 'refs', 'tags', '*.*'))">
+ <Output ItemName="_GitInput" TaskParameter="Include" />
+ </CreateItem>
+
+ <Delete Files="$(_GitInfoFile)" Condition="Exists('$(_GitInfoFile)') And '$(SkipReadGitCache)' == 'true'" />
+ </Target>
+
+ <!-- If the inputs/outputs are outdated, clear the cache -->
+ <Target Name="_GitClearCache" Inputs="@(_GitInput)" Outputs="$(_GitInfoFile)" Condition="Exists('$(_GitInfoFile)')">
+ <Delete Files="$(_GitInfoFile)" />
+ </Target>
+
+ <Target Name="_GitReadCache" Condition="Exists('$(_GitInfoFile)') And '$(SkipReadGitCache)' != 'true' ">
+ <PropertyGroup>
+ <_GitCachedInfo>$([System.IO.File]::ReadAllText('$(_GitInfoFile)'))</_GitCachedInfo>
+ </PropertyGroup>
+
+ <CreateItem Include="GitInfo" AdditionalMetadata="$(_GitCachedInfo.Split(';'))">
+ <Output TaskParameter="Include" ItemName="GitInfo" />
+ </CreateItem>
+
+ <PropertyGroup>
+ <GitBranch Condition="'$(GitBranch)' == ''">%(GitInfo.GitBranch)</GitBranch>
+ <GitCommit Condition="'$(GitCommit)' == ''">%(GitInfo.GitCommit)</GitCommit>
+ <GitSha Condition="'$(GitSha)' == ''">%(GitInfo.GitSha)</GitSha>
+ <GitBaseVersion Condition="'$(GitBaseVersion)' == ''">%(GitInfo.GitBaseVersion)</GitBaseVersion>
+ <GitBaseVersionSource Condition="'$(GitBaseVersionSource)' == ''">%(GitInfo.GitBaseVersionSource)</GitBaseVersionSource>
+ <GitBaseVersionMajor Condition="'$(GitBaseVersionMajor)' == ''">%(GitInfo.GitBaseVersionMajor)</GitBaseVersionMajor>
+ <GitBaseVersionMinor Condition="'$(GitBaseVersionMinor)' == ''">%(GitInfo.GitBaseVersionMinor)</GitBaseVersionMinor>
+ <GitBaseVersionPatch Condition="'$(GitBaseVersionPatch)' == ''">%(GitInfo.GitBaseVersionPatch)</GitBaseVersionPatch>
+ <GitCommits Condition="'$(GitCommits)' == '' Or '$(GitCommits)' == '0'">%(GitInfo.GitCommits)</GitCommits>
+ <GitTag Condition="'$(GitTag)' == ''">%(GitInfo.GitTag)</GitTag>
+ <GitBaseTag Condition="'$(GitBaseTag)' == ''">%(GitInfo.GitBaseTag)</GitBaseTag>
+ <GitSemVerMajor Condition="'$(GitSemVerMajor)' == ''">%(GitInfo.GitSemVerMajor)</GitSemVerMajor>
+ <GitSemVerMinor Condition="'$(GitSemVerMinor)' == ''">%(GitInfo.GitSemVerMinor)</GitSemVerMinor>
+ <GitSemVerPatch Condition="'$(GitSemVerPatch)' == ''">%(GitInfo.GitSemVerPatch)</GitSemVerPatch>
+ <GitSemVerLabel Condition="'$(GitSemVerLabel)' == ''">%(GitInfo.GitSemVerLabel)</GitSemVerLabel>
+ <GitSemVerDashLabel Condition="'$(GitSemVerDashLabel)' == ''">%(GitInfo.GitSemVerDashLabel)</GitSemVerDashLabel>
+ <GitSemVerSource Condition="'$(GitSemVerSource)' == ''">%(GitInfo.GitSemVerSource)</GitSemVerSource>
+ </PropertyGroup>
+ </Target>
+
+ <Target Name="_GitBranch" Returns="$(GitBranch)"
+ DependsOnTargets="_GitInputs"
+ Condition="'$(GitBranch)' == ''"
+ Inputs="@(_GitInput)"
+ Outputs="$(_GitInfoFile)">
+
+ <PropertyGroup Condition="'$(GitRoot)' != ''">
+ <_GitHead>$([System.IO.Path]::Combine($(GitDir), 'HEAD'))</_GitHead>
+ <_GitHead>$([System.IO.Path]::GetFullPath($(_GitHead)))</_GitHead>
+ <_GitHead>$([System.IO.File]::ReadAllText('$(_GitHead)'))</_GitHead>
+ <GitBranch>$([System.Text.RegularExpressions.Regex]::Match($(_GitHead), '(?<=refs/heads/).+$'))</GitBranch>
+ <GitBranch>$(GitBranch.Trim())</GitBranch>
+ </PropertyGroup>
+
+ <!-- CI systems may checkout the specific commit, rather than the branch, so we need to fallback -->
+ <Exec Command='$(GitExe) name-rev --name-only HEAD'
+ Condition=" '$(GitBranch)' == '' "
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="GitBranch"/>
+ </Exec>
+
+ <PropertyGroup Condition="'$(GitRoot)' == ''">
+ <GitBranch>$(GitDefaultBranch)</GitBranch>
+ </PropertyGroup>
+
+ </Target>
+
+ <Target Name="_GitCommit" Returns="$(GitCommit)"
+ DependsOnTargets="_GitRoot"
+ Inputs="@(_GitInput)"
+ Outputs="$(_GitInfoFile)"
+ Condition="'$(GitRoot)' != '' And '$(GitCommit)' == ''">
+
+ <Exec Command='$(GitExe) log --format=format:$(_ShortShaFormat) -n 1'
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="GitCommit"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <PropertyGroup Condition="'$(MSBuildLastExitCode)' != '0'">
+ <GitCommit>$(GitDefaultCommit)</GitCommit>
+ </PropertyGroup>
+
+ <Exec Command='$(GitExe) log --format=format:$(_LongShaFormat) -n 1'
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="GitSha"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <PropertyGroup Condition="'$(MSBuildLastExitCode)' != '0'">
+ <GitSha>$(GitDefaultCommit)</GitSha>
+ </PropertyGroup>
+
+ </Target>
+
+ <Target Name="_GitPopulateInfo">
+ <ItemGroup>
+ <GitInfo Include="GitInfo">
+ <GitRoot>$(GitRoot)</GitRoot>
+ <GitBranch>$(GitBranch)</GitBranch>
+ <GitCommit>$(GitCommit)</GitCommit>
+ <GitSha>$(GitSha)</GitSha>
+ </GitInfo>
+ </ItemGroup>
+ </Target>
+
+ <PropertyGroup>
+ <GitVersionDependsOn>
+ GitInfo;
+ _GitBaseVersionBranch;
+ _GitBaseVersionTagExists;
+ _GitBaseVersionTag;
+ _GitBaseVersionFile;
+ _GitBaseVersionFallback;
+ _GitValidateBaseVersion;
+ _GitPopulateVersionInfo;
+ _GitWriteCache
+ </GitVersionDependsOn>
+ </PropertyGroup>
+
+ <Target Name="GitVersion" DependsOnTargets="$(GitVersionDependsOn)" Returns="@(GitInfo)" />
+
+ <Target Name="_GitBaseVersionFile" Returns="$(GitBaseVersion)"
+ Inputs="@(_GitInput)"
+ Outputs="$(_GitInfoFile)"
+ Condition="'$(GitBaseVersion)' == '' And Exists('$(GitVersionFile)')">
+
+ <PropertyGroup>
+ <GitBaseVersion>$([System.IO.File]::ReadAllText('$(GitVersionFile)'))</GitBaseVersion>
+ <GitBaseVersion>$(GitBaseVersion.Trim())</GitBaseVersion>
+ <IsValidGitBaseVersion>
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(GitBaseVersion), $(_GitBaseVersionExpr)))
+ </IsValidGitBaseVersion>
+ <IsValidGitBaseVersion>$(IsValidGitBaseVersion.Trim())</IsValidGitBaseVersion>
+ </PropertyGroup>
+
+ <Error Text="$(GitVersionFile) does not contain a valid base version (found '$(GitBaseVersion)', regex: $(_GitBaseVersionExpr))."
+ Condition="'$(IsValidGitBaseVersion)' == 'False'" />
+
+ <PropertyGroup>
+ <_GitVersionFile>$(GitVersionFile)</_GitVersionFile>
+ <GitBaseVersionSource>$(GitVersionFile)</GitBaseVersionSource>
+ <GitSemVerSource>File</GitSemVerSource>
+ </PropertyGroup>
+
+ <Message Text="Using base version from version file $(GitVersionFile)'" Importance="normal" />
+
+ <!-- Account for cygwin/WSL separately -->
+ <Exec Command='"$(CygPathExe)" -u "$(_GitVersionFile)"'
+ EchoOff='true'
+ WorkingDirectory="$(GitRoot)"
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'
+ ConsoleToMSBuild='true'
+ Condition="'$(MSBuildLastExitCode)' == '0' And '$(CygPathExe)' != ''">
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitVersionFile" />
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <Exec Command='$(GitExe) log -n 1 --format=format:$(_ShortShaFormat) "$(_GitVersionFile)"'
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitLastBump"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <Warning Text="Could not retrieve last commit for $(GitVersionFile). Defaulting to its declared version '$(GitBaseVersion)' and no additional commits."
+ Condition="'$(MSBuildLastExitCode)' != '0' Or '$(_GitLastBump)' == ''" />
+
+ <PropertyGroup>
+ <GitCommits Condition="'$(MSBuildLastExitCode)' != '0' Or '$(_GitLastBump)' == ''">0</GitCommits>
+ <_GitLastBump>$(_GitLastBump.Trim())</_GitLastBump>
+ <_GitCommitsRelativeTo>$(GitCommitsRelativeTo)</_GitCommitsRelativeTo>
+ <!-- If the GitVersionFile is at the GitRoot dir, there won't be a directory to specify to base the rev-list count, so no need to quote anything -->
+ <_GitCommitsRelativeTo Condition="'$(_GitCommitsRelativeTo)' == '' And '$([System.IO.Path]::GetDirectoryName($(GitVersionFile)))' != ''">"$([System.IO.Path]::GetDirectoryName("$(GitVersionFile)"))"</_GitCommitsRelativeTo>
+ <!-- If the GitVersionFile is at the GitRoot dir, we use the current directory '.' for the count. This allows us to exclude submodule commits -->
+ <_GitCommitsRelativeTo Condition="'$(_GitCommitsRelativeTo)' == ''">.</_GitCommitsRelativeTo>
+ </PropertyGroup>
+
+ <!-- Account for cygwin/WSL separately -->
+ <Exec Command='"$(CygPathExe)" -u $(_GitCommitsRelativeTo)'
+ EchoOff='true'
+ WorkingDirectory="$(GitRoot)"
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'
+ ConsoleToMSBuild='true'
+ Condition="'$(MSBuildLastExitCode)' == '0' And '$(CygPathExe)' != '' And '$(_GitCommitsRelativeTo)' != ''">
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitCommitsRelativeTo" />
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <Exec Command='$(GitExe) rev-list --count --full-history "$(_GitLastBump)"..HEAD $(_GitCommitsRelativeTo)'
+ Condition="$(MSBuildLastExitCode) == '0' And '$(_GitLastBump)' != ''"
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="GitCommits"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ </Target>
+
+ <Target Name="_GitBaseVersionBranch" Returns="$(GitBaseVersion)"
+ Inputs="@(_GitInput)"
+ Outputs="$(_GitInfoFile)"
+ DependsOnTargets="_GitBranch"
+ Condition="'$(GitBaseVersion)' == '' And '$(GitIgnoreBranchVersion)' != 'true' ">
+
+ <PropertyGroup>
+ <IsValidGitBaseVersion>
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(GitBranch), $(_GitBaseVersionExpr)))
+ </IsValidGitBaseVersion>
+ <IsValidGitBaseVersion>$(IsValidGitBaseVersion.Trim())</IsValidGitBaseVersion>
+ </PropertyGroup>
+
+ <Message Text="Git branch '$(GitBranch)' cannot be used as a version specifier. Skipping branch-based version processing."
+ Importance="low" Condition="'$(IsValidGitBaseVersion)' == 'false'" />
+
+ <PropertyGroup Condition="'$(IsValidGitBaseVersion)' == 'true'">
+ <GitBaseVersion>$(GitBranch)</GitBaseVersion>
+ <GitBaseVersionSource>GitBranch</GitBaseVersionSource>
+ <GitSemVerSource>Branch</GitSemVerSource>
+ </PropertyGroup>
+
+ <!-- Get the initial commit when the current branch departed from the default branch -->
+ <Exec Command='$(GitExe) merge-base --fork-point "$(GitDefaultBranch)"'
+ Condition="'$(IsValidGitBaseVersion)' == 'true'"
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitForkPoint"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <Warning Text="Could not retrieve first commit where branch $(GitBranch) forked from $(GitDefaultBranch). Defaulting to zero commits."
+ Condition="'$(IsValidGitBaseVersion)' == 'true' And '$(MSBuildLastExitCode)' != '0'" />
+
+ <PropertyGroup Condition="'$(IsValidGitBaseVersion)' == 'true' And '$(MSBuildLastExitCode)' != '0'">
+ <GitCommits>0</GitCommits>
+ </PropertyGroup>
+
+ <!-- Get the commit count from the fork point to the current branch head -->
+ <Exec Command='$(GitExe) rev-list --count "$(_GitForkPoint)"..HEAD'
+ Condition="'$(IsValidGitBaseVersion)' == 'true' and '$(MSBuildLastExitCode)' == '0'"
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="GitCommits"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ </Target>
+
+ <Target Name="_GitBaseVersionTagExists" Returns="$(GitBaseTag)"
+ Inputs="@(_GitInput)"
+ Outputs="$(_GitInfoFile)"
+ DependsOnTargets="_GitBranch;_GitCommit"
+ Condition="'$(GitBaseVersion)' == '' And '$(GitIgnoreTagVersion)' != 'true' ">
+
+ <Exec Command='$(GitExe) describe --tags --abbrev=0'
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true"
+ IgnoreExitCode="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="GitBaseTag"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <PropertyGroup Condition="'$(MSBuildLastExitCode)' != '0'">
+ <GitCommits>0</GitCommits>
+ <GitBaseTag></GitBaseTag>
+ </PropertyGroup>
+
+ <Message Text="No git tags exist. Skipping tag processing."
+ Importance="low" Condition="'$(GitBaseTag)' == ''" />
+
+ </Target>
+
+ <Target Name="_GitBaseVersionTag" Returns="$(GitBaseVersion)"
+ Inputs="@(_GitInput)"
+ Outputs="$(_GitInfoFile)"
+ DependsOnTargets="_GitBaseVersionTagExists"
+ Condition="'$(GitBaseVersion)' == '' And '$(GitIgnoreTagVersion)' != 'true' And '$(GitBaseTag)' != ''">
+
+ <!-- At this point, we now there is a base tag already we can leverage -->
+ <Exec Command='$(GitExe) describe --tags'
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="GitTag"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <PropertyGroup>
+ <IsValidGitBaseVersion>
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(GitBaseTag), $(_GitBaseVersionExpr)))
+ </IsValidGitBaseVersion>
+ <IsValidGitBaseVersion>$(IsValidGitBaseVersion.Trim())</IsValidGitBaseVersion>
+
+ <GitBaseVersion Condition="'$(IsValidGitBaseVersion)' == 'true'">$(GitBaseTag)</GitBaseVersion>
+ </PropertyGroup>
+
+ <Message Text="Current tag '$(GitBaseTag)' cannot be used as a version specifier. Skipping tag-based version processing."
+ Importance="low" Condition="'$(IsValidGitBaseVersion)' == 'false'" />
+
+ <PropertyGroup Condition="'$(IsValidGitBaseVersion)' == 'true'" >
+ <GitBaseVersionSource>GitBaseTag</GitBaseVersionSource>
+ <GitSemVerSource>Tag</GitSemVerSource>
+ <GitCommits>0</GitCommits>
+ </PropertyGroup>
+
+ <Exec Command='$(GitExe) rev-list "$(GitBaseTag)" -n 1'
+ Condition="'$(IsValidGitBaseVersion)' == 'true'"
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="_GitBaseTagCommit"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <Exec Command='$(GitExe) rev-list --count "$(_GitBaseTagCommit)".."$(GitCommit)"'
+ Condition="'$(IsValidGitBaseVersion)' == 'true' And '$(_GitBaseTagCommit)' != '' And '$(GitCommit)' != '' And '$(GitCommit)' != '$(GitDefaultCommit)'"
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="GitCommits"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <Warning Text="Failed to retrieve commit count from tag '$(GitBaseTag)' to tip $(GitCommit). Defaulting to zero commits."
+ Condition="'$(IsValidGitBaseVersion)' == 'true' And '$(MSBuildLastExitCode)' != '0'" />
+
+ <PropertyGroup>
+ <GitCommits Condition="'$(MSBuildLastExitCode)' != '0'">0</GitCommits>
+ </PropertyGroup>
+
+ </Target>
+
+ <Target Name="_GitBaseVersionFallback" Returns="$(GitBaseVersion)"
+ Inputs="@(_GitInput)"
+ Outputs="$(_GitInfoFile)"
+ Condition="'$(GitBaseVersion)' == '' And '$(GitDefaultVersion)' != ''">
+
+ <PropertyGroup>
+ <IsValidGitDefaultVersion>
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(GitDefaultVersion), $(_GitBaseVersionExpr)))
+ </IsValidGitDefaultVersion>
+ <IsValidGitDefaultVersion>$(IsValidGitDefaultVersion.Trim())</IsValidGitDefaultVersion>
+ <GitCommits>0</GitCommits>
+ </PropertyGroup>
+
+ <!-- If $(GitBaseVersion) == '' And $(IsValidGitBaseVersion) == '' -->
+ <Error Text="Fallback version %24(GitDefaultVersion) value of '$(GitDefaultVersion)' is not a valid SemVer 2.0 string."
+ Condition="'$(IsValidGitDefaultVersion)' == 'false'" />
+
+ <Exec Command='$(GitExe) rev-list --count $(GitCommit)'
+ Condition="'$(IsValidGitDefaultVersion)' == 'true' And '$(GitCommit)' != '' And '$(GitCommit)' != '$(GitDefaultCommit)'"
+ EchoOff='true'
+ StandardErrorImportance="low"
+ StandardOutputImportance="low"
+ ConsoleToMSBuild="true"
+ WorkingDirectory="$(GitRoot)"
+ ContinueOnError="true">
+ <Output TaskParameter="ConsoleOutput" PropertyName="GitCommits"/>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+
+ <PropertyGroup>
+ <GitBaseVersion>$(GitDefaultVersion)</GitBaseVersion>
+ <GitSemVerSource>Default</GitSemVerSource>
+ </PropertyGroup>
+
+ </Target>
+
+ <Target Name="_GitValidateBaseVersion"
+ Inputs="@(_GitInput)"
+ Outputs="$(_GitInfoFile)">
+
+ <!-- If $(GitBaseVersion) == '', it means we couldn't determine a base version by any probing mechanism -->
+ <Error Text="Failed to find a valid base version to use. Please make sure you have a %24(GitVersionFile) file (defaults to '$(GitVersionFile)'), branch, tag or %24(GitDefaultVersion) property with a valid SemVer 2.0 string."
+ Condition="'$(GitBaseVersion)' == ''" />
+
+ <PropertyGroup>
+ <IsValidGitBaseVersion>
+ $([System.Text.RegularExpressions.Regex]::IsMatch($(GitBaseVersion), $(_GitBaseVersionExpr)))
+ </IsValidGitBaseVersion>
+ <IsValidGitBaseVersion>$(IsValidGitBaseVersion.Trim())</IsValidGitBaseVersion>
+ </PropertyGroup>
+
+ <Error Text="Current %24(GitBaseVersion) value of '$(GitBaseVersion)' is not a valid SemVer 2.0 string."
+ Condition="'$(IsValidGitBaseVersion)' == 'false'" />
+
+ </Target>
+
+ <Target Name="_GitPopulateVersionInfo">
+
+ <PropertyGroup>
+ <!-- Remove the initial optional 'v' or 'V' from the base version. -->
+ <GitBaseVersion Condition="$(GitBaseVersion.StartsWith('v'))">$(GitBaseVersion.TrimStart('v'))</GitBaseVersion>
+ <GitBaseVersion Condition="$(GitBaseVersion.StartsWith('V'))">$(GitBaseVersion.TrimStart('V'))</GitBaseVersion>
+ <GitBaseVersionMajor>$([System.Text.RegularExpressions.Regex]::Match($(GitBaseVersion), $(_GitBaseVersionExpr)).Groups['MAJOR'].Value)</GitBaseVersionMajor>
+ <GitBaseVersionMinor>$([System.Text.RegularExpressions.Regex]::Match($(GitBaseVersion), $(_GitBaseVersionExpr)).Groups['MINOR'].Value)</GitBaseVersionMinor>
+ <GitBaseVersionPatch>$([System.Text.RegularExpressions.Regex]::Match($(GitBaseVersion), $(_GitBaseVersionExpr)).Groups['PATCH'].Value)</GitBaseVersionPatch>
+ <GitSemVerMajor>$(GitBaseVersionMajor)</GitSemVerMajor>
+ <GitSemVerMinor>$(GitBaseVersionMinor)</GitSemVerMinor>
+ <GitSemVerPatch>$([MSBuild]::Add('$(GitBaseVersionPatch)', '$(GitCommits)'))</GitSemVerPatch>
+ <GitSemVerLabel>$([System.Text.RegularExpressions.Regex]::Match($(GitBaseVersion), $(_GitBaseVersionExpr)).Groups['LABEL'].Value)</GitSemVerLabel>
+ <GitSemVerDashLabel Condition="'$(GitSemVerLabel)' != ''" >-$(GitSemVerLabel)</GitSemVerDashLabel>
+ </PropertyGroup>
+
+
+ <ItemGroup>
+ <_GitInfo Include="@(GitInfo -> Distinct())">
+ <GitBaseVersion>$(GitBaseVersion)</GitBaseVersion>
+ <GitBaseVersionSource>$(GitBaseVersionSource)</GitBaseVersionSource>
+ <GitBaseVersionMajor>$(GitBaseVersionMajor)</GitBaseVersionMajor>
+ <GitBaseVersionMinor>$(GitBaseVersionMinor)</GitBaseVersionMinor>
+ <GitBaseVersionPatch>$(GitBaseVersionPatch)</GitBaseVersionPatch>
+ <GitCommits>$(GitCommits)</GitCommits>
+ <GitTag>$(GitTag)</GitTag>
+ <GitBaseTag>$(GitBaseTag)</GitBaseTag>
+ <GitSemVerMajor>$(GitSemVerMajor)</GitSemVerMajor>
+ <GitSemVerMinor>$(GitSemVerMinor)</GitSemVerMinor>
+ <GitSemVerPatch>$(GitSemVerPatch)</GitSemVerPatch>
+ <GitSemVerLabel>$(GitSemVerLabel)</GitSemVerLabel>
+ <GitSemVerDashLabel>$(GitSemVerDashLabel)</GitSemVerDashLabel>
+ <GitSemVerSource>$(GitSemVerSource)</GitSemVerSource>
+ </_GitInfo>
+ <GitInfo Remove="@(GitInfo)" />
+ <GitInfo Include="@(_GitInfo)" />
+ </ItemGroup>
+
+ </Target>
+
+ <Target Name="_GitWriteCache" Inputs="@(_GitInput)" Outputs="$(_GitInfoFile)" Condition="'$(SkipWriteGitCache)' != 'true'">
+
+ <PropertyGroup>
+ <_GitInfoContent>$([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)GitInfo.cache.pp'))</_GitInfoContent>
+
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitBranch$', '$(GitBranch)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitCommits$', '$(GitCommits)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitCommit$', '$(GitCommit)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitSha$', '$(GitSha)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitBaseVersion$', '$(GitBaseVersion)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitBaseVersionSource$', '$(GitBaseVersionSource)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitBaseVersionMajor$', '$(GitBaseVersionMajor)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitBaseVersionMinor$', '$(GitBaseVersionMinor)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitBaseVersionPatch$', '$(GitBaseVersionPatch)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitTag$', '$(GitTag)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitBaseTag$', '$(GitBaseTag)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitSemVerMajor$', '$(GitSemVerMajor)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitSemVerMinor$', '$(GitSemVerMinor)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitSemVerPatch$', '$(GitSemVerPatch)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitSemVerLabel$', '$(GitSemVerLabel)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitSemVerDashLabel$', '$(GitSemVerDashLabel)'))</_GitInfoContent>
+ <_GitInfoContent>$(_GitInfoContent.Replace('$GitSemVerSource$', '$(GitSemVerSource)'))</_GitInfoContent>
+ </PropertyGroup>
+
+ <PropertyGroup>
+ <_GitInfoFileDir>$([System.IO.Path]::GetDirectoryName('$(_GitInfoFile)'))</_GitInfoFileDir>
+ </PropertyGroup>
+
+ <MakeDir Directories="$(_GitInfoFileDir)" Condition="!Exists('$(_GitInfoFileDir)')" />
+
+ <WriteLinesToFile File="$(_GitInfoFile)" Lines="$(_GitInfoContent)" Overwrite="true" />
+
+ <ItemGroup>
+ <FileWrites Include="$(_GitInfoFile)" />
+ </ItemGroup>
+
+ </Target>
+
+ <PropertyGroup>
+ <GitThisAssemblyDependsOn>
+ GitInfo;
+ GitVersion;
+ _GitInputs;
+ _GitGenerateThisAssembly
+ </GitThisAssemblyDependsOn>
+ </PropertyGroup>
+
+ <Target Name="GitThisAssembly" DependsOnTargets="$(GitThisAssemblyDependsOn)"
+ BeforeTargets="BuildOnlySettings" Condition="'$(GitThisAssembly)' == 'true'">
+
+ <ItemGroup>
+ <Compile Remove="$(GitInfoThisAssemblyFile)" />
+ <Compile Include="$(GitInfoThisAssemblyFile)" />
+ <!-- For the double compilation happening with XAML projects. -->
+ <_GeneratedCodeFiles Include="$(GitInfoThisAssemblyFile)" />
+ </ItemGroup>
+
+ </Target>
+
+ <Target Name="_GitGenerateThisAssembly" Condition="'$(GitThisAssembly)' == 'true'"
+ Inputs="@(_GitInput)" Outputs="$(GitInfoThisAssemblyFile)">
+
+ <PropertyGroup>
+ <_ThisAssemblyContent>$([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)GitInfo$(DefaultLanguageSourceExtension).pp'))</_ThisAssemblyContent>
+
+ <!-- The $NamespaceDefine$ replacement is turned into the GLOBALNAMESPACE define if the ThisAssemblyNamespace isn't empty. -->
+ <_ThisAssemblyContent Condition="'$(ThisAssemblyNamespace)' != ''">$(_ThisAssemblyContent.Replace('$NamespaceDefine$', 'LOCALNAMESPACE'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent Condition="'$(ThisAssemblyNamespace)' == ''">$(_ThisAssemblyContent.Replace('$NamespaceDefine$', 'GLOBALNAMESPACE'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$MetadataDefine$', '$(GitThisAssemblyMetadataDefine)'))</_ThisAssemblyContent>
+
+ <_ThisAssemblyContent Condition="'$(ThisAssemblyNamespace)' != ''">$(_ThisAssemblyContent.Replace('RootNamespace.', '$(ThisAssemblyNamespace).'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent Condition="'$(ThisAssemblyNamespace)' == ''">$(_ThisAssemblyContent.Replace('RootNamespace.', ''))</_ThisAssemblyContent>
+
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('_RootNamespace_', '$(ThisAssemblyNamespace)'))</_ThisAssemblyContent>
+
+ <!-- no git repository -->
+ <_ThisAssemblyContent Condition="'$(Language)' == 'C#' And '$(GitRoot)' == ''">$(_ThisAssemblyContent.Replace('$GitIsDirty$', 'false'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent Condition="'$(Language)' == 'C#' And '$(GitIsDirty)' == '1'">$(_ThisAssemblyContent.Replace('$GitIsDirty$', 'true'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent Condition="'$(Language)' == 'C#' And '$(GitIsDirty)' == '0'">$(_ThisAssemblyContent.Replace('$GitIsDirty$', 'false'))</_ThisAssemblyContent>
+ <!-- no git repository -->
+ <_ThisAssemblyContent Condition="'$(Language)' == 'VB' And '$(GitRoot)' == ''">$(_ThisAssemblyContent.Replace('$GitIsDirty$', 'False'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent Condition="'$(Language)' == 'VB' And '$(GitIsDirty)' == '1'">$(_ThisAssemblyContent.Replace('$GitIsDirty$', 'True'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent Condition="'$(Language)' == 'VB' And '$(GitIsDirty)' == '0'">$(_ThisAssemblyContent.Replace('$GitIsDirty$', 'False'))</_ThisAssemblyContent>
+
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitBranch$', '$(GitBranch)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitCommits$', '$(GitCommits)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitCommit$', '$(GitCommit)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitSha$', '$(GitSha)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitBaseVersion$', '$(GitBaseVersion)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitBaseVersionSource$', '$(GitBaseVersionSource)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitBaseVersionMajor$', '$(GitBaseVersionMajor)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitBaseVersionMinor$', '$(GitBaseVersionMinor)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitBaseVersionPatch$', '$(GitBaseVersionPatch)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitTag$', '$(GitTag)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitBaseTag$', '$(GitBaseTag)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitSemVerMajor$', '$(GitSemVerMajor)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitSemVerMinor$', '$(GitSemVerMinor)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitSemVerPatch$', '$(GitSemVerPatch)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitSemVerLabel$', '$(GitSemVerLabel)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitSemVerDashLabel$', '$(GitSemVerDashLabel)'))</_ThisAssemblyContent>
+ <_ThisAssemblyContent>$(_ThisAssemblyContent.Replace('$GitSemVerSource$', '$(GitSemVerSource)'))</_ThisAssemblyContent>
+ </PropertyGroup>
+
+ <PropertyGroup>
+ <GitInfoThisAssemblyDir>$([System.IO.Path]::GetDirectoryName('$(GitInfoThisAssemblyFile)'))</GitInfoThisAssemblyDir>
+ </PropertyGroup>
+
+ <MakeDir Directories="$(GitInfoThisAssemblyDir)" Condition="!Exists('$(GitInfoThisAssemblyDir)')" />
+
+ <WriteLinesToFile File='$(GitInfoThisAssemblyFile)' Lines='$(_ThisAssemblyContent)' Overwrite='true' />
+ </Target>
+
+ <!--
+ ============================================================
+ GitExe Property
+
+ Cascading probing mechanism will try to locate an installed
+ version of git, msysgit, WSL git or cygwin git.
+ ============================================================
+ -->
+ <PropertyGroup Condition="'$(GitExe)' == '' And '$(OS)' != 'Windows_NT'">
+ <GitExe>git</GitExe>
+ </PropertyGroup>
+
+ <Target Name="SetGitExe" Condition="'$(GitExe)' == '' And '$(OS)' == 'Windows_NT'">
+ <!-- If git from %PATH% works, just use that -->
+ <Exec Command='git --version'
+ EchoOff='true'
+ ContinueOnError='true'
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+ <PropertyGroup Condition="'$(MSBuildLastExitCode)' == '0'">
+ <GitExe>git</GitExe>
+ </PropertyGroup>
+
+ <PropertyGroup Condition="'$(GitExe)' == ''">
+ <!-- We probe multiple places, with the first matching one winning -->
+ <GitExe Condition="'$(GitExe)' == '' And Exists('C:\Program Files\Git\bin\git.exe')">"C:\Program Files\Git\bin\git.exe"</GitExe>
+ <GitExe Condition="'$(GitExe)' == '' And Exists('C:\Program Files (x86)\Git\bin\git.exe')">"C:\Program Files (x86)\Git\bin\git.exe"</GitExe>
+ <GitExe Condition="'$(GitExe)' == '' And Exists('C:\msysgit\bin\git.exe')">C:\msysgit\bin\git.exe</GitExe>
+ </PropertyGroup>
+
+ <!-- If we didn't find it in the PATH nor the above locations, check for git installed in WSL -->
+ <Exec Condition="'$(GitExe)' == ''"
+ Command="$(MSBuildThisFileDirectory)wslrun.cmd git --version"
+ EchoOff='true'
+ ContinueOnError='true'
+ StandardErrorImportance='high'
+ StandardOutputImportance='low'>
+ <Output TaskParameter="ExitCode" PropertyName="MSBuildLastExitCode" />
+ </Exec>
+ <PropertyGroup Condition="'$(GitExe)' == '' And '$(MSBuildLastExitCode)' == '0'">
+ <GitExe>$(MSBuildThisFileDirectory)wslrun.cmd git</GitExe>
+ <CygPathExe>$(MSBuildThisFileDirectory)wslpath.cmd</CygPathExe>
+ </PropertyGroup>
+
+ <PropertyGroup Condition="'$(GitExe)' == ''">
+ <!-- Only consider cygwin as a last resort, as it tends to be slower -->
+ <GitExe Condition="'$(GitExe)' == '' And Exists('C:\cygwin\bin\git.exe')">C:\cygwin\bin\git.exe</GitExe>
+ <GitExe Condition="'$(GitExe)' == '' And Exists('C:\cygwin64\bin\git.exe')">C:\cygwin64\bin\git.exe</GitExe>
+ </PropertyGroup>
+
+ <!--
+ ============================================================
+ CygPathExe Property
+
+ If we are using cygwin git, we need to pipe the path to
+ cygpath to convert it into a Windows path. If the path is
+ already a Windows path, it will be returned unchanged.
+ ============================================================
+ -->
+ <PropertyGroup>
+ <CygPathExe Condition="'$(CygPathExe)' == '' And Exists('C:\cygwin\bin\cygpath.exe') And $(GitExe.Contains('cygwin'))">C:\cygwin\bin\cygpath.exe</CygPathExe>
+ <CygPathExe Condition="'$(CygPathExe)' == '' And Exists('C:\cygwin64\bin\cygpath.exe') And $(GitExe.Contains('cygwin64'))">C:\cygwin64\bin\cygpath.exe</CygPathExe>
+ </PropertyGroup>
+ </Target>
+
+ <PropertyGroup>
+ <GitInfoImported>true</GitInfoImported>
+ </PropertyGroup>
+</Project>