fix: upserting operation should handle deleting in edge cases where the source and target URNs are different (#1737)

This commit is contained in:
三咲雅 · Misaki Masa 2024-10-06 13:04:52 +08:00 committed by GitHub
parent 87b159fb9d
commit dcbe7873cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 9 additions and 6 deletions

View File

@ -301,6 +301,10 @@ impl Files {
return;
}
self.update_deleting(
files.iter().filter(|&(u, f)| u != f.urn()).map(|(_, f)| f.urn_owned()).collect(),
);
let (hidden, items) = self.update_updating(files);
if hidden.is_empty() && items.is_empty() {
return;

View File

@ -48,15 +48,14 @@ impl FilesOp {
}
pub fn rename(map: HashMap<Url, File>) {
let mut parents = HashMap::new();
let mut parents: HashMap<_, (HashSet<_>, HashMap<_, _>)> = Default::default();
for (o, n) in map {
let Some(o_p) = o.parent_url() else { continue };
if o == n.url {
parents.entry(o_p).or_insert((HashSet::new(), HashMap::new())).1.insert(o.urn_owned(), n);
} else if let Some(n_p) = n.url.parent_url() {
parents.entry(o_p).or_insert((HashSet::new(), HashMap::new())).0.insert(o.urn_owned());
parents.entry(n_p).or_insert((HashSet::new(), HashMap::new())).1.insert(n.urn_owned(), n);
let Some(n_p) = n.url.parent_url() else { continue };
if o_p != n_p {
parents.entry(o_p).or_default().0.insert(o.urn_owned());
}
parents.entry(n_p).or_default().1.insert(n.urn_owned(), n);
}
for (p, (o, n)) in parents {
match (o.is_empty(), n.is_empty()) {