diff options
| author | Paul Buetow <paul@buetow.org> | 2026-06-16 22:21:36 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-06-16 22:21:36 +0300 |
| commit | 14d041e890765afbab396a29871d6bf6e8097fff (patch) | |
| tree | e3fcdc084b75bbd7ec294489a72966e03d7f6ed1 /src/lib/paths.source.sh | |
| parent | aca23d3a094cb1bf86db40e42f184fbf88371d42 (diff) | |
jn0 split bootstrap.source.sh into logging/paths/startup modules
Separate the mixed concerns in bootstrap.source.sh per [SRP]:
- logging.source.sh: output_is_quiet, output_is_verbose, log_info,
log_verbose, log_warning (the output/logging concern).
- paths.source.sh: resolve_default_rc_file, resolve_source_root,
resolve_default_template_dir, resolve_default_asset_dir,
template_dir_uses_default, apply_template_dir_default, init_config
(install/source-root/default-dir + rc-file/template-dir resolution).
- bootstrap.source.sh keeps the CLI usage text and the shared
resolve_config_array parser used by the config modules.
Pure code move, verified byte-identical function bodies. LIB_SOURCES now
lists logging.source.sh first, then bootstrap, then paths; matching
source directives added to src/shuriken.sh so --check-sourced sees the
new modules. just test/shellcheck/check-generated and git diff --check
all pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'src/lib/paths.source.sh')
| -rw-r--r-- | src/lib/paths.source.sh | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/lib/paths.source.sh b/src/lib/paths.source.sh new file mode 100644 index 0000000..d0db74b --- /dev/null +++ b/src/lib/paths.source.sh @@ -0,0 +1,138 @@ +# Path resolution. Split out of bootstrap.source.sh (task jn0) so the install / +# source-root / default-directory discovery and the rc-file/template-dir +# defaulting live apart from startup wiring and logging. These helpers resolve +# where the packaged config, templates and assets live (both when installed and +# when running from a source checkout) and initialise a fresh shuriken.conf. +# All library modules are sourced before any code runs, so definition order does +# not affect availability (e.g. init_config calls log_info from +# logging.source.sh). + +resolve_default_rc_file() { + local source_root + + if [ -f "$DEFAULTRC" ]; then + printf '%s\n' "$DEFAULTRC" + return + fi + + source_root=$(resolve_source_root) + + if [ -n "$source_root" ]; then + printf '%s\n' "$source_root/src/shuriken.default.conf" + return + fi + + printf '%s\n' "$DEFAULTRC" +} + +resolve_source_root() { + local script_dir + local source_root + + script_dir="$SHURIKEN_SOURCE_DIR" + source_root=$(cd "$script_dir/.." && pwd) + + if [[ -f "$source_root/src/shuriken.default.conf" \ + && -d "$source_root/share/templates/default" ]]; then + printf '%s\n' "$source_root" + fi +} + +resolve_default_template_dir() { + local source_root + + if [ -d "$DEFAULT_TEMPLATE_DIR" ]; then + printf '%s\n' "$DEFAULT_TEMPLATE_DIR" + return + fi + + source_root=$(resolve_source_root) + + if [ -n "$source_root" ]; then + printf '%s\n' "$source_root/share/templates/default" + return + fi + + printf '%s\n' "$DEFAULT_TEMPLATE_DIR" +} + +resolve_default_asset_dir() { + local source_root + + if [ -d "$DEFAULT_ASSET_DIR" ]; then + printf '%s\n' "$DEFAULT_ASSET_DIR" + return + fi + + source_root=$(resolve_source_root) + + if [ -n "$source_root" ]; then + printf '%s\n' "$source_root/assets/site" + return + fi + + printf '%s\n' "$DEFAULT_ASSET_DIR" +} + +template_dir_uses_default() { + if [ -z "${TEMPLATE_DIR+x}" ] || [ -z "$TEMPLATE_DIR" ]; then + return 1 + fi + + case "$TEMPLATE_DIR" in + "$PACKAGED_TEMPLATE_DIR"|"$DEFAULT_TEMPLATE_DIR") + return 0 + ;; + *) + return 1 + ;; + esac +} + +apply_template_dir_default() { + if template_dir_uses_default; then + TEMPLATE_DIR=$(resolve_default_template_dir) + fi +} + +init_config() { + local -r rc_file=shuriken.conf + local default_rc_file + local rewritten_rc_file + local source_root + local source_template_dir + + if [ -f "$rc_file" ]; then + printf 'Error: %s already exists\n' "$rc_file" >&2 + exit 1 + fi + + default_rc_file=$(resolve_default_rc_file) + + if [ ! -f "$default_rc_file" ]; then + printf 'Error: Can not find config file %s\n' "$default_rc_file" >&2 + exit 1 + fi + + cp "$default_rc_file" "$rc_file" + + source_root=$(resolve_source_root) + if [[ -n "$source_root" \ + && "$default_rc_file" = "$source_root/src/shuriken.default.conf" ]]; then + source_template_dir="$source_root/share/templates/default" + rewritten_rc_file=$(mktemp "${rc_file}.XXXXXX") + if ! awk -v template_dir="$source_template_dir" \ + '/^TEMPLATE_DIR=/ { + print "TEMPLATE_DIR=" template_dir + next + } + { print }' "$rc_file" > "$rewritten_rc_file"; then + rm -f "$rewritten_rc_file" + exit 1 + fi + cat "$rewritten_rc_file" > "$rc_file" + rm -f "$rewritten_rc_file" + fi + + log_info "Created ./$rc_file" +} |
