58 lines
2.3 KiB
Bash
58 lines
2.3 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# sync-aom-to-obsidian.sh
|
||
|
|
# Syncs Atomizer V2 docs/AOM/ → Obsidian vault (with markdown→wiki-link conversion)
|
||
|
|
# Direction: Repo (source of truth) → Obsidian (read target for iPad/SeaDrive)
|
||
|
|
# Per DEC-036: one-way sync, repo wins.
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
REPO_AOM="/home/papa/repos/Atomizer-V2/docs/AOM"
|
||
|
|
OBSIDIAN_AOM="/home/papa/obsidian-vault/2-Projects/P-Atomizer-Operating-Manual"
|
||
|
|
LOG="/home/papa/atomizer/logs/aom-sync.log"
|
||
|
|
|
||
|
|
mkdir -p "$(dirname "$LOG")"
|
||
|
|
|
||
|
|
# Check source exists
|
||
|
|
if [ ! -d "$REPO_AOM" ]; then
|
||
|
|
echo "$(date -Iseconds) ERROR: Source not found: $REPO_AOM" >> "$LOG"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Sync files (delete extras in target that aren't in source)
|
||
|
|
# --exclude .obsidian to preserve any Obsidian workspace settings
|
||
|
|
rsync -av --delete \
|
||
|
|
--exclude '.obsidian/' \
|
||
|
|
--exclude '.trash/' \
|
||
|
|
"$REPO_AOM/" "$OBSIDIAN_AOM/" 2>&1 | tail -5 >> "$LOG"
|
||
|
|
|
||
|
|
# Convert standard markdown links back to Obsidian wiki-links
|
||
|
|
# Pattern: [Display Text](./path/to/file.md) → [[path/to/file|Display Text]]
|
||
|
|
# Pattern: [filename](./filename.md) → [[filename]]
|
||
|
|
find "$OBSIDIAN_AOM" -name "*.md" -type f | while read -r file; do
|
||
|
|
# Convert [text](relative/path.md#heading) → [[relative/path#heading|text]]
|
||
|
|
perl -i -pe '
|
||
|
|
# [Text](./file.md#heading) → [[file#heading|Text]]
|
||
|
|
s/\[([^\]]+)\]\(\.\/([\w\/-]+)\.md(#[^\)]+)?\)/
|
||
|
|
my ($text, $path, $heading) = ($1, $2, $3 || "");
|
||
|
|
my $target = $path . $heading;
|
||
|
|
# If display text matches filename, simplify
|
||
|
|
my $basename = $path; $basename =~ s|.*\/||;
|
||
|
|
($text eq $basename) ? "[[$target]]" : "[[$target|$text]]"
|
||
|
|
/ge;
|
||
|
|
# [Text](path.md) without ./ prefix
|
||
|
|
s/\[([^\]]+)\]\(([\w\/-]+)\.md(#[^\)]+)?\)/
|
||
|
|
my ($text, $path, $heading) = ($1, $2, $3 || "");
|
||
|
|
my $target = $path . $heading;
|
||
|
|
my $basename = $path; $basename =~ s|.*\/||;
|
||
|
|
($text eq $basename) ? "[[$target]]" : "[[$target|$text]]"
|
||
|
|
/ge;
|
||
|
|
' "$file"
|
||
|
|
done
|
||
|
|
|
||
|
|
# Handle the README.md → MAP rename for Obsidian navigation
|
||
|
|
if [ -f "$OBSIDIAN_AOM/README.md" ] && [ ! -f "$OBSIDIAN_AOM/MAP - Atomizer Operating Manual.md" ]; then
|
||
|
|
cp "$OBSIDIAN_AOM/README.md" "$OBSIDIAN_AOM/MAP - Atomizer Operating Manual.md"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "$(date -Iseconds) OK: Synced $(find "$OBSIDIAN_AOM" -name '*.md' | wc -l) docs" >> "$LOG"
|