mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-24 18:07:07 -06:00
* file.saveACopy refuses the document's own file without "overwrite" (#7437) Save a Copy through the engine (control channel, MCP, serve, headless action playback) silently replaced the open document's own file when given its path, so a lossy re-encode could not be undone. It now returns BadParams when `path` is the active document's file (same text, ./ or .. spelling, hard link, case on Windows via same_file) unless the params pass "overwrite": true, and nothing is written. The desktop dialog writes through the shell after the OS confirms a replace, so it is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * same_file: compare file identity on Windows, so a hard link is the same file On Windows `same_file` compared canonical path strings, so a hard link to the input (another name for the same file) passed the new convert guard without --in-place. It now compares the volume serial number and file index (the `same-file` crate, already in the dependency tree; std's file_index is unstable), as unix compares dev and inode, falling back to the case-insensitive canonical path when a file won't open. The engine's same_file test now checks hard links on every platform. (Review on #7454.) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * saveACopy own-file test: hard link on every platform, doc state unchanged after a refusal Each refused copy (same path, ./ spelling, hard link) now also checks the document keeps its path, revision and unsaved state. The hard link is no longer unix-only: same_file compares file identity on Windows too. (Review on #7456.) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
63 lines
2.2 KiB
TOML
63 lines
2.2 KiB
TOML
[package]
|
|
name = "photocraft-engine"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[features]
|
|
# Real-file corpus tests (opt-in; `cargo xtask test-corpus`). Fail when the corpus is missing.
|
|
corpus = []
|
|
|
|
[dependencies]
|
|
photocraft-geom = { workspace = true }
|
|
photocraft-color = { workspace = true }
|
|
photocraft-cms = { workspace = true }
|
|
photocraft-raster = { workspace = true }
|
|
photocraft-doc = { workspace = true }
|
|
photocraft-ops = { workspace = true }
|
|
photocraft-compose = { workspace = true }
|
|
serde = { workspace = true }
|
|
serde_json = { workspace = true }
|
|
thiserror = { workspace = true }
|
|
rayon = { workspace = true }
|
|
photocraft-paint = { workspace = true }
|
|
photocraft-algo = { workspace = true }
|
|
photocraft-text = { workspace = true }
|
|
photocraft-vector = { workspace = true }
|
|
photocraft-io = { workspace = true }
|
|
photocraft-psd = { workspace = true }
|
|
photocraft-format = { workspace = true }
|
|
photocraft-plugins = { workspace = true }
|
|
blake3 = { version = "1.8", default-features = false, features = ["pure"] }
|
|
photocraft-codecs = { workspace = true }
|
|
flate2 = { workspace = true }
|
|
craft-print = { workspace = true }
|
|
|
|
# Photoshop `.kys` shortcut sets (`edit.keyboardShortcuts` `importKys`); already in the tree
|
|
# through photocraft-ui-egui and usvg.
|
|
roxmltree = "0.20"
|
|
|
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
|
tempfile = "3"
|
|
|
|
# `file_cmds::same_file` on Windows: the volume serial number and file index, so a hard link to a
|
|
# file is that file (std's `MetadataExt::file_index` is unstable).
|
|
[target.'cfg(windows)'.dependencies]
|
|
same-file = "1"
|
|
|
|
# Printing on Unix: an IPP client for CUPS (pure Rust); the web build cannot print.
|
|
[target.'cfg(all(not(target_arch = "wasm32"), not(target_os = "windows")))'.dependencies]
|
|
photocraft-ipp = { workspace = true }
|
|
|
|
[dev-dependencies]
|
|
photocraft-affinity = { workspace = true, features = ["synth"] }
|
|
# Synthetic camera raw files for the open tests.
|
|
photocraft-raw = { workspace = true, features = ["testgen"] }
|
|
# WebAssembly text -> binary for plug-in test modules (Apache-2.0 WITH LLVM-exception).
|
|
wat = "1.228"
|
|
# Synthetic multi-part EXR fixtures for the parts-commands tests.
|
|
exr = { version = "1.73", default-features = false }
|