cf-node-bootstrap/cf-apps/circuitforge-core.manifest
pyr0ball bc9d1e564f fix: stop double-executing git clone / setup hooks via run()
run() re-splits its argument as a bare string with no eval, so any
call like run "git clone \"$url\" \"$dir\"" corrupts the quoted
arguments (embedded escaped quotes survive as literal characters,
e.g. git sees the protocol as '"https). Each of the 4 affected call
sites papered over this by following run() with a second, correctly
quoted manual execution of the same command - meaning every real run
double-executed (git clone twice, pip install -e twice, conda env
create twice), with the first, corrupted attempt's failure masked by
the working second attempt.

Fixed by dropping run() at these sites entirely and gating on
$dry_run directly with a single, properly quoted real execution path
(matches the pattern already used in the new model-cache-redirect
extra):
- lib/cf-apps.functions: install-cf-app's clone, provision-orchard-node's clone
- cf-apps/circuitforge-core.manifest: pip install -e setup hook
- cf-apps/kiwi.manifest: conda env create setup hook

Verified on sif via a scratch-dir harness (install-cf-app
circuitforge-core): first run now clones cleanly with no mangled-URL
error, second run correctly skips the clone and re-runs the
idempotent pip install; state.conf stays single-entry across both.
2026-07-18 22:12:05 -07:00

23 lines
985 B
Text

app_name="circuitforge-core"
app_desc="Shared scaffold (db/llm/tiers/config) used by other CF products"
app_repo_url_github="https://github.com/CircuitForgeLLC/circuitforge-core.git"
app_repo_url_forgejo="https://git.opensourcesolarpunk.com/Circuit-Forge/circuitforge-core.git"
# Not directly user-selectable in the app menu (installed automatically as a
# dependency by install-cf-core-dependency), but still needs a profile list
# so its own clone step honors the oem/collaborator remote split.
app_available_profiles=(oem collaborator)
app_install_types=(bare-metal)
app_conda_env="cf"
app_env_template=""
app_needs_core=false
app_setup_bare_metal() {
local dir="$1"
if [[ $dry_run == true ]]; then
boxline "DryRun: conda run -n ${app_conda_env} pip install -e ${dir}"
else
# run() re-splits its argument as a bare string with no eval, which
# mangles the quoted path - execute directly instead.
conda run -n "${app_conda_env}" pip install -e "${dir}"
fi
}