<Project ToolsVersion="15.0">
  <Target Name="WriteGitCommitInfoProps">
    <Exec Command="git rev-list --count HEAD" 
          ConsoleToMSBuild="true">
      <Output TaskParameter="ConsoleOutput" PropertyName="GitInfoCommitCount" />
    </Exec>

    <Exec Command="git rev-parse HEAD" 
          ConsoleToMSBuild="true">
      <Output TaskParameter="ConsoleOutput" PropertyName="GitInfoCommitHash" />
    </Exec>

    <ItemGroup>
      <GitInfoCommitCountLines Include="$(GitInfoCommitCount)" />
      <GitInfoCommitHashLines Include="$(GitInfoCommitHash)" />
    </ItemGroup>

    <PropertyGroup>
      <!-- Batching in GitInfoCommitCount and GitInfoCommitHash here ensures that the property contains only the last line of the output -->
      <GitInfoCommitCount>%(GitInfoCommitCountLines.Identity)</GitInfoCommitCount>
      <GitInfoCommitCount>$(GitInfoCommitCount.PadLeft(6,'0'))</GitInfoCommitCount>
      
      <GitInfoCommitHash>%(GitInfoCommitHashLines.Identity)</GitInfoCommitHash>

      <GitCommitInfoPropsContent>
&lt;Project ToolsVersion=&quot;15.0&quot;&gt;
    &lt;PropertyGroup&gt;
        &lt;CommitCount&gt;$(GitInfoCommitCount)&lt;/CommitCount&gt;
        &lt;CommitHash&gt;$(GitInfoCommitHash)&lt;/CommitHash&gt;
    &lt;/PropertyGroup&gt;
&lt;/Project&gt;
      </GitCommitInfoPropsContent>

      <ExistingGitCommitInfoProps Condition=" Exists('$(GitCommitInfoProps)') ">
        $([System.IO.File]::ReadAllText($(GitCommitInfoProps)))
      </ExistingGitCommitInfoProps>

      <ShouldOverwriteGitCommitInfoPropsFile>false</ShouldOverwriteGitCommitInfoPropsFile>
      <ShouldOverwriteGitCommitInfoPropsFile
        Condition=" '$(ExistingGitCommitInfoProps.Trim())' != '$(GitCommitInfoPropsContent.Trim())' ">true</ShouldOverwriteGitCommitInfoPropsFile>
    </PropertyGroup>

    <WriteLinesToFile File="$(GitCommitInfoProps)"
                      Lines="$(GitCommitInfoPropsContent)"
                      Condition=" '$(ShouldOverwriteGitCommitInfoPropsFile)' == 'true' "
                      Overwrite="true" />
  </Target>
</Project>