git-sigil/gitfield-github
2025-05-30 21:47:28 -05:00

127 lines
5.1 KiB
Bash
Executable file

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
GIT_REMOTE_NAME="github"
REPO_NAME=$(basename "$(pwd)")
DEFAULT_NAME="Mark Randall Havens"
DEFAULT_EMAIL="mark.r.havens@gmail.com"
# ─────────────────────────────
# LOGGING UTILITY
# ─────────────────────────────
info() { echo -e "\033[1;34m[INFO]\033[0m $*"; }
warn() { echo -e "\033[1;33m[WARN]\033[0m $*"; }
error() { echo -e "\033[1;31m[ERROR]\033[0m $*" >&2; exit 1; }
# ─────────────────────────────
# ENSURE DEPENDENCIES
# ─────────────────────────────
info "Checking for required tools..."
if ! command -v git &>/dev/null; then
info "Installing Git..."
sudo apt update && sudo apt install git -y || error "Failed to install Git"
else
info "Git already installed: $(git --version)"
fi
if ! command -v gh &>/dev/null; then
info "Installing GitHub CLI..."
sudo apt install curl -y
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture)] signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg https://cli.github.com/packages stable main" | \
sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update && sudo apt install gh -y || error "Failed to install GitHub CLI"
else
info "GitHub CLI already installed: $(gh --version | head -n 1)"
fi
# ─────────────────────────────
# AUTHENTICATE GH
# ─────────────────────────────
if ! gh auth status &>/dev/null; then
info "Authenticating GitHub CLI..."
gh auth login || error "Authentication failed"
else
info "GitHub CLI authenticated."
fi
# ─────────────────────────────
# CONFIGURE GIT IDENTITY
# ─────────────────────────────
USER_NAME=$(git config --global user.name || true)
USER_EMAIL=$(git config --global user.email || true)
if [[ -z "$USER_NAME" || -z "$USER_EMAIL" ]]; then
git config --global user.name "$DEFAULT_NAME"
git config --global user.email "$DEFAULT_EMAIL"
info "Git identity set to: $DEFAULT_NAME <$DEFAULT_EMAIL>"
else
info "Git identity already set to: $USER_NAME <$USER_EMAIL>"
fi
# ─────────────────────────────
# INITIALIZE IF NEEDED
# ─────────────────────────────
if [ ! -d ".git" ]; then
info "Initializing local git repository..."
git init
git add .
git commit -m "Initial commit" || warn "Nothing to commit"
else
info "Git repository already initialized."
fi
# ─────────────────────────────
# CREATE FIRST COMMIT IF MISSING
# ─────────────────────────────
if ! git rev-parse HEAD &>/dev/null; then
info "Creating first commit..."
git add .
git commit -m "Initial commit" || warn "Nothing to commit"
fi
# ─────────────────────────────
# LINK OR CREATE GITHUB REPO
# ─────────────────────────────
USERNAME=$(gh api user | jq -r .login)
REMOTE_URL="https://github.com/$USERNAME/$REPO_NAME.git"
if ! git remote get-url "$GIT_REMOTE_NAME" &>/dev/null; then
if gh repo view "$USERNAME/$REPO_NAME" &>/dev/null; then
info "Linking to existing GitHub repo: $REMOTE_URL"
git remote add "$GIT_REMOTE_NAME" "$REMOTE_URL"
else
info "Creating GitHub repository '$REPO_NAME'..."
gh repo create "$REPO_NAME" --public --source=. --remote="$GIT_REMOTE_NAME" || error "Failed to create GitHub repo"
fi
else
info "Remote '$GIT_REMOTE_NAME' already set to: $(git remote get-url $GIT_REMOTE_NAME)"
fi
# ─────────────────────────────
# COMMIT CHANGES IF ANY
# ─────────────────────────────
if ! git diff --quiet || ! git diff --cached --quiet; then
info "Changes detected — committing..."
git add .
git commit -m "Update: $(date '+%Y-%m-%d %H:%M:%S')" || warn "Nothing to commit"
else
info "No uncommitted changes found."
fi
# ─────────────────────────────
# PUSH TO GITHUB
# ─────────────────────────────
BRANCH=$(git rev-parse --abbrev-ref HEAD)
if ! git config --get branch."$BRANCH".remote &>/dev/null; then
info "Setting upstream and pushing..."
git push -u "$GIT_REMOTE_NAME" "$BRANCH" || error "Push failed"
else
info "Pushing to remote '$GIT_REMOTE_NAME'..."
git push "$GIT_REMOTE_NAME" "$BRANCH" || error "Push failed"
fi
info "✅ Sync complete: https://github.com/$USERNAME/$REPO_NAME"