scripts/update-words

#!/bin/bash

Syncs words/notes/images from backup locations to project input directory

Preserves generated poems.json files to avoid redundant extraction

#

Issue 8-042: Added configurable image sync from config.lua

Issue 10-014: Migrated from input-sources.json to unified config.lua

Issue 7-003: Added --force flag to skip file preservation

#

The external sync-to-projects script does rm -rf input/, which would delete

the generated files that scripts/update creates. We preserve and restore them

so the freshness check works correctly.

#

Usage: scripts/update-words [--force]

--force: Skip file preservation (regenerate everything from scratch)

set -euo pipefail

{{{ Parse arguments

FORCE=false
for arg in "$@"; do
case "$arg" in
--force)
FORCE=true
;;
esac
done

}}}

DIR="/mnt/mtwo/programming/ai-stuff/neocities-modernization"

Issue 8-059: route the preserve/restore backup through the project's

tmpfs-backed tmp/ symlink rather than a real on-disk temp/ directory.

"${DIR}/scripts/ensure-tmp-symlink" "${DIR}"
BACKUP_DIR="${DIR}/tmp/preserved-files-$$"

Issue 10-003b: Config helper functions removed

Image syncing now uses centralized external-sync module via scripts/sync-external-files

{{{ preserve_generated_files

Back up generated files before sync (they get deleted by rm -rf input/)

preserve_generated_files() {
local preserved=0
mkdir -p "${BACKUP_DIR}"

for subdir in fediverse messages notes; do
local files_dir="${DIR}/input/${subdir}/files"
if [ -d "${files_dir}" ]; then
mkdir -p "${BACKUP_DIR}/${subdir}"
cp -a "${files_dir}" "${BACKUP_DIR}/${subdir}/"
preserved=$((preserved + 1))
fi
done

if [ $preserved -gt 0 ]; then
echo " 💾 Preserved ${preserved} generated file directories"
fi
}

}}}

{{{ restore_generated_files

Restore generated files after sync

restore_generated_files() {
local restored=0

for subdir in fediverse messages notes; do
local backup_files="${BACKUP_DIR}/${subdir}/files"
if [ -d "${backup_files}" ]; then
mkdir -p "${DIR}/input/${subdir}"
cp -a "${backup_files}" "${DIR}/input/${subdir}/"
restored=$((restored + 1))
fi
done

# Cleanup backup directory
rm -rf "${BACKUP_DIR}"

if [ $restored -gt 0 ]; then
echo " ♻️ Restored ${restored} generated file directories"
fi
}

}}}

{{{ sync_external_files

Issue 10-003b: Use centralized external-sync module

Replaces the old sync_images_from_config() function

sync_external_files() {
echo " 📁 Syncing external files from config..."
"${DIR}/scripts/sync-external-files" || {
echo " ⚠️ Some external file syncs failed (check output above)" >&2
}
}

}}}

{{{ main

Issue 7-003: Skip file preservation when --force is active

if $FORCE; then
echo " 🔄 Force regenerate: skipping file preservation"
else
# Preserve generated files before the destructive sync
preserve_generated_files
fi

Run the external sync script (does rm -rf input/)

/home/ritz/backups/words/sync-to-projects > /dev/null 2>&1

Issue 7-003: Only restore if we preserved (i.e., not in force mode)

if ! $FORCE; then
restore_generated_files
fi

Issue 10-003b: Sync external files (images, etc.) from centralized config

sync_external_files

}}}