Move check_profile's downloads to a per-user cache outside the repo

The validator, fixture archives and unpacked fixture trees no longer live under <repo>/.test/check_profiles, so every worktree on a machine shares one copy instead of re-downloading. macOS, Linux and Windows each use their own user cache dir, named apart from OrcaSlicer's per-user dirs. The now-unused /.test/ ignore rule is dropped.
This commit is contained in:
SoftFever
2026-09-21 00:28:50 +08:00
parent cb98d82023
commit 505a46b280
5 changed files with 42 additions and 21 deletions
+2 -1
View File
@@ -91,7 +91,8 @@ Paths below are relative to this skill. Commands run from the repository root.
``` ```
On Windows use `py -3` instead of `python3`, and `scripts\check_profile.bat -Vendor "<Vendor>"` On Windows use `py -3` instead of `python3`, and `scripts\check_profile.bat -Vendor "<Vendor>"`
/ `scripts\check_profile.bat`. Logs: `.test/check_profiles/logs/<check>.log`. / `scripts\check_profile.bat`. Logs land in a per-user cache dir (see
[validation.md](references/validation.md)).
Id checks remain tree-wide under `--vendor`; filament-only bundles skip the default slice check. Id checks remain tree-wide under `--vendor`; filament-only bundles skip the default slice check.
See [validation.md](references/validation.md) for flags, coverage and error remedies. See [validation.md](references/validation.md) for flags, coverage and error remedies.
5. **Verify the changed behavior.** Slice newly added non-default processes explicitly, and 5. **Verify the changed behavior.** Slice newly added non-default processes explicitly, and
@@ -20,8 +20,11 @@ default Windows client refuses to run a checked-out `.ps1` at all. The `.ps1` fi
probing `py -3`, then `python`, then `python3`; run the tool by hand with `py -3` for the same reason. probing `py -3`, then `python`, then `python3`; run the tool by hand with `py -3` for the same reason.
Every check in the run happens even after an earlier one fails; the script exits non-zero if any did, and writes Every check in the run happens even after an earlier one fails; the script exits non-zero if any did, and writes
`.test/check_profiles/logs/<check>.log` plus, on failure, `.test/check_profiles/pr_comment.md` — the same `logs/<check>.log` plus, on failure, `pr_comment.md` under a per-user cache dir — the same report CI posts on the PR.
report CI posts on the PR. A stale `.test/check_profiles/.lock` after a crash must be removed by hand. That dir is `~/Library/Caches/orca-profile-check` on macOS, `${XDG_CACHE_HOME:-~/.cache}/orca-profile-check` on Linux
and `%LOCALAPPDATA%\orca-profile-check` on Windows; it is named apart from OrcaSlicer's own per-user dirs and sits
outside the checkout, so every worktree shares one copy. `--work-dir` / `-WorkDir` overrides it. A stale `.lock`
there after a crash must be removed by hand.
## The five checks ## The five checks
@@ -150,9 +153,10 @@ Two things it therefore does **not** enforce:
Built from `src/dev-utils/OrcaSlicer_profile_validator.cpp` (`-DORCA_TOOLS=ON`). Built from `src/dev-utils/OrcaSlicer_profile_validator.cpp` (`-DORCA_TOOLS=ON`).
Both scripts find a local build under `build*/` — `check_profile.sh` tries Release, RelWithDebInfo, then Both scripts find a local build under `build*/` — `check_profile.sh` tries Release, RelWithDebInfo, then
Debug, and `check_profile.ps1` adds MinSizeRel — else they download the nightly into Debug, and `check_profile.ps1` adds MinSizeRel — else they download the nightly into the
`.test/check_profiles/validator`. Pass `--download` / `-Download` to match CI exactly, since a stale `validator` subdirectory of the per-user cache dir (see above). Pass `--download` / `-Download` to
local build is used silently. Windows looks for `OrcaSlicer_profile_validator.exe`. match CI exactly, since a stale local build is used silently. Windows looks for
`OrcaSlicer_profile_validator.exe`.
If your build lives somewhere else entirely, point at it with `--validator` / `-Validator`, or set If your build lives somewhere else entirely, point at it with `--validator` / `-Validator`, or set
`ORCA_PROFILE_VALIDATOR` (`$env:ORCA_PROFILE_VALIDATOR` in PowerShell). `ORCA_PROFILE_VALIDATOR` (`$env:ORCA_PROFILE_VALIDATOR` in PowerShell).
-1
View File
@@ -52,5 +52,4 @@ internal_docs/
__pycache__/ __pycache__/
*.pyc *.pyc
*.opc *.opc
/.test/
docs/superpowers/ docs/superpowers/
+10 -5
View File
@@ -21,8 +21,10 @@
normalize and update-index would still rewrite. normalize and update-index would still rewrite.
Everything that has to be downloaded - the profile validator and the custom-preset fixture Everything that has to be downloaded - the profile validator and the custom-preset fixture
archives - lands under <repo>\.test\check_profiles and is reused on the next run. That archives - lands under a per-user cache directory (%LOCALAPPDATA%\orca-profile-check) and
directory also holds one log per check plus a copy of the comment CI would post on the PR. is reused on the next run. Being outside the checkout, that directory is shared by every
worktree on the machine. It also holds one log per check plus a copy of the comment CI would
post on the PR.
resources\profiles\user, which the validator creates as its data dir but a CI checkout never resources\profiles\user, which the validator creates as its data dir but a CI checkout never
has, is moved aside for the duration of the run and restored on exit. Only one run per work has, is moved aside for the duration of the run and restored on exit. Only one run per work
@@ -60,8 +62,8 @@
Re-download the validator and fixtures instead of using the cache. Re-download the validator and fixtures instead of using the cache.
.PARAMETER WorkDir .PARAMETER WorkDir
Downloads, logs and fixture trees (default: .test\check_profiles). Point it somewhere short, Downloads, logs and fixture trees (default: %LOCALAPPDATA%\orca-profile-check). Point it
such as D:\t, if a fixture tree trips Windows' 260-character path limit. somewhere short, such as D:\t, if a fixture tree trips Windows' 260-character path limit.
.PARAMETER LogLevel .PARAMETER LogLevel
Validator log level (default: 2, as in CI). Validator log level (default: 2, as in CI).
@@ -212,7 +214,10 @@ if ($Vendor) {
$VendorArgs = if ($Vendor) { @('-v', $Vendor) } else { @() } $VendorArgs = if ($Vendor) { @('-v', $Vendor) } else { @() }
$VendorPyArgs = if ($Vendor) { @('--vendor', $Vendor) } else { @() } $VendorPyArgs = if ($Vendor) { @('--vendor', $Vendor) } else { @() }
if (-not $WorkDir) { $WorkDir = Join-Path $RepoRoot '.test\check_profiles' } if (-not $WorkDir) {
# Per-user cache dir, so every worktree on the machine shares one set of downloads.
$WorkDir = Join-Path ([Environment]::GetFolderPath('LocalApplicationData')) 'orca-profile-check'
}
$LogDir = Join-Path $WorkDir 'logs' $LogDir = Join-Path $WorkDir 'logs'
try { New-Item -ItemType Directory -Force -Path $LogDir | Out-Null } catch { Die "cannot create ${LogDir}: $_" } try { New-Item -ItemType Directory -Force -Path $LogDir | Out-Null } catch { Die "cannot create ${LogDir}: $_" }
$WorkDir = (Resolve-Path -LiteralPath $WorkDir).Path $WorkDir = (Resolve-Path -LiteralPath $WorkDir).Path
+21 -9
View File
@@ -7,8 +7,9 @@
# continue-on-error), then the script exits non-zero once at the end. # continue-on-error), then the script exits non-zero once at the end.
# #
# Everything that has to be downloaded - the profile validator and the custom-preset fixture # Everything that has to be downloaded - the profile validator and the custom-preset fixture
# archives - lands under <repo>/.test/check_profiles/ and is reused on the next run. That # archives - lands under a per-user cache directory and is reused on the next run. Being outside
# directory also holds one log per check plus a copy of the comment CI would post on the PR. # the checkout, that directory is shared by every worktree on the machine. It also holds one log
# per check plus a copy of the comment CI would post on the PR.
# #
# resources/profiles/user, which the validator creates as its data dir but a CI checkout never # resources/profiles/user, which the validator creates as its data dir but a CI checkout never
# has, is moved aside for the duration of the run and restored on exit. Only one run per work # has, is moved aside for the duration of the run and restored on exit. Only one run per work
@@ -33,9 +34,20 @@ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" REPO_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)"
HOST_ARCH="$(uname -m)" HOST_ARCH="$(uname -m)"
HOST_OS="$(uname -s)"
case "${HOST_OS}" in
Darwin*) HOST_OS=Darwin ;;
MINGW*|MSYS*|CYGWIN*) HOST_OS=Windows ;;
Linux*) HOST_OS=Linux ;;
esac
PROFILES_DIR="${REPO_ROOT}/resources/profiles" PROFILES_DIR="${REPO_ROOT}/resources/profiles"
WORK_DIR="${REPO_ROOT}/.test/check_profiles" case "${HOST_OS}" in
Darwin) DEFAULT_WORK_DIR="${HOME}/Library/Caches/orca-profile-check" ;;
Windows) DEFAULT_WORK_DIR="${LOCALAPPDATA:-${HOME}/AppData/Local}/orca-profile-check" ;;
*) DEFAULT_WORK_DIR="${XDG_CACHE_HOME:-${HOME}/.cache}/orca-profile-check" ;;
esac
WORK_DIR="${DEFAULT_WORK_DIR}"
VALIDATOR="${ORCA_PROFILE_VALIDATOR:-}" VALIDATOR="${ORCA_PROFILE_VALIDATOR:-}"
# Vendor to check, named after its <Vendor>.json - empty means every vendor, which is exactly what # Vendor to check, named after its <Vendor>.json - empty means every vendor, which is exactly what
# both the validator's -v and orca_profile_tool.py check's --vendor take an empty value to mean. # both the validator's -v and orca_profile_tool.py check's --vendor take an empty value to mean.
@@ -75,7 +87,7 @@ Options:
downloaded for this platform downloaded for this platform
--download ignore local builds and use the downloaded nightly validator --download ignore local builds and use the downloaded nightly validator
--refresh re-download the validator and fixtures instead of using the cache --refresh re-download the validator and fixtures instead of using the cache
--work-dir DIR downloads, logs and fixture trees (default: .test/check_profiles) --work-dir DIR downloads, logs and fixture trees (default: ${DEFAULT_WORK_DIR})
-l, --log-level N validator log level (default: ${LOG_LEVEL}, as in CI) -l, --log-level N validator log level (default: ${LOG_LEVEL}, as in CI)
-h, --help show this help -h, --help show this help
@@ -304,8 +316,8 @@ EOF
# holding the signed .app, Windows an .exe. # holding the signed .app, Windows an .exe.
download_validator() { download_validator() {
local dest="${WORK_DIR}/validator" binary dmg app mounted app_src local dest="${WORK_DIR}/validator" binary dmg app mounted app_src
case "$(uname -s)" in case "${HOST_OS}" in
Linux*) Linux)
case "${HOST_ARCH}" in case "${HOST_ARCH}" in
arm64|aarch64) msg "the nightly Linux validator is x86_64; build it locally for ${HOST_ARCH}" ;; arm64|aarch64) msg "the nightly Linux validator is x86_64; build it locally for ${HOST_ARCH}" ;;
esac esac
@@ -313,7 +325,7 @@ download_validator() {
fetch "${VALIDATOR_RELEASE_URL}/OrcaSlicer_profile_validator_Linux_Ubuntu2404_nightly" "${binary}" || return 1 fetch "${VALIDATOR_RELEASE_URL}/OrcaSlicer_profile_validator_Linux_Ubuntu2404_nightly" "${binary}" || return 1
chmod +x "${binary}" || return 1 chmod +x "${binary}" || return 1
;; ;;
Darwin*) Darwin)
dmg="${dest}/OrcaSlicer_profile_validator.dmg" dmg="${dest}/OrcaSlicer_profile_validator.dmg"
app="${dest}/OrcaSlicer_profile_validator.app" app="${dest}/OrcaSlicer_profile_validator.app"
binary="${app}/Contents/MacOS/OrcaSlicer_profile_validator" binary="${app}/Contents/MacOS/OrcaSlicer_profile_validator"
@@ -332,13 +344,13 @@ download_validator() {
[ -x "${binary}" ] || { msg "no validator app inside ${dmg}"; return 1; } [ -x "${binary}" ] || { msg "no validator app inside ${dmg}"; return 1; }
fi fi
;; ;;
MINGW*|MSYS*|CYGWIN*) Windows)
binary="${dest}/OrcaSlicer_profile_validator.exe" binary="${dest}/OrcaSlicer_profile_validator.exe"
fetch "${VALIDATOR_RELEASE_URL}/OrcaSlicer_profile_validator_Windows_nightly.exe" "${binary}" || return 1 fetch "${VALIDATOR_RELEASE_URL}/OrcaSlicer_profile_validator_Windows_nightly.exe" "${binary}" || return 1
chmod +x "${binary}" || return 1 chmod +x "${binary}" || return 1
;; ;;
*) *)
msg "no nightly validator published for $(uname -s); build it (-DORCA_TOOLS=ON) and pass --validator" msg "no nightly validator published for ${HOST_OS}; build it (-DORCA_TOOLS=ON) and pass --validator"
return 1 return 1
;; ;;
esac esac