131 lines
3.5 KiB
PowerShell
131 lines
3.5 KiB
PowerShell
# pr-create.ps1 - Create pull requests on Gitea or GitHub
|
|
# Usage: .\pr-create.ps1 -Title "Title" [-Body "Body"] [-Base base] [-Head head] [-Labels "labels"] [-Milestone "milestone"]
|
|
|
|
[CmdletBinding()]
|
|
param(
|
|
[Alias("t")]
|
|
[string]$Title,
|
|
|
|
[Alias("b")]
|
|
[string]$Body,
|
|
|
|
[Alias("B")]
|
|
[string]$Base,
|
|
|
|
[Alias("H")]
|
|
[string]$Head,
|
|
|
|
[Alias("l")]
|
|
[string]$Labels,
|
|
|
|
[Alias("m")]
|
|
[string]$Milestone,
|
|
|
|
[Alias("i")]
|
|
[int]$Issue,
|
|
|
|
[Alias("d")]
|
|
[switch]$Draft,
|
|
|
|
[switch]$Help
|
|
)
|
|
|
|
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
. "$ScriptDir\detect-platform.ps1"
|
|
|
|
function Show-Usage {
|
|
@"
|
|
Usage: pr-create.ps1 [OPTIONS]
|
|
|
|
Create a pull request on the current repository (Gitea or GitHub).
|
|
|
|
Options:
|
|
-Title, -t TITLE PR title (required, or use -Issue)
|
|
-Body, -b BODY PR description/body
|
|
-Base, -B BRANCH Base branch to merge into (default: main/master)
|
|
-Head, -H BRANCH Head branch with changes (default: current branch)
|
|
-Labels, -l LABELS Comma-separated labels
|
|
-Milestone, -m NAME Milestone name
|
|
-Issue, -i NUMBER Link to issue (auto-generates title if not provided)
|
|
-Draft, -d Create as draft PR
|
|
-Help Show this help message
|
|
|
|
Examples:
|
|
.\pr-create.ps1 -Title "Add login feature" -Body "Implements user authentication"
|
|
.\pr-create.ps1 -t "Fix bug" -B main -H feature/fix-123
|
|
.\pr-create.ps1 -i 42 -b "Implements the feature described in #42"
|
|
.\pr-create.ps1 -t "WIP: New feature" -Draft
|
|
"@
|
|
exit 1
|
|
}
|
|
|
|
if ($Help) {
|
|
Show-Usage
|
|
}
|
|
|
|
# If no title but issue provided, generate title
|
|
if (-not $Title -and $Issue) {
|
|
$Title = "Fixes #$Issue"
|
|
}
|
|
|
|
if (-not $Title) {
|
|
Write-Error "Title is required (-t) or provide an issue (-i)"
|
|
Show-Usage
|
|
}
|
|
|
|
# Default head branch to current branch
|
|
if (-not $Head) {
|
|
$Head = git branch --show-current
|
|
}
|
|
|
|
# Add issue reference to body if provided
|
|
if ($Issue) {
|
|
if ($Body) {
|
|
$Body = "$Body`n`nFixes #$Issue"
|
|
} else {
|
|
$Body = "Fixes #$Issue"
|
|
}
|
|
}
|
|
|
|
$platform = Get-GitPlatform
|
|
|
|
switch ($platform) {
|
|
"github" {
|
|
$cmd = @("gh", "pr", "create", "--title", $Title)
|
|
if ($Body) { $cmd += @("--body", $Body) }
|
|
if ($Base) { $cmd += @("--base", $Base) }
|
|
if ($Head) { $cmd += @("--head", $Head) }
|
|
if ($Labels) { $cmd += @("--label", $Labels) }
|
|
if ($Milestone) { $cmd += @("--milestone", $Milestone) }
|
|
if ($Draft) { $cmd += "--draft" }
|
|
& $cmd[0] $cmd[1..($cmd.Length-1)]
|
|
}
|
|
"gitea" {
|
|
$cmd = @("tea", "pr", "create", "--title", $Title)
|
|
if ($Body) { $cmd += @("--description", $Body) }
|
|
if ($Base) { $cmd += @("--base", $Base) }
|
|
if ($Head) { $cmd += @("--head", $Head) }
|
|
if ($Labels) { $cmd += @("--labels", $Labels) }
|
|
|
|
if ($Milestone) {
|
|
$milestoneList = tea milestones list 2>$null
|
|
$milestoneId = ($milestoneList | Select-String "^\s*(\d+).*$Milestone" | ForEach-Object { $_.Matches.Groups[1].Value } | Select-Object -First 1)
|
|
if ($milestoneId) {
|
|
$cmd += @("--milestone", $milestoneId)
|
|
} else {
|
|
Write-Warning "Could not find milestone '$Milestone', creating without milestone"
|
|
}
|
|
}
|
|
|
|
if ($Draft) {
|
|
Write-Warning "Draft PR may not be supported by your tea version"
|
|
}
|
|
|
|
& $cmd[0] $cmd[1..($cmd.Length-1)]
|
|
}
|
|
default {
|
|
Write-Error "Could not detect git platform"
|
|
exit 1
|
|
}
|
|
}
|