play build: find the Android SDK like Android Studio (ANDROID_HOME, ANDROID_SDK_ROOT, sdk.dir, default folder), pass it in the env, stop before Gradle when missing; doctor shows it. apple upload: size, per-part lines, 20 s heartbeat (api, altool, processing wait), per-part and per-call timeouts, --timeout exits 7 with the resume hint. Pitfall 25

This commit is contained in:
CRTkafa 2026-10-12 08:48:02 +08:00
parent 366362d62b
commit fc524cd2d4
15 changed files with 460 additions and 34 deletions

View file

@ -2,6 +2,20 @@
## Unreleased
- Fix (`play build`): the Android SDK is found the way Android Studio finds it, so a non-interactive shell (no
`ANDROID_HOME`) with a gitignored `local.properties` no longer ends in Gradle's "SDK location not found". Order:
`ANDROID_HOME`, `ANDROID_SDK_ROOT`, `sdk.dir` in the Gradle project's `local.properties`, then
`~/Library/Android/sdk` (macOS) / `~/Android/Sdk` (Linux) / `%LOCALAPPDATA%\Android\Sdk` (Windows); only a folder
with `platforms/` or `platform-tools/` counts. Gradle gets it through `ANDROID_HOME` and `ANDROID_SDK_ROOT`;
`local.properties` is never written. None found: the build stops before Gradle and lists every place checked. The
dry run and `storebound doctor` (also `--json`: `androidSdk`) show the SDK path and where it came from. Pitfall 25.
- Fix (`apple upload`): never silent. The IPA size at the start, a line per part (every 10th from 20 parts), a
heartbeat every 20 s while a part is in flight ("still uploading, 4m30s, 312/890 MB (35%), part 4/12"), the same
heartbeat while `--via altool` runs (now in the background, stopped at the deadline) and while the build is
processed (`apple testflight wait` too). Each part has a 15 min limit and is retried; `--timeout` now also covers
the parts and stops with exit 7 and the hint to run the same command again (it resumes the build upload). Every App
Store Connect API call has a 2 min limit (a hung connection is retried when safe, never a silent wait).
- Fix (`flow run`, every confirming command): a declined confirmation is no longer a success. `confirm()` prints
`declined: <reason>` and exits 3 when the owner answers no, when there is no terminal and no `--yes`, or under
`serve` without the owner's dialog; `flow run` stops at that step with "step N declined: <reason>" (status