#!/usr/bin/env pwsh # Git-specific common functions for the git extension. # Extracted from scripts/powershell/common.ps1 — contains only git-specific # branch validation and detection logic. function Test-HasGit { param([string]$RepoRoot = (Get-Location)) try { if (-not (Test-Path (Join-Path $RepoRoot '.git'))) { return $false } if (-not (Get-Command git -ErrorAction SilentlyContinue)) { return $false } git -C $RepoRoot rev-parse --is-inside-work-tree 2>$null | Out-Null return ($LASTEXITCODE -eq 0) } catch { return $false } } function Get-SpecKitEffectiveBranchName { param([string]$Branch) if ($Branch -match '^([^/]+)/([^/]+)$') { return $Matches[2] } return $Branch } function Test-FeatureBranch { param( [string]$Branch, [bool]$HasGit = $true ) # For non-git repos, we can't enforce branch naming but still provide output if (-not $HasGit) { Write-Warning "[specify] Warning: Git repository not detected; skipped branch validation" return $true } $raw = $Branch $Branch = Get-SpecKitEffectiveBranchName $raw # Accept sequential prefix (3+ digits) but exclude malformed timestamps # Malformed: 7-or-8 digit date + 6-digit time with no trailing slug (e.g. "2026031-143022" or "20260319-143022") $hasMalformedTimestamp = ($Branch -match '^[0-9]{7}-[0-9]{6}-') -or ($Branch -match '^(?:\d{7}|\d{8})-\d{6}$') $isSequential = ($Branch -match '^[0-9]{3,}-') -and (-not $hasMalformedTimestamp) if (-not $isSequential -and $Branch -notmatch '^\d{8}-\d{6}-') { [Console]::Error.WriteLine("ERROR: Not on a feature branch. Current branch: $raw") [Console]::Error.WriteLine("Feature branches should be named like: 001-feature-name, 1234-feature-name, or 20260319-143022-feature-name") return $false } return $true }