102 lines
2.3 KiB
PowerShell
102 lines
2.3 KiB
PowerShell
param(
|
|
[string]$PrimaryRemote,
|
|
[string]$MirrorRemote,
|
|
[string[]]$Branches,
|
|
[switch]$Force,
|
|
[switch]$Prune,
|
|
[switch]$NoTags,
|
|
[switch]$DryRun
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
if (-not $PrimaryRemote) {
|
|
$PrimaryRemote = if ($env:PRIMARY_REMOTE) { $env:PRIMARY_REMOTE } else { "origin" }
|
|
}
|
|
if (-not $MirrorRemote) {
|
|
$MirrorRemote = if ($env:MIRROR_REMOTE) { $env:MIRROR_REMOTE } else { "gitlab" }
|
|
}
|
|
if (-not $Branches -and $env:SYNC_BRANCHES) {
|
|
$Branches = @($env:SYNC_BRANCHES -split "[,;\s]+" | Where-Object { $_ })
|
|
}
|
|
if ($env:FORCE -eq "true") {
|
|
$Force = $true
|
|
}
|
|
if ($env:PRUNE -eq "true") {
|
|
$Prune = $true
|
|
}
|
|
if ($env:SYNC_TAGS -eq "false") {
|
|
$NoTags = $true
|
|
}
|
|
if ($env:DRY_RUN -eq "true") {
|
|
$DryRun = $true
|
|
}
|
|
|
|
function Invoke-Git {
|
|
param([string[]]$Arguments)
|
|
|
|
if ($DryRun) {
|
|
Write-Host ("git " + ($Arguments -join " "))
|
|
return
|
|
}
|
|
|
|
& git @Arguments
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "git $($Arguments -join ' ') failed with exit code $LASTEXITCODE"
|
|
}
|
|
}
|
|
|
|
Invoke-Git -Arguments @("fetch", $PrimaryRemote, "--prune", "--tags")
|
|
|
|
if ($Force) {
|
|
Invoke-Git -Arguments @("fetch", $MirrorRemote, "--prune")
|
|
}
|
|
|
|
if (-not $Branches) {
|
|
$Branches = @(
|
|
git for-each-ref "--format=%(refname:strip=3)" "refs/remotes/$PrimaryRemote" |
|
|
Where-Object { $_ -and $_ -ne "HEAD" }
|
|
)
|
|
}
|
|
|
|
foreach ($branch in $Branches) {
|
|
if (-not $branch) {
|
|
continue
|
|
}
|
|
|
|
$src = "refs/remotes/$PrimaryRemote/$branch"
|
|
$dst = "refs/heads/$branch"
|
|
$args = @("push", $MirrorRemote)
|
|
if ($Force) {
|
|
$args += "--force-with-lease=$dst"
|
|
}
|
|
$args += "${src}:${dst}"
|
|
Invoke-Git -Arguments $args
|
|
}
|
|
|
|
if (-not $NoTags) {
|
|
Invoke-Git -Arguments @("push", $MirrorRemote, "--tags")
|
|
}
|
|
|
|
if ($Prune) {
|
|
$primaryBranchSet = @{}
|
|
foreach ($branch in $Branches) {
|
|
$primaryBranchSet[$branch] = $true
|
|
}
|
|
|
|
$mirrorBranches = @(
|
|
git ls-remote --heads $MirrorRemote |
|
|
ForEach-Object {
|
|
if ($_ -match "refs/heads/(.+)$") {
|
|
$Matches[1]
|
|
}
|
|
}
|
|
)
|
|
|
|
foreach ($mirrorBranch in $mirrorBranches) {
|
|
if (-not $primaryBranchSet.ContainsKey($mirrorBranch)) {
|
|
Invoke-Git -Arguments @("push", $MirrorRemote, ":refs/heads/$mirrorBranch")
|
|
}
|
|
}
|
|
}
|