From 3a1aeb7a4b7ed3ab0e1b8ff9510f774c85f5cd08 Mon Sep 17 00:00:00 2001 From: skylar taylor-barrick Date: Wed, 14 Oct 2026 21:15:58 -0600 Subject: [PATCH 1/2] ci: add comfortable runtime limits to unbounded jobs (#397) Co-authored-by: skylartaylor <26588250+skylartaylor@users.noreply.github.com> --- .github/workflows/ci.yml | 2 ++ .github/workflows/packaging-lint.yml | 1 + .github/workflows/release.yml | 9 +++++++++ 3 files changed, 12 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7edccb16..e613617a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,7 @@ concurrency: jobs: test: + timeout-minutes: 35 name: test (ubuntu-latest) runs-on: ubuntu-latest steps: @@ -69,6 +70,7 @@ jobs: run: cargo run --locked -q -p xtask -- assets wasm: + timeout-minutes: 30 name: wasm32 check runs-on: ubuntu-latest steps: diff --git a/.github/workflows/packaging-lint.yml b/.github/workflows/packaging-lint.yml index 6b1ab739..26fad875 100644 --- a/.github/workflows/packaging-lint.yml +++ b/.github/workflows/packaging-lint.yml @@ -19,6 +19,7 @@ concurrency: jobs: lint: + timeout-minutes: 15 runs-on: ubuntu-latest env: ACTIONLINT_VERSION: 1.7.12 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e5b6248b..ddf622d7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -41,6 +41,7 @@ env: jobs: version: + timeout-minutes: 10 name: version runs-on: ubuntu-latest # No `environment: release`: this job reads no secrets, so a branch dry run can run it. @@ -69,6 +70,7 @@ jobs: echo "### FigCraft v$v (\`${GITHUB_SHA::9}\`)" >>"$GITHUB_STEP_SUMMARY" macos: + timeout-minutes: 90 name: macOS universal needs: version runs-on: macos-15-xlarge # M2 Pro larger runner; use only in release.yml (actions_macos_xl budget caps spend) @@ -127,6 +129,7 @@ jobs: if [ -n "${MACOS_KEYCHAIN:-}" ]; then security delete-keychain "$MACOS_KEYCHAIN" || true; fi windows: + timeout-minutes: 90 name: Windows ${{ matrix.arch }} needs: version runs-on: windows-latest @@ -187,6 +190,7 @@ jobs: if-no-files-found: error linux: + timeout-minutes: 90 name: Linux ${{ matrix.arch }} needs: version # The oldest GitHub-hosted image, so the binaries only need glibc >= 2.35 (Ubuntu 22.04+, @@ -252,6 +256,7 @@ jobs: if-no-files-found: error server: + timeout-minutes: 90 name: Server Linux ${{ matrix.arch }} needs: version # The headless collaboration server (docs/server.md): figcraft-server--linux-.tar.gz @@ -295,6 +300,7 @@ jobs: if-no-files-found: error flatpak: + timeout-minutes: 90 name: Flatpak ${{ matrix.arch }} needs: [version, linux] # Repackages the Linux job's tarball (the same binaries as the AppImage/deb/rpm); no Rust @@ -388,6 +394,7 @@ jobs: if-no-files-found: error web: + timeout-minutes: 90 name: Web (wasm) needs: version runs-on: ubuntu-latest @@ -433,6 +440,7 @@ jobs: if-no-files-found: error linux-riscv64: + timeout-minutes: 90 name: Linux riscv64 needs: version # Cross-compiled on x86_64 (no hosted RISC-V runners) against the runner's own Ubuntu release @@ -502,6 +510,7 @@ jobs: if-no-files-found: error release: + timeout-minutes: 10 name: Draft GitHub Release needs: [version, macos, windows, linux, linux-riscv64, flatpak, freebsd, web, server] runs-on: ubuntu-latest From 8482c3e85bc5f2a430e2f3be2826674872f6d084 Mon Sep 17 00:00:00 2001 From: Andrey <38911974+Barzabel@users.noreply.github.com> Date: Thu, 15 Oct 2026 06:53:18 +0300 Subject: [PATCH 2/2] M7: home tests wait for the recent files reader instead of a fixed frame count (#351) (#354) --- crates/ui-egui/src/home_tests.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/ui-egui/src/home_tests.rs b/crates/ui-egui/src/home_tests.rs index 1179b1c4..f2091f01 100644 --- a/crates/ui-egui/src/home_tests.rs +++ b/crates/ui-egui/src/home_tests.rs @@ -22,11 +22,22 @@ fn shapes(u: &mut Ui) -> Vec { flat(&u.frame_output(vec![]).shapes) } -/// Enough frames for every thumbnail in view (they render one a frame) and what follows a click. +/// Enough frames for every thumbnail in view (they render one a frame) and what follows a click, +/// then until every recent file has been looked at: the reader is a thread of its own, and until it +/// answers a file's card is a skeleton without its name (on a loaded machine, 12 frames weren't +/// always enough, #351). fn settle(u: &mut Ui) -> Vec { for _ in 0..12 { u.frame(vec![]); } + for _ in 0..400 { + let files = u.app.inspect()["homeRecents"]["files"].as_array().cloned().unwrap_or_default(); + if files.iter().all(|f| !f["exists"].is_null()) { + break; + } + std::thread::sleep(std::time::Duration::from_millis(5)); + u.frame(vec![]); + } shapes(u) }