79031da543
Spell checking / Check Spelling (push) Has been cancelled
Spell checking / Update PR (push) Has been cancelled
Publish Dev Docs Website / build (push) Failing after 1s
Publish Dev Docs Website / deploy (push) Has been skipped
Spell checking / Report (Push) (push) Has been cancelled
Spell checking / Report (PR) (push) Has been cancelled
81 lines
2.6 KiB
PowerShell
81 lines
2.6 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Find a commit on a branch that has the same subject line as a reference commit.
|
|
|
|
.DESCRIPTION
|
|
Given a commit SHA (often from a release tag) and a branch name, this script
|
|
resolves the reference commit's subject, then searches the branch history for
|
|
commits with the exact same subject line. Useful when the release tag commit
|
|
is not reachable from your current branch history.
|
|
|
|
.PARAMETER Commit
|
|
The reference commit SHA or ref (e.g., v0.96.1 or a full SHA).
|
|
|
|
.PARAMETER Branch
|
|
The branch to search (e.g., stable or main). Defaults to stable.
|
|
|
|
.PARAMETER RepoPath
|
|
Path to the local repo. Defaults to current directory.
|
|
|
|
.EXAMPLE
|
|
pwsh ./find-commit-by-title.ps1 -Commit b62f6421845f7e5c92b8186868d98f46720db442 -Branch stable
|
|
#>
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory = $true)][string]$Commit,
|
|
[string]$Branch = "stable",
|
|
[string]$RepoPath = "."
|
|
)
|
|
|
|
function Write-Info($msg) { Write-Host $msg -ForegroundColor Cyan }
|
|
function Write-Err($msg) { Write-Host $msg -ForegroundColor Red }
|
|
|
|
Push-Location $RepoPath
|
|
try {
|
|
Write-Info "Fetching latest '$Branch' from origin (with tags)..."
|
|
git fetch origin $Branch --tags | Out-Null
|
|
if ($LASTEXITCODE -ne 0) { throw "git fetch origin $Branch --tags failed" }
|
|
|
|
$commitSha = (git rev-parse --verify $Commit) 2>$null
|
|
if (-not $commitSha) { throw "Commit '$Commit' not found" }
|
|
|
|
$subject = (git show -s --format=%s $commitSha) 2>$null
|
|
if (-not $subject) { throw "Unable to read subject for '$commitSha'" }
|
|
|
|
$branchRef = $Branch
|
|
$branchSha = (git rev-parse --verify $branchRef) 2>$null
|
|
if (-not $branchSha) {
|
|
$branchRef = "origin/$Branch"
|
|
$branchSha = (git rev-parse --verify $branchRef) 2>$null
|
|
}
|
|
if (-not $branchSha) { throw "Branch '$Branch' not found" }
|
|
|
|
Write-Info "Reference commit: $commitSha"
|
|
Write-Info "Reference title: $subject"
|
|
Write-Info "Searching branch: $branchRef"
|
|
|
|
$matches = git log $branchRef --format="%H|%s" | Where-Object { $_ -match '\|' }
|
|
$results = @()
|
|
foreach ($line in $matches) {
|
|
$parts = $line -split '\|', 2
|
|
if ($parts.Count -eq 2 -and $parts[1] -eq $subject) {
|
|
$results += [PSCustomObject]@{ Sha = $parts[0]; Title = $parts[1] }
|
|
}
|
|
}
|
|
|
|
if (-not $results -or $results.Count -eq 0) {
|
|
Write-Info "No matching commit found on $branchRef for the given title."
|
|
exit 0
|
|
}
|
|
|
|
Write-Info ("Found {0} matching commit(s):" -f $results.Count)
|
|
$results | ForEach-Object { Write-Host ("{0} {1}" -f $_.Sha, $_.Title) }
|
|
}
|
|
catch {
|
|
Write-Err $_
|
|
exit 1
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|