git-sigil/bin/gitfield-sync
2025-06-06 05:35:26 -05:00

99 lines
5.8 KiB
Bash
Executable file

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
# ╭─────────────────────────────────────╮
# │ CONFIGURATION │
# ╰─────────────────────────────────────╮
REPO_PATH=$(git rev-parse --show-toplevel 2>/dev/null) || error "Not inside a Git repository"
REPO_NAME=$(basename "$REPO_PATH")
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
GITHUB_URL="https://github.com/mrhavens/$REPO_NAME"
GITLAB_URL="https://gitlab.com/mrhavens/$REPO_NAME"
BITBUCKET_URL="https://bitbucket.org/thefoldwithin/$REPO_NAME"
FORGEJO_URL="https://remember.thefoldwithin.earth/mrhavens/$REPO_NAME"
RADICLE_RID="rad:z3FEj7rF8gZw9eFksCuiN43qjzrex"
RADICLE_PEER_ID="z6Mkw5s3ppo26C7y7tGK5MD8n2GqTHS582PPpeX5Xqbu2Mpz"
# ╭─────────────────────────────────────╮
# │ LOGGING UTILS │
# ╰─────────────────────────────────────╮
info() { echo -e "\e[1;34m[INFO]\e[0m $*" >&2; }
warn() { echo -e "\e[1;33m[WARN]\e[0m $*" >&2; }
error() { echo -e "\e[1;31m[ERROR]\e[0m $*" >&2; exit 1; }
# ╭─────────────────────────────────────╮
# │ SCRIPT LOOKUP FUNCTION │
# ╰─────────────────────────────────────╮
find_script() {
local script_name=$1
local search_paths=(
"$HOME/.local/gitfieldbin"
"$HOME/.local/bin"
"$HOME/.local/gitfield"
"$HOME/.local/bin/gitfield"
"$HOME/.local/bin/gitfieldbin"
"$REPO_PATH/bin"
)
for path in "${search_paths[@]}"; do
if [ -f "$path/$script_name" ]; then
if [ -x "$path/$script_name" ]; then
if [[ "$path" != "$HOME"* && "$path" != "$REPO_PATH"* ]]; then
info "Using script: \e[1;31m$path/$script_name\e[0m (outside home or repo)"
else
info "Using script: $path/$script_name"
fi
echo "$path/$script_name"
return 0
else
warn "Found $path/$script_name but it is not executable"
fi
fi
done
error "Script $script_name not found in any search path"
}
# ╭─────────────────────────────────────╮
# │ INITIAL SETUP │
# ╰─────────────────────────────────────╮
mkdir -p "$GITFIELD_DIR"
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" <<EOF
# 🌐 GitField Recursive Multi-Repository Strategy
## Overview
The \`$REPO_NAME\` project employs a multi-repository strategy across five distinct platforms: **GitHub**, **GitLab**, **Bitbucket**, **Radicle**, and **Forgejo**. This approach ensures **redundancy**, **resilience**, and **sovereignty** of the project's data and metadata, protecting against deplatforming risks and preserving the integrity of the work. The strategy is a deliberate response to past deplatforming and delisting attempts by individuals such as **Mr. Joel Johnson** ([Mirror post](https://mirror.xyz/neutralizingnarcissism.eth/x40_zDWWrYOJ7nh8Y0fk06_3kNEP0KteSSRjPmXkiGg?utm_medium=social&utm_source=heylink.me)), **Dr. Peter Gaied** ([Paragraph post](https://paragraph.com/@neutralizingnarcissism/%F0%9F%9C%81-the-narcissistic-messiah)), and **Andrew LeCody** ([Mirror post](https://mirror.xyz/neutralizingnarcissism.eth/s3GRxuiZs6vGSGDcPEpCgjaSxwGAViGhmg6a5XTL6s0)), who have sought to undermine or suppress the work of **Mark Randall Havens** ([Substack post](https://theempathictechnologist.substack.com/p/mark-randall-havens-the-architect)). Specifically, Andrew LeCody has attempted to delist the project's content on Google, though it remains accessible on other search engines such as [Bing](https://www.bing.com/search?q=andrew+lecody+neutralizing+narcissism&qs=HS&pq=andrew+lecody), [DuckDuckGo](https://duckduckgo.com/?t=h_&q=andrew+lecody+neutralizing+narcissism&ia=web), and [Yahoo](https://search.yahoo.com/search?p=andrew+lecody+neutralizng+narcissism). By distributing the repository across multiple platforms, including a self-hosted Forgejo instance, we ensure its persistence, accessibility, and sovereignty.
---
## 📍 Repository Platforms
The following platforms host the \`$REPO_NAME\` repository, each chosen for its unique strengths and contributions to the project's goals.
### 1. Radicle
- **RID**: $RADICLE_RID
- **Peer ID**: $RADICLE_PEER_ID
- **Purpose**: Radicle is a decentralized, peer-to-peer git platform that ensures sovereignty and censorship resistance. It hosts the repository in a distributed network, independent of centralized servers.
- **Value**: Protects against deplatforming by eliminating reliance on centralized infrastructure, ensuring the project remains accessible in a decentralized ecosystem.
- **Access Details**: To view project details, run:
```bash
rad inspect $RADICLE_RID