diff --git a/.gitfield/config b/.gitfield/config new file mode 100644 index 0000000..3018a71 --- /dev/null +++ b/.gitfield/config @@ -0,0 +1,21 @@ +[bitbucket] +username=mrhavens +workspace=thefoldwithin +app_password_file=~/.bitbucket_app_password +remote=bitbucket +web_url=https://bitbucket.org/thefoldwithin/%s + +[github] +username=mrhavens +remote=github +web_url=https://github.com/mrhavens/%s + +[gitlab] +username=mrhavens +token_file=~/.gitfield_token +remote=gitlab +web_url=https://gitlab.com/mrhavens/%s + +[radicle] +remote=radicle +home=~/.radicle diff --git a/.radicle-push-state b/.radicle-push-state index ea97f3a..43553c4 100644 --- a/.radicle-push-state +++ b/.radicle-push-state @@ -1 +1 @@ -ceabc8af9414289cd0e0795f574ca6afc8523032 +245e862fb584e99bc55590a0cb82f432b841d97e diff --git a/gitfield b/gitfield new file mode 100755 index 0000000..d5e5524 --- /dev/null +++ b/gitfield @@ -0,0 +1,112 @@ +#!/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