Post-Local sync at 2025-06-09T23:36:20Z

This commit is contained in:
Mark Randall Havens 2025-06-09 18:36:45 -05:00
parent dc9c7c26c2
commit 4a2101c75a
12 changed files with 170 additions and 342 deletions

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHav8ACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHb/0ACgkQTifTfDWI
cr/onQ//SErngjxex16eFaIv3YAkAA0q5rOE/KdCYyaFbONn5aeQA+UEJgzkQUMz cr/okhAAnYR+0jB6mIyszpckoQfcRGuMar4BfxjvFbUBzYu/pG/72AnaFZbj5ntT
LLCSjC6snHbmL++qPvOPzBbp8zZ3aktIgZAaOXYC2MUuz7l1O1apfG6pZTVh6x4R j/LdYE8MAnMGr74Ky9GFk3X6E9EgNP8jTzz5RdWIUG54KfYr/uszZNXs3tC6fGSS
TenLORc7PzqZ65wkIfLdmAJagjVsPHMCGW7SMyfAr+q401TJCNPs3w7Gi4oyvrgZ s+ZSYDkDTKb4YUqFgTzrN0Nyzr0OT8ADKWxgTWLd8yrU50bBDiiu5IVrQ6uGZZ/u
V1Kw7dUznrpRzB/KaHzZK998pAOe2P1KaF0J4LdmBYOnBBRvDqAuA/wegS9gpzpq IdjcaZbwHXbYEaKDCkTwbS2tmR9esn+ilBx6Xsh6z+A4tDv++0YKHJ3Lm5NwhiwD
uJGkxkeENdFyIOpwRrXh+4dbjdcW5YrNosZveJWWL7WJwL/yEfWWaLuI6cGr4wWu HxBncP/E4rZpmI23BhMFrGOGgCyxbsf9pdZ7Mk7QvWGa1/BMx76PVyUINf/Mh186
S3g/BJYBj0bLNwoLPG7oCj5DQslW8CS6BseYO4LLnpXsHgJywLaTu6/XxDoylSMt ZGmaF9wZrDnJyC6djcDkG7JX9VAEBH5/1E8kXwWlW8mQzzyG59zM86/HLTnJkpln
WhmMq3PH7u6KImbHbgMuY7Y5AdwUe0St3PM8kd4lciRJXSy6exvPGO3+/dlmYrB8 nD1VebwxJ+hz4uh/gcHMzFuQA7JbwNC522OJkG84+XGcyUyR6BdYYGOobtBGsxvd
7c4a2jVhmQXW0vQUj+WkR+mqYFAvPJIMYn+jOQyUhdZi9SbCKffgreNFfoI62fNo CUmq5RXgkmNTX1TiEcqgyVnz7Bcpv40H3t0rDTSJ+1iuIVDzO4Wso0lEoA+i2OXI
w692YF1hE8Kyn0dPClRi+yL+40vbFNwkD7OqoKJYf+gYxuWkrq4q9X/lLcZTeHQe xbxmu0RYEY2EN09+S2C1/CY3jN0N+PgRGTV5MOm9xGL61JsZD7byPz4/ABg5FFxW
TxKuNsdz018ZagbYUOXTCH+QtIqOHW5VDCcRY2GExhZiY8YcVuFTZGJaiGdDhPDi J4yNpQa86jIqGq1IEBt8hTf+pZXCl36xhRMEilbgazsQ4kYFLuG/sBol4yC9BSjl
QSvAY6XYR50MAgyHHtwaSsl04iO+9h5y6iqB9Xr4Tm9zZahxMXw= MiQ928dtmIIe42pGMkd4YFFsdeF8B6XFZMg5aW54b3HSfF82A44=
=vJNA =GjBh
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHauIACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHcAAACgkQTifTfDWI
cr/KQw/9HkOl1IRURvjmi1tiEuguuEXIvj5BNVBmIRAYE5FmsOr+495FK2fL7ArT cr8ZwQ/+KJoD/nCxWWeaxLpTJTU7O7HtnvtCSXzbRYAIFxqfbkiR663KiroIeLL5
/4Gcpako1VTwmYEzF+JdJqqb9kVAbnzkOdXsV6Mb7eaGpRsleU+xSQpDyAP/K8yC AWMOFSQbgVZsIHsNA+HnEdZ3gxF0s2gj7Fd0BQrERuP4/ZG6yQ394khDwpPx3lUB
VDB47UXxeDB/aiEfcLiNcWdqVLBdin8YMlbep1UQk/zjTuTAc18JtYnSqZgwcYef lSgoGzG86SMD04OuXOvZjLAnZKZ1ECrEHdRHiGkx4KMPC2Z7EP16WbxWCGDuhj1G
7ya6KYhar9EaV7mou9e6o71nwaxb+CMMsXONp2yMigyO4+a9fKWHEvFxNlyUKs5Q 3HINr9xoMau68Zs7wTQdMkpvwEcn+Y7romGOXxRFJsuNJ2w+0q4Jvp9f/OWXIKF4
7I3rQO7ZwqJ0JkgT6QxcVYBl+vp/OfqubWL8CbpH6COTfLM5+120mb3eALabMgDc FWmV0G79moQaz08NnMVCKzd6Ful7VtTN8SxiWex9aIjVjfB0ukWgLfilycA67RN8
rC7tLhcZTGmH5mD4qteZTA8hWIExJGPB9vfTdFWvr+gZTh7E3Xg9hDB2M2PFqa98 5mMh7cxV/mPgqluJuwL800f7Js3uuaq51NHx0kj6UscRUcjZpzJAUi3dqBIa3MKV
RFeSv5EZR/WWER26FdfBIYw9VGn8j9V9AVYIOYHXsmTjqfltQRk0348tt9nebhh0 H+JP+7AnPplQ5bREsYtZzRbeLQTVCsUorKfARQ9o97NX/gupvFuo2yYUuiBQ90vr
nFDg8Kgem6BUQhF+GCp0BBn1AJFfDVBROCLkYmK26uJ0uSURl2Xu4uZUMLutSOig j5DCPnuBpqElfdb02Wz3WP/NPk+jxwsuSX+1uN+09B1ibM5By1SkhubGQANF0Ajm
9vGPFYhkstJlPYcq7BM95SoptFeVYadAIX2tMOui/IuxM6ZEYCYcrHEBd2s+YxQp RjfYozo7/U4Iq/a/Vor/mvG0v3Ips7fhorkVj8FeH02lx330jg29hJ8K92/0WbtJ
YD6/cGrhDGjq6pTHgofLsvLqmDY+z4L5v1nr4eLxzKxJFeEry+EAzNYD/BupgE7F hRLNryQszV00Ut7FcIdqIMHyIRI9GwbY+dvxjGi5kYwW2XT86cpX7Pqbkd5Pq7E6
LG7vjaHmxNKOWGxz92kU01v9wBR/MRstwXZQvTcrx7Ip2U7r3dc= LFxp1JTHuBi4CvO+f8PMIyarX2PfRBJPnJHvP1oxDhWUsof8MCQ=
=x5Er =FEte
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -260,6 +260,12 @@
"branch": "master", "branch": "master",
"commit": "8e3f520dbdda6686cc24f79b9d44a5e041797444", "commit": "8e3f520dbdda6686cc24f79b9d44a5e041797444",
"message": "Generated index.json at 2025-06-09T22:35:36Z" "message": "Generated index.json at 2025-06-09T22:35:36Z"
},
{
"timestamp": "2025-06-09 18:36:43",
"branch": "master",
"commit": "a77e52ebd9eed01da90bdc7fc97c963405570d9e",
"message": "Generated docs/integrity.sha256 at 2025-06-09T23:36:20Z"
} }
] ]
} }

View file

@ -499,3 +499,7 @@
Diff Summary: Diff Summary:
.gitfield/github.sigil.md | 14 +++++++------- .gitfield/github.sigil.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-) 1 file changed, 7 insertions(+), 7 deletions(-)
[2025-06-09T23:36:44Z] Local: , Branch=master, Commit=689a81f
Diff Summary:
.gitfield/local.sigil.md | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHauYACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHcAMACgkQTifTfDWI
cr/q3g//T4n9i9W2BLzMoHhiRVcYXXEv2voUmOu7mxc/b+BrbjqtteCkqYAO8U78 cr9SDxAAquF8OI28W9ejajYUTbRRPfx8HhXoBEYba+YdlZjdc/pxDs42bBjEq7Vc
CKER/YB+ZJ7Mt4rgYZG3+oJ6rgVCrTUFc7SX8e54NzUx054tsX5r8oEKgD673ENe zOBax02YVeS6GXqN4GrHYqmHEaOW8bC+4W8UrBO4eTV6LosnliyUiSwDY1td0dTJ
BguXxC8a2MpNHo+Rl21PXqg96RoPwOKntKhDVnz8SUouSz7Dq9eeTuKT/aJWowQm 1HAfg7tRYs3Lnxo6HjlVXMngR5VHKhLhBsMNBKoxdVObqedtDYIHApmg9vgxziOQ
FvFtcaqpIlKXdNoPp1nesca7d7pBYi/ODIxy0XAUnRsUTBkUBRDyhUtUbG31BqIe IVfEgOrpfkVQq2fxO2OKaHHrDgrMmr/nHjNjybczLoX035qbIYGpNRnD3kHuOVTz
PfLLW6U/0oDuW7+65D910Ipe78JVOpYWfg5sSDOVYe/Cg8pzMKkd28NQKdLZGNhm ziR7opP1X8fiy20tA88MK4l9DB5oulGvGIvSh1+6WVmowIe1+oQgJqYRqGJD/s4T
biGNFGLNvk+cKhfyuMiV8lasDdKgaYYuxgL0VeKsFkJ+k5UOyaPrpfLrtbQ+A0Zc rbegKA1y9+IzaaESUKlIrgiQnBghBD0C4zv6tfri/HF4ZUAP0vEMfQYAoxhVbkAw
8wp8l6jcpFX28RFx0u3abnC5RneYUopXfSDo+NcS4nYwLQ0RCOIe6ldOlVg8JbV+ kW1kLbdlaaWq8WOso/LARDDtFRndnmZ5A4L/lfViDrM93/yxbNJ6NxNINj9rC4Aa
oL8xN92ebOfsRr0x0RR0dRZV8OttSameEkkvQgW6o6eTFRBfIqByk+PsIIxpwalY ExyzKl272ov4kquk2UiXas0h6sIudbArwj4zkD+Wif6lDr0bn0/N2+yn4ZVIlxPa
TM76+5+9f7yNgaFYENKspQBSUzIX9qey40F+qgOJ6iZDah6mxc7KmVpkemkIiY4D 1xb1mCRGeLylCdYzMf6qpxT6AnKJwSY6cW2jVrF2iPvx/WSOUlOwOmmkNoX4JBDY
jU/RIlZs7j9ZuY7RziKNydqxc6JmxcH3/ce62EMKza1bDkDRjW4Pe9cXA64ffPDX 2DUEN78nHJ2tILOG1Jy5KXs5jGiFWavx1Eaj87w90czNo+k9UcDbUoF+YoiZBpeA
bzW9IFDMepBAJoVD97eR9c8SI4hqxfCq+w+MX/5S97Hv51p/7yA= L5reachrocild2vcNoETVXK4ljDWt1jcnMXWW5hapnag7DbbJ9E=
=dz8e =Hnbv
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -33,17 +33,10 @@ DOCS_NOJEKYLL="$DOCS_DIR/.nojekyll"
DOCS_ROBOTS="$DOCS_DIR/robots.txt" DOCS_ROBOTS="$DOCS_DIR/robots.txt"
DOCS_SITEMAP="$DOCS_DIR/sitemap.xml" DOCS_SITEMAP="$DOCS_DIR/sitemap.xml"
DOCS_INTEGRITY="$DOCS_DIR/integrity.sha256" DOCS_INTEGRITY="$DOCS_DIR/integrity.sha256"
GITLAB_CI="$REPO_PATH/.gitlab-ci.yml"
CODEBERG_CI="$REPO_PATH/.codeberg-ci.yml"
TIMESTAMP=$(date -u '+%Y-%m-%dT%H:%M:%SZ') TIMESTAMP=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
SCRIPT_VERSION="1.5" # Updated for CI/CD and GPG enhancements SCRIPT_VERSION="1.4" # Updated for GPG integration
PRESERVE_META=${PRESERVE_META:-false} # Preserve existing metadata PRESERVE_META=${PRESERVE_META:-false} # Preserve existing metadata
FORCE_DOCS=${FORCE_DOCS:-false} # Force overwrite of /docs metadata FORCE_DOCS=${FORCE_DOCS:-false} # Force overwrite of /docs metadata
SKIP_CI=${SKIP_CI:-false} # Skip CI/CD file generation
GPG_FORCE=${GPG_FORCE:-true} # Force GPG overwrites
CI_STATUS=${CI_STATUS:-mock} # Mock or live CI status
CI_STATUS_GITLAB="unknown"
CI_STATUS_CODEBERG="unknown"
# URLs for each platform # URLs for each platform
CANONICAL_URL="https://remember.thefoldwithin.earth/mrhavens/$REPO_NAME" CANONICAL_URL="https://remember.thefoldwithin.earth/mrhavens/$REPO_NAME"
@ -135,7 +128,7 @@ sign_file() {
return return
fi fi
for key_id in "${GPG_KEYS[@]}"; do for key_id in "${GPG_KEYS[@]}"; do
gpg --armor --detach-sign --default-key "$key_id" --yes --batch "$file" > "$sig_file.$key_id" 2>/dev/null || warn "Failed to sign $file with key $key_id, continuing..." gpg --armor --detach-sign --yes --default-key "$key_id" "$file" > "$sig_file.$key_id" 2>/dev/null || warn "Failed to sign $file with key $key_id, continuing..."
if [ -f "$sig_file.$key_id" ]; then if [ -f "$sig_file.$key_id" ]; then
git -C "$REPO_PATH" add "$sig_file.$key_id" git -C "$REPO_PATH" add "$sig_file.$key_id"
git -C "$REPO_PATH" commit -m "Signed $file with GPG key $key_id at $TIMESTAMP" || warn "No changes to commit for $sig_file.$key_id" git -C "$REPO_PATH" commit -m "Signed $file with GPG key $key_id at $TIMESTAMP" || warn "No changes to commit for $sig_file.$key_id"
@ -165,81 +158,6 @@ copy_to_docs() {
info "Copied $src to $dest and committed" info "Copied $src to $dest and committed"
} }
# ╭─────────────────────────────────────╮
# │ CI/CD GENERATION │
# ╰─────────────────────────────────────╮
generate_gitlab_ci() {
if [ "$SKIP_CI" = "true" ]; then
info "Skipping .gitlab-ci.yml generation (--skip-ci enabled)"
return
fi
info "Generating $GITLAB_CI..."
if [ "$PRESERVE_META" = "true" ] && [ -f "$GITLAB_CI" ]; then
info "Preserving existing $GITLAB_CI (--preserve-meta enabled)"
return
fi
cat > "$GITLAB_CI" <<EOF
# GitLab CI configuration for GitField Pages deployment
# Generated by gitfield-sync at $TIMESTAMP (v$SCRIPT_VERSION)
stages:
- deploy
pages:
stage: deploy
script:
- cp -r docs/ public/
artifacts:
paths:
- public
only:
- main
EOF
git -C "$REPO_PATH" add "$GITLAB_CI"
git -C "$REPO_PATH" commit -m "Generated .gitlab-ci.yml at $TIMESTAMP" || warn "No changes to commit for $GITLAB_CI"
info "Generated and committed $GITLAB_CI"
}
generate_codeberg_ci() {
if [ "$SKIP_CI" = "true" ]; then
info "Skipping .codeberg-ci.yml generation (--skip-ci enabled)"
return
fi
if ! git -C "$REPO_PATH" remote -v | grep -q "codeberg.org"; then
info "No Codeberg remote detected, skipping .codeberg-ci.yml generation"
return
fi
info "Generating $CODEBERG_CI..."
if [ "$PRESERVE_META" = "true" ] && [ -f "$CODEBERG_CI" ]; then
info "Preserving existing $CODEBERG_CI (--preserve-meta enabled)"
return
fi
cat > "$CODEBERG_CI" <<EOF
# Codeberg CI configuration for GitField Pages deployment
# Generated by gitfield-sync at $TIMESTAMP (v$SCRIPT_VERSION)
name: Deploy Pages
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Copy docs to public
run: cp -r docs/ public/
- name: Deploy to Codeberg Pages
uses: actions/upload-pages-artifact@v1
with:
path: public
EOF
git -C "$REPO_PATH" add "$CODEBERG_CI"
git -C "$REPO_PATH" commit -m "Generated .codeberg-ci.yml at $TIMESTAMP" || warn "No changes to commit for $CODEBERG_CI"
info "Generated and committed $CODEBERG_CI"
}
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ METADATA GENERATION │ # │ METADATA GENERATION │
# ╰─────────────────────────────────────╮ # ╰─────────────────────────────────────╮
@ -267,11 +185,7 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
], ]
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
EOF EOF
# Sanitize rad:rad: # Sanitize rad:rad:
@ -312,11 +226,6 @@ $(for i in "${!GPG_KEYS[@]}"; do
echo "- **${GPG_NAMES[i]}** <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})" echo "- **${GPG_NAMES[i]}** <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})"
done) done)
## CI/CD Status
- **GitLab Pages**: $CI_STATUS_GITLAB
- **Codeberg Pages**: $CI_STATUS_CODEBERG
## Mirror Repositories ## Mirror Repositories
The project is mirrored across multiple platforms to enhance redundancy and accessibility: The project is mirrored across multiple platforms to enhance redundancy and accessibility:
@ -376,11 +285,7 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
], ]
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
EOF EOF
# Sanitize rad:rad: # Sanitize rad:rad:
@ -419,11 +324,7 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
], ]
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
EOF EOF
# Sanitize rad:rad: # Sanitize rad:rad:
@ -516,11 +417,7 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
], ]
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
</script> </script>
</head> </head>
@ -538,14 +435,9 @@ done)
<p>Signed with the following GPG keys:</p> <p>Signed with the following GPG keys:</p>
<ul> <ul>
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " <li>${GPG_NAMES[i]} <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})</li>" echo " <li>${GPG_NAMES[i]} &lt;${GPG_EMAILS[i]}&gt; (Key ID: ${GPG_KEYS[i]})</li>"
done) done)
</ul> </ul>
<p>CI/CD Status:</p>
<ul>
<li>GitLab Pages: $CI_STATUS_GITLAB</li>
<li>Codeberg Pages: $CI_STATUS_CODEBERG</li>
</ul>
</section> </section>
<section> <section>
<h2>Mirror Repositories</h2> <h2>Mirror Repositories</h2>
@ -574,15 +466,15 @@ done)
</section> </section>
<section> <section>
<h2>Why Recursive Sovereignty Matters</h2> <h2>Why Recursive Sovereignty Matters</h2>
<p>The GitField framework distributes <code>$REPO_NAME</code> across decentralized (Radicle), self-hosted (Forgejo), and community-driven (Codeberg, Gitea) platforms, alongside mainstream services (GitHub, GitLab, Bitbucket). This recursive strategy defends against past deplatforming attempts by individuals such as Joel Johnson, Dr. LeCody, and Andrew LeCody, ensuring the project's persistence and accessibility.</p> <p>The GitField framework distributes <code>$REPO_NAME</code> across decentralized (Radicle), self-hosted (Forgejo), and community-driven (Codeberg, Gitea) platforms, alongside mainstream services (GitHub, GitLab, Bitbucket). This recursive strategy defends against past deplatforming attempts by individuals such as Joel Johnson, Dr. Peter Gaied, and Andrew LeCody, ensuring the project's persistence and accessibility.</p>
</section> </section>
<section> <section>
<h2>Source Links</h2> <h2>Source Links</h2>
<p>Access the project's metadata and logs:</p> <p>Access the project's metadata and logs:</p>
<ul> <ul>
<li><a href="pushed.log">pushed Log</a> (Audit trail of sync operations)</li> <li><a href="pushed.log">pushed.log</a> (Audit trail of sync operations)</li>
<li><a href="../GITFIELD_GITLAB.md">GitLab</a> (Multi-repo manifest)</a></li> <li><a href="../GITFIELD.md">GITFIELD.md</a> (Multi-repository strategy overview)</li>
<li><a href="gitfieldtown.README.txt">GitField</a> README.txt</a> (Metadata directory explanation)</li> <li><a href="gitfield.README.txt">gitfield.README.txt</a> (Metadata directory explanation)</li>
</ul> </ul>
</section> </section>
</main> </main>
@ -602,7 +494,7 @@ EOF
generate_docs_css() { generate_docs_css() {
info "Generating $DOCS_CSS..." info "Generating $DOCS_CSS..."
mkdir -p "$DOCS_DIR" mkdir -p "$DOCS_DIR"
if [ -f "$DOCS_CSS" ] && [ "$PRESERVE_META" = "true" ]; then if [ "$PRESERVE_META" = "true" ] && [ -f "$DOCS_CSS" ]; then
info "Preserving existing $DOCS_CSS (--preserve-meta enabled)" info "Preserving existing $DOCS_CSS (--preserve-meta enabled)"
return return
fi fi
@ -681,19 +573,15 @@ $(printf ' "%s",\n' "${MIRRORS[@]}" | sed '$ s/,$//')
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//' echo " {\"key_id\": \"${GPG_KEYS[i]}\", \"name\": \"${GPG_NAMES[i]}\", \"email\": \"${GPG_EMAILS[i]}\"}" | sed '$ s/,$//'
done) done)
], ]
"ci_status": {
"gitlab": "$CI_STATUS_GITLAB",
"codeberg": "$CI_STATUS_CODEBERG"
}
} }
EOF EOF
# Sanitize rad:rad: # Sanitize rad:rad:
sed -i 's/rad:rad:/rad:/g' "$DOCS_REPOS_JSON" sed -i 's/rad:rad:/rad:/g' "$DOCS_REPOS_JSON"
git -C "$REPO_PATH" add "$DOCS_REPOS_JSON" git -C "$REPO_PATH" add "$DOCS_REPOS_JSON"
git -C "$REPO_PATH" commit -m "Generated docs/repos.json at $TIMESTAMP" || warn "No changes to commit for $DOCS_REPOS_JSON" git -C "$REPO_PATH" commit -m "Generated docs/repos.json at $TIMESTAMP" || warn "No changes to commit for $DOCS_REPOS_JSON"
sign_file "$DOCS_REPOS_JSON"
info "Generated and committed $DOCS_REPOS_JSON" info "Generated and committed $DOCS_REPOS_JSON"
sign_file "$DOCS_REPOS_JSON"
} }
generate_docs_readme() { generate_docs_readme() {
@ -706,7 +594,7 @@ generate_docs_readme() {
cat > "$DOCS_README" <<EOF cat > "$DOCS_README" <<EOF
# GitField /docs Directory # GitField /docs Directory
The `/docs` directory hosts a public-facing, SEO-optimized canonical declaration for the \`$REPO_NAME\` repository, designed for GitHub Pages, GitLab Pages, and Codeberg Pages compatibility and enhanced discoverability. The `/docs` directory hosts a public-facing, SEO-optimized canonical declaration for the \`$REPO_NAME\` repository, designed for GitHub Pages compatibility and enhanced discoverability.
## Files ## Files
@ -726,11 +614,6 @@ The `/docs` directory hosts a public-facing, SEO-optimized canonical declaration
- **sitemap.xml**: Auto-generated sitemap for improved SEO. - **sitemap.xml**: Auto-generated sitemap for improved SEO.
- **integrity.sha256**: SHA-256 hash of all metadata files for integrity verification. - **integrity.sha256**: SHA-256 hash of all metadata files for integrity verification.
## CI/CD Integration
- **GitLab Pages**: Deployed via `.gitlab-ci.yml`, status: $CI_STATUS_GITLAB
- **Codeberg Pages**: Deployed via `.codeberg-ci.yml`, status: $CI_STATUS_CODEBERG
## Purpose ## Purpose
This directory ensures the \`$REPO_NAME\` project is discoverable via search engines and accessible to humans and bots. It declares the canonical repository at [$CANONICAL_URL]($CANONICAL_URL) and links to all mirrors, reinforcing the GitField recursive metadata strategy for sovereign publishing. This directory ensures the \`$REPO_NAME\` project is discoverable via search engines and accessible to humans and bots. It declares the canonical repository at [$CANONICAL_URL]($CANONICAL_URL) and links to all mirrors, reinforcing the GitField recursive metadata strategy for sovereign publishing.
@ -796,18 +679,6 @@ generate_docs_sitemap() {
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.9</priority> <priority>0.9</priority>
</url> </url>
<url>
<loc>$GITLAB_URL/-/jobs/artifacts/main/raw/public/index.html?job=pages</loc>
<lastmod>$TIMESTAMP</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://mrhavens.codeberg.page/$REPO_NAME/index.html</loc>
<lastmod>$TIMESTAMP</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url> <url>
<loc>$GITHUB_URL/docs/canonical.meta</loc> <loc>$GITHUB_URL/docs/canonical.meta</loc>
<lastmod>$TIMESTAMP</lastmod> <lastmod>$TIMESTAMP</lastmod>
@ -833,8 +704,7 @@ generate_docs_sitemap() {
<priority>0.8</priority> <priority>0.8</priority>
</url> </url>
<url> <url>
<loc>$GITHUB_URL/docs/.well-known/repo.$REPO_NAME.json</loc> <loc>$GITHUB_URL/docs/.well-known/gitfield.json</loc>
<url>
<lastmod>$TIMESTAMP</lastmod> <lastmod>$TIMESTAMP</lastmod>
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
@ -852,7 +722,7 @@ generate_docs_sitemap() {
<priority>0.8</priority> <priority>0.8</priority>
</url> </url>
<url> <url>
<url>$GITHUB_URL/docs/gitfieldtown.README.txt</loc> <loc>$GITHUB_URL/docs/gitfield.README.txt</loc>
<lastmod>$TIMESTAMP</lastmod> <lastmod>$TIMESTAMP</lastmod>
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
@ -860,7 +730,7 @@ generate_docs_sitemap() {
$(for mirror in "${MIRRORS[@]}"; do $(for mirror in "${MIRRORS[@]}"; do
if [[ "$mirror" != rad:* ]]; then if [[ "$mirror" != rad:* ]]; then
echo " <url>" echo " <url>"
echo " <loc>$mirror</loc></loc>" echo " <loc>$mirror</loc>"
echo " <lastmod>$TIMESTAMP</lastmod>" echo " <lastmod>$TIMESTAMP</lastmod>"
echo " <changefreq>weekly</changefreq>" echo " <changefreq>weekly</changefreq>"
echo " <priority>0.8</priority>" echo " <priority>0.8</priority>"
@ -886,7 +756,7 @@ generate_docs_integrity() {
# Generated by gitfield-sync at $TIMESTAMP (v$SCRIPT_VERSION) # Generated by gitfield-sync at $TIMESTAMP (v$SCRIPT_VERSION)
EOF EOF
for file in "$DOCS_CANNONICAL_META" "$DOCS_CANNICAL_MD" "$DOCS_INDEX_JSON" "$DOCS_GITFIELD_JSON" "$DOCS_WELL_KNOWN_JSON" "$DOCS_REPOS_JSON" "$DOCS_PUSHED_LOG" "$DOCS_GITFIELD_README"; do for file in "$DOCS_CANONICAL_META" "$DOCS_CANONICAL_MD" "$DOCS_INDEX_JSON" "$DOCS_GITFIELD_JSON" "$DOCS_WELL_KNOWN_JSON" "$DOCS_REPOS_JSON" "$DOCS_PUSHED_LOG" "$DOCS_GITFIELD_README"; do
if [ -f "$file" ]; then if [ -f "$file" ]; then
sha256sum "$file" >> "$DOCS_INTEGRITY" || warn "Failed to compute SHA-256 for $file, continuing..." sha256sum "$file" >> "$DOCS_INTEGRITY" || warn "Failed to compute SHA-256 for $file, continuing..."
else else
@ -895,55 +765,22 @@ EOF
done done
git -C "$REPO_PATH" add "$DOCS_INTEGRITY" git -C "$REPO_PATH" add "$DOCS_INTEGRITY"
git -C "$REPO_PATH" commit -m "Generated docs/integrity.sha256 at $TIMESTAMP" || warn "No changes to commit for $DOCS_INTEGRITY" git -C "$REPO_PATH" commit -m "Generated docs/integrity.sha256 at $TIMESTAMP" || warn "No changes to commit for $DOCS_INTEGRITY"
sign_file "$DOCS_INTEGRITY"
info "Generated and committed $DOCS_INTEGRITY" info "Generated and committed $DOCS_INTEGRITY"
sign_file "$DOCS_INTEGRITY"
} }
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ TRIGGER CI PIPELINE # │ INITIAL SETUP
# ╰─────────────────────────────────────╮ # ╰─────────────────────────────────────╮
trigger_ci_pipeline() { mkdir -p "$GITFIELD_DIR" "$WELL_KNOWN_DIR" "$DOCS_DIR" "$DOCS_WELL_KNOWN_DIR"
local platform=$1
local url=$2
local token_var=$3
local project_id=$4
local timestamp=$(date -u '+%Y-%m-%dT%H:%M:%SZ')
if [ "$CI_STATUS" = "mock" ]; then if [ ! -f "$LOG_FILE" ]; then
info "CI status set to mock, skipping $platform pipeline trigger" echo "# Push Log for $REPO_NAME" > "$LOG_FILE"
echo "[$timestamp] $platform: Pipeline trigger skipped (mock mode)" >> "$LOG_FILE" echo "# Generated by gitfield-sync" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
copy_to_docs "$LOG_FILE" "$DOCS_PUSHED_LOG" copy_to_docs "$LOG_FILE" "$DOCS_PUSHED_LOG"
return
fi fi
if [ -z "${!token_var}" ]; then
warn "$platform API token ($token_var) not set, skipping pipeline trigger"
echo "[$timestamp] $platform: Pipeline trigger skipped (no API token)" >> "$LOG_FILE"
copy_to_docs "$LOG_FILE" "$DOCS_PUSHED_LOG"
return
fi
local response
if [ "$platform" = "GitLab" ]; then
response=$(curl -s -X POST \
-H "PRIVATE-TOKEN: ${!token_var}" \
"$url/api/v4/projects/$project_id/pipeline?ref=main" | jq '.status' 2>/dev/null)
elif [ "$platform" = "Codeberg" ]; then
response=$(curl -s -X POST \
-H "Authorization: Bearer ${!token_var}" \
"$url/api/v1/repos/mrhavens/$REPO_NAME/actions/runs" | jq '.status' 2>/dev/null)
fi
if [ -n "$response" ]; then
echo "[$timestamp] $platform: Pipeline triggered, status: $response" >> "$LOG_FILE"
info "$platform pipeline triggered, status: $response"
else
echo "[$timestamp] $platform: Pipeline trigger failed" >> "$LOG_FILE"
warn "$platform pipeline trigger failed"
fi
copy_to_docs "$LOG_FILE" "$DOCS_PUSHED_LOG"
}
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ GENERATE GITFIELD.MD │ # │ GENERATE GITFIELD.MD │
# ╰─────────────────────────────────────╮ # ╰─────────────────────────────────────╮
@ -991,7 +828,6 @@ The following platforms host the \`$REPO_NAME\` repository, each chosen for its
### 3. Codeberg ### 3. Codeberg
- **URL**: [$CODEBERG_URL]($CODEBERG_URL) - **URL**: [$CODEBERG_URL]($CODEBERG_URL)
- **CI/CD Status**: $CI_STATUS_CODEBERG
- **Purpose**: Codeberg is a community-driven, open-source platform powered by Forgejo, offering a reliable and ethical alternative for hosting git repositories. - **Purpose**: Codeberg is a community-driven, open-source platform powered by Forgejo, offering a reliable and ethical alternative for hosting git repositories.
- **Value**: Enhances project resilience with its open-source ethos and independent infrastructure, ensuring accessibility and community support. - **Value**: Enhances project resilience with its open-source ethos and independent infrastructure, ensuring accessibility and community support.
@ -1002,7 +838,6 @@ The following platforms host the \`$REPO_NAME\` repository, each chosen for its
### 5. GitLab ### 5. GitLab
- **URL**: [$GITLAB_URL]($GITLAB_URL) - **URL**: [$GITLAB_URL]($GITLAB_URL)
- **CI/CD Status**: $CI_STATUS_GITLAB
- **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. - **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. - **Value**: Enhances project resilience with its integrated CI/CD pipelines and independent infrastructure, reducing reliance on a single provider.
@ -1027,7 +862,7 @@ The decision to maintain multiple repositories stems from the need to safeguard
- **Diversity**: Each platforms unique features (e.g., GitHubs community, GitLabs CI/CD, Bitbuckets integrations, Radicles decentralization, Forgejos self-hosting, Codebergs community-driven model, Giteas lightweight efficiency) enhance the projects functionality and reach. - **Diversity**: Each platforms unique features (e.g., GitHubs community, GitLabs CI/CD, Bitbuckets integrations, Radicles decentralization, Forgejos self-hosting, Codebergs community-driven model, Giteas lightweight efficiency) enhance the projects functionality and reach.
- **Transparency**: Metadata snapshots in the \`.gitfield\` directory (for internal audit) and public-facing documentation in the \`/docs\` directory provide a verifiable record of the projects state across all platforms. - **Transparency**: Metadata snapshots in the \`.gitfield\` directory (for internal audit) and public-facing documentation in the \`/docs\` directory provide a verifiable record of the projects state across all platforms.
This multi-repository approach, bolstered by Forgejos sovereign hosting, GitHub Pages, GitLab Pages, and Codeberg Pages discoverability, reflects a commitment to preserving the integrity, accessibility, and independence of \`$REPO_NAME\`, ensuring it remains available to contributors and users regardless of external pressures. This multi-repository approach, bolstered by Forgejos sovereign hosting and GitHub Pages discoverability, reflects a commitment to preserving the integrity, accessibility, and independence of \`$REPO_NAME\`, ensuring it remains available to contributors and users regardless of external pressures.
--- ---
@ -1038,17 +873,11 @@ This multi-repository approach, bolstered by Forgejos sovereign hosting, GitH
- **SEO Metadata**: SEO-friendly metadata with Schema.org JSON-LD is available in [\`docs/gitfield.json\`](./docs/gitfield.json) and [\`docs/.well-known/gitfield.json\`](./docs/.well-known/gitfield.json). - **SEO Metadata**: SEO-friendly metadata with Schema.org JSON-LD is available in [\`docs/gitfield.json\`](./docs/gitfield.json) and [\`docs/.well-known/gitfield.json\`](./docs/.well-known/gitfield.json).
- **Push Log**: The [\`docs/pushed.log\`](./docs/pushed.log) file records the date, time, commit hash, and RID/URL of every push operation across all platforms, providing a transparent audit trail. - **Push Log**: The [\`docs/pushed.log\`](./docs/pushed.log) file records the date, time, commit hash, and RID/URL of every push operation across all platforms, providing a transparent audit trail.
- **GitField Directory**: The \`.gitfield\` directory contains internal metadata and platform-specific sigils (e.g., \`github.sigil.md\`). See [\`docs/gitfield.README.txt\`](./docs/gitfield.README.txt) for details. - **GitField Directory**: The \`.gitfield\` directory contains internal metadata and platform-specific sigils (e.g., \`github.sigil.md\`). See [\`docs/gitfield.README.txt\`](./docs/gitfield.README.txt) for details.
- **Pages Deployments**: Public-facing declarations are available at: - **GitHub Pages**: A public-facing, SEO-optimized canonical declaration is available in [\`docs/index.html\`](./docs/index.html), with a sitemap in [\`docs/sitemap.xml\`](./docs/sitemap.xml) and integrity hashes in [\`docs/integrity.sha256\`](./docs/integrity.sha256).
- GitHub Pages: [$GITHUB_URL/docs/index.html]($GITHUB_URL/docs/index.html)
- GitLab Pages: [$GITLAB_URL/-/jobs/artifacts/main/raw/public/index.html?job=pages]($GITLAB_URL/-/jobs/artifacts/main/raw/public/index.html?job=pages)
- Codeberg Pages: [https://mrhavens.codeberg.page/$REPO_NAME/index.html](https://mrhavens.codeberg.page/$REPO_NAME/index.html)
- **GPG Signatures**: Metadata files are signed with the following GPG keys: - **GPG Signatures**: Metadata files are signed with the following GPG keys:
$(for i in "${!GPG_KEYS[@]}"; do $(for i in "${!GPG_KEYS[@]}"; do
echo " - ${GPG_NAMES[i]} <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})" echo " - ${GPG_NAMES[i]} <${GPG_EMAILS[i]}> (Key ID: ${GPG_KEYS[i]})"
done) done)
- **CI/CD Status**:
- GitLab: $CI_STATUS_GITLAB
- Codeberg: $CI_STATUS_CODEBERG
- **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. - **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 → Forgejo → Codeberg → Gitea → GitLab → Bitbucket → GitHub**. This prioritizes Radicles decentralized, censorship-resistant network as the primary anchor, followed by Forgejos sovereign, self-hosted infrastructure, Codebergs community-driven platform, Giteas lightweight efficiency, GitLabs robust DevOps features, Bitbuckets enterprise redundancy, and GitHubs broad visibility, ensuring a resilient and accessible metadata chain. - **Push Order**: The repository is synchronized in the following order: **Radicle → Forgejo → Codeberg → Gitea → GitLab → Bitbucket → GitHub**. This prioritizes Radicles decentralized, censorship-resistant network as the primary anchor, followed by Forgejos sovereign, self-hosted infrastructure, Codebergs community-driven platform, Giteas lightweight efficiency, GitLabs robust DevOps features, Bitbuckets enterprise redundancy, and GitHubs broad visibility, ensuring a resilient and accessible metadata chain.
@ -1103,8 +932,6 @@ execute_push() {
local url=$3 local url=$3
local rid=$4 local rid=$4
local peer_id=$5 local peer_id=$5
local token_var=$6
local project_id=$7
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 "Executing $platform push with script: $script_path" info "Executing $platform push with script: $script_path"
@ -1114,9 +941,6 @@ execute_push() {
log_url "$platform" "$url" "$rid" "$peer_id" log_url "$platform" "$url" "$rid" "$peer_id"
git add . || warn "Nothing to add after $script_path" 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" git commit -m "Post-$platform sync at $TIMESTAMP" || warn "No changes to commit after $script_path"
if [ "$platform" = "GitLab" ] || [ "$platform" = "Codeberg" ]; then
trigger_ci_pipeline "$platform" "$url" "$token_var" "$project_id"
fi
popd >/dev/null popd >/dev/null
else else
error "Script $script_path is not executable" error "Script $script_path is not executable"
@ -1131,14 +955,14 @@ run_push_cycle() {
info "Starting push cycle $cycle_number..." info "Starting push cycle $cycle_number..."
SYNC_CYCLES=$cycle_number SYNC_CYCLES=$cycle_number
execute_push "gitfield-local" "Local" "" "" "" "" "" execute_push "gitfield-local" "Local" "" "" ""
execute_push "gitfield-radicle" "Radicle" "" "$RADICLE_RID" "$RADICLE_PEER_ID" "" "" execute_push "gitfield-radicle" "Radicle" "" "$RADICLE_RID" "$RADICLE_PEER_ID"
execute_push "gitfield-remember" "Forgejo" "$FORGEJO_URL" "" "" "" "" execute_push "gitfield-remember" "Forgejo" "$FORGEJO_URL" "" ""
execute_push "gitfield-codeberg" "Codeberg" "$CODEBERG_URL" "" "" "CODEBERG_TOKEN" "mrhavens/$REPO_NAME" execute_push "gitfield-codeberg" "Codeberg" "$CODEBERG_URL" "" ""
execute_push "gitfield-gitea" "Gitea" "$GITEA_URL" "" "" "" "" execute_push "gitfield-gitea" "Gitea" "$GITEA_URL" "" ""
execute_push "gitfield-gitlab" "GitLab" "$GITLAB_URL" "" "" "GITLAB_TOKEN" "mrhavens/$REPO_NAME" execute_push "gitfield-gitlab" "GitLab" "$GITLAB_URL" "" ""
execute_push "gitfield-bitbucket" "Bitbucket" "$BITBUCKET_URL" "" "" "" "" execute_push "gitfield-bitbucket" "Bitbucket" "$BITBUCKET_URL" "" ""
execute_push "gitfield-github" "GitHub" "$GITHUB_URL" "" "" "" "" execute_push "gitfield-github" "GitHub" "$GITHUB_URL" "" ""
# Regenerate metadata after each cycle to update sync_cycles # Regenerate metadata after each cycle to update sync_cycles
generate_canonical_meta generate_canonical_meta
@ -1154,13 +978,11 @@ run_push_cycle() {
generate_docs_robots generate_docs_robots
generate_docs_sitemap generate_docs_sitemap
generate_docs_integrity generate_docs_integrity
generate_gitlab_ci
generate_codeberg_ci
} }
# ╭─────────────────────────────────────╮ # ╭─────────────────────────────────────╮
# │ MAIN EXECUTION │ # │ MAIN EXECUTION │
# ╰───────────────────────────────────── # ╰─────────────────────────────────────
info "Starting gitfield-sync for $REPO_NAME..." info "Starting gitfield-sync for $REPO_NAME..."
# Parse flags # Parse flags
@ -1176,24 +998,6 @@ while [ $# -gt 0 ]; do
info "Force docs overwrite flag enabled" info "Force docs overwrite flag enabled"
shift shift
;; ;;
--skip-ci)
SKIP_CI=true
info "Skip CI generation flag enabled"
shift
;;
--gpg-force)
GPG_FORCE=true
info "GPG force overwrite flag enabled"
shift
;;
--ci-status=*)
CI_STATUS="${1#*=}"
if [[ ! "$CI_STATUS" =~ ^(mock|live)$ ]]; then
error "Invalid --ci-status value: $CI_STATUS, must be 'mock' or 'live'"
fi
info "CI status set to $CI_STATUS"
shift
;;
*) *)
warn "Unknown argument: $1" warn "Unknown argument: $1"
shift shift
@ -1204,8 +1008,8 @@ done
if [ ! -d "$REPO_PATH/.git" ]; then if [ ! -d "$REPO_PATH/.git" ]; then
pushd "$REPO_PATH" >/dev/null pushd "$REPO_PATH" >/dev/null
git init git init
git add . || warn "Nothing to commit" git add .
git commit -m "Initial commit" || warn "No changes to commit" git commit -m "Initial commit" || warn "Nothing to commit"
popd >/dev/null popd >/dev/null
fi fi
@ -1223,8 +1027,6 @@ generate_docs_nojekyll
generate_docs_robots generate_docs_robots
generate_docs_sitemap generate_docs_sitemap
generate_docs_integrity generate_docs_integrity
generate_gitlab_ci
generate_codeberg_ci
# Run push cycles # Run push cycles
run_push_cycle 1 run_push_cycle 1

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHaukACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHcAcACgkQTifTfDWI
cr98fA//ZukcmW8omAfCjgchDfBEGGYnGKP21rnPSHmxYbht+2dvGULxbtvqJW3W cr+a9Q//Q9NsAFFEgL+5Qy/kFWQQSO/lz6jBeEbo9pfjccHNF7gLyZXzZniFJU9D
bjlB5yh102CnwkHiFj5LdpLAqrif3ZKzPtHg7jjREWZqL1dItk5OXPJuzfw5ETPL aRTz/92kaGf05QxT5FGlvsL9FTDTM+UibbYysni9nFSuTOXlYpBl8CrDvKPBpn1n
KawoF74sdXHrrdP0iMWfCRAg+WreDZB091D5Arg80QlKYLp/otdrgDTi0UgGFL0F W+4e1yUabFighiVvdXPQa/TNyQshjpaE82KvtJ8UjjB8bivrSSHRxVgCZCDhbilm
0tjc6l/B4oI9dTlV1Ts8X3WZerzQx8E6kRkWUz279lFTIsgsau+fnGChMT5HKLwt FBJ6N6dY3zVPIoGn9PoJpF0RFMc8cCjhYrjy1CJ7uO3ACz1de2XhM+tYWNYwHVVa
0UJ+ISSQw5QL8MthPMYywz3NPm/bQ9ywxHQ2MtZjI8tgwAjPyH5Qav6/oHgHNUtb Hg2C/gW7DHkC8669Py/BGMcZ1uFx4W9DJqcymXAQehuW6NUUPWkCM33pOm+8kIFl
DSn9C/FzS26ZIOVPU97ktVcfgA/8nwLQ4eUh5JfdQKxRoV2bRG9nDsiDRbFg80Xl TP4KHUtYQYTIrpwjJ9W2ARAdvdT0CXuoEl8jdrU9JZ+w8qOlnHq2Okg+lQrsCtjm
TYx5kNYBIM18wrWKeob2mP4LFGQintiScuEfKxmosgOTC34rm7U9p8dK2A23sesG N5Wt7iaaJqHr1L6fFYxwoFj/EDWB09m3vbRbAMOa8MIBZIOmcfnnUEoqR4ZD0XF3
zJ4u44nxCuaLeatQr7soDUj5neVISO1WSl/nk3bwZhyC2PKXCei3/SXgX2JQzjnp L+L72ylYZA6V4g7PcSFfWtDwsBNH6PW/pgppbaEon06lZC+5FFw3QnO1KdCjjN1f
ew+OlRD3qybx9EmXSX7Zh8/YoPyZq9UavFLg7d6Jpi6QMpXmmnDagQ0cbRuxQk9k aLV1SY1tXhxvBR0y6q5xTdo8ul5QltBe7MWpjkl8bM3dK5Z2TuViyI6f14R6KBUa
lCkHGAI8n2ETFwWHyC2YAzoglQ/zsOQWwCwIJSgt5MSybh31FixzO1zxPZB+6D91 GjTBDGcjkObecFEg9GelpccDPVy6IfH5WBS9eMYP0fO7mNj8O4NxHdtAAxpQKEvt
9XY2oFUd9PJs7e0+WGogewXRk1Y6g4kDOiLwC8ChsYNwWkGFTy8= X95Owo5OsSxhgUk1xQULyVMIxCyobfYvJ9BvBFLvC/wIBpzWWf0=
=Kowh =9E7z
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -0,0 +1,16 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHb/8ACgkQTifTfDWI
cr/OcxAAuO37ofdgf51czLvp4Rxk4NdEsUpn3BueRDsmRbfmclWyG3X+sRwsD+Fq
d60Yp/fy/aICyIkUqJ8P0DcASKkKWaahob0wQipWh256oTTAxFrohcKu19h1f432
fClLRdcgm74WJOrcBC7fx0LjAHdUnEV8xRdH+zhOdVyiiBCHn2E4GMQdqwqp7mI3
2r1Q0Mq6ku+BwKoYcRdZsoFVGJOi39CZpvFRqZYCoclmc+Un23P0E6gucY1FIxFN
xQtYXmgu/It1y4ZXUVMyZPrisqqlBfMcMbRMB06KQ48/goJoq42FV7EBxG9ZdZfO
NZmteWULMxFlPQu4JwJkdRAYNN2c6uZd6GQcwg6I5GfMH1qoWnWUrJuQtFRusn0A
rhW0ntY34M5cTaJDSq69yXGg5dmnufFL/2CpjnwOiC/NxHiHJE7w+CHDJ7Qtl1Ie
4sqhstAz113MPeQQpw2biinZ636eHZODdvboyJzuVFssbSCwI22TopTdLj1s9sEB
xduwGDzmVra28qhg1aeeqT+4tWxBwn6dwamPsLqFJLpwO7q9fcMGd7cENCVIcS6I
0bH2Nrc0kFpqaSsnLtutIjTJ5MCLlUGl2CHpXHWoApO2AkeuZn7ac3gJWucrMYvE
WkTN+uPJ531AG7zXJsPJEOP67ttBjyFodEcVTYcgZueLqJIW7js=
=uwJG
-----END PGP SIGNATURE-----

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHaucACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHcAUACgkQTifTfDWI
cr9ZJg//W1s21IygAOXTe/RGRk3cBEZo67OrTbkjHZW0TFB4nomuhl4HbFfeD9LQ cr80PQ//e53vdbf5s9ISzz8jHVoD/Kpuf3y0yTmAW5/UiR8dcX5eo/b7g74c0pjI
2k+obj+fjzvseL8B+nOBvrK1n/2OiLsrJihHg2mbWe7HKm8jG/cRfAf++nQ3j024 v4A7N8qt5EEuv1WHby3zPMeo69rJ3FBI+PLpwLo2+VpeMYjblatBI9Px5vZsNbyG
zMMtKakRcJHAvIsa+Bg1vwfJdEvKyaEhO+lGsiIadpdmVEmPuBWZFmsjEZzs1tU6 vJ/hlyzP0jpUf1qamKXPjebQtcMRN/cY2gUHMwZzl8IV+ZggeCwTKiuYZgGCAL8N
PNQadE7b7bM1UREjpOZRqVvSZYZ2+ngicC/AdHiFD8tlwMGpeE5k8CPjsZouPznv frKqrZ4nj0qBkjmemgMsRpJQ8eYLDHsTnisbCKGzcX60H12zXTlUU4XYiofdcdUl
lUySiRKfv0dIC3+vtIL7Sfr8b+Ux3gdKvCaqEY0C4+FTIR1Cq/abslNPl0rYDI2W tHH4qdpBV9FadB9ypSkNkGeQe5NlkTt2sbrOVaTjPvlGkyjFkVyPFP9yYWESv7oJ
KWTkG/JPA/OJTWrNzGzuatQKdbPJxqv56K5PL7A+tGvbqVjfkrpmUFODJYmMhcXx MB8Om71w/M53YgpV7/b22lTPKG9DvNVSS5zt4fVjRq0libeaM5vWZ8Uda1ARbnm/
8rdod4Znt3TRk6EPrknymPdY0zk1kPI4LkMTdNBzDruVQBrF/LXHY1dQ1y4ZkFWR yBdSwfSUsXWBcxelYqPdXxjyoAC3lKEkJP3tCFx6mvJnlRmEpA9xALt3FB/mGrw6
P8QQS2k0hQ9+//lA0dvIabRL2u6c52zbNswLYbC2FDKmwRb2QMIenrxqhNXEhMGb STHiD+0tRF1bv5cdP0enFk09B/pKMBcTuhW56r9XaECqw7zacwYk/OViUYQBtLT+
LtoO0MC3O2V1wiahpaXkQvWR2ylbMhRMQWNBGYFYTWA2l8PLRSgsI01+G2FH2JbX nZRewMds5KtGgn1klviAiLIcu9rE9iZ66UvPxZD29lJIauIRxUi7LDx5zNw3EhWL
yhQZDdLChwlmRytrUPiIOv8hx+R0TVgKizExXKu2I3aoFQviexs8aLBqGqo0vknn DrVuxRPODjKs/D/owQWF9yw7WgQlb2Pnfhs1B1KgOpTOe5UAhUr4QZ+Oraogd7k7
ku3IssxPHC8rfc4AsFgxjPeHxFRL3iT4m9Gxhum7AVQFZMssDRk= OoRa2zx8fHbzQLVyHzq7YmFk8uUxbOrZvTg2aDWck/sgH8wckLs=
=bFPR =Iq+Z
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHauQACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHcAIACgkQTifTfDWI
cr/y5hAArDCV0nDEh9RVatuGltKDwH+ncRp7GZKXc1cLSVUsBSR1Lb8+fbBjmuYq cr+EphAAjheQ4Q2/3c+/co5LAegBhP2/OC43l6G7uP5uGBfZOenBozG3mn7gCeTW
iZlT97ujzPAMDO8B3LID+jacOQ/+jqyhyLRdOT4hpOA+BsUmdLCQl1X87VnOoq0h 9cLNhs/k0OT4RxY8Gs7TQ8OKAsGRc+6aGDTurGhyP4pfHnzeOivNxyk6t/3ZbXcC
rwSNaGlPcGeq9pMN4T1boUNJsCnrwhUcCay+hDS50mCd/Bh/v9yuc+oV6mRWEiDp edGLbjy7GeygwyU2fTBRbWaG7QUSa5e9TomTfj05ysWUp88JFHcG4YaXiZUURSwk
wnUPx9XvQJRzDs3xR92do/yixlZFHEYoHMqM2GYi4XU0Nw5XEfxiuJhYta2zuyFy qC61+ggI4oDk/OSbjcE7xduU5FZ0fI12sZ4gRmCB5+vcmm8ozC3EehpZenMSeURl
UnYt/oe54fKEXxWp5LC2SU9oBFfryYFfbiUrPHaQLt2fSlVD2fAAqkqEIdRf6QfJ fMBDeRkVW5mWihoCDCxEIJZOwTsMbLmUPwVhUwNfFsxEWxE6hlGQeHtWhaDzYhue
Ur7Q/5MElszmguu67cgWYyFkoSigE2TGRYbV0LdG3ZsDA+qHD/L7agv5wNZW6lv6 lESk++Evqv4inkwhMmK+4iTiMHP6UjcFc9/qo8QbTVmmTevyz2sWaSAl6149L8J4
h5zZgIrbpWurYFiNztB8/89tnw3Oau51LYcnHuZeF2typELE39qjCJK3iAiETa47 sZol2S9WLIRSS90EOblC/VAVofD0KmVujrPiE7GC5swhdu8FKcpLsZVuMcjAAOKJ
mnFBz6l8Q9cbpgV1E4nWsn0Zy9SGJMcv+yw3hNsBV+OSwxNnLiHpeNcdrHOTdfVS lFDW2DBC5xD2e6Ho/YZ27rmdldm6XWZbDSgmh8Vs1lE2zsEMbOhDN3H6z6h6y1Rz
veUlnexhZr1sQOD5r4jTn7Hb5qp7xo6GklAQAoije7VEf9/VhsTwG6aMXrmtKqbz mr0sEK/VftZFXgvsIkgpXle9lrB8+PPcgHoUgvrOsi/m2ujJ29U4na33GQEVz7nn
tPAgBIjrBXcK3pOuAAsWqvuHMmTRJibPnL0MEx6ZjYBmsqrLrcNtZIPeVy7jI2eP xCSSYkQ3azGJb2ejYoAIZVBcNW8/wzsk1kyKDKhfkvN69As+it07nZVlxPoXc5M3
zIdmo/PniPailFZBbjn2djmL6Hj/Hu+B3NApD47056541jt1S2I= hcInsvNJy3ttfxrVPFkF//wGOlZDKWpfaJ6dG+bVTHYYd8imeZg=
=I1yO =eZDl
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHZrUACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHcAoACgkQTifTfDWI
cr/wNw//TwyN6YbX4g0GJWO+W75MxkeKYU9F4gZG7OMpw4ldKYjpUcioURcQUyvf cr+MOA//fToVCi0cj1SkErZ88lr+qtGrvAV8cAoa6USi5fEcj5HxT+ywm1/Cd0rq
HDOfIW9kXQd/cgIzG+OkyfY2fTnVl2pIZ/F2+Zqz6zpE2xvegl/iI8lBXeuiZIDW 2UJBcg68AdGgsA9RB21fm/DJwRyR6DzFXzYMuPM6490qNLNPesIUgi86LO78PhtU
WGfSfwrVq8+zZsu4a01sQ/3IEYtaeeUb8TcJLc1On5EJX1BKSihmgKJ0M52ovlWS ImHs8koOnTAf0V2xzMEEv6jWxhGyYbCpCQat1woFQqcsDPPXaKe/HQlrbZakdt6P
++UsQvQUdCpV+0HUUgLGSNrXCEZ/0YQ00QPxuY9fpnTsSbxh+1jwnjq0RY3Zvcl5 yvvjwLvkyRhU759xQ3GUj3YqVzWjlBU+XvZTipYqJScbwo8Qru9MKClnOMFPBZyt
cDPxmMF0eSKdTh/TjoVq7YWvtPHxYIp3SMZdFRPXGMZBHmihSZpNaz/UCunyyyDt PfhA2mU/Vyg5lzG6lorPFaEsjGdUENoscU+h8sjaPgjpTA09d+KjyuoVfqMYVa4d
1sjU7blr8ygsjvCOb83H5D5I4Ivsb+4f6W61byMBARDYAeMpNjy4SrH29mcwEtDh 4g2bwep25DqbaI73HFiclklNAn1/+xQRe3EGQK/+SWWkYSSOOgcsNQK3PM52KRV/
oIK00Q3LF1fxeL+lUyyydAgDAtERWRgHpZLoYFTifumoQU51UCghM6pkCbaJI1+K Rt7nAQ9iiFXZjljJ0s7NbIqHtRnshlSLXgQ1myOjL7dvTYdwF2cj5tirpHVVWXR3
6DXQJLyWQbb/Mvg1pArCIp8QTD1yD2wlD+KxPaYPmK6qA8jNLS/8Bbe5KebVxh8Q KvHyONDWY8LcH9JLKZyWaUoxvnrrtMj1OClYhBV422njDQOm9YJ3Ln6ySB3jnUho
zv1rrj4CgiEQXiXI9rFvWw14WrJclT9vgJNujcNW+qBbuvOle2dY6Ub7V8TZmZHG rQ7caNiThD60TieEV+xvCuKxhi5sPnPMRuF4O2qt6TEgga1ml1UTbtAUMp4XGu/H
D+G7uiHFcpqo6jU4jfoVly96Lrs6GImfF4eneeQUu0RfXGf5CoFEMzR2QaKObxD8 eAGXAFBtd2wQNQ6eza1sZsdCY/hmvgMMIHaeCMsTrdo+tUTST5ylii0EgWbE8lKI
NbSe3ouqdfdF1PLgTrsNr/SP2MtilV8B+/uSvmIYsSJbn4VzWuE= 9kIf1mhPnoOIo/jjp2f5PR2Dp4nk9izJy2b30QVdRLO04PrWtPA=
=3ciN =MVhZ
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----

View file

@ -1,16 +1,16 @@
-----BEGIN PGP SIGNATURE----- -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHausACgkQTifTfDWI iQIzBAABCgAdFiEEif0F7T4AkoRgIfM3TifTfDWIcr8FAmhHcAkACgkQTifTfDWI
cr+tgQ/7BCxdSGoaawSj0g0BoJmDYA/Sezc/dYG4NmYFUU4tZO+lrx794myYJ1Yh cr/+zg/8CRZFqrZP+JelLITCS1GBiQeZMWjPy+czbtxPpQcer0vzf4keUWbM8DWp
Xq5UZLnLGwIfxFl6oA1l82a6szYysMDP4W7bbHr1IkFiZduPE96V073kzJM+C+Io XiRxQn7w61ub/N4wjYspJz9IXdrznx3i9TMM8Eixpa/L0ka4NZovs+Y+H6/aTqCy
lo7DIm1J6+Ej8fnzH1Nl5gMjxR4RjqGUxJkeLKPgTlkZF9BB3Ng2IUgBWFiE0si7 mz8eLOE90ju4nx6fh9ZO/MpzFZd1fwO72UCW89NaYQDp4lF3kkKAMWiMOZ3x9M4s
UAH2qxh3n2pwhOjhrLfVx1dm5HOoZtb5jpeuvc5Mjiu654E2rwxUTZcrPOKU4R94 Azgx0F+IVu4RuVyPBNOblw6r+Tsji34PTbNFYJO3VqqtIQlxbDhU0Q/zgyVR/8Gi
B1H4juGz5bmh82gX6Sri2sABHLvhBNVeATBAiInrb0ADEMVugpU1sxCTXM18T/Tz lzLKeNPeVLBaBCbiW+XPD0vybkAZriuV30XF6o9NqpPSo2y9cyFmv6RbJHMOf9qZ
CsGjFAiAAGgIsfZMXYtBxlF1b0CjXPJ413yLvTnQSSHzsmNqkdTjKMshyJNUoAyW rLUIRu1wJhnEVIvca6cvibvS/ZjUxhDyO+fJY24uxpAUUwwzYoMzDcvEpymbKoDk
q6LKXNgC62tPHxM6squs6Qpyo17JcY8w9Up26otgbVYuQGsO8ZfyxMjh+tScbgjp 1cxrmIwYuXlx8KeVLV8wYqoBr+zR3kQhpUiatfEAdABtaUP09JiylQ+tSFISFLDU
pkyWe8umB1ViWqZ562m9SU4RmYwL8+vTGIKubaHmv0TsdQM8pgjQyeE6Jmn/xpGy B02xA5JtXjKBnDTf063gAatZQCq1setbsX4ArN38GVQ3c7k7PfZqFV0POZJAT8Mt
hwGhZGjTaH4wUWTLR2TEiuMc6IzRFXRL6YOJGfqWD/fdLcKhkbNPgj6RMacSfWtB y34NFL6xNWY4w/m4xa2rxzx5GV6nPbyBcFucnYS7KNjY48MJ6NQlQz9KNjl+GArn
JJ65GYYzzwGYgSxJUT9gRLbWz1o8Bf9ArT6CgJUZ8d9AJdvCUzmTv5s6aBge3GmG IKXIH9pgauWWusl5EiaRIou0Ak7j2L4uD52fYPl4igJt+EnG9yPqxrQZvqgl+L9S
D2NuCd8HULfg1nhGwtmGFXZsytNXx/7VS/xnVOeGh5kNolJ7MM4= h8G7PXG5jiO/6pppPAD2FK6wCUt8gp7I/2u65eVhiTrVYbino+I=
=7/Bg =pN6s
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----