112 lines
3.8 KiB
Bash
Executable file
112 lines
3.8 KiB
Bash
Executable file
#!/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
|