#!/bin/bash set -euo pipefail IFS=$'\n\t' # ╭───────────────────────────────╮ # │ Configuration │ # ╰───────────────────────────────╯ CONFIG_DIR="$HOME/.gitfield" CONFIG_FILE="$CONFIG_DIR/config" REPO_NAME=$(basename "$(pwd)") DEFAULT_NAME="Mark Randall Havens" DEFAULT_EMAIL="mark.r.havens@gmail.com" # ╭───────────────────────────────╮ # │ Logging Utils │ # ╰───────────────────────────────╯ 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; } # ╭───────────────────────────────╮ # │ Shared Functions │ # ╰───────────────────────────────╯ setup_git() { command -v git >/dev/null || { sudo apt update && sudo apt install -y git || error "Git install failed"; } git config --global user.name "$DEFAULT_NAME" git config --global user.email "$DEFAULT_EMAIL" [ -d .git ] || { git init; git add .; git commit -m "Initial commit" || warn "Nothing to commit"; } } setup_ssh() { [ -f ~/.ssh/id_ed25519 ] || { ssh-keygen -t ed25519 -C "$DEFAULT_EMAIL" -f ~/.ssh/id_ed25519 -N "" eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 } } commit_changes() { if ! git diff --quiet || ! git diff --cached --quiet; then git add . && git commit -m "Update: $(date '+%Y-%m-%d %H:%M:%S')" || warn "Nothing to commit" else info "No uncommitted changes." fi } # ╭───────────────────────────────╮ # │ Platform Functions │ # ╰───────────────────────────────╯ bitbucket_init() { local user workspace app_pass_file remote web_url user=$(grep -A4 "\[bitbucket\]" "$CONFIG_FILE" | grep "username" | cut -d'=' -f2) workspace=$(grep -A4 "\[bitbucket\]" "$CONFIG_FILE" | grep "workspace" | cut -d'=' -f2) app_pass_file=$(grep -A4 "\[bitbucket\]" "$CONFIG_FILE" | grep "app_password_file" | cut -d'=' -f2) remote=$(grep -A4 "\[bitbucket\]" "$CONFIG_FILE" | grep "remote" | cut -d'=' -f2) web_url=$(grep -A4 "\[bitbucket\]" "$CONFIG_FILE" | grep "web_url" | cut -d'=' -f2) # Bitbucket-specific setup (e.g., app password, repo creation) # ... info "Bitbucket: $(git remote get-url "$remote" 2>/dev/null || echo "Not set")" info "Web: $(printf "$web_url" "$REPO_NAME")" } github_init() { # Similar setup for GitHub # ... } gitlab_init() { # Similar setup for GitLab # ... } radicle_init() { # Similar setup for Radicle # ... } # ╭───────────────────────────────╮ # │ Main Logic │ # ╰───────────────────────────────╯ mkdir -p "$CONFIG_DIR" [ -f "$CONFIG_FILE" ] || { echo "[bitbucket]\n...\n[github]\n...\n[gitlab]\n...\n[radicle]\n..." > "$CONFIG_FILE"; } case "${1:-status}" in status) setup_git info "Git Repository Status" git status --short info "Branch: $(git rev-parse --abbrev-ref HEAD)" info "Configured Remotes" bitbucket_init github_init gitlab_init radicle_init ;; push) setup_git setup_ssh commit_changes bitbucket_push github_push gitlab_push radicle_push info "All remotes synced." ;; configure) # Prompt for credentials and update $CONFIG_FILE ;; *) error "Usage: gitfield [status|push|configure]" ;; esac