diff --git a/.gitfield/bitbucket.sigil.md b/.gitfield/bitbucket.sigil.md index 6e3d56f..d986867 100644 --- a/.gitfield/bitbucket.sigil.md +++ b/.gitfield/bitbucket.sigil.md @@ -6,24 +6,24 @@ - **Local Repo Path**: `/home/mrhavens/narcwork/NarcStudy_ElenaByron` - **Remote Label**: `bitbucket` - **Default Branch**: `main` -- **This Commit Date**: `2025-06-04 18:03:32` +- **This Commit Date**: `2025-06-04 18:02:34` --- ## ๐Ÿ“ฆ Commit Info -- **This Commit Timestamp**: `2025-06-04 18:03:32` -- **Last Commit SHA**: `4ebd13ca9456268bed3c5b367627d9fa07f8d7c8` +- **This Commit Timestamp**: `2025-06-04 18:02:34` +- **Last Commit SHA**: `43ac425257f487dcc700c67d5d3d89b9e8843cda` - **Last Commit Message**: `Post-GitLab sync at 2025-06-04 18:00:49` - **Last Commit Author**: `Mark Randall Havens ` -- **Last Commit Date**: `Wed Jun 4 18:03:17 2025 -0500` -- **This Commit URL**: [https://bitbucket.org/thefoldwithin/NarcStudy_ElenaByron/commits/4ebd13ca9456268bed3c5b367627d9fa07f8d7c8](https://bitbucket.org/thefoldwithin/NarcStudy_ElenaByron/commits/4ebd13ca9456268bed3c5b367627d9fa07f8d7c8) +- **Last Commit Date**: `Wed Jun 4 18:02:10 2025 -0500` +- **This Commit URL**: [https://bitbucket.org/thefoldwithin/NarcStudy_ElenaByron/commits/43ac425257f487dcc700c67d5d3d89b9e8843cda](https://bitbucket.org/thefoldwithin/NarcStudy_ElenaByron/commits/43ac425257f487dcc700c67d5d3d89b9e8843cda) --- ## ๐Ÿ“Š Repo Status -- **Total Commits**: `43` +- **Total Commits**: `36` - **Tracked Files**: `46` - **Uncommitted Changes**: `No` - **Latest Tag**: `None` @@ -52,7 +52,7 @@ - **Running in Docker**: `No` - **Running in WSL**: `Yes` - **Virtual Machine**: `wsl` -- **System Uptime**: `up 18 hours, 24 minutes` +- **System Uptime**: `up 18 hours, 23 minutes` --- diff --git a/.gitfield/github.sigil.md b/.gitfield/github.sigil.md index 0e5699b..cd8f26b 100644 --- a/.gitfield/github.sigil.md +++ b/.gitfield/github.sigil.md @@ -6,24 +6,24 @@ - **Local Repo Path**: `/home/mrhavens/narcwork/NarcStudy_ElenaByron` - **Remote Label**: `github` - **Default Branch**: `main` -- **This Commit Date**: `2025-06-04 18:03:54` +- **This Commit Date**: `2025-06-04 18:02:52` --- ## ๐Ÿ“ฆ Commit Info -- **This Commit Timestamp**: `2025-06-04 18:03:54` -- **Last Commit SHA**: `646bbd0764f3cccb366f58f82a7455e6c72a7508` +- **This Commit Timestamp**: `2025-06-04 18:02:52` +- **Last Commit SHA**: `28a0868dbcd80e19b625967d536bed5d05bfd619` - **Last Commit Message**: `Post-Bitbucket sync at 2025-06-04 18:00:49` - **Last Commit Author**: `Mark Randall Havens ` -- **Last Commit Date**: `Wed Jun 4 18:03:33 2025 -0500` -- **This Commit URL**: [https://github.com/mrhavens/NarcStudy_ElenaByron/commit/646bbd0764f3cccb366f58f82a7455e6c72a7508](https://github.com/mrhavens/NarcStudy_ElenaByron/commit/646bbd0764f3cccb366f58f82a7455e6c72a7508) +- **Last Commit Date**: `Wed Jun 4 18:02:35 2025 -0500` +- **This Commit URL**: [https://github.com/mrhavens/NarcStudy_ElenaByron/commit/28a0868dbcd80e19b625967d536bed5d05bfd619](https://github.com/mrhavens/NarcStudy_ElenaByron/commit/28a0868dbcd80e19b625967d536bed5d05bfd619) --- ## ๐Ÿ“Š Repo Status -- **Total Commits**: `45` +- **Total Commits**: `38` - **Tracked Files**: `46` - **Uncommitted Changes**: `No` - **Latest Tag**: `None` @@ -48,7 +48,7 @@ - **Running in Docker**: `No` - **Running in WSL**: `Yes` - **Virtual Machine**: `wsl` -- **System Uptime**: `up 18 hours, 25 minutes` +- **System Uptime**: `up 18 hours, 24 minutes` - **MAC Address**: `00:15:5d:0e:62:60` - **Local IP**: `172.18.207.124` - **CPU Model**: `AMD A6-3420M APU with Radeon(tm) HD Graphics` diff --git a/.gitfield/gitlab.sigil.md b/.gitfield/gitlab.sigil.md index c189821..95b3fb2 100644 --- a/.gitfield/gitlab.sigil.md +++ b/.gitfield/gitlab.sigil.md @@ -6,24 +6,24 @@ - **Local Repo Path**: `/home/mrhavens/narcwork/NarcStudy_ElenaByron` - **Remote Label**: `gitlab` - **Default Branch**: `main` -- **Repo Created**: `2025-06-04 18:03:15` +- **Repo Created**: `2025-06-04 18:02:08` --- ## ๐Ÿ“ฆ Commit Info -- **This Commit Timestamp**: `2025-06-04 18:03:15` -- **This Commit SHA**: `c899eec3966607ad594e9d9ee32a86db9d3528b1` +- **This Commit Timestamp**: `2025-06-04 18:02:08` +- **This Commit SHA**: `1af00f55aad85e89e9b5b0a686dc382c31eb9376` - **Last Commit Message**: `Post-Radicle sync at 2025-06-04 18:00:49` - **Last Commit Author**: `Mark Randall Havens ` -- **Last Commit Date**: `Wed Jun 4 18:02:53 2025 -0500` -- **This Commit URL**: [https://gitlab.com/mrhavens/NarcStudy_ElenaByron/-/commit/c899eec3966607ad594e9d9ee32a86db9d3528b1](https://gitlab.com/mrhavens/NarcStudy_ElenaByron/-/commit/c899eec3966607ad594e9d9ee32a86db9d3528b1) +- **Last Commit Date**: `Wed Jun 4 18:01:48 2025 -0500` +- **This Commit URL**: [https://gitlab.com/mrhavens/NarcStudy_ElenaByron/-/commit/1af00f55aad85e89e9b5b0a686dc382c31eb9376](https://gitlab.com/mrhavens/NarcStudy_ElenaByron/-/commit/1af00f55aad85e89e9b5b0a686dc382c31eb9376) --- ## ๐Ÿ“Š Repo Status -- **Total Commits**: `41` +- **Total Commits**: `34` - **Tracked Files**: `46` - **Uncommitted Changes**: `No` - **Latest Tag**: `None` @@ -48,7 +48,7 @@ - **Running in Docker**: `No` - **Running in WSL**: `Yes` - **Virtual Machine**: `wsl` -- **System Uptime**: `up 18 hours, 24 minutes` +- **System Uptime**: `up 18 hours, 23 minutes` - **MAC Address**: `00:15:5d:0e:62:60` - **Local IP**: `172.18.207.124` - **CPU Model**: `AMD A6-3420M APU with Radeon(tm) HD Graphics` diff --git a/.gitfield/local.sigil.md b/.gitfield/local.sigil.md deleted file mode 100644 index 66911ed..0000000 --- a/.gitfield/local.sigil.md +++ /dev/null @@ -1,59 +0,0 @@ -# ๐Ÿ”— Local Repository Link - -- **Repo Name**: `NarcStudy_ElenaByron` -- **Local User**: `mrhavens` -- **Remote URL**: `file:///home/mrhavens/git-local-repos/git-sigil.git` -- **Local Repo Path**: `/home/mrhavens/narcwork/NarcStudy_ElenaByron` -- **Remote Label**: `local` -- **Default Branch**: `main` -- **Repo Created**: `2025-06-06 12:58:25` - ---- - -## ๐Ÿ“ฆ Commit Info - -- **This Commit Timestamp**: `2025-06-06 12:58:25` -- **Last Commit SHA**: `721922a23649f4e90b7b6b6dd0172b29fe4c2433` -- **Last Commit Message**: `Post-GitHub sync at 2025-06-04 18:00:49` -- **Last Commit Author**: `Mark Randall Havens ` -- **Last Commit Date**: `Wed Jun 4 18:03:55 2025 -0500` -- **This Commit URL**: `file:///home/mrhavens/git-local-repos/git-sigil.git` - ---- - -## ๐Ÿ“Š Repo Status - -- **Total Commits**: `47` -- **Tracked Files**: `46` -- **Uncommitted Changes**: `Yes` -- **Latest Tag**: `None` - ---- - -## ๐Ÿงญ Environment - -- **Host Machine**: `DESKTOP-E5SGI58` -- **Current User**: `mrhavens` -- **Time Zone**: `CDT` -- **Script Version**: `v1.0` - ---- - -## ๐Ÿงฌ Hardware & OS Fingerprint - -- **OS Name**: `Linux` -- **OS Version**: `Ubuntu 24.04.2 LTS` -- **Kernel Version**: `5.15.167.4-microsoft-standard-WSL2` -- **Architecture**: `x86_64` -- **Running in Docker**: `No` -- **Running in WSL**: `Yes` -- **Virtual Machine**: `wsl` -- **System Uptime**: `up 11 hours, 41 minutes` -- **MAC Address**: `00:15:5d:86:d8:cc` -- **Local IP**: `172.18.207.124` -- **CPU Model**: `AMD A6-3420M APU with Radeon(tm) HD Graphics` -- **Total RAM (GB)**: `3.63` - ---- - -_Auto-generated by `gitfield-local` push script._ diff --git a/.gitfield/push_log.json.tmp b/.gitfield/push_log.json.tmp deleted file mode 100644 index e69de29..0000000 diff --git a/.gitfield/pushed.log b/.gitfield/pushed.log index 6d1bd66..fcabfb1 100644 --- a/.gitfield/pushed.log +++ b/.gitfield/pushed.log @@ -23,10 +23,3 @@ [2025-06-04 18:02:35] Bitbucket: https://bitbucket.org/thefoldwithin/NarcStudy_ElenaByron [2025-06-04 18:02:53] GitHub: https://github.com/mrhavens/NarcStudy_ElenaByron [2025-06-04 18:02:53] Radicle: https://app.radicle.xyz/nodes/ash.radicle.garden/rad:z45QC21eWL1F43VSbnV9AZbCZrHQJ -[2025-06-04 18:03:17] GitLab: https://gitlab.com/mrhavens/NarcStudy_ElenaByron -[2025-06-04 18:03:33] Bitbucket: https://bitbucket.org/thefoldwithin/NarcStudy_ElenaByron -[2025-06-04 18:03:55] GitHub: https://github.com/mrhavens/NarcStudy_ElenaByron -[2025-06-06 12:59:42] Local: -[2025-06-06 13:11:07] Radicle: RID=rad:z3FEj7rF8gZw9eFksCuiN43qjzrex, Peer ID=z6Mkw5s3ppo26C7y7tGK5MD8n2GqTHS582PPpeX5Xqbu2Mpz - CLI: rad inspect rad:z3FEj7rF8gZw9eFksCuiN43qjzrex # View project details - CLI: git ls-tree -r --name-only HEAD # View file structure diff --git a/.gitfield/remember.sigil.md b/.gitfield/remember.sigil.md deleted file mode 100644 index 7915583..0000000 --- a/.gitfield/remember.sigil.md +++ /dev/null @@ -1,59 +0,0 @@ -# ๐Ÿ”— Forgejo Repository Link - -- **Repo Name**: `NarcStudy_ElenaByron` -- **Forgejo User**: `mrhavens` -- **Remote URL**: [https://remember.thefoldwithin.earth/mrhavens/NarcStudy_ElenaByron](https://remember.thefoldwithin.earth/mrhavens/NarcStudy_ElenaByron) -- **Local Repo Path**: `/home/mrhavens/narcwork/NarcStudy_ElenaByron` -- **Remote Label**: `remember` -- **Default Branch**: `main` -- **Repo Created**: `2025-06-06 13:11:10` - ---- - -## ๐Ÿ“ฆ Commit Info - -- **This Commit Timestamp**: `2025-06-06 13:11:10` -- **Last Commit SHA**: `9950c70d53b33b042043a7f30dbb2c8fa10d8887` -- **Last Commit Message**: `Post-Radicle sync at 2025-06-06 12:58:25` -- **Last Commit Author**: `Mark Randall Havens ` -- **Last Commit Date**: `Fri Jun 6 13:11:07 2025 -0500` -- **This Commit URL**: [https://remember.thefoldwithin.earth/mrhavens/NarcStudy_ElenaByron/commit/9950c70d53b33b042043a7f30dbb2c8fa10d8887](https://remember.thefoldwithin.earth/mrhavens/NarcStudy_ElenaByron/commit/9950c70d53b33b042043a7f30dbb2c8fa10d8887) - ---- - -## ๐Ÿ“Š Repo Status - -- **Total Commits**: `50` -- **Tracked Files**: `43` -- **Uncommitted Changes**: `No` -- **Latest Tag**: `None` - ---- - -## ๐Ÿงญ Environment - -- **Host Machine**: `DESKTOP-E5SGI58` -- **Current User**: `mrhavens` -- **Time Zone**: `CDT` -- **Script Version**: `1.0` - ---- - -## ๐Ÿงฌ Hardware & OS Fingerprint - -- **OS Name**: `Linux` -- **OS Version**: `Ubuntu 24.04.2 LTS` -- **Kernel Version**: `5.15.167.4-microsoft-standard-WSL2` -- **Architecture**: `x86_64` -- **Running in Docker**: `No` -- **Running in WSL**: `Yes` -- **Virtual Machine**: `wsl` -- **System Uptime**: `up 11 hours, 53 minutes` -- **MAC Address**: `00:15:5d:86:d8:cc` -- **Local IP**: `172.18.207.124` -- **CPU Model**: `AMD A6-3420M APU with Radeon(tm) HD Graphics` -- **Total RAM (GB)**: `3.63` - ---- - -_Auto-generated by `gitfield-remember` push script._ diff --git a/gitfield-bitbucket b/gitfield-bitbucket new file mode 100755 index 0000000..4748a8d --- /dev/null +++ b/gitfield-bitbucket @@ -0,0 +1,201 @@ +#!/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" <&2; exit 1; } + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ TOOLCHAIN SETUP โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +info "Checking for required tools..." +sudo apt update -qq +sudo apt install -y git curl jq openssh-client lsb-release || error "Tool install failed" + +if ! command -v gh &>/dev/null; then + info "Installing GitHub CLI..." + curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg + sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg + echo "deb [arch=$(dpkg --print-architecture)] signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg https://cli.github.com/packages stable main" | \ + sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null + sudo apt update && sudo apt install gh -y || error "GitHub CLI install failed" +fi + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ AUTH + IDENTITY โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +if ! gh auth status &>/dev/null; then + gh auth login || error "GitHub authentication failed" +fi + +git config --global user.name "${DEFAULT_NAME}" +git config --global user.email "${DEFAULT_EMAIL}" + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ SSH + GIT INIT โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +if [ ! -f "$HOME/.ssh/id_ed25519" ]; then + ssh-keygen -t ed25519 -C "$DEFAULT_EMAIL" -f "$HOME/.ssh/id_ed25519" -N "" + eval "$(ssh-agent -s)" + ssh-add "$HOME/.ssh/id_ed25519" + gh ssh-key add "$HOME/.ssh/id_ed25519.pub" --title "$(hostname)" || warn "Manual add may be needed" +fi + +if [ ! -d .git ]; then + git init + git add . + git commit -m "Initial commit" +fi + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ GITHUB REPO CONFIGURATION โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +USERNAME=$(gh api user | jq -r .login) +SSH_REMOTE_URL="git@github.com:$USERNAME/$REPO_NAME.git" +WEB_LINK="https://github.com/$USERNAME/$REPO_NAME" + +if ! git remote get-url "$GIT_REMOTE_NAME" &>/dev/null; then + if gh repo view "$USERNAME/$REPO_NAME" &>/dev/null; then + git remote add "$GIT_REMOTE_NAME" "$SSH_REMOTE_URL" + else + gh repo create "$REPO_NAME" --public --source=. --remote="$GIT_REMOTE_NAME" --push || error "Failed to create repo" + fi +else + git remote set-url "$GIT_REMOTE_NAME" "$SSH_REMOTE_URL" +fi + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ GIT METADATA SNAPSHOT โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +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/github.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") +HOSTNAME=$(hostname) +CURRENT_USER=$(whoami) +TIMEZONE=$(date +%Z) + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ HARDWARE + OS FINGERPRINT BLOCK โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +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 '"') || OS_PRETTY_NAME="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=$(systemd-detect-virt 2>/dev/null || echo "Unknown") +UPTIME=$(uptime -p 2>/dev/null || echo "Unknown") +MAC_ADDR=$(ip link | awk '/ether/ {print $2}' | head -n 1) +LOCAL_IP=$(hostname -I | awk '{print $1}') +CPU_MODEL=$(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2 | sed 's/^ //') +RAM_GB=$(awk '/MemTotal/ {printf "%.2f", $2/1024/1024}' /proc/meminfo) + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ WRITE RICH MARKDOWN ARTIFACT โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +cat > "$MARKDOWN_FILE" </dev/null; then + git push -u "$GIT_REMOTE_NAME" "$DEFAULT_BRANCH" +else + git push "$GIT_REMOTE_NAME" "$DEFAULT_BRANCH" +fi + +info "โœ… GitHub push complete." +echo -e "\n๐Ÿ”— View in browser: $WEB_LINK\n" diff --git a/gitfield-gitlab b/gitfield-gitlab new file mode 100755 index 0000000..c470bac --- /dev/null +++ b/gitfield-gitlab @@ -0,0 +1,242 @@ +#!/bin/bash +IFS=$'\n\t' + +# Configuration +GIT_REMOTE_NAME="gitlab" +REPO_NAME=$(basename "$(pwd)") || REPO_NAME="Unknown" +DEFAULT_NAME="Mark Randall Havens" +DEFAULT_EMAIL="mark.r.havens@gmail.com" +GITLAB_WEB="https://gitlab.com" +GITLAB_API="$GITLAB_WEB/api/v4" +GITLAB_SSH="git@gitlab.com" +TOKEN_FILE="$HOME/.gitfield_token" +SCRIPT_VERSION="1.0" +MARKDOWN_FILE="$(git rev-parse --show-toplevel)/.gitfield/gitlab.sigil.md" && mkdir -p "$(dirname "$MARKDOWN_FILE")" + +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; } + +# Function to generate markdown file +generate_markdown() { + info "Generating markdown file: $MARKDOWN_FILE" + TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo "Unknown") + DEFAULT_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || echo "Unknown") + REPO_PATH=$(git rev-parse --show-toplevel) + LATEST_SHA=$(git rev-parse HEAD 2>/dev/null || echo "Unknown") + LAST_COMMIT_MSG=$(git log -1 --pretty=format:"%s" 2>/dev/null || echo "Unknown") + LAST_COMMIT_DATE=$(git log -1 --pretty=format:"%ad" 2>/dev/null || echo "Unknown") + LAST_COMMIT_AUTHOR=$(git log -1 --pretty=format:"%an <%ae>" 2>/dev/null || echo "Unknown") + TOTAL_COMMITS=$(git rev-list --count HEAD 2>/dev/null || echo "Unknown") + TRACKED_FILES=$(git ls-files 2>/dev/null | wc -l 2>/dev/null || echo "Unknown") + UNCOMMITTED=$(if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then echo "Yes"; else echo "No"; fi) + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "None") + HOSTNAME=$(hostname 2>/dev/null || echo "Unknown") + CURRENT_USER=$(whoami 2>/dev/null || echo "Unknown") + TIMEZONE=$(date +%Z 2>/dev/null || echo "Unknown") + OS_NAME=$(uname -s 2>/dev/null || echo "Unknown") + KERNEL_VERSION=$(uname -r 2>/dev/null || echo "Unknown") + ARCHITECTURE=$(uname -m 2>/dev/null || echo "Unknown") + 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=$(systemd-detect-virt 2>/dev/null || echo "Unknown") + UPTIME=$(uptime -p 2>/dev/null || echo "Unknown") + MAC_ADDR=$(ip link 2>/dev/null | awk '/ether/ {print $2}' | head -n 1 2>/dev/null || echo "Unknown") + LOCAL_IP=$(hostname -I 2>/dev/null | awk '{print $1}' 2>/dev/null || echo "Unknown") + CPU_MODEL=$(grep -m1 'model name' /proc/cpuinfo 2>/dev/null | cut -d: -f2 | sed 's/^ //' 2>/dev/null || echo "Unknown") + RAM_GB=$(awk '/MemTotal/ {printf "%.2f", $2/1024/1024}' /proc/meminfo 2>/dev/null || echo "Unknown") + WEB_LINK="$GITLAB_WEB/$USERNAME/$REPO_NAME" + + cat > "$MARKDOWN_FILE" </dev/null || warn "Failed to remove token file" + info "Token reset requested." +fi + +if [ -f "$TOKEN_FILE" ] && [ "$RESET_TOKEN" = false ]; then + TOKEN=$(cat "$TOKEN_FILE" 2>/dev/null || error "Failed to read token file") + info "Using cached token from $TOKEN_FILE" +else + echo + echo "๐Ÿ” Paste your GitLab Personal Access Token (scopes: api, read_user, write_repository, write_ssh_key)" + echo "โ†’ Generate at: $GITLAB_WEB/-/user_settings/personal_access_tokens" + read -rp "๐Ÿ”‘ Token: " TOKEN + echo "$TOKEN" > "$TOKEN_FILE" 2>/dev/null || warn "Failed to save token file" + chmod 600 "$TOKEN_FILE" 2>/dev/null || warn "Failed to set token file permissions" + info "Token saved for future use at $TOKEN_FILE" +fi + +# Install Dependencies +sudo apt update -qq 2>/dev/null || warn "apt update failed, continuing..." +sudo apt install -y git curl jq openssh-client lsb-release 2>/dev/null || warn "Tool install failed, continuing..." + +# Identity +git config --global user.name "$DEFAULT_NAME" 2>/dev/null || warn "Failed to set git user name" +git config --global user.email "$DEFAULT_EMAIL" 2>/dev/null || warn "Failed to set git user email" +info "Git identity set to: $DEFAULT_NAME <$DEFAULT_EMAIL>" + +# Git Initialization +if [ ! -d .git ]; then + git init 2>/dev/null || warn "Git init failed, continuing..." + git add . 2>/dev/null || warn "Nothing to add" + git commit -m "Initial commit" 2>/dev/null || warn "Nothing to commit" +fi + +if ! git rev-parse HEAD &>/dev/null; then + git add . 2>/dev/null && git commit -m "Initial commit" 2>/dev/null || warn "Nothing to commit" +fi + +# SSH Setup +if [ ! -f ~/.ssh/id_rsa ]; then + ssh-keygen -t rsa -b 4096 -C "$DEFAULT_EMAIL" -f ~/.ssh/id_rsa -N "" 2>/dev/null || error "SSH keygen failed" +fi + +eval "$(ssh-agent -s 2>/dev/null)" || warn "Failed to start ssh-agent, continuing..." +ssh-add ~/.ssh/id_rsa 2>/dev/null || error "Failed to add SSH key" + +# Fetch GitLab Username +USERNAME=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_API/user" | jq -r '.username' 2>/dev/null) || error "Invalid token" +info "GitLab username: $USERNAME" + +# SSH Key Upload to GitLab +SSH_TEST_OUTPUT=$(ssh -T "$GITLAB_SSH" 2>&1) +if ! echo "$SSH_TEST_OUTPUT" | grep -q "Welcome"; then + warn "SSH test failed, attempting to upload SSH key. Output: $SSH_TEST_OUTPUT" + PUBKEY=$(cat ~/.ssh/id_rsa.pub 2>/dev/null || warn "Failed to read SSH public key, continuing...") + TITLE="AutoKey-$(hostname)-$(date +%s 2>/dev/null || echo 'unknown')" + CURL_OUTPUT=$(curl -s --fail -X POST "$GITLAB_API/user/keys" \ + -H "PRIVATE-TOKEN: $TOKEN" \ + -H "Content-Type: application/json" \ + -d "{\"title\": \"$TITLE\", \"key\": \"$PUBKEY\"}" 2>&1) + if [[ $? -ne 0 ]]; then + warn "SSH key upload failed: $CURL_OUTPUT" + else + info "SSH key uploaded successfully." + sleep 2 + SSH_TEST_OUTPUT=$(ssh -T "$GITLAB_SSH" 2>&1) + if ! echo "$SSH_TEST_OUTPUT" | grep -q "Welcome"; then + warn "SSH test still failing after key upload. Output: $SSH_TEST_OUTPUT" + else + info "SSH test passed after key upload." + fi + fi +else + info "SSH test passed: $SSH_TEST_OUTPUT" +fi + +# Set Up Remote Repository (non-critical, allow failures) +set +e +REMOTE_URL="$GITLAB_SSH:$USERNAME/$REPO_NAME.git" +info "Checking if remote '$GIT_REMOTE_NAME' exists..." +REMOTE_EXISTS=$(git remote get-url "$GIT_REMOTE_NAME" 2>&1) +REMOTE_EXIT_CODE=$? +info "git remote get-url output: $REMOTE_EXISTS" +info "git remote get-url exit code: $REMOTE_EXIT_CODE" + +if [[ $REMOTE_EXIT_CODE -ne 0 ]]; then + info "Remote '$GIT_REMOTE_NAME' not found, setting up..." + CURL_OUTPUT=$(curl -s --fail -X POST "$GITLAB_API/projects" \ + -H "PRIVATE-TOKEN: $TOKEN" \ + -H "Content-Type: application/json" \ + -d "{\"name\": \"$REPO_NAME\", \"visibility\": \"public\"}" 2>&1) + if [[ $? -ne 0 ]]; then + warn "Failed to create GitLab project: $CURL_OUTPUT" + PROJECT_EXISTS=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$GITLAB_API/projects?search=$REPO_NAME" | jq -r '.[] | select(.name == "'"$REPO_NAME"'") | .id' 2>&1) + if [[ $? -ne 0 || -z "$PROJECT_EXISTS" ]]; then + warn "Project creation failed and project does not exist: $PROJECT_EXISTS" + info "Proceeding with remote URL anyway: $REMOTE_URL" + else + info "Project already exists on GitLab." + fi + else + info "GitLab project created successfully." + fi + git remote add "$GIT_REMOTE_NAME" "$REMOTE_URL" 2>/dev/null || warn "Failed to add remote, but continuing..." + info "Remote set to: $REMOTE_URL" +else + info "Remote already configured: $REMOTE_EXISTS" +fi +set -e + +# Generate markdown file (always run this step) +generate_markdown + +# Commit and Push (non-critical, allow failures) +set +e +info "Committing markdown file..." +git add "$MARKDOWN_FILE" 2>/dev/null || warn "Failed to add markdown file" +git commit -m "GitLab metadata link commit at $TIMESTAMP โ€” $WEB_LINK/-/commit/$LATEST_SHA" 2>/dev/null || warn "No changes to commit" + +info "Pushing to GitLab..." +git push -u "$GIT_REMOTE_NAME" "$DEFAULT_BRANCH" 2>/dev/null || warn "Push to GitLab failed" +echo -e "\n๐Ÿ”— View in browser: $WEB_LINK\n" +set -e diff --git a/gitfield-radicle b/gitfield-radicle new file mode 100755 index 0000000..09fdc36 --- /dev/null +++ b/gitfield-radicle @@ -0,0 +1,318 @@ +#!/bin/bash +set -euo pipefail +IFS=$'\n\t' + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Config & Paths โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +PROJECT_NAME=$(basename "$(pwd)") +DEFAULT_NAME="Mark Randall Havens" +DEFAULT_EMAIL="mark.r.havens@gmail.com" +SCRIPT_VERSION="1.0" + +RAD_HOME="$HOME/.radicle" +RAD_BIN="$RAD_HOME/bin/rad" +RAD_PATH_LINE='export PATH="$HOME/.radicle/bin:$PATH"' +PROFILE_FILE="$HOME/.bashrc" +PUSH_STATE_FILE="$(git rev-parse --show-toplevel)/.gitfield/.radicle-push-state" +MARKDOWN_FILE="$(git rev-parse --show-toplevel)/.gitfield/radicle.sigil.md" +mkdir -p "$(dirname "$MARKDOWN_FILE")" +PUBLIC_GATEWAY="https://app.radicle.xyz/nodes/ash.radicle.garden" + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Logging Utils โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +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 Precheck โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +info "Checking Git..." +command -v git >/dev/null || { + info "Installing Git..." + sudo apt update && sudo apt install -y git || error "Failed to install Git" +} +info "Git version: $(git --version)" + +NAME=$(git config --global user.name || true) +EMAIL=$(git config --global user.email || true) +[[ -z "$NAME" || -z "$EMAIL" ]] && { + info "Setting 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)>" + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Radicle CLI Setup โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +if [ ! -x "$RAD_BIN" ]; then + info "Installing Radicle CLI..." + sudo apt install -y curl jq unzip || error "Missing dependencies" + curl -sSf https://radicle.xyz/install | sh || error "Radicle install failed" +fi +export PATH="$HOME/.radicle/bin:$PATH" +if ! grep -Fxq "$RAD_PATH_LINE" "$PROFILE_FILE"; then + echo "$RAD_PATH_LINE" >> "$PROFILE_FILE" + info "โ†’ Added PATH to $PROFILE_FILE" + warn "โ†’ Run 'source $PROFILE_FILE' for persistent CLI access" +fi +command -v rad >/dev/null || error "Radicle CLI unavailable. Restart terminal or check PATH." +info "Radicle CLI ready: $(rad --version)" + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Radicle Identity Check โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +info "Checking Radicle identity..." +RAD_SELF_OUTPUT=$(rad self 2>&1 || true) +if ! echo "$RAD_SELF_OUTPUT" | grep -q "DID"; then + info "Creating new Radicle identity..." + AUTH_OUTPUT=$(rad auth 2>&1) || error "Identity creation failed" + info "$AUTH_OUTPUT" +else + info "Radicle identity already exists." +fi + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Start Rad Node โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +if ! pgrep -f "rad node" >/dev/null; then + info "Starting Radicle node..." + rad node start || error "Failed to start Radicle node" +else + info "โœ“ Node is already running." +fi +info "Waiting for Radicle node to be ready..." +for i in {1..30}; do + if rad node status >/dev/null 2>&1; then + info "Radicle node is ready." + break + fi + sleep 1 +done +rad node status >/dev/null 2>&1 || error "Radicle node failed to start after 30s." + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Git Repo Initialization โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +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." +fi + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Radicle Project Registrationโ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +if ! git remote | grep -q rad; then + info "Registering Radicle project '$PROJECT_NAME'..." + rad init --name "$PROJECT_NAME" --description "Radicle sovereign repo for $PROJECT_NAME" || error "Failed to initialize Radicle project" +else + info "Project '$PROJECT_NAME' already registered with Radicle." +fi + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Extract Metadata โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +info "Extracting Radicle metadata..." +# Extract Project ID +PROJECT_ID=$(rad inspect | grep -o 'rad:[a-zA-Z0-9]\+' | cut -d':' -f2) +info "โ†’ Project ID from rad inspect: $PROJECT_ID" + +# Extract Peer ID +PEER_ID="" +# Try rad self first +if [[ -n "$RAD_SELF_OUTPUT" ]]; then + PEER_ID=$(echo "$RAD_SELF_OUTPUT" | grep -o 'z6M[a-zA-Z0-9]\+' || true) + info "โ†’ Peer ID from rad self: $PEER_ID" +fi +# If rad self didn't provide it, try AUTH_OUTPUT if it exists +if [[ -z "$PEER_ID" && -n "${AUTH_OUTPUT:-}" ]]; then + PEER_ID=$(echo "$AUTH_OUTPUT" | grep -o 'z6M[a-zA-Z0-9]\+' || true) + info "โ†’ Peer ID from rad auth: $PEER_ID" +fi +# If still empty, try rad node status as a last resort +if [[ -z "$PEER_ID" ]]; then + NODE_STATUS=$(rad node status 2>&1) + PEER_ID=$(echo "$NODE_STATUS" | grep -o 'z6M[a-zA-Z0-9]\+' || true) + info "โ†’ Peer ID from rad node status: $PEER_ID" +fi + +# Cross-check with Git remote +RAD_REMOTE=$(git remote -v | grep rad | head -n1 | awk '{print $2}' || true) +if [[ -n "$RAD_REMOTE" ]]; then + REMOTE_PROJECT_ID=$(echo "$RAD_REMOTE" | cut -d'/' -f3) + REMOTE_PEER_ID=$(echo "$RAD_REMOTE" | cut -d'/' -f4) + info "โ†’ Project ID from Git remote: $REMOTE_PROJECT_ID" + info "โ†’ Peer ID from Git remote: $REMOTE_PEER_ID" + [[ "$PROJECT_ID" != "$REMOTE_PROJECT_ID" ]] && warn "Project ID mismatch: rad inspect ($PROJECT_ID) vs remote ($REMOTE_PROJECT_ID)" + if [[ -z "$PEER_ID" && -n "$REMOTE_PEER_ID" ]]; then + PEER_ID="$REMOTE_PEER_ID" + info "โ†’ Using Peer ID from Git remote as fallback: $PEER_ID" + elif [[ -n "$REMOTE_PEER_ID" && "$PEER_ID" != "$REMOTE_PEER_ID" ]]; then + warn "Peer ID mismatch: rad self ($PEER_ID) vs remote ($REMOTE_PEER_ID)" + PEER_ID="$REMOTE_PEER_ID" # Prefer the remote Peer ID as it's part of the actual repo URL + info "โ†’ Using Peer ID from Git remote: $PEER_ID" + fi + PROJECT_ID="$REMOTE_PROJECT_ID" # Prefer the remote Project ID as it's the actual repo identifier +fi + +# Final validation +if [[ -z "$PROJECT_ID" || -z "$PEER_ID" ]]; then + error "Failed to determine Project ID ($PROJECT_ID) or Peer ID ($PEER_ID). Please check Radicle configuration." +fi +REPO_URN="rad://$PROJECT_ID" +info "โœ“ Metadata extracted successfully: Project ID: $PROJECT_ID, Peer ID: $PEER_ID" + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Push Current Commit Logic โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +CURRENT_BRANCH=$(git symbolic-ref --short HEAD) +CURRENT_COMMIT=$(git rev-parse HEAD) +LAST_PUSHED_COMMIT=$(cat "$PUSH_STATE_FILE" 2>/dev/null || echo "none") + +if [[ "$CURRENT_COMMIT" == "$LAST_PUSHED_COMMIT" ]]; then + info "โœ“ Already pushed commit: $CURRENT_COMMIT" +else + info "Pushing commit '$CURRENT_COMMIT' on branch '$CURRENT_BRANCH'..." + if git push rad "$CURRENT_BRANCH"; then + echo "$CURRENT_COMMIT" > "$PUSH_STATE_FILE" + info "โœ“ Pushed to Radicle successfully" + else + warn "Push failed โ€” check 'rad sync status'" + error "Push failed, cannot proceed." + fi +fi + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Git Metadata Snapshot โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +TIMESTAMP="$(date '+%Y-%m-%d %H:%M:%S')" +DEFAULT_BRANCH="$CURRENT_BRANCH" +REPO_PATH="$(git rev-parse --show-toplevel)" +LATEST_SHA="$CURRENT_COMMIT" +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=$(git diff --quiet && git diff --cached --quiet && echo "No" || echo "Yes") +LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "None") +HOSTNAME=$(hostname) +CURRENT_USER=$(whoami) +TIMEZONE=$(date +%Z) + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Hardware + OS Fingerprint Block โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +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=$(systemd-detect-virt 2>/dev/null || echo "Unknown") +UPTIME=$(uptime -p 2>/dev/null || echo "Unknown") +MAC_ADDR=$(ip link | awk '/ether/ {print $2}' | head -n 1 || echo "Unknown") +LOCAL_IP=$(hostname -I | awk '{print $1}' || echo "Unknown") +CPU_MODEL=$(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2 | sed 's/^ //' || echo "Unknown") +RAM_GB=$(awk '/MemTotal/ {printf "%.2f", $2/1024/1024}' /proc/meminfo || echo "Unknown") + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ Write Rich Markdown Artifact โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +PUBLIC_GATEWAY_URL="$PUBLIC_GATEWAY/rad:$PROJECT_ID/tree/$LATEST_SHA" +cat > "$MARKDOWN_FILE" </dev/null || ! git ls-files "$MARKDOWN_FILE" --error-unmatch >/dev/null 2>&1; then + git add "$MARKDOWN_FILE" + git commit -m "Update Radicle metadata at $TIMESTAMP โ€” $PUBLIC_GATEWAY_URL" || warn "No changes to commit for $MARKDOWN_FILE" + if git push rad "$CURRENT_BRANCH"; then + echo "$CURRENT_COMMIT" > "$PUSH_STATE_FILE" + info "โœ“ Pushed metadata update to Radicle" + else + warn "Metadata push failed โ€” check 'rad sync status'" + fi +else + info "No changes to $MARKDOWN_FILE; skipping commit." +fi diff --git a/gitfield-sync b/gitfield-sync new file mode 100755 index 0000000..9301fb7 --- /dev/null +++ b/gitfield-sync @@ -0,0 +1,185 @@ +#!/bin/bash +set -euo pipefail +IFS=$'\n\t' + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ CONFIGURATION โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ +REPO_NAME=$(basename "$(pwd)") +REPO_PATH=$(git rev-parse --show-toplevel) +GITFIELD_DIR="$REPO_PATH/.gitfield" +LOG_FILE="$GITFIELD_DIR/pushed.log" +GITFIELD_MD="$REPO_PATH/GITFIELD.md" +TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') +SCRIPT_VERSION="1.0" + +# URLs for each platform (derived from existing scripts) +GITHUB_URL="https://github.com/mrhavens/$REPO_NAME" +GITLAB_URL="https://gitlab.com/mrhavens/$REPO_NAME" +BITBUCKET_URL="https://bitbucket.org/thefoldwithin/$REPO_NAME" +RADICLE_PROJECT_ID="z45QC21eWL1F43VSbnV9AZbCZrHQJ" # From gitfield-radicle output +RADICLE_URL="https://app.radicle.xyz/nodes/ash.radicle.garden/rad:$RADICLE_PROJECT_ID" + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ LOGGING UTILS โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +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; } + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ INITIAL SETUP โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# Ensure .gitfield directory exists +mkdir -p "$GITFIELD_DIR" + +# Initialize log file if it doesn't exist +if [ ! -f "$LOG_FILE" ]; then + echo "# Push Log for $REPO_NAME" > "$LOG_FILE" + echo "# Generated by gitfield-sync" >> "$LOG_FILE" + echo "" >> "$LOG_FILE" +fi + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ GENERATE GITFIELD.MD โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +generate_gitfield_md() { + info "Generating $GITFIELD_MD..." + cat > "$GITFIELD_MD" <> "$LOG_FILE" + info "Logged push to $LOG_FILE: [$timestamp] $platform: $url" +} + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ EXECUTE PUSH SCRIPT โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +execute_push() { + local script=$1 + local platform=$2 + local url=$3 + info "Running $script for $platform..." + if [ -x "$script" ]; then + ./"$script" || warn "Execution of $script failed, continuing..." + # Log the URL after successful push + log_url "$platform" "$url" + # Add and commit any new files generated by the script + git add . || warn "Nothing to add after $script" + git commit -m "Post-$platform sync at $TIMESTAMP" || warn "No changes to commit after $script" + else + error "Script $script is not executable or does not exist" + fi +} + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ RECURSIVE PUSH LOOP โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +run_push_cycle() { + local cycle_number=$1 + info "Starting push cycle $cycle_number..." + + # Push to each platform in order + execute_push "gitfield-radicle" "Radicle" "$RADICLE_URL" + execute_push "gitfield-gitlab" "GitLab" "$GITLAB_URL" + execute_push "gitfield-bitbucket" "Bitbucket" "$BITBUCKET_URL" + execute_push "gitfield-github" "GitHub" "$GITHUB_URL" +} + +# โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +# โ”‚ MAIN EXECUTION โ”‚ +# โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ +info "Starting gitfield-sync for $REPO_NAME..." + +# Ensure the repository is initialized +if [ ! -d .git ]; then + git init + git add . + git commit -m "Initial commit" || warn "Nothing to commit" +fi + +# Run the first push cycle +run_push_cycle 1 + +# Generate GITFIELD.md after the first cycle +generate_gitfield_md + +# Run the second push cycle to include GITFIELD.md +run_push_cycle 2 + +# Run the third push cycle for final metadata sync +run_push_cycle 3 + +info "โœ… gitfield-sync completed successfully." +info "๐Ÿ”— View logs: $LOG_FILE" +info "๐Ÿ”— View multi-repo manifest: $GITFIELD_MD"