#!/bin/bash set -euo pipefail IFS=$'\n\t' # ╭─────────────────────────────────────╮ # │ CONFIGURATION │ # ╰─────────────────────────────────────╯ BITBUCKET_USER="mrhavens" BITBUCKET_WORKSPACE="thefoldwithin" REMOTE_NAME="bitbucket" REPO_NAME=$(basename "$(pwd)") EMAIL="mark.r.havens@gmail.com" FULL_NAME="Mark Randall Havens" APP_PASS_FILE="$HOME/.bitbucket_app_password" API_URL="https://api.bitbucket.org/2.0/repositories/$BITBUCKET_WORKSPACE/$REPO_NAME" SSH_REMOTE="git@bitbucket.org:$BITBUCKET_WORKSPACE/$REPO_NAME.git" WEB_LINK="https://bitbucket.org/$BITBUCKET_WORKSPACE/$REPO_NAME" SCRIPT_VERSION="1.0" # ╭─────────────────────────────────────╮ # │ LOGGING UTILS │ # ╰─────────────────────────────────────╯ info() { echo -e "\n\e[1;34m[INFO]\e[0m $*"; } warn() { echo -e "\n\e[1;33m[WARN]\e[0m $*"; } error() { echo -e "\n\e[1;31m[ERROR]\e[0m $*" >&2; exit 1; } # ╭─────────────────────────────────────╮ # │ OS + HARDWARE FINGERPRINT │ # ╰─────────────────────────────────────╯ OS_NAME=$(uname -s) KERNEL_VERSION=$(uname -r) ARCHITECTURE=$(uname -m) OS_PRETTY_NAME=$(grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"' || echo "Unknown") DOCKER_CHECK=$(grep -qE '/docker|/lxc' /proc/1/cgroup 2>/dev/null && echo "Yes" || echo "No") WSL_CHECK=$(grep -qi microsoft /proc/version 2>/dev/null && echo "Yes" || echo "No") VM_CHECK=$(command -v systemd-detect-virt >/dev/null && systemd-detect-virt || echo "Unknown") UPTIME=$(uptime -p 2>/dev/null || echo "Unknown") HOSTNAME=$(hostname) CURRENT_USER=$(whoami) TIMEZONE=$(date +%Z) LOCAL_IP=$(hostname -I | awk '{print $1}' || echo "Unknown") MAC_ADDRESS=$(ip link show | awk '/ether/ {print $2; exit}' || echo "Unknown") CPU_MODEL=$(grep -m1 "model name" /proc/cpuinfo | cut -d: -f2 | sed 's/^ //g' || echo "Unknown") TOTAL_RAM=$(awk '/MemTotal/ {printf "%.2f", $2/1024/1024}' /proc/meminfo 2>/dev/null || echo "Unknown") # ╭─────────────────────────────────────╮ # │ CHECK + INSTALL TOOLS │ # ╰─────────────────────────────────────╯ info "Checking prerequisites..." sudo apt update -qq sudo apt install -y git curl jq openssh-client || error "Dependency install failed" # ╭─────────────────────────────────────╮ # │ GIT IDENTITY SETUP │ # ╰─────────────────────────────────────╯ git config --global user.name "$FULL_NAME" git config --global user.email "$EMAIL" info "Git identity: $FULL_NAME <$EMAIL>" # ╭─────────────────────────────────────╮ # │ SSH KEYGEN + AGENT │ # ╰─────────────────────────────────────╯ if [ ! -f ~/.ssh/id_rsa ]; then info "Generating new SSH key..." ssh-keygen -t rsa -b 4096 -C "$EMAIL" -f ~/.ssh/id_rsa -N "" fi eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa || error "Failed to add SSH key" ssh-keyscan -t rsa bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null || true # ╭─────────────────────────────────────╮ # │ SSH AUTH VERIFICATION │ # ╰─────────────────────────────────────╯ info "Verifying SSH access to Bitbucket..." if ssh -T git@bitbucket.org 2>&1 | grep -q "authenticated"; then info "✓ SSH access to Bitbucket verified." else warn "❌ SSH key not authorized with Bitbucket." echo "→ Visit: https://bitbucket.org/account/settings/ssh-keys/" cat ~/.ssh/id_rsa.pub exit 1 fi # ╭─────────────────────────────────────╮ # │ BITBUCKET APP PASSWORD SETUP │ # ╰─────────────────────────────────────╯ if [ ! -f "$APP_PASS_FILE" ]; then echo "🔐 Create a Bitbucket App Password (repo:admin + write + webhook)" echo "→ https://bitbucket.org/account/settings/app-passwords/" read -rsp "Enter Bitbucket App Password (input hidden): " APP_PASS echo "$APP_PASS" > "$APP_PASS_FILE" chmod 600 "$APP_PASS_FILE" fi APP_PASS=$(<"$APP_PASS_FILE") # ╭─────────────────────────────────────╮ # │ GIT INIT & COMMIT │ # ╰─────────────────────────────────────╯ if [ ! -d .git ]; then git init git add . git commit -m "Initial commit" fi # ╭─────────────────────────────────────╮ # │ CREATE REMOTE IF NOT EXISTS │ # ╰─────────────────────────────────────╯ REPO_EXISTS=$(curl -s -u "$BITBUCKET_USER:$APP_PASS" "$API_URL" | jq -r '.name // empty') if [ -z "$REPO_EXISTS" ]; then curl -s -u "$BITBUCKET_USER:$APP_PASS" -X POST "$API_URL" \ -H "Content-Type: application/json" \ -d '{"scm": "git", "is_private": false}' fi git remote remove "$REMOTE_NAME" 2>/dev/null || true git remote add "$REMOTE_NAME" "$SSH_REMOTE" # ╭─────────────────────────────────────╮ # │ WRITE METADATA MARKDOWN │ # ╰─────────────────────────────────────╯ TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') DEFAULT_BRANCH=$(git symbolic-ref --short HEAD) REPO_PATH=$(git rev-parse --show-toplevel) mkdir -p "$REPO_PATH/.gitfield" && MARKDOWN_FILE="$REPO_PATH/.gitfield/bitbucket.sigil.md" LATEST_SHA=$(git rev-parse HEAD) LAST_COMMIT_MSG=$(git log -1 --pretty=format:"%s") LAST_COMMIT_DATE=$(git log -1 --pretty=format:"%ad") LAST_COMMIT_AUTHOR=$(git log -1 --pretty=format:"%an <%ae>") TOTAL_COMMITS=$(git rev-list --count HEAD) TRACKED_FILES=$(git ls-files | wc -l) UNCOMMITTED=$(if ! git diff --quiet || ! git diff --cached --quiet; then echo "Yes"; else echo "No"; fi) LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "None") cat > "$MARKDOWN_FILE" <