From d7785d618702319eb83646b7ef24dfce0eab5f15 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 14 Nov 2017 15:26:51 -0800 Subject: [PATCH] Add tag repos script --- scripts/TagRepos.ps1 | 66 ++++++++++++++++++++++++++++++++++++++++++++ scripts/common.psm1 | 66 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100755 scripts/TagRepos.ps1 create mode 100644 scripts/common.psm1 diff --git a/scripts/TagRepos.ps1 b/scripts/TagRepos.ps1 new file mode 100755 index 000000000000..bd21163c6e54 --- /dev/null +++ b/scripts/TagRepos.ps1 @@ -0,0 +1,66 @@ +#!/usr/bin/env pwsh + +<# +.SYNOPSIS + Tags each repo according to VersionPrefix in version.props of that repo +.PARAMETER Push + Push all updated tags +.PARAMETER ForceUpdateTag + This will call git tag --force +#> +[cmdletbinding(SupportsShouldProcess = $true)] +param( + [switch]$Push = $false, + [switch]$ForceUpdateTag = $false +) + +Set-StrictMode -Version 2 +$ErrorActionPreference = 'Stop' + +Import-Module -Scope Local -Force "$PSScriptRoot/common.psm1" + +Assert-Git + +$RepoRoot = Resolve-Path "$PSScriptRoot/../" + +Get-Submodules $RepoRoot -Shipping | % { + Push-Location $_.path | Out-Null + try { + + if (-not $_.versionPrefix) { + Write-Warning "Could not determine tag version for $(_.path)" + } + else { + $tag = $_.versionPrefix + Write-Host "$($_.module) => $tag" + + $gitTagArgs = @() + if ($ForceUpdateTag) { + $gitTagArgs += '--force' + } + + Invoke-Block { & git tag @gitTagArgs $tag } + + if ($Push) { + $gitPushArgs = @() + if ($WhatIfPreference) { + $gitPushArgs += '--dry-run' + } + Invoke-Block { & git push --dry-run @gitPushArgs origin "refs/tags/${tag}" } + } + + if ($WhatIfPreference) { + Invoke-Block { & git tag -d $tag } | Out-Null + } + } + } + catch { + Write-Host -ForegroundColor Red "Could not update $_" + throw + } + finally { + Pop-Location + } +} + + diff --git a/scripts/common.psm1 b/scripts/common.psm1 new file mode 100644 index 000000000000..3eeca4b25036 --- /dev/null +++ b/scripts/common.psm1 @@ -0,0 +1,66 @@ +function Assert-Git { + if (!(Get-Command git -ErrorAction Ignore)) { + Write-Error 'git is required to execute this script' + exit 1 + } +} + +function Invoke-Block([scriptblock]$cmd) { + $cmd | Out-String | Write-Verbose + & $cmd + + # Need to check both of these cases for errors as they represent different items + # - $?: did the powershell script block throw an error + # - $lastexitcode: did a windows command executed by the script block end in error + if ((-not $?) -or ($lastexitcode -ne 0)) { + Write-Warning $error[0] + throw "Command failed to execute: $cmd" + } +} + +function Get-Submodules { + param( + [Parameter(Mandatory = $true)] + [string]$RepoRoot, + [switch]$Shipping + ) + + $moduleConfigFile = Join-Path $RepoRoot ".gitmodules" + $submodules = @() + + [xml] $submoduleConfig = Get-Content "$RepoRoot/build/submodules.props" + $repos = $submoduleConfig.Project.ItemGroup.Repository | % { $_.Include } + + Get-ChildItem "$RepoRoot/modules/*" -Directory ` + | ? { (-not $Shipping) -or $($repos -contains $($_.Name)) -or $_.Name -eq 'Templating' } ` + | % { + Push-Location $_ | Out-Null + Write-Verbose "Attempting to get submodule info for $_" + + if (Test-Path 'version.props') { + [xml] $versionXml = Get-Content 'version.props' + $versionPrefix = $versionXml.Project.PropertyGroup.VersionPrefix + } else { + $versionPrefix = '' + } + + try { + $data = @{ + path = $_ + module = $_.Name + commit = $(git rev-parse HEAD) + newCommit = $null + changed = $false + branch = $(git config -f $moduleConfigFile --get submodule.modules/$($_.Name).branch ) + versionPrefix = $versionPrefix + } + + $submodules += $data + } + finally { + Pop-Location | Out-Null + } + } + + return $submodules +}