149 lines
4.9 KiB
PowerShell
Executable File
149 lines
4.9 KiB
PowerShell
Executable File
#!/usr/bin/env pwsh
|
|
|
|
<#
|
|
.SYNOPSIS
|
|
Updates each submodule this repo builds to new dependencies.props.
|
|
.PARAMETER Source
|
|
The NuGet package source to find the lineup on.
|
|
.PARAMETER LineupID
|
|
The ID of the Lineup to determine which versions to use.
|
|
.PARAMETER LineupVersion
|
|
The version of the Lineup to be used.
|
|
.PARAMETER NoPush
|
|
Make commits without pusing.
|
|
.PARAMETER GitAuthorName
|
|
The author name to use in the commit message. (Optional)
|
|
.PARAMETER GitAuthorEmail
|
|
The author email to use in the commit message. (Optional)
|
|
.PARAMETER Force
|
|
Specified this to push commits without prompting.
|
|
.PARAMETER GitCommitArgs
|
|
Any remaining arguments are passed as arguments to 'git commit' actions in each repo.
|
|
#>
|
|
[cmdletbinding(SupportsShouldProcess = $true)]
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$Source,
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$LineupID,
|
|
[Parameter(Mandatory = $true)]
|
|
[string]$LineupVersion,
|
|
[switch]$NoPush,
|
|
[string]$GitAuthorName = $null,
|
|
[string]$GitAuthorEmail = $null,
|
|
[switch]$Force,
|
|
[string[]]$GitCommitArgs = @()
|
|
)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
Set-StrictMode -Version 2
|
|
|
|
Import-Module "$PSScriptRoot/common.psm1" -Scope Local -Force
|
|
|
|
$RepoRoot = Resolve-Path "$PSScriptRoot\.."
|
|
$ModuleDirectory = Join-Path $RepoRoot "modules"
|
|
|
|
$gitConfigArgs = @()
|
|
if ($GitAuthorName) {
|
|
$gitConfigArgs += '-c', "user.name=$GitAuthorName"
|
|
}
|
|
|
|
if ($GitAuthorEmail) {
|
|
$gitConfigArgs += '-c', "user.email=$GitAuthorEmail"
|
|
}
|
|
|
|
Push-Location $ModuleDirectory
|
|
try {
|
|
|
|
$build_errors = @()
|
|
$submodules = Get-Submodules $RepoRoot
|
|
foreach ($submodule in $submodules) {
|
|
Push-Location $submodule.path
|
|
try {
|
|
Invoke-Block { & git fetch }
|
|
Invoke-Block { & git checkout origin/$($submodule.branch) }
|
|
$depsFile = Join-Path (Join-Path $($submodule.path) "build") "dependencies.props"
|
|
|
|
if (!(Test-Path $depsFile)) {
|
|
Write-Warning "No build\dependencies.props file exists for '$($submodule.module)'."
|
|
continue
|
|
}
|
|
|
|
$koreBuildLock = "korebuild-lock.txt"
|
|
|
|
$repoKoreBuildLock = (Join-Path $RepoRoot $koreBuildLock)
|
|
$submoduleKoreBuildLock = (Join-Path $submodule.path $koreBuildLock)
|
|
|
|
Copy-Item $repoKoreBuildLock $submoduleKoreBuildLock -Force
|
|
|
|
Write-Verbose "About to update dependencies.props for $($submodule.module)"
|
|
& .\run.ps1 upgrade deps --source $Source --id $LineupID --version $LineupVersion --deps-file $depsFile
|
|
|
|
Invoke-Block { & git @gitConfigArgs add $depsFile $koreBuildLock }
|
|
|
|
# If there were any changes test and push.
|
|
& git diff --cached --quiet ./
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Invoke-Block { & git @gitConfigArgs commit --quiet -m "Update dependencies.props`n`n[auto-updated: dependencies]" @GitCommitArgs }
|
|
|
|
# Prepare this submodule for push
|
|
$sshUrl = "git@github.com:aspnet/$($submodule.module)"
|
|
Invoke-Block { & git remote set-url --push origin $sshUrl }
|
|
|
|
# Test the submodule
|
|
try {
|
|
Invoke-Block { & .\run.ps1 default-build /p:SkipTests=true }
|
|
}
|
|
catch {
|
|
Write-Warning "Error in $($submodule.module): $_"
|
|
$build_errors += @{
|
|
Repo = $submodule.module
|
|
Message = $_
|
|
}
|
|
continue
|
|
}
|
|
|
|
# Push the changes
|
|
if (-not $NoPush -and ($Force -or ($PSCmdlet.ShouldContinue("Pushing updates to repos.", 'Push the changes to these repos?')))) {
|
|
try {
|
|
$newBranch = "maestro/$($submodule.branch)"
|
|
Invoke-Block { & git @gitConfigArgs push origin HEAD:refs/heads/$newBranch}
|
|
}
|
|
catch {
|
|
Write-Warning "Error in pushing $($newBranch): $_"
|
|
$build_errors += @{
|
|
Repo = $submodule.module
|
|
Message = $_
|
|
}
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
Write-Host "No changes in $($submodule.module)"
|
|
}
|
|
}
|
|
catch {
|
|
Write-Warning "Error in $($submodule.module): $_"
|
|
$build_errors += @{
|
|
Repo = $submodule.module
|
|
Message = $_
|
|
}
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|
|
}
|
|
|
|
if ($build_errors.Count -gt 0 ) {
|
|
Write-Warning "The following repos failed:"
|
|
foreach ($error in $build_errors) {
|
|
Write-Warning " - $($error.Repo)"
|
|
}
|
|
throw "Failed to build"
|
|
}
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|