feat(scripts): added --ref flag for installing specific git refs
- Added --ref flag to install specific tags, branches, or commits from source or binary releases. - Enabled source installation from git refs by cloning and checking out the specified reference. - Added git availability check for source installations with --ref flag. - Updated README with usage examples for --ref flag on both shell and PowerShell installers.
This commit is contained in:
@@ -48,10 +48,25 @@ By default, the installer uses bun if available, otherwise downloads the prebuil
|
||||
Options:
|
||||
- `--source` / `-Source`: Install via bun (installs bun first if needed)
|
||||
- `--binary` / `-Binary`: Always use prebuilt binary
|
||||
- `--ref <ref>` / `-Ref <ref>`: Install a tag/commit/branch (defaults to source install)
|
||||
|
||||
```bash
|
||||
# Force bun installation
|
||||
curl -fsSL .../install.sh | sh -s -- --source
|
||||
|
||||
# Install a tag via binary
|
||||
curl -fsSL .../install.sh | sh -s -- --binary --ref v3.20.1
|
||||
|
||||
# Install a branch or commit via source
|
||||
curl -fsSL .../install.sh | sh -s -- --source --ref main
|
||||
```
|
||||
|
||||
```powershell
|
||||
# Install a tag via binary
|
||||
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1))) -Binary -Ref v3.20.1
|
||||
|
||||
# Install a branch or commit via source
|
||||
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1))) -Source -Ref main
|
||||
```
|
||||
|
||||
### Manual download
|
||||
|
||||
+75
-6
@@ -4,10 +4,14 @@
|
||||
# Or with options:
|
||||
# & ([scriptblock]::Create((irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1))) -Source
|
||||
# & ([scriptblock]::Create((irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1))) -Binary
|
||||
# & ([scriptblock]::Create((irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1))) -Source -Ref v3.20.1
|
||||
# & ([scriptblock]::Create((irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1))) -Source -Ref main
|
||||
# & ([scriptblock]::Create((irm https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.ps1))) -Binary -Ref v3.20.1
|
||||
|
||||
param(
|
||||
[switch]$Source,
|
||||
[switch]$Binary
|
||||
[switch]$Binary,
|
||||
[string]$Ref
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
@@ -26,6 +30,15 @@ function Test-BunInstalled {
|
||||
}
|
||||
}
|
||||
|
||||
function Test-GitInstalled {
|
||||
try {
|
||||
$null = Get-Command git -ErrorAction Stop
|
||||
return $true
|
||||
} catch {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Install-Bun {
|
||||
Write-Host "Installing bun..."
|
||||
irm bun.sh/install.ps1 | iex
|
||||
@@ -35,18 +48,70 @@ function Install-Bun {
|
||||
|
||||
function Install-ViaBun {
|
||||
Write-Host "Installing via bun..."
|
||||
bun install -g $Package
|
||||
if ($Ref) {
|
||||
if (-not (Test-GitInstalled)) {
|
||||
throw "git is required for -Ref when installing from source"
|
||||
}
|
||||
|
||||
$tmpRoot = Join-Path ([System.IO.Path]::GetTempPath()) ("omp-install-" + [System.Guid]::NewGuid().ToString("N"))
|
||||
New-Item -ItemType Directory -Force -Path $tmpRoot | Out-Null
|
||||
|
||||
try {
|
||||
$repoUrl = "https://github.com/$Repo.git"
|
||||
$cloneOk = $false
|
||||
try {
|
||||
git clone --depth 1 --branch $Ref $repoUrl $tmpRoot | Out-Null
|
||||
$cloneOk = $true
|
||||
} catch {
|
||||
$cloneOk = $false
|
||||
}
|
||||
|
||||
if (-not $cloneOk) {
|
||||
git clone $repoUrl $tmpRoot | Out-Null
|
||||
Push-Location $tmpRoot
|
||||
try {
|
||||
git checkout $Ref | Out-Null
|
||||
} finally {
|
||||
Pop-Location
|
||||
}
|
||||
}
|
||||
|
||||
$packagePath = Join-Path $tmpRoot "packages\coding-agent"
|
||||
if (-not (Test-Path $packagePath)) {
|
||||
throw "Expected package at $packagePath"
|
||||
}
|
||||
|
||||
bun install -g $packagePath
|
||||
} finally {
|
||||
Remove-Item -Recurse -Force $tmpRoot -ErrorAction SilentlyContinue
|
||||
}
|
||||
} else {
|
||||
bun install -g $Package
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "✓ Installed omp via bun" -ForegroundColor Green
|
||||
Write-Host "Run 'omp' to get started!"
|
||||
}
|
||||
|
||||
function Install-Binary {
|
||||
# Get latest release
|
||||
Write-Host "Fetching latest release..."
|
||||
$Release = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest"
|
||||
if ($Ref) {
|
||||
Write-Host "Fetching release $Ref..."
|
||||
try {
|
||||
$Release = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/tags/$Ref"
|
||||
} catch {
|
||||
throw "Release tag not found: $Ref`nFor branch/commit installs, use -Source with -Ref."
|
||||
}
|
||||
} else {
|
||||
Write-Host "Fetching latest release..."
|
||||
$Release = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest"
|
||||
}
|
||||
|
||||
$Latest = $Release.tag_name
|
||||
Write-Host "Latest version: $Latest"
|
||||
if (-not $Latest) {
|
||||
throw "Failed to fetch release tag"
|
||||
}
|
||||
Write-Host "Using version: $Latest"
|
||||
|
||||
# Download binary
|
||||
$Url = "https://github.com/$Repo/releases/download/$Latest/$BinaryName"
|
||||
@@ -71,6 +136,10 @@ function Install-Binary {
|
||||
}
|
||||
|
||||
# Main logic
|
||||
if ($Ref -and -not $Source -and -not $Binary) {
|
||||
$Source = $true
|
||||
}
|
||||
|
||||
if ($Source) {
|
||||
if (-not (Test-BunInstalled)) {
|
||||
Install-Bun
|
||||
|
||||
+92
-12
@@ -5,8 +5,10 @@ set -e
|
||||
# Usage: curl -fsSL https://raw.githubusercontent.com/can1357/oh-my-pi/main/scripts/install.sh | sh
|
||||
#
|
||||
# Options:
|
||||
# --source Install via bun (installs bun if needed)
|
||||
# --binary Always install prebuilt binary
|
||||
# --source Install via bun (installs bun if needed)
|
||||
# --binary Always install prebuilt binary
|
||||
# --ref <ref> Install specific tag/commit/branch
|
||||
# -r <ref> Shorthand for --ref
|
||||
|
||||
REPO="can1357/oh-my-pi"
|
||||
PACKAGE="@oh-my-pi/omp-coding-agent"
|
||||
@@ -14,18 +16,60 @@ INSTALL_DIR="${OMP_INSTALL_DIR:-$HOME/.local/bin}"
|
||||
|
||||
# Parse arguments
|
||||
MODE=""
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--source) MODE="source" ;;
|
||||
--binary) MODE="binary" ;;
|
||||
REF=""
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--source)
|
||||
MODE="source"
|
||||
shift
|
||||
;;
|
||||
--binary)
|
||||
MODE="binary"
|
||||
shift
|
||||
;;
|
||||
--ref)
|
||||
shift
|
||||
if [ -z "$1" ]; then
|
||||
echo "Missing value for --ref"
|
||||
exit 1
|
||||
fi
|
||||
REF="$1"
|
||||
shift
|
||||
;;
|
||||
--ref=*)
|
||||
REF="${1#*=}"
|
||||
shift
|
||||
;;
|
||||
-r)
|
||||
shift
|
||||
if [ -z "$1" ]; then
|
||||
echo "Missing value for -r"
|
||||
exit 1
|
||||
fi
|
||||
REF="$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# If a ref is provided, default to source install
|
||||
if [ -n "$REF" ] && [ -z "$MODE" ]; then
|
||||
MODE="source"
|
||||
fi
|
||||
|
||||
# Check if bun is available
|
||||
has_bun() {
|
||||
command -v bun >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Check if git is available
|
||||
has_git() {
|
||||
command -v git >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Install bun
|
||||
install_bun() {
|
||||
echo "Installing bun..."
|
||||
@@ -37,7 +81,31 @@ install_bun() {
|
||||
# Install via bun
|
||||
install_via_bun() {
|
||||
echo "Installing via bun..."
|
||||
bun install -g "$PACKAGE"
|
||||
if [ -n "$REF" ]; then
|
||||
if ! has_git; then
|
||||
echo "git is required for --ref when installing from source"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TMP_DIR="$(mktemp -d)"
|
||||
trap 'rm -rf "$TMP_DIR"' EXIT
|
||||
|
||||
if git clone --depth 1 --branch "$REF" "https://github.com/${REPO}.git" "$TMP_DIR" >/dev/null 2>&1; then
|
||||
:
|
||||
else
|
||||
git clone "https://github.com/${REPO}.git" "$TMP_DIR"
|
||||
(cd "$TMP_DIR" && git checkout "$REF")
|
||||
fi
|
||||
|
||||
if [ ! -d "$TMP_DIR/packages/coding-agent" ]; then
|
||||
echo "Expected package at ${TMP_DIR}/packages/coding-agent"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
bun install -g "$TMP_DIR/packages/coding-agent"
|
||||
else
|
||||
bun install -g "$PACKAGE"
|
||||
fi
|
||||
echo ""
|
||||
echo "✓ Installed omp via bun"
|
||||
echo "Run 'omp' to get started!"
|
||||
@@ -63,14 +131,26 @@ install_binary() {
|
||||
|
||||
BINARY="omp-${PLATFORM}-${ARCH}"
|
||||
|
||||
# Get latest release tag
|
||||
echo "Fetching latest release..."
|
||||
LATEST=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||
# Get release tag
|
||||
if [ -n "$REF" ]; then
|
||||
echo "Fetching release $REF..."
|
||||
if RELEASE_JSON=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/tags/${REF}"); then
|
||||
LATEST=$(echo "$RELEASE_JSON" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||
else
|
||||
echo "Release tag not found: $REF"
|
||||
echo "For branch/commit installs, use --source with --ref."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "Fetching latest release..."
|
||||
RELEASE_JSON=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest")
|
||||
LATEST=$(echo "$RELEASE_JSON" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||
fi
|
||||
if [ -z "$LATEST" ]; then
|
||||
echo "Failed to fetch latest release"
|
||||
echo "Failed to fetch release tag"
|
||||
exit 1
|
||||
fi
|
||||
echo "Latest version: $LATEST"
|
||||
echo "Using version: $LATEST"
|
||||
|
||||
# Download binary
|
||||
URL="https://github.com/${REPO}/releases/download/${LATEST}/${BINARY}"
|
||||
|
||||
Reference in New Issue
Block a user