Commit Graph
3220 Commits
Author SHA1 Message Date
aiongg dbf4b2b428 Merge PR #2409: Drop non-finite elevation values in the GPX parser 2026-10-22 02:41:08 +00:00
aiongg 1e99e2e1d9 Merge PR #2386: The Windows x64 installer is verified on Windows 11
Conflicts:
- docs/gaps.md: header keeps both changes; revision rows are the union
- docs/target-app-parity.md: revision rows are the union
2026-10-22 02:41:08 +00:00
aiongg 6e7d733ab5 Merge PR #2309: Fix trailing dot in All Metadata rational formatter 2026-10-22 02:40:48 +00:00
aiongg aea654b59a Merge PR #2257: LR-META-XMP: fewer false "XMP adjustments were not imported" warnings for raws edited elsewhere
Conflicts:
- docs/parity-checklist.md: LR-META-XMP row carries both changes (JPEG embedded XMP, bookkeeping crs fields)
2026-10-22 02:40:48 +00:00
aiongg 9e80884add Merge PR #2106: docs: add Traditional Chinese (Taiwan) README 2026-10-22 02:40:30 +00:00
aiongg 5acc4dead6 Merge PR #2066: LR-BEHAV-LOCALIZE: German catalog filled, 217 interface strings and 862 What's New lines (80% → 97%)
Conflicts:
- docs/localization-parity.md: header keeps the newer date and both changes
2026-10-22 02:40:30 +00:00
aiongg 3ec8b08ad8 Merge PR #2042: LR-META-XMP: reread embedded JPEG metadata
Conflicts:
- crates/engine/src/sidecar.rs: imports keep HashSet and add Read, Seek, SeekFrom
- docs/parity-checklist.md: LR-META-XMP and LR-META-EXIF-FULL rows carry both changes (import stem ranking, JPEG embedded XMP)
- docs/xmp-interop.md: Read row carries both changes
2026-10-22 02:40:19 +00:00
aiongg 29565bbad0 Merge PR #1861: LR-EXP-DIM: Width & Height limits each edge to its own number (#1620)
Conflicts:
- docs/parity-checklist.md: header keeps the newer date; revision rows are the union
2026-10-22 02:39:44 +00:00
aiongg 5cd029a40c Merge PR #1628: #1617: placeholder GPS block (NUL refs, 0/0 rationals) reads as no location 2026-10-22 02:39:34 +00:00
aiongg f460cbd90c Merge PR #2449: Settings and Edit ▸ Language: list the languages alphabetically by their own name
Conflicts:
- crates/ui-egui/src/menus.rs: LANGUAGE_COMMANDS lists every language, including sv, fi, id and vi, in Locale::for_picker order
2026-10-22 02:39:29 +00:00
aiongg 5aab69a059 Integration: #1484 report Vietnamese coverage gaps, list vi in the keyword-label test, attribute the vi catalogs
The vi coverage test reports missing catalog messages and display labels instead of
failing on them, like the Italian and Finnish tests; the English-fallback check stays.
2026-10-22 02:38:50 +00:00
aiongg 05f31758fd Merge PR #1484: Add Vietnamese interface translation
Conflicts:
- crates/ui-egui/src/i18n.rs, crates/ui-egui/src/menus.rs: language table and commands keep every language plus vi
- docs/localization.md: language list, note links and table excerpt keep every language plus vi
- docs/localization-parity.md: header keeps the newer date and both changes; the newer per-language measurements are kept, Vietnamese row from the PR; links and revision rows are the union
2026-10-22 02:38:28 +00:00
aiongg 0068d9040b Merge PR #2295: i18n: Indonesian (id) interface language
Conflicts:
- crates/ui-egui/src/i18n.rs, crates/ui-egui/src/menus.rs: language table and commands keep sv, fi and id
- crates/ui-egui/src/panels/keyword_list.rs: code list gains id; Locale::ALL.len() is 17
- docs/localization.md: language list and note links keep every language
- docs/localization-parity.md: header keeps the newer date and both changes; links and revision rows are the union
2026-10-22 02:37:53 +00:00
aiongg d8b2eb60d3 Merge PR #2172: i18n: add Finnish (fi) interface language
Conflicts:
- README.md, docs/localization.md: language lists keep every language, Finnish appended
- assets/ATTRIBUTION.md: union of rows
- crates/ui-egui/src/i18n.rs, crates/ui-egui/src/menus.rs: language table and commands keep sv and fi
- crates/ui-egui/src/panels/keyword_list.rs: code list gains fi; Locale::ALL.len() is 16
- docs/localization-parity.md: header keeps the newer date and both changes; revision rows are the union
2026-10-22 02:37:29 +00:00
aiongg 4764767694 Merge PR #1855: i18n: Swedish (sv) interface translation
Conflicts:
- README.md, docs/localization.md: language lists keep every language, Swedish appended
- assets/ATTRIBUTION.md: union of rows
- crates/ui-egui/src/i18n.rs: language table and command test list keep it, ka and sv; both tests kept
- crates/ui-egui/src/menus.rs: language commands keep it, ka and sv
- crates/ui-egui/src/panels/keyword_list.rs: code list gains sv; Locale::ALL.len() is 15
2026-10-22 02:37:05 +00:00
Dylan M. Taylor bfb23db2ca Use chrono instead of hand-rolled UTC conversion (#2457)
* Use chrono for UTC/calendar conversion instead of hand-rolled copies

Replaces the hand-rolled Howard Hinnant civil/days-from-civil copies and the
leap-year/days-in-month table with chrono as a workspace dependency:
- apps/lightcraft/src/logging.rs: timestamp (log line time)
- crates/catalog/src/dates.rs: civil + weekday
- crates/catalog/src/stacks.rs: iso_seconds (date -> seconds)
- crates/engine/src/cmd/face_recognize.rs: capture_secs (native only)
- crates/meta/src/datetime.rs: DateTime::unix_seconds and the valid() day check
Output formats and semantics are unchanged (pre-epoch clamp, day rollover that
normalize_iso relies on, leap-second tolerance, EXIF/XMP parsing). chrono uses
only std, so wasm stays safe. AGENTS.md/CLAUDE.md now say time goes through chrono.

Follow-up to storytold/cadcraft#1785

* Never panic on a clock outside chrono's range; keep 5-digit years unprefixed

chrono's From<SystemTime> unwraps, so a clock past year 262143 panicked
inside the logger. timestamp now uses the fallible DateTime::from_timestamp
and reads such a clock as the epoch, keeping the old pre-epoch clamp.

timestamp and catalog's civil write years past 9999 with {:04} like the old
{y:04} did, because %Y would add a '+'. Tests cover the out-of-range and
5-digit-year cases.

* Don't build an unrepresentable SystemTime in the far-future test

UNIX_EPOCH + Duration::from_secs(u64::MAX / 2) overflows Windows'
SystemTime and panicked before timestamp() ran, failing the Windows
test job. Build it with checked_add and only assert where it exists.

* time: preserve old out-of-range date conversion (no epoch fallback)

`DateTime::from_timestamp(...).unwrap_or_default()` silently reset any instant
past chrono's year range to 1970-01-01, changing output the old hand-rolled
Howard-Hinnant code converted exactly (e.g. 10_000_000_000_000 s was
318857-05-20 17:46:40, not the epoch). Restore the old conversion domain with a
cycle-based helper that routes the calendar through chrono (the calendar
repeats every 400 years = 146_097 days, so month/day/time come from chrono and
only the year is carried in i128, keeping every i64 exact).

- apps/lightcraft/src/logging.rs: `timestamp` via `utc_parts`; keep the
  pre-1970 epoch clamp; u64 secs past i64::MAX saturate, not epoch.
- crates/catalog/src/dates.rs: `civil` cycle-based (the callers stay inside
  0000-9999, but a far clock no longer resets to the epoch).

Pinned old outputs in tests:
  logging u64::MAX/2 s -> 292277026596-12-04T15:30:07.000Z (was epoch),
          10_000_000_000_000 s -> 318857-05-20T17:46:40.000Z
  civil 10_000_000_000_000 -> 318857-05-20T17:46:40,
        -10_000_000_000_000 -> -314918-08-13T06:13:20, i64 extremes

* Don't build a year-318857 SystemTime unchecked in the logging test

Windows' SystemTime only reaches about year 30828, so
UNIX_EPOCH + Duration::from_secs(10_000_000_000_000) panicked before
timestamp() ran and failed the Windows test job. Build it with
checked_add and assert where the platform can hold it. The year-10000
case fits everywhere and stays unconditional.

* Name the 400-year range extension as the one exception to the time rule

The rule said never to hand-roll calendar math, but the range fix
(shifting by whole 400-year Gregorian cycles so dates past chrono's year
range keep their old output) is cycle arithmetic, so the rule and the code
disagreed. The rule now names that exception: the library still computes
month, day and time, and only whole cycles are carried in the year.

* Say the library computes month and day; time-of-day is plain arithmetic

Narrows the range-extension wording: the date library computes the
calendar fields, and splitting seconds into hours, minutes and seconds
is ordinary arithmetic, which is what the code does.
2026-10-21 19:36:36 -04:00
Dylan M. Taylor d79b1f33e3 security: enforce HTTPS on curl downloads (SonarCloud S6506) (#2493)
Add --proto '=https' to curl invocations so redirects cannot downgrade to
plaintext HTTP. Resolves SonarCloud S6506 (shell/docker/githubactions).
2026-10-21 19:35:59 -04:00
Dylan M. Taylor 3dc3b955df ci: add sonar-project.properties for CI-based analysis
Marks the project ineligible for SonarCloud Automatic Analysis, resolving the
CI-vs-automatic-analysis conflict so the SonarCloud workflow succeeds.
2026-10-21 16:00:43 -04:00
Dylan M. Taylor 511908ab06 ci: add SonarCloud scan via shared reusable workflow
Calls storytold/craft-common-actions/.github/workflows/sonarcloud.yml@main
with secrets: inherit. Adds SonarCloud badge to README where missing and
removes the redundant sonar-project.properties (config now passed by the
reusable workflow).
2026-10-21 15:47:01 -04:00
Brandon Thomas ec0cda9a6f Merge pull request #2486 from storytold/release-0.11.0
Release 0.11.0
v0.11.0
2026-10-21 14:05:52 -04:00
Brandon ThomasandClaude Opus 5.5 79d916c149 Release 0.11.0
The web release now builds with craft-fonts too (web-craft-fonts), as VectorCraft's
does, so the published web app ships the Chinese and Japanese faces docs/releasing.md
promises.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 14:05:43 -04:00
Matthew James SivakandClaude Opus 5.5 85ceee31a7 Merge main into import-crs-false-warnings (conflicts resolved)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:57:58 +02:00
aiongg e142e2ffa4 Merge PR #2470: integration of 43 reviewed PRs (round 1) 2026-10-21 12:59:32 -04:00
aiongg 22ae8bc9a8 Integration: #2280 drop a clone of the Copy crop in its test 2026-10-21 15:04:38 +00:00
aiongg 21903294bf Merge track r1-rawcat into next
crates/ui-egui/locales/{cs,it,pl}-formats.json: kept the translations and added the track's new keys.
docs/parity-checklist.md: newer header line; revision rows from both sides.
docs/whats-new.md: both tracks' 2026-10-15 entries.
2026-10-21 14:58:55 +00:00
aiongg 69fcc25535 Revert "Merge PR #995: LR-VIEW-CLIPPING: ⌥-drag previews for Blacks, Whites, Exposure, Sharpening and NR (#937)"
Held for the owner: #995 and #999 overlap, and #995's author offered on 10-12 to
close #995 once his commit was in #999. docs/parity-checklist.md: header keeps the
#1485 note and drops the #995 part.
2026-10-21 14:56:17 +00:00
aiongg a1455fa7cd Merge PR #1988: #1507: web start-up treats only NotFoundError as a missing file
apps/lightcraft-web/src/files.rs: keeps #1987's and #1988's tests
docs/whats-new.md: keeps both 2026-10-15 entries
2026-10-21 14:56:12 +00:00
aiongg e9e44643a5 Revert "Integration: #995 time drag drafts only while the GPU draws the view"
This reverts commit 5aa5c6681f.
2026-10-21 14:55:59 +00:00
aiongg 697d201e97 Merge PR #1987: #1508: web backup refuses to start while changes are unsaved 2026-10-21 14:55:55 +00:00
aiongg 047e9bb962 Integration: #1924 a fresh re-import keeps its own stem sidecar 2026-10-21 14:55:45 +00:00
aiongg 5443225c3c Merge track r1-i18nci into next 2026-10-21 14:54:41 +00:00
aiongg 4e581739bd Merge PR #1924: Do not read a sibling's shared stem sidecar on import (#1905)
docs/parity-checklist.md: header keeps the newer 2026-10-18 change
2026-10-21 14:54:19 +00:00
aiongg 523894b00b Merge PR #1998: LR-BEHAV-BG-TASKS: Reload from Disk reads its files in the background
docs/parity-checklist.md: header names #1998's change
2026-10-21 14:54:08 +00:00
aiongg a44a2eeb1d Merge track r1-ui into next
docs/whats-new.md: kept both tracks' entries, newest first, one 2026-10-18 heading.
2026-10-21 14:54:06 +00:00
aiongg c1c9f94094 Merge PR #842: Read large Lightroom catalogs by page
crates/engine/src/lightroom_catalog.rs: test helpers chained; native_catalog_rows takes #842's last_page argument, native_catalog_with_last_table_page builds on it
docs/parity-checklist.md: LRC-LIB-CATALOG-IMPORT keeps both texts
2026-10-21 14:53:52 +00:00
aiongg 73ac15ddaf Merge PR #2181: web: Auto language follows the browser's languages (#2085)
#2089 proposed the same fix for #2085 earlier.
2026-10-21 14:53:26 +00:00
aiongg 06a5c2edb7 Merge PR #2244: fonts: Georgian UI text from craft-fonts' Noto Sans Georgian (release builds) 2026-10-21 14:53:17 +00:00
aiongg 80a7b8bba8 Merge PR #2230: Lightroom import: skip images whose file record is missing instead of failing 2026-10-21 14:53:06 +00:00
aiongg 25feff7182 Merge PR #2294: Write ISOSpeed extension tag for ISO above 65534 in write_exif 2026-10-21 14:53:02 +00:00
aiongg 83ac0bca70 Merge PR #1923: LR-IMP-FORMATS: CRX high-frequency band width from the tile geometry … 2026-10-21 14:53:02 +00:00
aionggandEmpressAthleticus 4cf0b3472e Integration: #2003 decode test for real lossy tiles (from #1994)
Co-authored-by: EmpressAthleticus <153782305+EmpressAthleticus@users.noreply.github.com>
2026-10-21 14:52:59 +00:00
aiongg 47be297b69 Merge PR #2258: i18n(cs): bring the Czech catalog up to date 2026-10-21 14:52:57 +00:00
aiongg 3ac7034ef5 Merge PR #2238: LR-BEHAV-LOCALIZE: translate AI Denoise progress and face-model hints into zh-hans 2026-10-21 14:52:57 +00:00
aiongg 8424779044 Merge PR #1869: i18n(pl): menu command names, the formats left in English, and Vibrance as Jaskrawość 2026-10-21 14:52:57 +00:00
aiongg aee07a0376 Merge PR #1871: i18n(it): native-speaker corrections and every interface string translated 2026-10-21 14:52:57 +00:00
aiongg 452f317d38 Merge PR #1993: macOS bundle: drop Info.plist types LightCraft cannot open (#1951) 2026-10-21 14:52:57 +00:00
aiongg e68a0e753d Merge PR #2334: the slideshow-template cache fix and contributor entry only
Its store.rs, tests_export.rs and tests_folder_drop.rs hunks are covered by #1975 and #1967; resolved to the merged version.
2026-10-21 14:52:57 +00:00
aiongg 598a6ecb9b Merge PR #2004: the tests_offline bounded wait only
Its tests_export.rs and tests_folder_drop.rs hunks are covered by #1975 and #1967; resolved to the merged version.
2026-10-21 14:52:48 +00:00
aiongg 142eca0970 Merge PR #1975: Tests: fix the 11 Windows-only test failures on main 2026-10-21 14:52:38 +00:00
aiongg 6e893fdaa3 Merge PR #1967: CI: catalog's staging-link test module compiles only on Unix (fixes clippy -D warnings on Windows) 2026-10-21 14:52:38 +00:00