Commit Graph
4114 Commits
Author SHA1 Message Date
Chad ElliottandClaude Opus 5.5 a57bd69d98 fix(import): a duplicate with a capture time skips its sidecar (#2589)
Since a content duplicate carries its file's capture time, the duplicate
check ran after the sidecar read, so a duplicate whose file already has
a capture time read and parsed a sidecar it doesn't use (more I/O on a
network share). The check now happens first and the sidecar is read for
a duplicate only when the file has no capture time.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:25:53 -05:00
Chad ElliottandClaude Opus 5.5 d9476bc16d fix(lightroom): a content duplicate takes its file's capture time (#2589)
A content duplicate whose catalog row has no capture time took the
capture time of the library photo with the same bytes, which Edit
Capture Time may have changed. The import job now resolves the file's
capture time (the file's, else its XMP sidecar's, else its modification
time) before it sets the file aside as a duplicate, and hands it over
with the file's metadata (`Duplicate::file`, a `FileFacts`). The
Lightroom import uses it; the catalog's capture time still applies on
top when the row has one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:57:55 -05:00
Chad ElliottandClaude Opus 5.5 5b8b9b521d fix(lightroom): a content duplicate keeps the metadata its file carries (#2589)
A catalog photo whose bytes match another library photo became a new record that took only the
camera description from that photo's record, so the copyright, rights, creator and other metadata
its file carries (EXIF, IPTC, embedded XMP), which a file import keeps, was lost whenever the
catalog's XMP didn't restate it. Copying them from the other record would have carried that
photo's edits instead.

The file import already reads each content duplicate before it skips it; the probed metadata now
rides on the duplicate (`Duplicate::file_meta`, not serialised) and the new record starts from it,
before the import defaults and the catalog's metadata go on top, as for a file import. Without a
probe (a path match, which this branch never sees) it keeps the exposure description only, no
longer the user-editable GPS.

Test: a content duplicate of a trashed photo, imported through the Lightroom job with a file
carrying copyright, status, usage terms and creator, keeps them and takes nothing from the other
record's edited notice, creator or GPS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:56:50 -05:00
Chad ElliottandClaude Opus 5.5 a31a43670b fix(lightroom): content duplicates start from import defaults; Show in Library skips Recently Deleted (#2589)
A catalog photo whose bytes match another library photo got the generic develop defaults, so a raw
with no white balance or lens setting in the catalog lost its as-shot white balance and embedded
lens corrections and rendered unlike a file import. It now gets the import defaults (camera
defaults plus the default preset), as a file import does, before the catalog's settings go on top.

Show in Library selected the lowest mapped photo id, which can be a master left in Recently Deleted
whose new virtual copy the import added; All Photos doesn't show it. It now selects the lowest
mapped photo not in Recently Deleted, and the button is left out when there is none.

Tests: a content-duplicate raw with no catalog settings equals its camera defaults (as-shot WB,
lens profile on); Show in Library skips a trashed mapped photo and offers nothing when only
trashed or vanished ids are mapped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:56:50 -05:00
Chad ElliottandClaude Opus 5.5 7c74ae0ac3 Issue #2589: a content duplicate starts from the file, not from the other photo's record
The new record for a catalog photo whose bytes match another library photo copied that whole
record and reset a few fields, so the other photo's edits, history, versions, ratings and written
metadata (title, keywords, face regions) carried over, from a trashed photo too. It now starts as a
new photo and takes only what the bytes determine: format, size, kind, capture time, camera EXIF,
GPS, focus point, content hash, embedded lens data and preview-only state. The catalog's own
settings and metadata apply on top as before.

Tests: the duplicate test gives the other photo edits, history, a version, a title, keywords and a
Local baseline and checks none reach the new record; a reimport after a master and its virtual copy
were trashed counts each once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:56:50 -05:00
Chad ElliottandClaude Opus 5.5 de9b0a8951 Issue #2589: a Lightroom import never creates a photo already in Recently Deleted
A catalog photo whose file matched a photo in Recently Deleted by content was cloned with the trashed
record's `deleted` flag (and its virtual-copy fields), so it landed in Recently Deleted while the report
counted it as imported. A new virtual copy of a trashed master did the same. Both are now live records,
as Create Virtual Copy already does.

Catalog photos matched by path to a trashed photo stay there (the Lightroom import's OnDeleted::Skip,
#706); the report counts them as `inRecentlyDeleted` and the result window says so in one line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:56:50 -05:00
Dylan M. Taylor b2d89895ad CI: workflows only call craft-common-actions at @main (#3356)
AGENTS.md (and CLAUDE.md where present) gets a CI workflows section: workflows only call
craft-common-actions at @main, with no other jobs; feature and fix PRs don't touch CI and
link or open a craft-common-actions issue (a PR only for a small fix that is safe for
every app and does not increase CI time); legacy jobs
aren't added to and move only as their own task, staying until a shared workflow runs them.

windows-arm64.yml moves from its SHA pin to @main. The pinned revision is on
craft-common-actions main and the workflow (and the actions it calls) is identical
there, so nothing changes in behaviour.
2026-10-29 22:36:34 -04:00
Dylan M. Taylor 260d797acc deps: bump tar, zip, roxmltree, rustls-webpki and symphonia to their latest versions (#3358)
- `rustls-webpki`: 0.102.8, 0.103.15 → 0.102.8, 0.103.16
- `zip`: 7.2.0, 9.1.0 → 7.4.0, 9.1.3

Lockfile only.
2026-10-29 22:21:27 -04:00
Dylan M. Taylor 77c0a6adfa Honor CARGO_BUILD_TARGET in FreeBSD packaging for aarch64 release builds (#3275)
* Honor CARGO_BUILD_TARGET in FreeBSD packaging for aarch64 release builds

package.sh always built for the host and took the arch from uname -m, so a
cross build (aarch64 in an x86_64 FreeBSD VM) would read the wrong target
directory and name the archive after the VM. With CARGO_BUILD_TARGET set,
pass it to cargo, read target/<triple>/release, and take the arch from the
target. Unset keeps the old behavior.

* Reject unknown CARGO_BUILD_TARGET in FreeBSD packaging

Only the two FreeBSD triples are packaged. Any other target now fails before the
build instead of being labelled x86_64.

* Skip the --version smoke run for cross-built FreeBSD packages

A binary built for another target cannot run on the build host, so under set -e
the run would fail the release after the archive is written.
2026-10-28 15:48:43 -04:00
Dylan M. Taylor e2d18b5fb9 Grant network access so update checks can reach GitHub (#3269) 2026-10-28 13:05:19 -04:00
Brandon ThomasandClaude Opus 5.5 e381c1ae6b Release 0.15.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.15.0
2026-10-28 12:09:24 -04:00
Brandon ThomasandClaude Opus 5.5 aaf532c525 macOS packaging: retry stapler when Apple's CloudKit drops the connection
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 12:09:18 -04:00
Dylan M. Taylor 59a5d00c60 Merge pull request #3111 from dylanmtaylor/sonar/enforce-clippy-standards
Enforce Rust coding standards via Clippy
2026-10-28 01:31:16 -04:00
Dylan M. Taylor 307ecb981d fix(ui-egui): keep the Export dialog's original spacing before the preset row 2026-10-28 04:06:29 +00:00
Dylan M. Taylor 6e54232557 test: factor long UI and MCP scenarios into helpers 2026-10-28 03:25:18 +00:00
Dylan M. Taylor f6489e60d8 refactor(lightcraft): import prefs and GPU crash names explicitly 2026-10-28 03:25:18 +00:00
Dylan M. Taylor ce3ce07771 refactor(ui-egui): split the top bar and slider widget 2026-10-28 03:25:18 +00:00
Dylan M. Taylor f858578f8c refactor(ui-egui): split the detail view, mask overlay and denoise panel 2026-10-28 03:25:18 +00:00
Dylan M. Taylor 4ed9a5c869 refactor(ui-egui): split the grid cell and context menu 2026-10-28 03:25:18 +00:00
Dylan M. Taylor 620826cac0 refactor(ui-egui): shorten functions that format localized messages 2026-10-28 03:25:18 +00:00
Dylan M. Taylor 7b4236bc8b refactor(ui-egui): pass related arguments as small structs 2026-10-28 03:25:18 +00:00
Dylan M. Taylor b74612513c refactor(ui-egui): split the Export dialog body into sections 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 8c3dd7ebd2 refactor(ui-egui): split dialog frame into title, buttons and confirm 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 335defee47 refactor(ui-egui): one function per dialog body 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 627804c161 refactor(ui-egui): split import finish and print settings 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 63755f8a2e refactor(ui-egui): split the global shortcut dispatcher 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 2f3002bc5c refactor(ui-egui): split preset import and find-missing commands 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 71bf82f7bb refactor(ui-egui): split run_ui_command into parts and per-command functions 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 6774d1419f refactor(ui-egui): replace wildcard imports with explicit lists 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 5b5ddc3904 fix(engine): import denoise model and gpu names explicitly 2026-10-28 03:24:18 +00:00
Dylan M. Taylor eeb63636e8 docs: clarify crate lint attribute placement 2026-10-28 03:24:18 +00:00
Dylan M. Taylor b298c79a7d docs: correct clippy indexing guidance 2026-10-28 03:24:18 +00:00
Dylan M. Taylor ca69e74b62 fix(raw): check opcode byte counts without overflow 2026-10-28 03:24:18 +00:00
Dylan M. Taylor c9d44f7804 style(engine): expand module imports explicitly 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 4d8369b091 test(engine): factor complex regression scenarios 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 47839a61db refactor(bench): dispatch specialized render modes 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 9c1ea73116 refactor(gpu): extract neural plan validation 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 9e1483388f refactor(import): separate Lightroom collection staging 2026-10-28 03:24:18 +00:00
Dylan M. Taylor e8f52cc07e refactor(print): define blit rectangles 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 33252920e3 refactor(denoise): model installation requests 2026-10-28 03:24:18 +00:00
Dylan M. Taylor de6cb3cd41 refactor(codecs): separate TIFF sample encoders 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 694b237f0a refactor(faces): model crop and plane shift inputs 2026-10-28 03:24:18 +00:00
Dylan M. Taylor a3da2d1040 refactor(denoise): model Bayer tile regions 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 2f42ff8944 refactor(pipeline): group pixel finish parameters 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 196a0c1a45 docs: require lint inheritance for new crates 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 2c7d98b5e2 refactor(raw): separate DNG metadata and opcode parsing 2026-10-28 03:24:18 +00:00
Dylan M. Taylor c1766c016b refactor(scenes): model water lighting parameters 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 38c3232214 refactor(meta): isolate descriptive metadata merging 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 32e4874569 docs: explain workspace lint inheritance 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 59083081ae fix(sysmem): inherit workspace Clippy denies 2026-10-28 03:24:18 +00:00