Avoid saving buffer if it's neither dirty nor in conflict

However, keep emitting `Saved` events so that the language server
is notified and can perform tasks related to saving (e.g., running
`cargo check` in the case of rust-analyzer).
This commit is contained in:
Antonio Scandurra 2023-03-08 17:02:12 +01:00
parent a435dc1339
commit b687aec9d9

View file

@ -1434,7 +1434,19 @@ impl Project {
let worktree = file.worktree.clone();
let path = file.path.clone();
worktree.update(cx, |worktree, cx| match worktree {
Worktree::Local(worktree) => worktree.save_buffer(buffer, path, false, cx),
Worktree::Local(worktree) => {
if buffer.read(cx).is_dirty() || buffer.read(cx).has_conflict() {
worktree.save_buffer(buffer, path, false, cx)
} else {
buffer.update(cx, |buffer, cx| {
let version = buffer.saved_version().clone();
let fingerprint = buffer.saved_version_fingerprint();
let mtime = buffer.saved_mtime();
buffer.did_save(version.clone(), fingerprint, mtime, cx);
Task::ready(Ok((version, fingerprint, mtime)))
})
}
}
Worktree::Remote(worktree) => worktree.save_buffer(buffer, cx),
})
}