/ bin / gitfield-bitbucket
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"