From f54fdef099c5e7ae8094579dfc70489d20620835 Mon Sep 17 00:00:00 2001 From: Nik Revenco <154856872+NikitaRevenco@users.noreply.github.com> Date: Tue, 25 Mar 2025 11:46:36 +0000 Subject: [PATCH] refactor: remove extra layer of sync --- helix-term/src/handlers/blame.rs | 30 ++++++------------------------ helix-vcs/src/git/blame.rs | 8 ++++---- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/helix-term/src/handlers/blame.rs b/helix-term/src/handlers/blame.rs index 93fdf4e3d..218db731e 100644 --- a/helix-term/src/handlers/blame.rs +++ b/helix-term/src/handlers/blame.rs @@ -1,4 +1,4 @@ -use std::time::Duration; +use std::{mem, time::Duration}; use helix_event::register_hook; use helix_vcs::FileBlame; @@ -8,13 +8,13 @@ use helix_view::{ handlers::{BlameEvent, Handlers}, DocumentId, }; -use tokio::{sync::oneshot, time::Instant}; +use tokio::time::Instant; use crate::job; #[derive(Default)] pub struct BlameHandler { - worker: Option>>, + file_blame: Option>, doc_id: DocumentId, show_blame_for_line_in_statusline: Option, } @@ -27,36 +27,18 @@ impl helix_event::AsyncHook for BlameHandler { event: Self::Event, _timeout: Option, ) -> Option { - if let Some(worker) = &mut self.worker { - if worker.try_recv().is_ok() { - self.finish_debounce(); - return None; - } - } - self.doc_id = event.doc_id; self.show_blame_for_line_in_statusline = event.line; - let (tx, rx) = oneshot::channel(); - - tokio::spawn(async move { - let result = FileBlame::try_new(event.path); - let _ = tx.send(result); - }); - - self.worker = Some(rx); - + self.file_blame = Some(FileBlame::try_new(event.path)); Some(Instant::now() + Duration::from_millis(50)) } fn finish_debounce(&mut self) { let doc_id = self.doc_id; let line_blame = self.show_blame_for_line_in_statusline; - if let Some(worker) = self.worker.take() { + let result = mem::take(&mut self.file_blame); + if let Some(result) = result { tokio::spawn(async move { - let Ok(result) = worker.await else { - return; - }; - job::dispatch(move |editor, _| { let Some(doc) = editor.document_mut(doc_id) else { return; diff --git a/helix-vcs/src/git/blame.rs b/helix-vcs/src/git/blame.rs index 27887716d..0b83bd1d8 100644 --- a/helix-vcs/src/git/blame.rs +++ b/helix-vcs/src/git/blame.rs @@ -1,6 +1,6 @@ use anyhow::Context as _; use anyhow::Result; -use std::cell::RefCell; +use parking_lot::Mutex; use std::collections::HashMap; use std::path::PathBuf; @@ -24,7 +24,7 @@ enum LineBlameUnit { #[derive(Debug)] pub struct FileBlame { /// A map from line numbers to blame for that line - blame: RefCell>, + blame: Mutex>, /// The owning repository for this file's `ObjectId`s repo: gix::ThreadSafeRepository, } @@ -47,7 +47,7 @@ impl FileBlame { let blame_line = line.saturating_sub(inserted_lines) + removed_lines; let repo = self.repo.to_thread_local(); - let mut blame = self.blame.borrow_mut(); + let mut blame = self.blame.lock(); let line_blame_unit = blame.get_mut(&blame_line); let commit = match line_blame_unit { @@ -120,7 +120,7 @@ impl FileBlame { .entries; Ok(Self { - blame: RefCell::new( + blame: Mutex::new( file_blame .into_iter() .flat_map(|blame| {