The broken `tea login list | awk '{print $NF}'` pattern extracted
the table border character instead of a token, causing pr-metadata.sh
to return empty fields (baseRefName, etc.) and breaking pr-merge.sh.
Centralizes get_remote_host and get_gitea_token in detect-platform.sh
with a 3-tier resolution: Mosaic credential loader (host→service
mapping) → GITEA_TOKEN env var → ~/.git-credentials file.
Removes duplicate local copies from 5 scripts that already source
detect-platform.sh.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
150 lines
4.0 KiB
Bash
Executable File
150 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# detect-platform.sh - Detect git platform (Gitea or GitHub) for current repo
|
|
# Usage: source detect-platform.sh && detect_platform
|
|
# or: ./detect-platform.sh (prints platform name)
|
|
|
|
detect_platform() {
|
|
local remote_url
|
|
remote_url=$(git remote get-url origin 2>/dev/null)
|
|
|
|
if [[ -z "$remote_url" ]]; then
|
|
echo "error: not a git repository or no origin remote" >&2
|
|
return 1
|
|
fi
|
|
|
|
# Check for GitHub
|
|
if [[ "$remote_url" == *"github.com"* ]]; then
|
|
PLATFORM="github"
|
|
export PLATFORM
|
|
echo "github"
|
|
return 0
|
|
fi
|
|
|
|
# Check for common Gitea indicators
|
|
# Gitea URLs typically don't contain github.com, gitlab.com, bitbucket.org
|
|
if [[ "$remote_url" != *"gitlab.com"* ]] && \
|
|
[[ "$remote_url" != *"bitbucket.org"* ]]; then
|
|
# Assume Gitea for self-hosted repos
|
|
PLATFORM="gitea"
|
|
export PLATFORM
|
|
echo "gitea"
|
|
return 0
|
|
fi
|
|
|
|
PLATFORM="unknown"
|
|
export PLATFORM
|
|
echo "unknown"
|
|
return 1
|
|
}
|
|
|
|
get_repo_info() {
|
|
local remote_url
|
|
remote_url=$(git remote get-url origin 2>/dev/null)
|
|
|
|
if [[ -z "$remote_url" ]]; then
|
|
echo "error: not a git repository or no origin remote" >&2
|
|
return 1
|
|
fi
|
|
|
|
# Extract owner/repo from URL
|
|
# Handles: git@host:owner/repo.git, https://host/owner/repo.git, https://host/owner/repo
|
|
local repo_path
|
|
if [[ "$remote_url" == git@* ]]; then
|
|
repo_path="${remote_url#*:}"
|
|
else
|
|
repo_path="${remote_url#*://}"
|
|
repo_path="${repo_path#*/}"
|
|
fi
|
|
|
|
# Remove .git suffix if present
|
|
repo_path="${repo_path%.git}"
|
|
|
|
echo "$repo_path"
|
|
}
|
|
|
|
get_repo_owner() {
|
|
local repo_info
|
|
repo_info=$(get_repo_info)
|
|
echo "${repo_info%%/*}"
|
|
}
|
|
|
|
get_repo_name() {
|
|
local repo_info
|
|
repo_info=$(get_repo_info)
|
|
echo "${repo_info##*/}"
|
|
}
|
|
|
|
get_remote_host() {
|
|
local remote_url
|
|
remote_url=$(git remote get-url origin 2>/dev/null || true)
|
|
if [[ -z "$remote_url" ]]; then
|
|
return 1
|
|
fi
|
|
if [[ "$remote_url" =~ ^https?://([^/]+)/ ]]; then
|
|
echo "${BASH_REMATCH[1]}"
|
|
return 0
|
|
fi
|
|
if [[ "$remote_url" =~ ^git@([^:]+): ]]; then
|
|
echo "${BASH_REMATCH[1]}"
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
# Resolve a Gitea API token for the given host.
|
|
# Priority: Mosaic credential loader → GITEA_TOKEN env → ~/.git-credentials
|
|
get_gitea_token() {
|
|
local host="$1"
|
|
local script_dir
|
|
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
local cred_loader="$script_dir/../_lib/credentials.sh"
|
|
|
|
# 1. Mosaic credential loader (host → service mapping, run in subshell to avoid polluting env)
|
|
if [[ -f "$cred_loader" ]]; then
|
|
local token
|
|
token=$(
|
|
source "$cred_loader"
|
|
case "$host" in
|
|
git.mosaicstack.dev) load_credentials gitea-mosaicstack 2>/dev/null ;;
|
|
git.uscllc.com) load_credentials gitea-usc 2>/dev/null ;;
|
|
*)
|
|
for svc in gitea-mosaicstack gitea-usc; do
|
|
load_credentials "$svc" 2>/dev/null || continue
|
|
[[ "${GITEA_URL:-}" == *"$host"* ]] && break
|
|
unset GITEA_TOKEN GITEA_URL
|
|
done
|
|
;;
|
|
esac
|
|
echo "${GITEA_TOKEN:-}"
|
|
)
|
|
if [[ -n "$token" ]]; then
|
|
echo "$token"
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
# 2. GITEA_TOKEN env var (may be set by caller)
|
|
if [[ -n "${GITEA_TOKEN:-}" ]]; then
|
|
echo "$GITEA_TOKEN"
|
|
return 0
|
|
fi
|
|
|
|
# 3. ~/.git-credentials file
|
|
local creds="$HOME/.git-credentials"
|
|
if [[ -f "$creds" ]]; then
|
|
local token
|
|
token=$(grep -F "$host" "$creds" 2>/dev/null | sed -n 's#https\?://[^@]*:\([^@/]*\)@.*#\1#p' | head -n 1)
|
|
if [[ -n "$token" ]]; then
|
|
echo "$token"
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
# If script is run directly (not sourced), output the platform
|
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
detect_platform
|
|
fi
|