Integration: #1924 a fresh re-import keeps its own stem sidecar

This commit is contained in:
aiongg
2026-10-21 14:55:45 +00:00
parent 4e581739bd
commit 047e9bb962
2 changed files with 23 additions and 1 deletions
+4 -1
View File
@@ -644,7 +644,9 @@ impl ImportStems {
pub(crate) fn for_import<'a>(cat: Option<&lightcraft_catalog::Catalog>, incoming: impl Iterator<Item = (&'a str, MediaKind)>) -> ImportStems {
// per stem: the best of the library's files, and the best arriving file with its path
let mut best: HashMap<String, (Option<Rank>, Option<(Rank, &'a str)>)> = HashMap::new();
let mut arriving_paths = HashSet::new();
for (arriving, (path, kind)) in incoming.enumerate() {
arriving_paths.insert(path);
let e = best.entry(stem_key(path)).or_default();
let rank = rank_of(path, kind, arriving as u64);
if e.1.as_ref().is_none_or(|(b, _)| rank < *b) {
@@ -654,7 +656,8 @@ impl ImportStems {
if let Some(cat) = cat {
let mut key = String::new();
for p in cat.photos().filter(|p| p.copy_of.is_none()) {
let Some(path) = file_path(p) else { continue };
// the arriving file's own record (a trashed photo imported again) is not a rival
let Some(path) = file_path(p).filter(|path| !arriving_paths.contains(*path)) else { continue };
stem_key_into(&mut key, path);
let Some(e) = best.get_mut(key.as_str()) else { continue };
let rank = rank_of(path, p.kind, p.id.0);
+19
View File
@@ -1132,6 +1132,25 @@ fn import_can_replace_a_duplicate_from_recently_deleted() {
let _ = std::fs::remove_dir_all(&src);
}
/// A trashed photo imported again as a new one owns its stem sidecar: its own old record is not a
/// rival for `a.xmp` (issue #1905's ranking), so the fresh photo reads it.
#[test]
fn a_fresh_reimport_reads_its_own_stem_sidecar() {
let (mut s, src, id) = trashed_photo("trash-fresh-sidecar");
std::fs::write(
src.join("a.xmp"),
r#"<x:xmpmeta xmlns:x="adobe:ns:meta/"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmp:Rating="3"/></rdf:RDF></x:xmpmeta>"#,
)
.unwrap();
let r = s.execute("library.import", &json!({"paths": [src.to_string_lossy()], "onDeleted": "fresh"})).unwrap();
assert_eq!(ids(&r, "imported"), 1, "{r}");
let new = r["imported"][0].as_u64().unwrap();
assert_ne!(new, id);
assert_eq!(s.catalog.photo(lightcraft_catalog::PhotoId(new)).unwrap().rating, 3, "the fresh photo reads a.xmp: {r}");
let _ = std::fs::remove_dir_all(&src);
}
#[test]
fn unknown_on_deleted_is_an_error() {
let mut s = Session::new().with_fs();