Private
Public Access
0
0
Files
manual_slop/scripts/tier2/fetch_tier2_branch.ps1
T
ed abf92a8b31 feat(tier2): add fetch_tier2_branch.ps1 - bridge from sandbox to main repo
The Tier 2 sandbox blocks git push (and all other destructive git ops).
After Tier 2 finishes a track, this script is the bridge: it fetches the
tier2/<track> branch from the sandboxed clone (C:\projects\manual_slop_tier2)
into the main repo (C:\projects\manual_slop), creating a local
review/<track> branch so the working tree is untouched.

Usage:
  pwsh -File scripts\\tier2\\fetch_tier2_branch.ps1 -TrackName send_result_to_send_20260616

Supports -WhatIf for dry-run. Does NOT push to origin (user's call).
2026-06-17 01:52:04 -04:00

144 lines
5.6 KiB
PowerShell

# scripts/tier2/fetch_tier2_branch.ps1
<#
.SYNOPSIS
Fetch a Tier 2 autonomous branch from the sandboxed clone into the main repo.
.DESCRIPTION
The Tier 2 sandbox blocks git push (and all other destructive git ops). After
Tier 2 finishes a track, this script is the bridge: it fetches the
tier2/<track> branch from the sandboxed clone (C:\projects\manual_slop_tier2)
into the main repo (C:\projects\manual_slop), creating a local
review/<track> branch so your working tree is untouched.
You can then review the diff, merge to main, and push to origin yourself.
This script does NOT push to origin. Pushing is the user's call.
.PARAMETER TrackName
The track name (e.g., send_result_to_send_20260616). The branch fetched is
tier2/<TrackName>.
.PARAMETER MainRepoPath
Path to the main repo. Default: C:\projects\manual_slop
.PARAMETER Tier2ClonePath
Path to the Tier 2 sandboxed clone. Default: C:\projects\manual_slop_tier2
.PARAMETER RemoteName
The git remote name to use for the Tier 2 clone. Default: tier2-clone
.EXAMPLE
pwsh -File scripts\tier2\fetch_tier2_branch.ps1 -TrackName send_result_to_send_20260616
Fetches tier2/send_result_to_send_20260616 from the sandboxed clone and
creates review/send_result_to_send_20260616 in the main repo.
.EXAMPLE
pwsh -File scripts\tier2\fetch_tier2_branch.ps1 -TrackName my_track -RemoteName sandbox
Same as above but uses 'sandbox' as the remote name (in case tier2-clone is taken).
#>
[CmdletBinding(SupportsShouldProcess = $true)]
param(
[Parameter(Mandatory = $true)]
[string]$TrackName,
[string]$MainRepoPath = "C:\projects\manual_slop",
[string]$Tier2ClonePath = "C:\projects\manual_slop_tier2",
[string]$RemoteName = "tier2-clone"
)
$ErrorActionPreference = "Stop"
# Resolve to absolute paths
$MainRepoPath = (Resolve-Path $MainRepoPath -ErrorAction SilentlyContinue)?.Path
if (-not $MainRepoPath) {
throw "Main repo not found at $MainRepoPath. Adjust -MainRepoPath."
}
if (-not (Test-Path $Tier2ClonePath)) {
throw "Tier 2 clone not found at $Tier2ClonePath. Run setup_tier2_clone.ps1 first."
}
$BranchName = "tier2/$TrackName"
$ReviewBranch = "review/$TrackName"
Write-Host "[fetch] Track: $TrackName"
Write-Host "[fetch] Branch in sandbox: $BranchName"
Write-Host "[fetch] Local review branch: $ReviewBranch"
Write-Host "[fetch] Main repo: $MainRepoPath"
Write-Host "[fetch] Tier 2 clone: $Tier2ClonePath"
Write-Host ""
# 1. Verify the branch exists in the Tier 2 clone
Push-Location $Tier2ClonePath
try {
$branchSha = git rev-parse --verify $BranchName 2>$null
if (-not $branchSha) {
$available = git branch --format='%(refname:short)' | Where-Object { $_ -like 'tier2/*' }
throw "Branch $BranchName does not exist in Tier 2 clone. Available tier2/* branches: $($available -join ', ')"
}
Write-Host "[fetch] Found branch in sandbox: $BranchName ($($branchSha.Substring(0,7)))"
} finally {
Pop-Location
}
# 2. Add the Tier 2 clone as a remote in the main repo (if not already)
Push-Location $MainRepoPath
try {
$currentRemote = git remote get-url $RemoteName 2>$null
if ($currentRemote -eq $Tier2ClonePath) {
Write-Host "[fetch] Remote '$RemoteName' already points to Tier 2 clone"
} elseif ($currentRemote) {
Write-Host "[fetch] Remote '$RemoteName' exists but points elsewhere; updating"
git remote set-url $RemoteName $Tier2ClonePath
} else {
Write-Host "[fetch] Adding remote '$RemoteName' -> $Tier2ClonePath"
git remote add $RemoteName $Tier2ClonePath
}
# 3. Fetch the branch
Write-Host "[fetch] Fetching $BranchName from $RemoteName"
git fetch $RemoteName $BranchName 2>&1 | Out-Null
# 4. Create or reset the local review branch
if (git rev-parse --verify $ReviewBranch 2>$null) {
Write-Host "[fetch] Local review branch $ReviewBranch exists; resetting to $RemoteName/$BranchName"
git branch -f $ReviewBranch "$RemoteName/$BranchName"
} else {
Write-Host "[fetch] Creating local review branch $ReviewBranch"
git branch $ReviewBranch "$RemoteName/$BranchName"
}
# 5. Print summary
$currentBranch = git rev-parse --abbrev-ref HEAD
$commitsAhead = git rev-list --count "$RemoteName/$BranchName" "^$currentBranch" 2>$null
if (-not $commitsAhead) { $commitsAhead = 0 }
$filesChanged = (git diff --stat "$currentBranch..$ReviewBranch" | Measure-Object -Line).Lines - 1
if ($filesChanged -lt 0) { $filesChanged = 0 }
$firstLine = (git log --oneline "$currentBranch..$ReviewBranch" | Select-Object -First 1)
Write-Host ""
Write-Host "=== Summary ==="
Write-Host " Branch: $BranchName"
Write-Host " Local review branch: $ReviewBranch"
Write-Host " Your current branch: $currentBranch (untouched)"
Write-Host " Commits ahead: $commitsAhead"
Write-Host " Files changed: $filesChanged"
Write-Host " First commit: $firstLine"
Write-Host ""
Write-Host "=== Next steps ==="
Write-Host " 1. Inspect the diff:"
Write-Host " git diff $currentBranch..$ReviewBranch"
Write-Host " git log $currentBranch..$ReviewBranch"
Write-Host " 2. Inspect specific files:"
Write-Host " git show $ReviewBranch -- <path>"
Write-Host " 3. If approved, merge to your current branch:"
Write-Host " git merge --no-ff $ReviewBranch"
Write-Host " 4. Push to origin (from main, in the non-sandboxed session):"
Write-Host " git push origin $currentBranch"
Write-Host ""
Write-Host "[fetch] done. The review branch is local-only; nothing has been pushed to origin."
} finally {
Pop-Location
}