feat: finishing of M0
This commit is contained in:
188
fixtures/create_fixture.sh
Normal file
188
fixtures/create_fixture.sh
Normal file
@@ -0,0 +1,188 @@
|
||||
#!/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 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"
|
||||
Reference in New Issue
Block a user