Post-Local sync at 2025-06-09T23:36:20Z
This commit is contained in:
parent
dc9c7c26c2
commit
4a2101c75a
12 changed files with 170 additions and 342 deletions
|
@ -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-----
|
||||||
|
|
|
@ -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-----
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(-)
|
||||||
|
|
|
@ -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-----
|
||||||
|
|
|
@ -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]} <${GPG_EMAILS[i]}> (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 platform’s unique features (e.g., GitHub’s community, GitLab’s CI/CD, Bitbucket’s integrations, Radicle’s decentralization, Forgejo’s self-hosting, Codeberg’s community-driven model, Gitea’s lightweight efficiency) enhance the project’s functionality and reach.
|
- **Diversity**: Each platform’s unique features (e.g., GitHub’s community, GitLab’s CI/CD, Bitbucket’s integrations, Radicle’s decentralization, Forgejo’s self-hosting, Codeberg’s community-driven model, Gitea’s lightweight efficiency) enhance the project’s 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 project’s 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 project’s state across all platforms.
|
||||||
|
|
||||||
This multi-repository approach, bolstered by Forgejo’s 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 Forgejo’s 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 Forgejo’s 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 Radicle’s decentralized, censorship-resistant network as the primary anchor, followed by Forgejo’s sovereign, self-hosted infrastructure, Codeberg’s community-driven platform, Gitea’s lightweight efficiency, GitLab’s robust DevOps features, Bitbucket’s enterprise redundancy, and GitHub’s 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 Radicle’s decentralized, censorship-resistant network as the primary anchor, followed by Forgejo’s sovereign, self-hosted infrastructure, Codeberg’s community-driven platform, Gitea’s lightweight efficiency, GitLab’s robust DevOps features, Bitbucket’s enterprise redundancy, and GitHub’s 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
|
||||||
|
|
|
@ -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-----
|
||||||
|
|
|
@ -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-----
|
|
@ -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-----
|
||||||
|
|
|
@ -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-----
|
||||||
|
|
|
@ -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-----
|
||||||
|
|
|
@ -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-----
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue