Files
2025-11-29 18:24:52 +08:00

87 lines
2.5 KiB
Bash

#!/bin/bash
# Shared library for detecting GitHub repository from git remote
# Usage: source this file and call detect_github_repo
# Extracts owner and repo from a GitHub URL
# Supports both HTTPS and SSH formats:
# https://github.com/owner/repo.git
# git@github.com:owner/repo.git
extract_repo_from_url() {
local url="$1"
# Remove .git suffix if present
url="${url%.git}"
# Handle HTTPS format: https://github.com/owner/repo
if [[ $url =~ https://github\.com/([^/]+)/([^/]+) ]]; then
echo "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}"
return 0
fi
# Handle SSH format: git@github.com:owner/repo
if [[ $url =~ git@github\.com:([^/]+)/(.+) ]]; then
echo "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}"
return 0
fi
return 1
}
# Detects GitHub repository from environment or git remote
# Sets REPO_OWNER and REPO_NAME global variables
# Returns 0 on success, 1 on failure
detect_github_repo() {
# Method 1: Use environment variables if set
if [ -n "${GITHUB_OWNER:-}" ] && [ -n "${GITHUB_REPO:-}" ]; then
REPO_OWNER="$GITHUB_OWNER"
REPO_NAME="$GITHUB_REPO"
return 0
fi
# Method 2: Extract from git remote
if ! command -v git &> /dev/null; then
echo "Error: git command not found" >&2
return 1
fi
# Check if we're in a git repository
if ! git rev-parse --git-dir &> /dev/null; then
echo "Error: Not in a git repository" >&2
echo "Please run this command from within a git repository, or set GITHUB_OWNER and GITHUB_REPO environment variables" >&2
return 1
fi
# Get the origin remote URL
local remote_url
remote_url=$(git config --get remote.origin.url 2>/dev/null)
if [ -z "$remote_url" ]; then
echo "Error: No 'origin' remote found in git repository" >&2
echo "Please add a GitHub remote or set GITHUB_OWNER and GITHUB_REPO environment variables" >&2
return 1
fi
# Extract owner/repo from URL
local repo_full
repo_full=$(extract_repo_from_url "$remote_url")
if [ -z "$repo_full" ]; then
echo "Error: Could not extract GitHub repository from remote URL: $remote_url" >&2
echo "Please ensure the remote is a GitHub URL, or set GITHUB_OWNER and GITHUB_REPO environment variables" >&2
return 1
fi
# Split into owner and repo
REPO_OWNER="${repo_full%%/*}"
REPO_NAME="${repo_full#*/}"
# Validate we got both parts
if [ -z "$REPO_OWNER" ] || [ -z "$REPO_NAME" ]; then
echo "Error: Failed to parse repository owner and name from: $repo_full" >&2
return 1
fi
return 0
}