68 lines
2.5 KiB
Bash
Executable File
68 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ai-chat-exporter — run the exporter without activating a virtualenv.
|
|
#
|
|
# cd /path/to/AIChatExporter
|
|
# ./ai-chat-exporter export --provider all
|
|
#
|
|
# Creates .venv and installs dependencies on first run, so a fresh clone on a
|
|
# new machine needs no `python3 -m venv` / `source .venv/bin/activate` ceremony.
|
|
# Reinstalls automatically when pyproject.toml changes.
|
|
#
|
|
# Working directory is deliberately NOT changed: EXPORT_DIR, CACHE_DIR and .env
|
|
# discovery are all relative to your current directory, which is what lets the
|
|
# same checkout archive different machines into different places. Run it from
|
|
# the repo (see the warning below) unless you mean otherwise.
|
|
#
|
|
# Windows equivalent: ai-chat-exporter.cmd (same directory).
|
|
|
|
set -euo pipefail
|
|
|
|
DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
|
VENV="$DIR/.venv"
|
|
PY="$VENV/bin/python"
|
|
STAMP="$VENV/.deps-stamp"
|
|
|
|
# The cache manifest is read from ./cache by default. Running from somewhere
|
|
# else silently starts a *new, empty* archive rather than failing, which would
|
|
# re-export everything and orphan the existing Joplin notes. Warn, don't block —
|
|
# a deliberate second archive is a legitimate thing to want.
|
|
if [ "$PWD" != "$DIR" ] && [ -z "${AI_CHAT_EXPORTER_QUIET_CWD:-}" ]; then
|
|
echo "warning: running from $PWD, not $DIR" >&2
|
|
echo " cache/ and exports/ resolve against the current directory," >&2
|
|
echo " so this may start a separate archive. Set" >&2
|
|
echo " AI_CHAT_EXPORTER_QUIET_CWD=1 to silence this." >&2
|
|
fi
|
|
|
|
find_python() {
|
|
for candidate in python3 python; do
|
|
if command -v "$candidate" >/dev/null 2>&1; then
|
|
# Needs >=3.11 (pyproject requires-python).
|
|
if "$candidate" -c 'import sys; sys.exit(0 if sys.version_info >= (3, 11) else 1)' 2>/dev/null; then
|
|
command -v "$candidate"
|
|
return 0
|
|
fi
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
if [ ! -x "$PY" ]; then
|
|
BOOTSTRAP_PY="$(find_python)" || {
|
|
echo "error: no python3 >= 3.11 found on PATH — install it and re-run." >&2
|
|
exit 1
|
|
}
|
|
echo "Creating virtualenv in $VENV …" >&2
|
|
"$BOOTSTRAP_PY" -m venv "$VENV"
|
|
rm -f "$STAMP"
|
|
fi
|
|
|
|
# Install (or refresh) dependencies when the venv is new or pyproject changed.
|
|
if [ ! -f "$STAMP" ] || [ "$DIR/pyproject.toml" -nt "$STAMP" ]; then
|
|
echo "Installing dependencies …" >&2
|
|
"$PY" -m pip install --quiet --upgrade pip
|
|
"$PY" -m pip install --quiet -e "$DIR"
|
|
touch "$STAMP"
|
|
fi
|
|
|
|
exec "$PY" -m src.main "$@"
|