146 lines
3.5 KiB
Bash
146 lines
3.5 KiB
Bash
#!/bin/sh
|
|
set -eu
|
|
|
|
APP_ROOT="${APP_ROOT:-/app}"
|
|
DATA_ROOT="${MOBILEMODELS_DATA_ROOT:-/data}"
|
|
|
|
mkdir -p "$DATA_ROOT" "$DATA_ROOT/state"
|
|
|
|
sync_missing_dir_entries() {
|
|
src_dir="$1"
|
|
dst_dir="$2"
|
|
|
|
mkdir -p "$dst_dir"
|
|
|
|
for src_entry in "$src_dir"/*; do
|
|
[ -e "$src_entry" ] || continue
|
|
name="$(basename "$src_entry")"
|
|
dst_entry="$dst_dir/$name"
|
|
|
|
if [ -d "$src_entry" ]; then
|
|
sync_missing_dir_entries "$src_entry" "$dst_entry"
|
|
continue
|
|
fi
|
|
|
|
if [ ! -e "$dst_entry" ] && [ ! -L "$dst_entry" ]; then
|
|
mkdir -p "$(dirname "$dst_entry")"
|
|
cp -a "$src_entry" "$dst_entry"
|
|
fi
|
|
done
|
|
}
|
|
|
|
refresh_workspace_builtin_entries() {
|
|
src_dir="$1"
|
|
dst_dir="$2"
|
|
|
|
mkdir -p "$dst_dir"
|
|
|
|
for rel_path in \
|
|
brands \
|
|
misc \
|
|
CHANGELOG.md \
|
|
CHANGELOG_en.md \
|
|
LICENSE.txt
|
|
do
|
|
src_entry="$src_dir/$rel_path"
|
|
dst_entry="$dst_dir/$rel_path"
|
|
|
|
[ -e "$src_entry" ] || continue
|
|
|
|
rm -rf "$dst_entry"
|
|
mkdir -p "$(dirname "$dst_entry")"
|
|
cp -a "$src_entry" "$dst_entry"
|
|
done
|
|
|
|
if [ -d "$src_dir/local" ]; then
|
|
sync_missing_dir_entries "$src_dir/local" "$dst_dir/local"
|
|
fi
|
|
}
|
|
|
|
workspace_has_sync_metadata() {
|
|
[ -f "$DATA_ROOT/state/sync_status.json" ]
|
|
}
|
|
|
|
migrate_legacy_manual_catalog() {
|
|
legacy_dir="$DATA_ROOT/workspace/brands/local"
|
|
target_dir="$DATA_ROOT/workspace/local"
|
|
legacy_file="$legacy_dir/manual_catalog.json"
|
|
target_file="$target_dir/manual_catalog.json"
|
|
|
|
[ -d "$legacy_dir" ] || return
|
|
|
|
mkdir -p "$target_dir"
|
|
if [ -f "$legacy_file" ] && [ ! -f "$target_file" ]; then
|
|
cp -a "$legacy_file" "$target_file"
|
|
fi
|
|
|
|
# Older builds accidentally copied local overlay files under brands/local.
|
|
# Once the real target exists, drop the misplaced directory to avoid confusion.
|
|
rm -rf "$legacy_dir"
|
|
}
|
|
|
|
init_path() {
|
|
rel_path="$1"
|
|
src_path="$APP_ROOT/$rel_path"
|
|
dst_path="$DATA_ROOT/$rel_path"
|
|
|
|
# Bind-mounted paths like /app/dist cannot be removed and replaced with symlinks.
|
|
# Keep the mount in place and only ensure the runtime copy exists.
|
|
if [ "$rel_path" = "dist" ]; then
|
|
if [ -d "$src_path" ]; then
|
|
if [ ! -e "$dst_path" ] && [ ! -L "$dst_path" ]; then
|
|
mkdir -p "$(dirname "$dst_path")"
|
|
cp -a "$src_path" "$dst_path"
|
|
else
|
|
sync_missing_dir_entries "$src_path" "$dst_path"
|
|
fi
|
|
elif [ ! -e "$dst_path" ] && [ ! -L "$dst_path" ]; then
|
|
mkdir -p "$(dirname "$dst_path")"
|
|
cp -a "$src_path" "$dst_path"
|
|
fi
|
|
return
|
|
fi
|
|
|
|
if [ "$rel_path" = "workspace" ] && [ -d "$src_path" ] && [ ! -L "$src_path" ]; then
|
|
if [ ! -e "$dst_path" ] && [ ! -L "$dst_path" ]; then
|
|
mkdir -p "$(dirname "$dst_path")"
|
|
cp -a "$src_path" "$dst_path"
|
|
elif workspace_has_sync_metadata; then
|
|
sync_missing_dir_entries "$src_path/local" "$dst_path/local"
|
|
else
|
|
refresh_workspace_builtin_entries "$src_path" "$dst_path"
|
|
fi
|
|
elif [ -d "$src_path" ]; then
|
|
if [ ! -e "$dst_path" ] && [ ! -L "$dst_path" ]; then
|
|
mkdir -p "$(dirname "$dst_path")"
|
|
cp -a "$src_path" "$dst_path"
|
|
else
|
|
sync_missing_dir_entries "$src_path" "$dst_path"
|
|
fi
|
|
elif [ ! -e "$dst_path" ] && [ ! -L "$dst_path" ]; then
|
|
mkdir -p "$(dirname "$dst_path")"
|
|
cp -a "$src_path" "$dst_path"
|
|
fi
|
|
|
|
if [ -L "$src_path" ]; then
|
|
current_target="$(readlink "$src_path" || true)"
|
|
if [ "$current_target" = "$dst_path" ]; then
|
|
return
|
|
fi
|
|
rm -f "$src_path"
|
|
else
|
|
rm -rf "$src_path"
|
|
fi
|
|
|
|
ln -s "$dst_path" "$src_path"
|
|
}
|
|
|
|
for rel_path in \
|
|
workspace \
|
|
dist
|
|
do
|
|
init_path "$rel_path"
|
|
done
|
|
|
|
migrate_legacy_manual_catalog
|