git-sigil/gitfield-radicle
Mark Randall Havens f780de2146 test
2025-05-30 07:50:09 -05:00

145 lines
6.2 KiB
Bash
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
# ╭─────────────────────────────╮
# │ Config & Constants │
# ╰─────────────────────────────╯
PROJECT_NAME=$(basename "$(pwd)")
DEFAULT_NAME="Mark Randall Havens"
DEFAULT_EMAIL="mark.r.havens@gmail.com"
RAD_HOME="$HOME/.radicle"
RAD_BIN="$RAD_HOME/bin/rad"
RAD_KEYS="$RAD_HOME/keys.json"
RAD_BACKUP=".radicle-backup/keys.json"
RAD_PATH_LINE='export PATH="$HOME/.radicle/bin:$PATH"'
PROFILE_FILE="$HOME/.bashrc"
RAD_PUSH_FILE=".radicle-push-done"
# ╭─────────────────────────────╮
# │ Logging │
# ╰─────────────────────────────╯
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 + Tools Check │
# ╰─────────────────────────────╯
info "Checking Git..."
if ! command -v git &>/dev/null; then
info "Installing Git..."
sudo apt update && sudo apt install -y git || error "Failed to install Git"
fi
info "Git version: $(git --version)"
NAME=$(git config --global user.name || true)
EMAIL=$(git config --global user.email || true)
[[ -z "$NAME" || -z "$EMAIL" ]] && {
info "Configuring Git identity..."
git config --global user.name "$DEFAULT_NAME"
git config --global user.email "$DEFAULT_EMAIL"
}
info "Git identity: $(git config --global user.name) <$(git config --global user.email)>"
# ╭─────────────────────────────╮
# │ Install Radicle CLI │
# ╰─────────────────────────────╯
if [ ! -x "$RAD_BIN" ]; then
info "Installing Radicle CLI from official script..."
sudo apt install -y curl jq unzip || error "Missing dependencies"
curl -sSf https://radicle.xyz/install | sh || error "Radicle CLI install failed"
fi
# ╭───────────────────────────────────────────────────────╮
# │ PATH Handling: Make rad command Just Work™
# ╰───────────────────────────────────────────────────────╯
if ! command -v rad &>/dev/null; then
if [[ ":$PATH:" != *":$HOME/.radicle/bin:"* ]]; then
export PATH="$HOME/.radicle/bin:$PATH"
info "→ Temporarily patched PATH for this session"
fi
fi
if ! grep -Fxq "$RAD_PATH_LINE" "$PROFILE_FILE"; then
echo "$RAD_PATH_LINE" >> "$PROFILE_FILE"
info "→ Added PATH to $PROFILE_FILE"
warn "→ Please run: source $PROFILE_FILE (or restart terminal) to make 'rad' globally available."
fi
if ! command -v rad &>/dev/null; then
error "'rad' CLI not available. Even after PATH patch. Try opening a new terminal or sourcing ~/.bashrc"
fi
info "Radicle CLI ready: $(rad --version)"
# ╭─────────────────────────────╮
# │ Radicle Identity Restore │
# ╰─────────────────────────────╯
mkdir -p "$(dirname "$RAD_BACKUP")"
if [ ! -f "$RAD_KEYS" ]; then
if [ -f "$RAD_BACKUP" ]; then
info "Injecting Radicle identity from backup..."
cp "$RAD_BACKUP" "$RAD_KEYS" || error "Failed to restore keys"
else
info "Creating new Radicle identity..."
rad auth || error "Radicle identity creation failed"
cp "$RAD_KEYS" "$RAD_BACKUP" || warn "Backup of new identity failed"
fi
else
info "Radicle identity already present."
fi
# ╭─────────────────────────────╮
# │ Radicle Node Start │
# ╰─────────────────────────────╯
pgrep -f "rad node start" &>/dev/null || {
info "Starting Radicle node..."
nohup rad node start > /dev/null 2>&1 &
sleep 3
}
# ╭─────────────────────────────╮
# │ Git Repo Initialization │
# ╰─────────────────────────────╯
if [ ! -d .git ]; then
git init
git add . || warn "Nothing to add"
git commit -m "Initial commit" || warn "Nothing to commit"
else
info "Git repo already initialized."
fi
# ╭─────────────────────────────╮
# │ Radicle Project Init │
# ╰─────────────────────────────╯
if ! rad projects | grep -q "$PROJECT_NAME"; then
info "Registering Radicle project '$PROJECT_NAME'..."
rad init --name "$PROJECT_NAME" --description "Radicle sovereign project for $PROJECT_NAME" || warn "Project may already exist"
else
info "Project '$PROJECT_NAME' already registered."
fi
# ╭─────────────────────────────╮
# │ Push to the Network │
# ╰─────────────────────────────╯
if [ ! -f "$RAD_PUSH_FILE" ]; then
info "Pushing project to Radicle network..."
if rad sync; then
touch "$RAD_PUSH_FILE"
info "✓ Project replicated successfully."
else
warn "Radicle push failed or already synced."
fi
else
info "Push previously completed. Skipping."
fi
# ╭─────────────────────────────╮
# │ Final Output Block │
# ╰─────────────────────────────╯
PROJECT_ID=$(rad self | grep 'Project ID' | awk '{print $NF}' || true)
PEER_ID=$(rad self | grep 'Peer ID' | awk '{print $NF}' || true)
[[ -n "$PROJECT_ID" ]] && info "✓ Project ID: $PROJECT_ID"
[[ -n "$PEER_ID" ]] && info "→ Peer ID: $PEER_ID (Share to connect)"