gitfield-bitbucket
1 #!/bin/bash 2 set -euo pipefail 3 IFS=$'\n\t' 4 5 # ╭─────────────────────────────────────╮ 6 # │ CONFIGURATION │ 7 # ╰─────────────────────────────────────╯ 8 BITBUCKET_USER="mrhavens" 9 BITBUCKET_WORKSPACE="thefoldwithin" 10 REMOTE_NAME="bitbucket" 11 REPO_NAME=$(basename "$(pwd)") 12 EMAIL="mark.r.havens@gmail.com" 13 FULL_NAME="Mark Randall Havens" 14 APP_PASS_FILE="$HOME/.bitbucket_app_password" 15 API_URL="https://api.bitbucket.org/2.0/repositories/$BITBUCKET_WORKSPACE/$REPO_NAME" 16 SSH_REMOTE="git@bitbucket.org:$BITBUCKET_WORKSPACE/$REPO_NAME.git" 17 WEB_LINK="https://bitbucket.org/$BITBUCKET_WORKSPACE/$REPO_NAME" 18 SCRIPT_VERSION="1.0" 19 20 # ╭─────────────────────────────────────╮ 21 # │ LOGGING UTILS │ 22 # ╰─────────────────────────────────────╯ 23 info() { echo -e "\n\e[1;34m[INFO]\e[0m $*"; } 24 warn() { echo -e "\n\e[1;33m[WARN]\e[0m $*"; } 25 error() { echo -e "\n\e[1;31m[ERROR]\e[0m $*" >&2; exit 1; } 26 27 # ╭─────────────────────────────────────╮ 28 # │ OS + HARDWARE FINGERPRINT │ 29 # ╰─────────────────────────────────────╯ 30 OS_NAME=$(uname -s) 31 KERNEL_VERSION=$(uname -r) 32 ARCHITECTURE=$(uname -m) 33 OS_PRETTY_NAME=$(grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d '"' || echo "Unknown") 34 DOCKER_CHECK=$(grep -qE '/docker|/lxc' /proc/1/cgroup 2>/dev/null && echo "Yes" || echo "No") 35 WSL_CHECK=$(grep -qi microsoft /proc/version 2>/dev/null && echo "Yes" || echo "No") 36 VM_CHECK=$(command -v systemd-detect-virt >/dev/null && systemd-detect-virt || echo "Unknown") 37 UPTIME=$(uptime -p 2>/dev/null || echo "Unknown") 38 HOSTNAME=$(hostname) 39 CURRENT_USER=$(whoami) 40 TIMEZONE=$(date +%Z) 41 LOCAL_IP=$(hostname -I | awk '{print $1}' || echo "Unknown") 42 MAC_ADDRESS=$(ip link show | awk '/ether/ {print $2; exit}' || echo "Unknown") 43 CPU_MODEL=$(grep -m1 "model name" /proc/cpuinfo | cut -d: -f2 | sed 's/^ //g' || echo "Unknown") 44 TOTAL_RAM=$(awk '/MemTotal/ {printf "%.2f", $2/1024/1024}' /proc/meminfo 2>/dev/null || echo "Unknown") 45 46 # ╭─────────────────────────────────────╮ 47 # │ CHECK + INSTALL TOOLS │ 48 # ╰─────────────────────────────────────╯ 49 info "Checking prerequisites..." 50 sudo apt update -qq 51 sudo apt install -y git curl jq openssh-client || error "Dependency install failed" 52 53 # ╭─────────────────────────────────────╮ 54 # │ GIT IDENTITY SETUP │ 55 # ╰─────────────────────────────────────╯ 56 git config --global user.name "$FULL_NAME" 57 git config --global user.email "$EMAIL" 58 info "Git identity: $FULL_NAME <$EMAIL>" 59 60 # ╭─────────────────────────────────────╮ 61 # │ SSH KEYGEN + AGENT │ 62 # ╰─────────────────────────────────────╯ 63 if [ ! -f ~/.ssh/id_rsa ]; then 64 info "Generating new SSH key..." 65 ssh-keygen -t rsa -b 4096 -C "$EMAIL" -f ~/.ssh/id_rsa -N "" 66 fi 67 68 eval "$(ssh-agent -s)" 69 ssh-add ~/.ssh/id_rsa || error "Failed to add SSH key" 70 ssh-keyscan -t rsa bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null || true 71 72 # ╭─────────────────────────────────────╮ 73 # │ SSH AUTH VERIFICATION │ 74 # ╰─────────────────────────────────────╯ 75 info "Verifying SSH access to Bitbucket..." 76 if ssh -T git@bitbucket.org 2>&1 | grep -q "authenticated"; then 77 info "✓ SSH access to Bitbucket verified." 78 else 79 warn "❌ SSH key not authorized with Bitbucket." 80 echo "→ Visit: https://bitbucket.org/account/settings/ssh-keys/" 81 cat ~/.ssh/id_rsa.pub 82 exit 1 83 fi 84 85 # ╭─────────────────────────────────────╮ 86 # │ BITBUCKET APP PASSWORD SETUP │ 87 # ╰─────────────────────────────────────╯ 88 if [ ! -f "$APP_PASS_FILE" ]; then 89 echo "🔐 Create a Bitbucket App Password (repo:admin + write + webhook)" 90 echo "→ https://bitbucket.org/account/settings/app-passwords/" 91 read -rsp "Enter Bitbucket App Password (input hidden): " APP_PASS 92 echo "$APP_PASS" > "$APP_PASS_FILE" 93 chmod 600 "$APP_PASS_FILE" 94 fi 95 APP_PASS=$(<"$APP_PASS_FILE") 96 97 # ╭─────────────────────────────────────╮ 98 # │ GIT INIT & COMMIT │ 99 # ╰─────────────────────────────────────╯ 100 if [ ! -d .git ]; then 101 git init 102 git add . 103 git commit -m "Initial commit" 104 fi 105 106 # ╭─────────────────────────────────────╮ 107 # │ CREATE REMOTE IF NOT EXISTS │ 108 # ╰─────────────────────────────────────╯ 109 REPO_EXISTS=$(curl -s -u "$BITBUCKET_USER:$APP_PASS" "$API_URL" | jq -r '.name // empty') 110 if [ -z "$REPO_EXISTS" ]; then 111 curl -s -u "$BITBUCKET_USER:$APP_PASS" -X POST "$API_URL" \ 112 -H "Content-Type: application/json" \ 113 -d '{"scm": "git", "is_private": false}' 114 fi 115 116 git remote remove "$REMOTE_NAME" 2>/dev/null || true 117 git remote add "$REMOTE_NAME" "$SSH_REMOTE" 118 119 # ╭─────────────────────────────────────╮ 120 # │ WRITE METADATA MARKDOWN │ 121 # ╰─────────────────────────────────────╯ 122 TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') 123 DEFAULT_BRANCH=$(git symbolic-ref --short HEAD) 124 REPO_PATH=$(git rev-parse --show-toplevel) 125 mkdir -p "$REPO_PATH/.gitfield" && MARKDOWN_FILE="$REPO_PATH/.gitfield/bitbucket.sigil.md" 126 LATEST_SHA=$(git rev-parse HEAD) 127 LAST_COMMIT_MSG=$(git log -1 --pretty=format:"%s") 128 LAST_COMMIT_DATE=$(git log -1 --pretty=format:"%ad") 129 LAST_COMMIT_AUTHOR=$(git log -1 --pretty=format:"%an <%ae>") 130 TOTAL_COMMITS=$(git rev-list --count HEAD) 131 TRACKED_FILES=$(git ls-files | wc -l) 132 UNCOMMITTED=$(if ! git diff --quiet || ! git diff --cached --quiet; then echo "Yes"; else echo "No"; fi) 133 LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "None") 134 135 cat > "$MARKDOWN_FILE" <<EOF 136 # 🔗 Bitbucket Repository Link 137 138 - **Repo Name**: \`$REPO_NAME\` 139 - **Bitbucket Workspace**: \`$BITBUCKET_WORKSPACE\` 140 - **Remote URL**: [$WEB_LINK]($WEB_LINK) 141 - **Local Repo Path**: \`$REPO_PATH\` 142 - **Remote Label**: \`$REMOTE_NAME\` 143 - **Default Branch**: \`$DEFAULT_BRANCH\` 144 - **This Commit Date**: \`$TIMESTAMP\` 145 146 --- 147 148 ## 📦 Commit Info 149 150 - **This Commit Timestamp**: \`$TIMESTAMP\` 151 - **Last Commit SHA**: \`$LATEST_SHA\` 152 - **Last Commit Message**: \`$LAST_COMMIT_MSG\` 153 - **Last Commit Author**: \`$LAST_COMMIT_AUTHOR\` 154 - **Last Commit Date**: \`$LAST_COMMIT_DATE\` 155 - **This Commit URL**: [$WEB_LINK/commits/$LATEST_SHA]($WEB_LINK/commits/$LATEST_SHA) 156 157 --- 158 159 ## 📊 Repo Status 160 161 - **Total Commits**: \`$TOTAL_COMMITS\` 162 - **Tracked Files**: \`$TRACKED_FILES\` 163 - **Uncommitted Changes**: \`$UNCOMMITTED\` 164 - **Latest Tag**: \`$LATEST_TAG\` 165 166 --- 167 168 ## 🧭 Environment 169 170 - **Host Machine**: \`$HOSTNAME\` 171 - **Current User**: \`$CURRENT_USER\` 172 - **Time Zone**: \`$TIMEZONE\` 173 - **Script Version**: \`v$SCRIPT_VERSION\` 174 175 --- 176 177 ## 🧬 Hardware & OS Fingerprint 178 179 - **OS Name**: \`$OS_NAME\` 180 - **OS Version**: \`$OS_PRETTY_NAME\` 181 - **Kernel Version**: \`$KERNEL_VERSION\` 182 - **Architecture**: \`$ARCHITECTURE\` 183 - **CPU Model**: \`$CPU_MODEL\` 184 - **Total RAM (GB)**: \`$TOTAL_RAM\` 185 - **MAC Address**: \`$MAC_ADDRESS\` 186 - **Local IP**: \`$LOCAL_IP\` 187 - **Running in Docker**: \`$DOCKER_CHECK\` 188 - **Running in WSL**: \`$WSL_CHECK\` 189 - **Virtual Machine**: \`$VM_CHECK\` 190 - **System Uptime**: \`$UPTIME\` 191 192 --- 193 194 _Auto-generated by \`gitfield-bitbucket\` push script._ 195 EOF 196 197 git add "$MARKDOWN_FILE" 198 git commit -m "Bitbucket metadata link commit at $TIMESTAMP — $WEB_LINK/commits/$LATEST_SHA" || warn "No changes to commit for $MARKDOWN_FILE" 199 200 git push -u "$REMOTE_NAME" "$DEFAULT_BRANCH" 201 echo -e "\n🔗 View in browser: $WEB_LINK\n"