190 lines
7.2 KiB
Bash
190 lines
7.2 KiB
Bash
#!/bin/bash
|
|
# Create a small fixture DB and file tree from the real rfc1437 bDS project.
|
|
# Run once to populate fixtures/compatibility-projects/rfc1437-sample/
|
|
set -euo pipefail
|
|
|
|
SRC_DB="$HOME/Library/Application Support/Blogging Desktop Server/bds.db"
|
|
BLOG="/Users/gb/Blogs/rfc1437.de"
|
|
FIXTURE_DIR="$(dirname "$0")/compatibility-projects/rfc1437-sample"
|
|
FIXTURE_DB="$FIXTURE_DIR/bds.db"
|
|
|
|
PROJ_ID="1979237c-034d-41f6-99a0-f35eb57b3f6c"
|
|
|
|
# Post IDs to extract
|
|
POST_ESMERALDA="40a83ab1-423d-4310-aac4-642d84675007"
|
|
POST_GHOSTTY="6745981d-da41-4cfd-80ec-95ad339acf6f"
|
|
POST_CMUX="2665bfaa-8251-468d-a710-a4cf34dd81e2" # post_link target from ghostty
|
|
|
|
# Media for esmeralda
|
|
MEDIA_ESMERALDA="eb0cf9d7-6fbd-4b74-9be3-759d6e16f240"
|
|
|
|
rm -rf "$FIXTURE_DIR"
|
|
mkdir -p "$FIXTURE_DIR"
|
|
|
|
# ---- Create fixture DB: dump only CREATE TABLE/INDEX from real DB, skip internals ----
|
|
sqlite3 "$FIXTURE_DB" "PRAGMA journal_mode=WAL; PRAGMA foreign_keys=ON;"
|
|
|
|
sqlite3 "$SRC_DB" ".schema" \
|
|
| grep -v "sqlite_sequence" \
|
|
| grep -v "^CREATE TABLE IF NOT EXISTS \"refinery_schema_history\"" \
|
|
| sed '/^CREATE TABLE __diesel_schema_migrations/,/^);$/d' \
|
|
| sed '/^CREATE TABLE refinery_schema_history/,/^);$/d' \
|
|
| sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract project ----
|
|
sqlite3 "$SRC_DB" ".mode insert projects" ".headers off" \
|
|
"SELECT * FROM projects WHERE id = '$PROJ_ID';" | sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract 3 published posts + the cmux post_link target ----
|
|
for PID in "$POST_ESMERALDA" "$POST_GHOSTTY" "$POST_CMUX"; do
|
|
sqlite3 "$SRC_DB" ".mode insert posts" ".headers off" \
|
|
"SELECT * FROM posts WHERE id = '$PID';" | sqlite3 "$FIXTURE_DB"
|
|
done
|
|
|
|
# ---- Insert a synthetic draft post (content in DB, no file) ----
|
|
sqlite3 "$FIXTURE_DB" "
|
|
INSERT INTO posts (id, project_id, title, slug, excerpt, content, status, author,
|
|
created_at, updated_at, published_at, file_path, checksum, tags, categories,
|
|
template_slug, language, do_not_translate)
|
|
VALUES (
|
|
'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee',
|
|
'$PROJ_ID',
|
|
'Draft Fixture Post',
|
|
'draft-fixture-post',
|
|
'A test draft post for fixture testing',
|
|
'This is the **body** of a draft post.\n\nIt has multiple paragraphs and [a link](/somewhere).',
|
|
'draft',
|
|
'fixture-author',
|
|
1700000000, 1700000001, NULL,
|
|
'', NULL,
|
|
'[\"test\",\"fixture\"]',
|
|
'[\"tech\"]',
|
|
NULL, 'de', 0
|
|
);
|
|
"
|
|
|
|
# ---- Extract translations for selected posts ----
|
|
sqlite3 "$SRC_DB" ".mode insert post_translations" ".headers off" \
|
|
"SELECT * FROM post_translations WHERE translation_for IN ('$POST_ESMERALDA', '$POST_GHOSTTY', '$POST_CMUX');" \
|
|
| sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract media (esmeralda's 1 item) ----
|
|
sqlite3 "$SRC_DB" ".mode insert media" ".headers off" \
|
|
"SELECT * FROM media WHERE id = '$MEDIA_ESMERALDA';" | sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract media_translations for that media ----
|
|
sqlite3 "$SRC_DB" ".mode insert media_translations" ".headers off" \
|
|
"SELECT * FROM media_translations WHERE translation_for = '$MEDIA_ESMERALDA';" \
|
|
| sqlite3 "$FIXTURE_DB" 2>/dev/null || true
|
|
|
|
# ---- Extract post_media links ----
|
|
sqlite3 "$SRC_DB" ".mode insert post_media" ".headers off" \
|
|
"SELECT * FROM post_media WHERE post_id IN ('$POST_ESMERALDA', '$POST_GHOSTTY', '$POST_CMUX');" \
|
|
| sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract post_links (ghostty -> cmux) ----
|
|
sqlite3 "$SRC_DB" ".mode insert post_links" ".headers off" \
|
|
"SELECT * FROM post_links WHERE source_post_id = '$POST_GHOSTTY';" \
|
|
| sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract 5 tags ----
|
|
sqlite3 "$SRC_DB" ".mode insert tags" ".headers off" \
|
|
"SELECT * FROM tags WHERE project_id = '$PROJ_ID' AND name IN ('fotografie','programmierung','sysadmin','mac-os-x','natur');" \
|
|
| sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract the 1 template ----
|
|
sqlite3 "$SRC_DB" ".mode insert templates" ".headers off" \
|
|
"SELECT * FROM templates WHERE project_id = '$PROJ_ID';" | sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract 2 scripts ----
|
|
sqlite3 "$SRC_DB" ".mode insert scripts" ".headers off" \
|
|
"SELECT * FROM scripts WHERE project_id = '$PROJ_ID' AND slug IN ('test_script', 'bgg_link');" \
|
|
| sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract a couple of settings ----
|
|
sqlite3 "$SRC_DB" ".mode insert settings" ".headers off" \
|
|
"SELECT * FROM settings LIMIT 5;" | sqlite3 "$FIXTURE_DB"
|
|
|
|
# ---- Extract 1 ai_provider + 1 ai_model (to test those tables read) ----
|
|
sqlite3 "$SRC_DB" ".mode insert ai_providers" ".headers off" \
|
|
"SELECT * FROM ai_providers LIMIT 1;" | sqlite3 "$FIXTURE_DB"
|
|
sqlite3 "$SRC_DB" ".mode insert ai_models" ".headers off" \
|
|
"SELECT * FROM ai_models LIMIT 1;" | sqlite3 "$FIXTURE_DB"
|
|
sqlite3 "$SRC_DB" ".mode insert ai_catalog_meta" ".headers off" \
|
|
"SELECT * FROM ai_catalog_meta;" | sqlite3 "$FIXTURE_DB"
|
|
|
|
# ==================================================================
|
|
# Copy filesystem files (posts, sidecars, templates, scripts, meta)
|
|
# NO binary media files — only .meta sidecars and .md text files
|
|
# ==================================================================
|
|
|
|
# Posts
|
|
for F in \
|
|
posts/2005/11/esmeralda.md \
|
|
posts/2005/11/esmeralda.en.md \
|
|
posts/2005/11/esmeralda.de.md \
|
|
posts/2026/03/ghostty.md \
|
|
posts/2026/03/ghostty.en.md \
|
|
posts/2026/03/cmux-das-terminal-fur-multitasking.md \
|
|
posts/2026/03/cmux-das-terminal-fur-multitasking.en.md \
|
|
; do
|
|
if [ -f "$BLOG/$F" ]; then
|
|
mkdir -p "$FIXTURE_DIR/$(dirname "$F")"
|
|
cp "$BLOG/$F" "$FIXTURE_DIR/$F"
|
|
fi
|
|
done
|
|
|
|
# Media sidecars only (not binaries)
|
|
for F in \
|
|
media/2005/11/eb0cf9d7-6fbd-4b74-9be3-759d6e16f240.jpg.meta \
|
|
; do
|
|
if [ -f "$BLOG/$F" ]; then
|
|
mkdir -p "$FIXTURE_DIR/$(dirname "$F")"
|
|
cp "$BLOG/$F" "$FIXTURE_DIR/$F"
|
|
fi
|
|
done
|
|
|
|
# Template
|
|
mkdir -p "$FIXTURE_DIR/templates"
|
|
cp "$BLOG/templates/testvorlage.liquid" "$FIXTURE_DIR/templates/" 2>/dev/null || true
|
|
|
|
# Scripts (2)
|
|
mkdir -p "$FIXTURE_DIR/scripts"
|
|
cp "$BLOG/scripts/test_script.py" "$FIXTURE_DIR/scripts/" 2>/dev/null || true
|
|
cp "$BLOG/scripts/bgg_link.py" "$FIXTURE_DIR/scripts/" 2>/dev/null || true
|
|
|
|
# Meta JSON files
|
|
mkdir -p "$FIXTURE_DIR/meta"
|
|
for F in project.json categories.json category-meta.json publishing.json tags.json; do
|
|
cp "$BLOG/meta/$F" "$FIXTURE_DIR/meta/" 2>/dev/null || true
|
|
done
|
|
|
|
# Menu OPML
|
|
cp "$BLOG/meta/menu.opml" "$FIXTURE_DIR/meta/" 2>/dev/null || true
|
|
|
|
echo "=== Fixture DB row counts ==="
|
|
sqlite3 "$FIXTURE_DB" "
|
|
SELECT 'projects', COUNT(*) FROM projects
|
|
UNION ALL SELECT 'posts', COUNT(*) FROM posts
|
|
UNION ALL SELECT 'post_translations', COUNT(*) FROM post_translations
|
|
UNION ALL SELECT 'media', COUNT(*) FROM media
|
|
UNION ALL SELECT 'media_translations', COUNT(*) FROM media_translations
|
|
UNION ALL SELECT 'tags', COUNT(*) FROM tags
|
|
UNION ALL SELECT 'templates', COUNT(*) FROM templates
|
|
UNION ALL SELECT 'scripts', COUNT(*) FROM scripts
|
|
UNION ALL SELECT 'post_links', COUNT(*) FROM post_links
|
|
UNION ALL SELECT 'post_media', COUNT(*) FROM post_media
|
|
UNION ALL SELECT 'settings', COUNT(*) FROM settings
|
|
UNION ALL SELECT 'ai_providers', COUNT(*) FROM ai_providers
|
|
UNION ALL SELECT 'ai_models', COUNT(*) FROM ai_models
|
|
UNION ALL SELECT 'ai_catalog_meta', COUNT(*) FROM ai_catalog_meta;
|
|
"
|
|
|
|
echo ""
|
|
echo "=== Fixture files ==="
|
|
find "$FIXTURE_DIR" -type f | sort | sed "s|$FIXTURE_DIR/||"
|
|
|
|
echo ""
|
|
echo "=== DB size ==="
|
|
ls -lh "$FIXTURE_DB"
|