freeswitch/w32/Setup/GitInfo/GitInfo.targets

954 lines
44 KiB
XML

<?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?(?&lt;MAJOR&gt;\d+)\.(?&lt;MINOR&gt;\d+)\.(?&lt;PATCH&gt;\d+)(?:\-(?&lt;LABEL&gt;[\dA-Za-z\-\.]+))?$|^(?&lt;LABEL&gt;[\dA-Za-z\-\.]+)\-v?(?&lt;MAJOR&gt;\d+)\.(?&lt;MINOR&gt;\d+)\.(?&lt;PATCH&gt;\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)')))) &lt; 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), '(?&lt;=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>