ren worker folder adding orig, mv new one into root

This commit is contained in:
2026-09-25 10:34:29 -04:00
parent 10f0668e32
commit 5b010039d7
1308 changed files with 44597 additions and 1511 deletions

View File

@@ -395,9 +395,13 @@ CTR_MARKER_DIR="/opt/raccoon-setup"
# Record <repo> as set up in THIS container. Best-effort: if the marker can't be written the
# only consequence is that setup runs again next time, and every step of it is idempotent.
_mark_ctr_setup() { mkdir -p "$CTR_MARKER_DIR" 2>/dev/null && : > "$CTR_MARKER_DIR/$1.done" 2>/dev/null || true; }
# A member set up but left without its dependencies, so the later arms don't claim otherwise.
_mark_ctr_nodeps() { mkdir -p "$CTR_MARKER_DIR" 2>/dev/null && : > "$CTR_MARKER_DIR/$1.nodeps" 2>/dev/null || true; }
_clear_ctr_nodeps() { rm -f "$CTR_MARKER_DIR/$1.nodeps" 2>/dev/null || true; }
_ctr_nodeps() { [ -f "$CTR_MARKER_DIR/$1.nodeps" ]; }
# First-use setup for a member repo: checkout its commit, install deps, prepare DB.
# The DNS jail (post-start.sh) blocks package registries, and the setup below installs
# The DNS jail (apply-dns-jail.sh) blocks package registries, and the setup below installs
# from them. Lift it for the install, then put it back — including on Ctrl-C, or the
# container would silently keep its network until the next start.
_DNSJAIL_LIFTED=""
@@ -431,6 +435,7 @@ _dnsjail_restore() {
[ -n "$(ls -A /tmp/.dnsjail/lifts 2>/dev/null)" ] && return 0
[ -f /tmp/.dnsjail/allow ] || return 0
sudo env DNSJAIL_ALLOW="$(cat /tmp/.dnsjail/allow)" \
DNSJAIL_ALLOW_EXTRA="$(cat /tmp/.dnsjail/allow-extra 2>/dev/null)" \
sh /workspace/.devcontainer/dns-jail-container.sh >/dev/null 2>&1 || true
}
@@ -601,17 +606,28 @@ setup_repo() {
# outright (Explore resolved pydantic 2.13.4 against a lock pinning 2.9.2, and the
# pinned strawberry cannot import on 2.13). Prefer the lock when there is one.
local vdir; vdir=$(_uv_venv_dir "$repo")
# --clear: uv >=0.12 won't create over an existing venv, so a failed first setup
# would wedge the member. setuptools 80.x is the last line shipping pkg_resources.
( cd "$dir" \
&& uv venv "$vdir" -p "$ver" -q \
&& uv venv --clear "$vdir" -p "$ver" -q \
&& . "$vdir/bin/activate" \
&& uv pip install -q 'setuptools==80.9.0' \
&& { [ -f .env.example ] && cp -n .env.example .env; true; } \
&& { for kv in $bootenv; do grep -qxF "$kv" .env 2>/dev/null || echo "$kv" >> .env; done; true; } \
&& { if [ -f poetry.lock ] && command -v poetry >/dev/null 2>&1 \
&& POETRY_VIRTUALENVS_CREATE=false poetry install -q --no-interaction --no-root 2>/dev/null; then true; \
elif [ -f pyproject.toml ]; then uv pip install -q -e . || uv pip install -q -r requirements.txt 2>/dev/null || true; \
elif [ -f requirements.txt ]; then uv pip install -q -r requirements.txt; \
elif [ -f server/requirements.txt ]; then uv pip install -q -r server/requirements.txt; \
elif [ -f setup.py ]; then uv pip install -q -e .; else true; fi; } ) || return 1
&& { for kv in $bootenv; do grep -qxF "$kv" .env 2>/dev/null || echo "$kv" >> .env; done; true; } ) || return 1
# Non-fatal: a manifest that cannot resolve here (a pin with no wheel for this
# architecture, say) leaves the member readable instead of failing the whole run.
if ( cd "$dir" && . "$vdir/bin/activate" \
&& { if [ -f poetry.lock ] && command -v poetry >/dev/null 2>&1 \
&& POETRY_VIRTUALENVS_CREATE=false poetry install -q --no-interaction --no-root 2>/dev/null; then true; \
elif [ -f pyproject.toml ]; then uv pip install -q -e . || uv pip install -q -r requirements.txt 2>/dev/null || true; \
elif [ -f requirements.txt ]; then uv pip install -q -r requirements.txt; \
elif [ -f server/requirements.txt ]; then uv pip install -q -r server/requirements.txt; \
elif [ -f setup.py ]; then uv pip install -q -e .; else true; fi; } ); then
_clear_ctr_nodeps "$repo"
else
_mark_ctr_nodeps "$repo"
printf " ${YELLOW}\xe2\x9a\xa0 %s: dependencies did not install${RESET} \xe2\x80\x94 explore-only in this container.\n ${GRAY}Reading the code, git and the editor still work; running the app or its tests will not.\n Usually a pin with no build for this machine's architecture. To retry: rm %s/%s.done${RESET}\n" "$repo" "$CTR_MARKER_DIR" "$repo"
fi
_mark_ctr_setup "$repo"; return 0
fi
_py_have "$ver" || { printf " ${GRAY}(Python %s not in this image; skipping deps \xe2\x80\x94 explore-only)${RESET}\n" "$ver"; _mark_ctr_setup "$repo"; return 0; }
@@ -630,10 +646,9 @@ setup_repo() {
# Every member Dockerfile sets this; without it poetry builds a .venv here
# that the trial image has no equivalent of.
poetry config virtualenvs.create false 2>/dev/null || true; \
# The git→path rewrite invalidates poetry.lock ("changed significantly");
# regenerate it before installing. Poetry 2.x `lock` preserves pins by
# default (the old `--no-update` flag was removed in 2.0).
poetry lock 2>/dev/null || true; \
# The git→path rewrite invalidates poetry.lock ("changed significantly"), so
# re-lock preserving pins: --no-update on poetry 1.x, the default on 2.x.
poetry lock --no-update 2>/dev/null || poetry lock 2>/dev/null || true; \
# --no-root: install deps only, not the project package itself. Some members'
# pyproject package name doesn't map to a folder poetry can find ("No file/folder
# found for package <x>"), which fails the whole install. The worker explores +
@@ -684,7 +699,12 @@ setup_repo() {
}
start_poly() {
local repo="${1:-}"; [ -z "$repo" ] && repo="$(_poly_default)"
local repo="${1:-}"
if [ -z "$repo" ]; then
repo="$(_poly_default)"
printf "${GRAY}no repo given — defaulting to '%s'. run-app <repo> picks another: %s${RESET}\n" \
"$repo" "$(_poly_repos | tr '\n' ' ')"
fi
if ! _poly_repos | grep -qx "$repo"; then
printf "${RED}unknown repo '%s'.${RESET} available: ${GRAY}%s${RESET}\n" "$repo" "$(_poly_repos | tr '\n' ' ')"
return 1
@@ -718,7 +738,8 @@ start_poly() {
return 0
fi
bash /workspace/.devcontainer/post-start.sh >/dev/null 2>&1 || true
setup_repo "$repo" || { printf "${RED}setup failed for %s${RESET} \xe2\x80\x94 ${GRAY}run-app --logs${RESET}\n" "$repo"; return 1; }
# Not --logs: setup runs before any app log exists, so its error is on screen, not in a file.
setup_repo "$repo" || { printf "${RED}setup failed for %s${RESET} \xe2\x80\x94 ${GRAY}see the error above${RESET}\n" "$repo"; return 1; }
local cmd=""
case "$kind" in
elixir)
@@ -812,6 +833,10 @@ start_poly() {
cmd="env $bootenv $craenv PATH=$nbin:\$PATH PORT=3000 BROWSER=none HOST=0.0.0.0 yarn $sc"
fi ;;
python)
if _ctr_nodeps "$repo"; then
printf " ${GRAY}%s: explore-only \xe2\x80\x94 its dependencies did not install, so its tests and scripts won't run here.${RESET}\n" "$repo"
return 0
fi
if [ -z "$startcmd" ]; then
printf " ${GRAY}%s: Python deps installed. No web server is wired \xe2\x80\x94 run its tests/scripts directly (e.g. pytest).${RESET}\n" "$repo"
return 0