Post-Radicle sync at 2025-06-05 02:13:16

This commit is contained in:
Mark Randall Havens 2025-06-05 02:13:17 -05:00
parent 185c74b633
commit 77a32d1c74
5 changed files with 380 additions and 13 deletions

View file

@ -1 +1 @@
eed9c3f4ef38c40e5793f456b368f5229f2fe790 1ea5ad28fc753a8891b807185c55c02460764696

View file

@ -192,3 +192,4 @@
[2025-06-05 01:10:26] GitLab: https://gitlab.com/mrhavens/git-sigil [2025-06-05 01:10:26] GitLab: https://gitlab.com/mrhavens/git-sigil
[2025-06-05 01:10:42] Bitbucket: https://bitbucket.org/thefoldwithin/git-sigil [2025-06-05 01:10:42] Bitbucket: https://bitbucket.org/thefoldwithin/git-sigil
[2025-06-05 01:10:56] GitHub: https://github.com/mrhavens/git-sigil [2025-06-05 01:10:56] GitHub: https://github.com/mrhavens/git-sigil
[2025-06-05 02:13:17] Radicle: https://app.radicle.xyz/nodes/ash.radicle.garden/rad:z45QC21eWL1F43VSbnV9AZbCZrHQJ

142
INSTALL.sh Executable file
View file

@ -0,0 +1,142 @@
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
# ╭─────────────────────────────────────╮
# │ CONFIGURATION │
# ╰─────────────────────────────────────╮
REPO_PATH=$(git rev-parse --show-toplevel 2>/dev/null) || { echo -e "\e[1;31m[ERROR]\e[0m Not inside a Git repository" >&2; exit 1; }
BIN_DIR="$REPO_PATH/bin"
INSTALL_DIR="$HOME/.local/gitfieldbin"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
SCRIPT_VERSION="1.0"
# ╭─────────────────────────────────────╮
# │ 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; }
# ╭─────────────────────────────────────╮
# │ DETECT SHELL CONFIG │
# ╰─────────────────────────────────────╮
detect_shell_config() {
local shell_name=$(basename "$SHELL")
case "$shell_name" in
bash)
if [[ -f "$HOME/.bash_profile" && "$(uname)" == "Darwin" ]]; then
echo "$HOME/.bash_profile"
else
echo "$HOME/.bashrc"
fi
;;
zsh)
echo "$HOME/.zshrc"
;;
*)
warn "Unsupported shell: $shell_name. Defaulting to ~/.bashrc"
echo "$HOME/.bashrc"
;;
esac
}
# ╭─────────────────────────────────────╮
# │ UPDATE PATH FUNCTION │
# ╰─────────────────────────────────────╮
update_path() {
local config_file=$1
local path_entry="export PATH=\$PATH:$INSTALL_DIR"
# Check for duplicate PATH entries in the config file
if [[ -f "$config_file" ]]; then
# Remove any existing entries for INSTALL_DIR
sed -i.bak "/export PATH=.*$INSTALL_DIR/d" "$config_file" && rm -f "$config_file.bak"
info "Removed any existing $INSTALL_DIR entries from $config_file"
fi
# Check if PATH already contains INSTALL_DIR in the current session
if [[ ":$PATH:" == *":$INSTALL_DIR:"* ]]; then
info "$INSTALL_DIR is already in PATH for the current session"
else
info "Adding $INSTALL_DIR to PATH in current session"
export PATH="$PATH:$INSTALL_DIR"
fi
# Add new PATH entry to config file
info "Adding $INSTALL_DIR to $config_file"
echo "" >> "$config_file"
echo "# Added by git-sigil INSTALL.sh at $TIMESTAMP" >> "$config_file"
echo "$path_entry" >> "$config_file"
}
# ╭─────────────────────────────────────╮
# │ INSTALL SCRIPTS │
# ╰─────────────────────────────────────╮
install_scripts() {
info "Installing scripts from $BIN_DIR to $INSTALL_DIR..."
# Create installation directory if it doesn't exist
mkdir -p "$INSTALL_DIR" || error "Failed to create $INSTALL_DIR"
# Check if bin directory exists and contains scripts
if [[ ! -d "$BIN_DIR" ]]; then
error "Directory $BIN_DIR does not exist"
fi
# Copy all executable files from BIN_DIR to INSTALL_DIR
local found_scripts=false
for script in "$BIN_DIR"/*; do
if [[ -f "$script" && -x "$script" ]]; then
found_scripts=true
local script_name=$(basename "$script")
info "Installing $script_name to $INSTALL_DIR..."
cp -f "$script" "$INSTALL_DIR/" || error "Failed to install $script_name"
chmod +x "$INSTALL_DIR/$script_name" || error "Failed to set executable permissions for $script_name"
fi
done
if [[ "$found_scripts" == false ]]; then
warn "No executable scripts found in $BIN_DIR"
fi
# Verify and fix permissions for all installed scripts
info "Verifying executable permissions in $INSTALL_DIR..."
for script in "$INSTALL_DIR"/*; do
if [[ -f "$script" && ! -x "$script" ]]; then
warn "Script $script is not executable, fixing permissions..."
chmod +x "$script" || error "Failed to set executable permissions for $script"
fi
done
}
# ╭─────────────────────────────────────╮
# │ MAIN EXECUTION │
# ╰─────────────────────────────────────╮
info "Starting git-sigil installation at $TIMESTAMP..."
# Install scripts
install_scripts
# Detect shell configuration file
CONFIG_FILE=$(detect_shell_config)
info "Detected shell configuration file: $CONFIG_FILE"
# Create config file if it doesn't exist
if [[ ! -f "$CONFIG_FILE" ]]; then
warn "$CONFIG_FILE does not exist, creating it..."
touch "$CONFIG_FILE" || error "Failed to create $CONFIG_FILE"
fi
# Update PATH in configuration file and current session
update_path "$CONFIG_FILE"
# Source the configuration file to update the current session
info "Sourcing $CONFIG_FILE to update current session..."
# shellcheck disable=SC1090
source "$CONFIG_FILE" || warn "Failed to source $CONFIG_FILE, but PATH will be updated on next login"
info "✅ Installation completed successfully."
info "🔗 Scripts installed to: $INSTALL_DIR"
info "🔗 PATH updated in: $CONFIG_FILE"
info "🔗 You can now run the installed scripts (e.g., gitfield-sync) from anywhere."

View file

@ -4,7 +4,7 @@ IFS=$'\n\t'
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ CONFIGURATION │ # │ CONFIGURATION │
# ╰───────────────────────────────────── # ╰─────────────────────────────────────
REPO_PATH=$(git rev-parse --show-toplevel 2>/dev/null) || error "Not inside a Git repository" REPO_PATH=$(git rev-parse --show-toplevel 2>/dev/null) || error "Not inside a Git repository"
REPO_NAME=$(basename "$REPO_PATH") REPO_NAME=$(basename "$REPO_PATH")
GITFIELD_DIR="$REPO_PATH/.gitfield" GITFIELD_DIR="$REPO_PATH/.gitfield"
@ -23,8 +23,8 @@ RADICLE_URL="https://app.radicle.xyz/nodes/ash.radicle.garden/rad:$RADICLE_PROJE
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ LOGGING UTILS │ # │ LOGGING UTILS │
# ╰─────────────────────────────────────╮ # ╰─────────────────────────────────────╮
info() { echo -e "\e[1;34m[INFO]\e[0m $*"; } info() { echo -e "\e[1;34m[INFO]\e[0m $*" >&2; }
warn() { echo -e "\e[1;33m[WARN]\e[0m $*"; } warn() { echo -e "\e[1;33m[WARN]\e[0m $*" >&2; }
error() { echo -e "\e[1;31m[ERROR]\e[0m $*" >&2; exit 1; } error() { echo -e "\e[1;31m[ERROR]\e[0m $*" >&2; exit 1; }
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
@ -33,21 +33,27 @@ error() { echo -e "\e[1;31m[ERROR]\e[0m $*" >&2; exit 1; }
find_script() { find_script() {
local script_name=$1 local script_name=$1
local search_paths=( local search_paths=(
"." "$HOME/.local/gitfieldbin"
"$REPO_PATH/bin"
"$REPO_PATH/gitfield"
"$REPO_PATH/gitfieldbin"
"$HOME/.local/bin" "$HOME/.local/bin"
"$HOME/.local/gitfield" "$HOME/.local/gitfield"
"$HOME/.local/gitfieldbin"
"$HOME/.local/bin/gitfield" "$HOME/.local/bin/gitfield"
"$HOME/.local/bin/gitfieldbin" "$HOME/.local/bin/gitfieldbin"
) )
for path in "${search_paths[@]}"; do for path in "${search_paths[@]}"; do
if [ -f "$path/$script_name" ]; then
if [ -x "$path/$script_name" ]; then if [ -x "$path/$script_name" ]; then
# Log to stderr to avoid capturing in command substitution
if [[ "$path" != "$HOME"* ]]; then
info "Using script: \e[1;31m$path/$script_name\e[0m (outside home directory)"
else
info "Using script: $path/$script_name"
fi
echo "$path/$script_name" echo "$path/$script_name"
return 0 return 0
else
warn "Found $path/$script_name but it is not executable"
fi
fi fi
done done
error "Script $script_name not found in any search path" error "Script $script_name not found in any search path"
@ -157,7 +163,7 @@ execute_push() {
local url=$3 local url=$3
local script_path local script_path
script_path=$(find_script "$script_name") || error "Failed to find $script_name" script_path=$(find_script "$script_name") || error "Failed to find $script_name"
info "Running $script_path for $platform..." info "Executing $platform push with script: $script_path"
if [ -x "$script_path" ]; then if [ -x "$script_path" ]; then
# Change to repo root to ensure consistent execution context # Change to repo root to ensure consistent execution context
pushd "$REPO_PATH" >/dev/null pushd "$REPO_PATH" >/dev/null

218
bin/gitfield-sync-old2 Executable file
View file

@ -0,0 +1,218 @@
#!/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 (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"
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; }
# ╭─────────────────────────────────────╮
# │ SCRIPT LOOKUP FUNCTION │
# ╰─────────────────────────────────────╮
find_script() {
local script_name=$1
local search_paths=(
"."
"$REPO_PATH/bin"
"$REPO_PATH/gitfield"
"$REPO_PATH/gitfieldbin"
"$HOME/.local/bin"
"$HOME/.local/gitfield"
"$HOME/.local/gitfieldbin"
"$HOME/.local/bin/gitfield"
"$HOME/.local/bin/gitfieldbin"
)
for path in "${search_paths[@]}"; do
if [ -x "$path/$script_name" ]; then
echo "$path/$script_name"
return 0
fi
done
error "Script $script_name not found in any search path"
}
# ╭─────────────────────────────────────╮
# │ 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" <<EOF
# 🌐 GitField Recursive Multi-Repository Strategy
## Overview
The \`$REPO_NAME\` project employs a multi-repository strategy across four distinct platforms: **GitHub**, **GitLab**, **Bitbucket**, and **Radicle**. 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 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)) and **Dr. Peter Gaied** ([Paragraph post](https://paragraph.com/@neutralizingnarcissism/%F0%9F%9C%81-the-narcissistic-messiah)), 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)). By distributing the repository across multiple platforms, we ensure its persistence and accessibility.
---
## 📍 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
- **URL**: [$RADICLE_URL]($RADICLE_URL)
- **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.
### 2. GitLab
- **URL**: [$GITLAB_URL]($GITLAB_URL)
- **Purpose**: GitLab offers a comprehensive DevOps platform with advanced CI/CD capabilities, private repository options, and robust access controls. It serves as a reliable backup and a platform for advanced automation workflows.
- **Value**: Enhances project resilience with its integrated CI/CD pipelines and independent infrastructure, reducing reliance on a single provider.
### 3. Bitbucket
- **URL**: [$BITBUCKET_URL]($BITBUCKET_URL)
- **Purpose**: Bitbucket provides a secure environment for repository hosting with strong integration into Atlassians ecosystem (e.g., Jira, Trello). It serves as an additional layer of redundancy and a professional-grade hosting option.
- **Value**: Offers enterprise-grade security and integration capabilities, ensuring the project remains accessible even if other platforms face disruptions.
### 4. GitHub
- **URL**: [$GITHUB_URL]($GITHUB_URL)
- **Purpose**: GitHub serves as the primary platform for visibility, collaboration, and community engagement. Its widespread adoption and robust tooling make it ideal for public-facing development, issue tracking, and integration with CI/CD pipelines.
- **Value**: Provides a centralized hub for open-source contributions, pull requests, and project management, ensuring broad accessibility and developer familiarity.
---
## 🛡️ Rationale for Redundancy
The decision to maintain multiple repositories stems from the need to safeguard the project against **deplatforming attempts** and ensure its **long-term availability**. Past incidents involving **Mr. Joel Johnson** and **Dr. Peter Gaied** have highlighted the vulnerability of relying on a single platform. By distributing the repository across GitHub, GitLab, Bitbucket, and Radicle, we achieve:
- **Resilience**: If one platform removes or restricts access, the project remains accessible on others.
- **Sovereignty**: Radicles decentralized nature ensures the project cannot be fully censored or controlled by any single entity.
- **Diversity**: Each platforms unique features (e.g., GitHubs community, GitLabs CI/CD, Bitbuckets integrations, Radicles decentralization) enhance the projects functionality and reach.
- **Transparency**: Metadata snapshots in the \`.gitfield\` directory provide a verifiable record of the projects state across all platforms.
This multi-repository approach reflects a commitment to preserving the integrity and accessibility of \`$REPO_NAME\`, ensuring it remains available to contributors and users regardless of external pressures.
---
## 📜 Metadata and Logs
- **Metadata Files**: Each platform generates a metadata snapshot in the \`.gitfield\` directory (e.g., \`github.sigil.md\`, \`gitlab.sigil.md\`, etc.), capturing commit details, environment information, and hardware fingerprints.
- **Push Log**: The \`.gitfield/pushed.log\` file records the date, time, and URL of every push operation across all platforms, providing a transparent audit trail.
- **Recursive Sync**: The repository is synchronized across all platforms in a recursive loop (three cycles) to ensure interconnected metadata captures the latest state of the project.
- **Push Order**: The repository is synchronized in the following order: **Radicle → GitLab → Bitbucket → GitHub**. This prioritizes Radicles decentralized, censorship-resistant network as the primary anchor, followed by GitLabs robust DevOps features, Bitbuckets enterprise redundancy, and GitHubs broad visibility, ensuring a resilient and accessible metadata chain.
---
_Auto-generated by \`gitfield-sync\` at $TIMESTAMP (v$SCRIPT_VERSION)._
EOF
# Add and commit GITFIELD.md
git -C "$REPO_PATH" add "$GITFIELD_MD"
git -C "$REPO_PATH" commit -m "Generated GITFIELD.md at $TIMESTAMP" || warn "No changes to commit for $GITFIELD_MD"
info "Generated and committed $GITFIELD_MD"
}
# ╭─────────────────────────────────────╮
# │ LOG URL FUNCTION │
# ╰─────────────────────────────────────╮
log_url() {
local platform=$1
local url=$2
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] $platform: $url" >> "$LOG_FILE"
info "Logged push to $LOG_FILE: [$timestamp] $platform: $url"
}
# ╭─────────────────────────────────────╮
# │ EXECUTE PUSH SCRIPT │
# ╰─────────────────────────────────────╮
execute_push() {
local script_name=$1
local platform=$2
local url=$3
local script_path
script_path=$(find_script "$script_name") || error "Failed to find $script_name"
info "Running $script_path for $platform..."
if [ -x "$script_path" ]; then
# Change to repo root to ensure consistent execution context
pushd "$REPO_PATH" >/dev/null
"$script_path" || warn "Execution of $script_path 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_path"
git commit -m "Post-$platform sync at $TIMESTAMP" || warn "No changes to commit after $script_path"
popd >/dev/null
else
error "Script $script_path is not executable"
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 "$REPO_PATH/.git" ]; then
pushd "$REPO_PATH" >/dev/null
git init
git add .
git commit -m "Initial commit" || warn "Nothing to commit"
popd >/dev/null
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"