Files
RuDS/fixtures/create_fixture.sh

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"