diff --git a/gitfield-bitbucket b/gitfield-bitbucket index 8441213..a7e3f3c 100755 --- a/gitfield-bitbucket +++ b/gitfield-bitbucket @@ -15,6 +15,7 @@ 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 │ @@ -23,6 +24,25 @@ 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 │ # ╰─────────────────────────────────────╯ @@ -58,10 +78,7 @@ if ssh -T git@bitbucket.org 2>&1 | grep -q "authenticated"; then else warn "❌ SSH key not authorized with Bitbucket." echo "→ Visit: https://bitbucket.org/account/settings/ssh-keys/" - echo "→ Paste this key:" - echo cat ~/.ssh/id_rsa.pub - echo exit 1 fi @@ -69,28 +86,21 @@ fi # │ BITBUCKET APP PASSWORD SETUP │ # ╰─────────────────────────────────────╯ if [ ! -f "$APP_PASS_FILE" ]; then - echo 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" - echo - info "App password saved at $APP_PASS_FILE" fi - APP_PASS=$(<"$APP_PASS_FILE") # ╭─────────────────────────────────────╮ # │ GIT INIT & COMMIT │ # ╰─────────────────────────────────────╯ if [ ! -d .git ]; then - info "Initializing Git repository..." git init - git add . || warn "Nothing to add" - git commit -m "Initial commit" || warn "Nothing to commit" -else - info "✓ Git repo already initialized." + git add . + git commit -m "Initial commit" fi # ╭─────────────────────────────────────╮ @@ -98,41 +108,29 @@ fi # ╰─────────────────────────────────────╯ REPO_EXISTS=$(curl -s -u "$BITBUCKET_USER:$APP_PASS" "$API_URL" | jq -r '.name // empty') if [ -z "$REPO_EXISTS" ]; then - info "Creating Bitbucket repository '$REPO_NAME'..." - CREATE_RESPONSE=$(curl -s -w "%{http_code}" -o /tmp/create_resp.txt -u "$BITBUCKET_USER:$APP_PASS" -X POST "$API_URL" \ + curl -s -u "$BITBUCKET_USER:$APP_PASS" -X POST "$API_URL" \ -H "Content-Type: application/json" \ - -d "{\"scm\": \"git\", \"is_private\": false}") - if [[ "$CREATE_RESPONSE" != "200" && "$CREATE_RESPONSE" != "201" ]]; then - cat /tmp/create_resp.txt - error "Failed to create repository (HTTP $CREATE_RESPONSE)" - fi - info "✓ Repository created." -else - info "✓ Remote Bitbucket repo already exists." + -d '{"scm": "git", "is_private": false}' fi -# ╭─────────────────────────────────────╮ -# │ REMOTE VALIDATION + SETUP │ -# ╰─────────────────────────────────────╯ -EXPECTED_REMOTE="$SSH_REMOTE" -CURRENT_REMOTE=$(git remote get-url "$REMOTE_NAME" 2>/dev/null || echo "") -if [[ "$CURRENT_REMOTE" != "$EXPECTED_REMOTE" ]]; then - if [ -n "$CURRENT_REMOTE" ]; then - warn "Removing incorrect remote: $CURRENT_REMOTE" - git remote remove "$REMOTE_NAME" - fi - info "Setting correct Bitbucket remote: $EXPECTED_REMOTE" - git remote add "$REMOTE_NAME" "$EXPECTED_REMOTE" -else - info "✓ Remote already correctly set to: $EXPECTED_REMOTE" -fi +git remote remove "$REMOTE_NAME" 2>/dev/null || true +git remote add "$REMOTE_NAME" "$SSH_REMOTE" # ╭─────────────────────────────────────╮ -# │ WRITE BITBUCKET-SPECIFIC MARKDOWN │ +# │ WRITE METADATA MARKDOWN │ # ╰─────────────────────────────────────╯ MARKDOWN_FILE=".bitbucket-link.md" -TIMESTAMP="$(date '+%Y-%m-%d %H:%M:%S')" -info "Creating Bitbucket markdown reference: $MARKDOWN_FILE" +TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') +DEFAULT_BRANCH=$(git symbolic-ref --short HEAD) +REPO_PATH=$(pwd) +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" < "$MARKDOWN_FILE" <> "$MARKDOWN_FILE" -echo "- **Commit URL**: [$WEB_LINK/commits/$LATEST_SHA]($WEB_LINK/commits/$LATEST_SHA)" >> "$MARKDOWN_FILE" -echo -e "\n_Auto-generated by \`gitfield-bitbucket\` push script._" >> "$MARKDOWN_FILE" +--- + +## 📦 Commit Info + +- **Commit Timestamp**: \`$TIMESTAMP\` +- **Last Commit SHA**: \`$LATEST_SHA\` +- **Commit Message**: \`$LAST_COMMIT_MSG\` +- **Commit Author**: \`$LAST_COMMIT_AUTHOR\` +- **Commit Date**: \`$LAST_COMMIT_DATE\` +- **Commit URL**: [$WEB_LINK/commits/$LATEST_SHA]($WEB_LINK/commits/$LATEST_SHA) + +--- + +## 📊 Repo Status + +- **Total Commits**: \`$TOTAL_COMMITS\` +- **Tracked Files**: \`$TRACKED_FILES\` +- **Uncommitted Changes**: \`$UNCOMMITTED\` +- **Latest Tag**: \`$LATEST_TAG\` + +--- + +## 🧭 Environment + +- **Host Machine**: \`$HOSTNAME\` +- **Current User**: \`$CURRENT_USER\` +- **Time Zone**: \`$TIMEZONE\` +- **Script Version**: \`v$SCRIPT_VERSION\` + +--- + +## 🧬 Hardware & OS Fingerprint + +- **OS Name**: \`$OS_NAME\` +- **OS Version**: \`$OS_PRETTY_NAME\` +- **Kernel Version**: \`$KERNEL_VERSION\` +- **Architecture**: \`$ARCHITECTURE\` +- **CPU Model**: \`$CPU_MODEL\` +- **Total RAM (GB)**: \`$TOTAL_RAM\` +- **MAC Address**: \`$MAC_ADDRESS\` +- **Local IP**: \`$LOCAL_IP\` +- **Running in Docker**: \`$DOCKER_CHECK\` +- **Running in WSL**: \`$WSL_CHECK\` +- **Virtual Machine**: \`$VM_CHECK\` +- **System Uptime**: \`$UPTIME\` + +--- + +_Auto-generated by \`gitfield-bitbucket\` push script._ +EOF git add "$MARKDOWN_FILE" git commit -m "Bitbucket metadata link commit at $TIMESTAMP" || warn "No changes to commit for $MARKDOWN_FILE" -# ╭─────────────────────────────────────╮ -# │ COMMIT + PUSH LOGIC │ -# ╰─────────────────────────────────────╯ -BRANCH=$(git rev-parse --abbrev-ref HEAD) -if ! git config --get branch."$BRANCH".remote &>/dev/null; then - info "Pushing with upstream..." - git push -u "$REMOTE_NAME" "$BRANCH" || error "Push failed" -else - info "Pushing to $REMOTE_NAME/$BRANCH..." - git push "$REMOTE_NAME" "$BRANCH" || error "Push failed" -fi - -info "✅ Bitbucket push complete." +git push -u "$REMOTE_NAME" "$DEFAULT_BRANCH" echo -e "\n🔗 View in browser: $WEB_LINK\n" -