Commit Graph
3542 Commits
Author SHA1 Message Date
Brandon Thomas 708e8a8bfc Merge PR #2688
# Conflicts:
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-23 17:21:17 -04:00
Brandon Thomas 92bd08ba5c Merge PR #2618
# Conflicts:
#	docs/whats-new.md
2026-10-23 17:21:17 -04:00
Brandon Thomas bbf9b713f2 Merge PR #2526
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-23 17:21:17 -04:00
Brandon Thomas e700170dc6 Merge PR #2727
# Conflicts:
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-23 17:21:17 -04:00
Brandon Thomas b106ceaca1 Merge PR #2621
# Conflicts:
#	docs/whats-new.md
2026-10-23 17:21:16 -04:00
Brandon Thomas 0605272e69 Merge PR #2620 2026-10-23 17:21:16 -04:00
Brandon Thomas 4d9914d4db Merge PR #2709 2026-10-23 17:21:16 -04:00
Brandon Thomas 652fa88c12 Merge PR #2670 2026-10-23 17:21:16 -04:00
Brandon Thomas d7763492c4 Merge PR #2210 2026-10-23 17:21:16 -04:00
Brandon Thomas c342c480cf Merge PR #2665 2026-10-23 17:21:16 -04:00
Brandon Thomas a344e277f0 Merge PR #2728 2026-10-23 17:21:16 -04:00
Brandon Thomas 433ce2375d Merge PR #2109 2026-10-23 17:21:16 -04:00
Brandon Thomas 8c52e2ee95 Merge PR #2630 2026-10-23 17:21:16 -04:00
Brandon Thomas 3ab88f50ac Merge PR #2612 2026-10-23 17:21:16 -04:00
Brandon Thomas cb94eb0e3a Merge PR #2626 2026-10-23 17:21:16 -04:00
Brandon Thomas 4f30720374 Merge PR #2702 2026-10-23 17:21:16 -04:00
Brandon Thomas 6a9e1b504f Merge PR #2694 2026-10-23 17:21:16 -04:00
Brandon Thomas d9db2d32e7 Merge PR #2596 2026-10-23 17:21:16 -04:00
Brandon Thomas e44cbc8725 Merge PR #2543 2026-10-23 17:21:16 -04:00
Brandon ThomasandClaude Opus 5.5 5e5602b4ca Enable Filters: Find Similar turns filtering back on; a filter put aside follows renamed keywords, people and folders
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:20:11 -04:00
Brandon ThomasandClaude Opus 5.5 089bf60ede Colour-range mask: mask.update caps the samples too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:13:39 -04:00
Brandon ThomasandClaude Opus 5.5 4d3ea22e9c Masking: drop the one-off overlay screenshot example and its png dev-dependency
Keeps CanvasMap::new and mask_overlay private to detail.rs again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:06:43 -04:00
Dylan M. Taylor 5ca49b3eab ci(sonar): don't cancel superseded runs on main, so coverage is published (#2737) 2026-10-23 17:01:32 -04:00
aiongg b264557916 i18n: missing translations are reported, never a failure (#2729)
A message a catalog lacks, or translates as an empty string, shows in
English and fails nothing:

- build.rs no longer requires every formats catalog to carry the same
  messages, and tr_format! gets a last arm that formats the English
  source, so a message no catalog has builds.
- Coverage tests (every language translates X) and tests of one
  language's exact wording are gone; the language-switching, layout,
  date, placeholder and user-value tests read the catalog's own value
  instead of a hard-coded translation.
- i18n::tests::translation_gaps_report lists, per language, the plain
  and format messages it lacks and its untranslated What's New lines.
  It always passes; cargo xtask ci
  runs it from the test step's binary after the tests.
- catalogs_load checks that every catalog file is a JSON object of
  strings with each key once; it.json named "Dimensions" twice.
2026-10-23 16:42:28 -04:00
aiongg d71b83b2bc Catalog import: resolve catalog paths with craft-docpath's resolve_absolute (#2412)
doc_path::resolve uses craft_docpath::resolve_absolute; a path that resolves but is not absolute here is reported as not on this computer. Adds tests for Windows-form, GVFS-relative and colon-in-name paths, and a git-sources check in nix.yml and release.yml.
2026-10-23 16:42:09 -04:00
Nathaniel Ledford c13875f77d LR-BEHAV-ACCESS: the feature row records the dialog Tab order and its test 2026-10-23 15:33:59 -04:00
NetterSilverandClaude Haiku 5.5 c7cff2d9a7 Fix smart album gte/lte rules missing equal f-number and focal length
Found while testing crates/catalog/src/rules.rs:673 (num_op), reached via Rule::matches at :956-957

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 21:24:32 +02:00
Nathaniel Ledford aae03c8f47 LR-BEHAV-ACCESS: Tab leaves the name field of a dialog
dialog_field took the focus back every frame while the field wasn't being edited, so Tab never
reached the check box, Cancel or OK of New Album, New Smart Album, Save Metadata Preset and the
other one-field dialogs. It now takes the focus once, when the dialog opens (the way the keyword
dialogs already did).
2026-10-23 15:20:09 -04:00
Nathaniel Ledford f0cdb20a86 Tests: a photo chosen during an import is chosen while the import is held, not while a clock runs 2026-10-23 15:10:15 -04:00
aiongg 069e32f909 CI: shared gate workflow; FreeBSD nightly and on release (#2667)
* CI: run the gate through craft-common-actions' shared gate.yml; FreeBSD nightly and on release

ci.yml is new: it calls the shared workflow (cached apt packages, nextest, main-only cache saves, Cargo.lock check). FreeBSD and Windows ARM64 run nightly and on pushes to release instead of on pull requests. Depends on storytold/craft-common-actions#69.

* CI: the gate installs no nextest (xtask ci runs cargo test)
2026-10-23 14:23:53 -04:00
Dylan M. Taylor 91fcaaaca3 coverage: keep the body scan linear and build the zero counter with dict.fromkeys (SonarCloud S8786/S7519) (#2713)
- ORF_DECODED's Camedia branch drops the redundant \\S+ before .*; with two anchored greedies the scanner can no longer retry the same substring count-for-count at lower and lower split points (same match set, verified on 14 body strings).
- {c: 0 for c in classes} is now dict.fromkeys(classes, 0), which the rule wants and which stones the per-class counters.
2026-10-23 13:35:38 -04:00
Marco Arnulfo b6d94b447b Drop a removed folder from the filter Enable Filters put aside 2026-10-23 19:35:06 +02:00
aiongg f3bb7a9f30 CI: one test binary per crate, line tables only, one WASM check (#2710)
* CI: dev profile keeps line tables for workspace crates and no debug info for dependencies

* Control server tests: persistent_requests_and_slow_replies_outlive_the_idle_read_timeout no longer races the idle timeout

Each request (and the closing half-shutdown) reaches the socket before the
worker reads, so on a slow machine only the reply waits outlast the 100 ms
idle timeout, as the test intends. The idle test sends its input the same
way, and the no-frames test allows 5 s instead of 2 s to give up.

* CI: one integration-test binary per crate

Each crate's tests/*.rs become modules of tests/it/main.rs (51 test files
into 13 binaries, plus 6 that stay their own). Inner #![cfg] attributes
move to the mod lines. Files that change state for the whole process keep
a binary of their own: codecs jxl_tail_heap and raw sr2_heap (dhat global
allocator), gpu shutdown, shutdown_first and memory, ui-egui shutdown.
Docs, comments and the GPU probe name the new paths and targets
(--test it <module>::); the CI report names an it binary's skips after
the crate.

* CI: tests under nextest, doctests apart, one wasm check

xtask ci runs the tests with cargo nextest run --lib --bins --tests when
cargo-nextest is installed, else cargo test with the same targets and a
one-line notice; doctests run after them with cargo test --workspace --doc.
The heif and hardware GPU steps use the same runner. Examples stay out of
the test build (clippy --all-targets still checks them). Concurrent tests
under nextest follow the RUST_TEST_THREADS cap (NEXTEST_TEST_THREADS).
The wasm check is one cargo check --keep-going over the same crates, and
clippy runs with --keep-going.

* CI: tests run under cargo test by default, nextest with LIGHTCRAFT_NEXTEST=1 (per-process scene cache)
2026-10-23 13:34:30 -04:00
aiongg 0e6b0b150f Packaging: pin the signing client and appimagetool, and check their hashes (#2413)
* Packaging: pin the Windows signing client and check its hash

* Packaging: pin appimagetool and check its hash

* Packaging: no pinned tool or runtime for an architecture exits clearly; pin the AppImage runtime and pass it with --runtime-file
2026-10-23 13:00:02 -04:00
Dylan M. Taylor d5e639b3d1 packaging: bash tests, named positional parameters and stderr errors (SonarCloud S7688/S7679/S7682/S7677) (#2655)
Bash scripts use [[ ]] for tests, functions name their positional
parameters and end with an explicit return, and the app-specific packaging
check writes its ::error:: annotations to stderr. No behaviour change.
2026-10-23 11:45:18 -04:00
Marco Arnulfo 6c55a76e95 LR-LIB-FILTER: Cmd+L / Ctrl+L (View > Enable Filters) switches the library filter off and on again as it was 2026-10-23 17:38:34 +02:00
Dylan M. Taylor 1c03b7b18f Merge pull request #2700 from dylanmtaylor/sonar/security-reliability
fix: document the deliberate buffer leak during thread teardown (SonarCloud)
2026-10-23 10:31:35 -04:00
Dylan M. Taylor 6fb6815cd9 fix: document the deliberate buffer leak during thread teardown (SonarCloud)
Dropping a wgpu buffer after the device's thread-locals are gone can
abort; the device owns the memory either way.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-23 09:44:05 -04:00
Nathaniel LedfordandClaude 63f4a3197d LR-META-LOCATION: no test starts the GeoNames download
The command sweep ran metadata.downloadPlaceNames with empty params, which
starts a real download from download.geonames.org into the settings folder.
The sweep now skips it (the command has its own loopback-server tests) and
asserts that no place names download was started.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-23 09:43:44 -04:00
Nicolas FalesyandClaude Opus 5.5 3f4fc66d1a contributors: add nicolasfalesy (GitHub profile name)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0121DZuByhKyGLHw5C9JkUue
2026-10-23 08:43:08 -04:00
Nicolas FalesyandClaude Opus 5.5 5407888184 perf(pipeline): Highlights/Shadows median about 2x faster on the CPU, bit for bit the same
`median_row` (the running median under process V2's highlights/shadows base) kept a sorted
window of f32 and, per pixel, found the leaving and entering values with two binary searches
on `total_cmp`, then `remove` + `insert`. The searches mispredicted on most steps.

Now the window holds `i32` keys that order exactly like `f32::total_cmp` (the same transform
it applies), both ranks come from one branch-free counting pass the compiler vectorizes, and
one `copy_within` moves the keys between them. Equal keys are equal bits, so the output is
unchanged bit for bit.

24 MP Sony A7 III log luminance, one P-core, interleaved: r = 9 (export) 1977-2027 ms ->
912-958 ms, r = 3 1249-1292 -> 658-724, r = 24 2180-2261 -> 972-1030. All cores, r = 9:
170-188 -> 86-102 ms. The GPU path has its own median and is untouched.

New test: special values (NaN of both signs, signed zeros, infinities), long ties and planes
narrower than the window match a per-pixel sorted median bit for bit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0121DZuByhKyGLHw5C9JkUue
2026-10-23 08:43:08 -04:00
Nathaniel Ledford 6889fe223b MENU-BAR: a menu item's cached accelerator follows the native call, and a failed one is retried 2026-10-23 08:23:43 -04:00
Nathaniel Ledford 2c73431db7 MENU-BAR: a failed menu item swap keeps the old item and its cached accelerator 2026-10-23 07:52:07 -04:00
Nathaniel Ledford 7fc8161fc9 MENU-BAR: a rebuilt native menu applies the keys' yield state in the same frame 2026-10-23 07:00:52 -04:00
Matej Vrzala dadb0dfc79 Colour-range mask: cap the number of samples from automation
A colour-range mask compares every pixel against every sample, so
render and export cost is pixels x samples. The interactive sampler
stops at 5, but mask.add / mask.update (colorRange) passed their
`samples` array straight through, so a few hundred samples on a large
render turned into billions of operations and hung rendering and
export. The project already caps similar lists (MAX_STROKE_DABS,
MAX_DETAIL).

The samples list from automation is now capped at 64.

Test: a request with 1000 samples is cut to 64; a two-sample request is
unchanged.

Reported-by: BS.ehlas.cz
2026-10-23 09:46:14 +02:00
Clyde C BrownandClaude Opus 5.5 22c261134d #2663: lightcraft-cli commands: list commands sorted by id
`lightcraft-cli commands` (text and --json) now sorts the registry by id
before printing, so each family's commands sit together. The engine's
registry order, used by engine.commands over MCP and the control channel,
is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:02:34 -06:00
Nathaniel Ledford 4d8dbddb86 MENU-BAR: a menu item really gives its key up to a text field or shortcut recording on macOS 2026-10-22 20:20:58 -04:00
Brandon ThomasandClaude Opus 5.5 23e181283c Release 0.13.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.13.0
2026-10-22 20:06:09 -04:00
skylar taylor-barrick 12ca4cc65b #49: test that the in-window menu headings are spaced apart
The File/Edit/View headings sat only egui's default 8 px apart because frameless
buttons get no padding of their own. The test lays out the in-window menu bar and
checks every pair of neighbouring headings is at least 24 px apart; without the
item-spacing fix the gap is 4 px and the assertion fails.
2026-10-22 17:31:42 -06:00
Dylan M. Taylor beb044bf35 Merge pull request #2494 from storytold/sonar-fix/path-cmd-hardening
security: validate CLI paths/args in dev tools (SonarCloud S2083/S8707/S8705)
2026-10-22 19:27:49 -04:00