#!/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 Helpers # ──────────────── info() { echo -e "\e[1;34m[INFO]\e[0m $*"; } warn() { echo -e "\e[1;33m[WARN]\e[0m $*"; } error() { echo -e "\e[1;31m[ERROR]\e[0m $*" >&2; exit 1; } # ──────────────── # Git and GitHub CLI Setup # ──────────────── 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 # ──────────────── # GitHub Authentication # ──────────────── if ! gh auth status &>/dev/null; then info "Authenticating GitHub CLI..." gh auth login || error "GitHub authentication failed" else info "GitHub CLI authenticated." fi # ──────────────── # 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 # ──────────────── # Ensure SSH Key Exists # ──────────────── if [ ! -f "$HOME/.ssh/id_ed25519" ]; then warn "SSH key not found. Generating a new one..." read -rp "[PROMPT] Enter your GitHub email: " SSH_EMAIL ssh-keygen -t ed25519 -C "$SSH_EMAIL" -f "$HOME/.ssh/id_ed25519" -N "" eval "$(ssh-agent -s)" ssh-add "$HOME/.ssh/id_ed25519" info "Public key:" cat "$HOME/.ssh/id_ed25519.pub" info "Now adding key to GitHub..." gh ssh-key add "$HOME/.ssh/id_ed25519.pub" --title "$(hostname)" || warn "You may need to add it manually" else info "SSH key already exists." fi # ──────────────── # Initialize Git Repo # ──────────────── if [ ! -d ".git" ]; then info "Initializing Git repo..." git init git add . git commit -m "Initial commit" || warn "Nothing to commit" else info "Git repo already initialized." fi # ──────────────── # Ensure First Commit # ──────────────── if ! git rev-parse HEAD &>/dev/null; then git add . git commit -m "Initial commit" || warn "Nothing to commit" fi # ──────────────── # Setup GitHub Remote (SSH) # ──────────────── USERNAME=$(gh api user | jq -r .login) SSH_REMOTE_URL="git@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 via SSH..." git remote add "$GIT_REMOTE_NAME" "$SSH_REMOTE_URL" else info "Creating GitHub repo..." gh repo create "$REPO_NAME" --public --source=. --remote="$GIT_REMOTE_NAME" --push || error "Failed to create GitHub repo" fi else info "Remote '$GIT_REMOTE_NAME' already set." git remote set-url "$GIT_REMOTE_NAME" "$SSH_REMOTE_URL" fi # ──────────────── # Commit Changes # ──────────────── 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 via SSH # ──────────────── 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 via SSH to '$GIT_REMOTE_NAME'..." git push "$GIT_REMOTE_NAME" "$BRANCH" || error "Push failed" fi info "✅ Sync complete: $SSH_REMOTE_URL"