summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Oram <dev@mitmaro.ca>2022-02-27 13:13:17 -0330
committerTim Oram <dev@mitmaro.ca>2022-02-27 13:35:21 -0330
commit14eab798222fa7602274c9cd0bfd1f396efd0988 (patch)
treecfa630dc412163eb290b87f180505f5e31631bc9
parent3d508664b8fae035f3e126902213c4415a1ae828 (diff)
Make core modules Send
-rw-r--r--Cargo.lock1
-rw-r--r--src/core/Cargo.toml1
-rw-r--r--src/core/src/git.rs22
-rw-r--r--src/core/src/lib.rs1
-rw-r--r--src/core/src/module/mod.rs2
-rw-r--r--src/core/src/module/modules.rs45
-rw-r--r--src/core/src/modules/show_commit/mod.rs17
-rw-r--r--src/core/src/modules/show_commit/tests.rs82
-rw-r--r--src/core/src/process/tests.rs8
-rw-r--r--src/core/src/run.rs8
-rw-r--r--src/core/src/tests.rs11
-rw-r--r--src/core/src/testutil/test_module.rs28
12 files changed, 136 insertions, 90 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 0c522db..781eeb0 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -191,6 +191,7 @@ dependencies = [
"girt-view",
"lazy_static",
"num-format",
+ "parking_lot 0.12.0",
"pico-args",
"rstest 0.12.0",
"rustc_version",
diff --git a/src/core/Cargo.toml b/src/core/Cargo.toml
index 1d43ff2..ac7b8d8 100644
--- a/src/core/Cargo.toml
+++ b/src/core/Cargo.toml
@@ -19,6 +19,7 @@ anyhow = "1.0.53"
captur = "0.1.0"
lazy_static = "1.4.0"
num-format = "0.4.0"
+parking_lot = "0.12.0"
pico-args = "0.4.2"
unicode-segmentation = "1.9.0"
girt-config = {version = "1.0.0", path = "../../src/config"}
diff --git a/src/core/src/git.rs b/src/core/src/git.rs
new file mode 100644
index 0000000..315258f
--- /dev/null
+++ b/src/core/src/git.rs
@@ -0,0 +1,22 @@
+use std::sync::Arc;
+
+use anyhow::Result;
+use git::{CommitDiff, CommitDiffLoaderOptions, Repository};
+use parking_lot::Mutex;
+
+#[derive(Debug, Clone)]
+pub(crate) struct Git {
+ repository: Arc<Mutex<Repository>>,
+}
+
+impl Git {
+ pub(crate) fn new(repository: Repository) -> Self {
+ Self {
+ repository: Arc::new(Mutex::new(repository)),
+ }
+ }
+
+ pub(crate) fn load_commit_diff(&self, hash: &str, config: &CommitDiffLoaderOptions) -> Result<CommitDiff> {
+ self.repository.lock().load_commit_diff(hash, config)
+ }
+}
diff --git a/src/core/src/lib.rs b/src/core/src/lib.rs
index df5e811..e08c650 100644
--- a/src/core/src/lib.rs
+++ b/src/core/src/lib.rs
@@ -84,6 +84,7 @@
mod arguments;
mod components;
mod exit;
+mod git;
mod help;
mod license;
mod module;
diff --git a/src/core/src/module/mod.rs b/src/core/src/module/mod.rs
index 9a247ba..189d4c8 100644
--- a/src/core/src/module/mod.rs
+++ b/src/core/src/module/mod.rs
@@ -15,7 +15,7 @@ lazy_static! {
static ref DEFAULT_INPUT_OPTIONS: InputOptions = InputOptions::RESIZE;
}
-pub(crate) trait Module {
+pub(crate) trait Module: Send {
fn activate(&mut self, _rebase_todo: &TodoFile, _previous_state: State) -> ProcessResult {
ProcessResult::new()
}
diff --git a/src/core/src/module/modules.rs b/src/core/src/module/modules.rs
index 03d9e37..fecff27 100644
--- a/src/core/src/module/modules.rs
+++ b/src/core/src/module/modules.rs
@@ -78,50 +78,56 @@ impl<'m> Modules<'m> {
#[cfg(test)]
mod tests {
- use std::{cell::RefCell, rc::Rc};
+ use std::sync::Arc;
use anyhow::{anyhow, Error};
use input::{Event, MetaEvent};
+ use parking_lot::Mutex;
use super::*;
use crate::testutil::module_test;
+ #[derive(Debug, Clone)]
struct TestModule {
- view_data: ViewData,
- trace: Rc<RefCell<Vec<String>>>,
+ view_data: Arc<ViewData>,
+ trace: Arc<Mutex<Vec<String>>>,
}
impl TestModule {
- fn new(trace: Rc<RefCell<Vec<String>>>) -> Self {
+ fn new() -> Self {
Self {
- view_data: ViewData::new(|_| {}),
- trace,
+ view_data: Arc::new(ViewData::new(|_| {})),
+ trace: Arc::new(Mutex::new(vec![])),
}
}
+
+ fn trace(&self) -> String {
+ self.trace.lock().join(",")
+ }
}
impl Module for TestModule {
fn activate(&mut self, _rebase_todo: &TodoFile, _previous_state: State) -> ProcessResult {
- self.trace.borrow_mut().push(String::from("Activate"));
+ self.trace.lock().push(String::from("Activate"));
ProcessResult::new()
}
fn deactivate(&mut self) {
- self.trace.borrow_mut().push(String::from("Deactivate"));
+ self.trace.lock().push(String::from("Deactivate"));
}
fn build_view_data(&mut self, _render_context: &RenderContext, _rebase_todo: &TodoFile) -> &ViewData {
- self.trace.borrow_mut().push(String::from("Build View Data"));
+ self.trace.lock().push(String::from("Build View Data"));
&self.view_data
}
fn handle_event(&mut self, _: Event, _: &ViewSender, _: &mut TodoFile) -> ProcessResult {
- self.trace.borrow_mut().push(String::from("Handle Events"));
+ self.trace.lock().push(String::from("Handle Events"));
ProcessResult::new()
}
fn handle_error(&mut self, error: &Error) {
- self.trace.borrow_mut().push(error.to_string());
+ self.trace.lock().push(error.to_string());
}
}
@@ -129,9 +135,8 @@ mod tests {
fn module_lifecycle() {
module_test(&["pick aaa comment"], &[Event::Meta(MetaEvent::Exit)], |mut context| {
let mut modules = Modules::new(context.event_handler_context.event_handler);
- let trace = Rc::new(RefCell::new(Vec::new()));
- let test_module = TestModule::new(Rc::clone(&trace));
- modules.register_module(State::List, test_module);
+ let test_module = TestModule::new();
+ modules.register_module(State::List, test_module.clone());
let _ = modules.activate(State::List, &context.rebase_todo_file, State::Insert);
let _ = modules.handle_event(
@@ -142,10 +147,7 @@ mod tests {
);
let _ = modules.build_view_data(State::List, &RenderContext::new(100, 100), &context.rebase_todo_file);
modules.deactivate(State::List);
- assert_eq!(
- (*trace).borrow().join(","),
- "Activate,Handle Events,Build View Data,Deactivate"
- );
+ assert_eq!(test_module.trace(), "Activate,Handle Events,Build View Data,Deactivate");
});
}
@@ -153,11 +155,10 @@ mod tests {
fn error() {
module_test(&["pick aaa comment"], &[Event::Meta(MetaEvent::Exit)], |context| {
let mut modules = Modules::new(context.event_handler_context.event_handler);
- let trace = Rc::new(RefCell::new(Vec::new()));
- let test_module = TestModule::new(Rc::clone(&trace));
- modules.register_module(State::Error, test_module);
+ let test_module = TestModule::new();
+ modules.register_module(State::Error, test_module.clone());
modules.error(State::Error, &anyhow!("Test Error"));
- assert_eq!((*trace).borrow().join(","), "Test Error");
+ assert_eq!(test_module.trace(), "Test Error");
});
}
}
diff --git a/src/core/src/modules/show_commit/mod.rs b/src/core/src/modules/show_commit/mod.rs
index 1b2086d..6380357 100644
--- a/src/core/src/modules/show_commit/mod.rs
+++ b/src/core/src/modules/show_commit/mod.rs
@@ -8,7 +8,7 @@ mod tests;
use anyhow::anyhow;
use captur::capture;
use config::{Config, DiffIgnoreWhitespaceSetting, DiffShowWhitespaceSetting};
-use git::{CommitDiff, CommitDiffLoaderOptions, Repository};
+use git::{CommitDiff, CommitDiffLoaderOptions};
use input::{Event, InputOptions, KeyBindings, MetaEvent};
use lazy_static::lazy_static;
use todo_file::TodoFile;
@@ -21,6 +21,7 @@ use self::{
};
use crate::{
components::help::{Help, INPUT_OPTIONS as HELP_INPUT_OPTIONS},
+ git::Git,
module::{Module, ProcessResult, State},
};
@@ -28,18 +29,18 @@ lazy_static! {
static ref INPUT_OPTIONS: InputOptions = InputOptions::UNDO_REDO | InputOptions::MOVEMENT | InputOptions::HELP;
}
-pub(crate) struct ShowCommit<'s> {
+pub(crate) struct ShowCommit {
commit_diff_loader_options: CommitDiffLoaderOptions,
diff: Option<CommitDiff>,
diff_view_data: ViewData,
help: Help,
overview_view_data: ViewData,
- repository: &'s Repository,
+ git: Git,
state: ShowCommitState,
view_builder: ViewBuilder,
}
-impl Module for ShowCommit<'_> {
+impl Module for ShowCommit {
fn activate(&mut self, rebase_todo: &TodoFile, _: State) -> ProcessResult {
if let Some(selected_line) = rebase_todo.get_selected_line() {
// skip loading commit data if the currently loaded commit has not changed, this retains
@@ -60,7 +61,7 @@ impl Module for ShowCommit<'_> {
});
let new_diff = self
- .repository
+ .git
.load_commit_diff(selected_line.get_hash(), &self.commit_diff_loader_options);
match new_diff {
@@ -172,8 +173,8 @@ impl Module for ShowCommit<'_> {
}
}
-impl<'s> ShowCommit<'s> {
- pub(crate) fn new(config: &Config, repository: &'s Repository) -> Self {
+impl ShowCommit {
+ pub(crate) fn new(config: &Config, git: Git) -> Self {
let overview_view_data = ViewData::new(|updater| {
updater.set_show_title(true);
updater.set_show_help(true);
@@ -208,7 +209,7 @@ impl<'s> ShowCommit<'s> {
overview_view_data,
state: ShowCommitState::Overview,
view_builder: ViewBuilder::new(view_builder_options),
- repository,
+ git,
}
}
}
diff --git a/src/core/src/modules/show_commit/tests.rs b/src/core/src/modules/show_commit/tests.rs
index 37f3c57..4446d5d 100644
--- a/src/core/src/modules/show_commit/tests.rs
+++ b/src/core/src/modules/show_commit/tests.rs
@@ -20,7 +20,7 @@ fn load_commit_during_activate() {
let oid = head_id(&repo, "main");
let line = format!("pick {} comment1", oid.to_string());
module_test(&[line.as_str()], &[], |test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
assert_process_result!(test_context.activate(&mut module, State::List));
assert!(module.diff.is_some());
});
@@ -34,7 +34,7 @@ fn cached_commit_in_activate() {
let oid = head_id(&repo, "main");
let line = format!("pick {} comment1", oid.to_string());
module_test(&[line.as_str()], &[], |test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
// would be nice to be able to test that a second call to load_commit_diff did not happen here
assert_process_result!(test_context.activate(&mut module, State::List));
assert_process_result!(test_context.activate(&mut module, State::List));
@@ -47,7 +47,7 @@ fn cached_commit_in_activate() {
fn no_selected_line_in_activate() {
with_temp_repository(|repo| {
module_test(&[], &[], |test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
assert_process_result!(
test_context.activate(&mut module, State::List),
state = State::List,
@@ -62,7 +62,7 @@ fn no_selected_line_in_activate() {
fn activate_error() {
with_temp_repository(|repo| {
module_test(&["pick aaaaaaaaaa comment1"], &[], |test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
assert_process_result!(
test_context.activate(&mut module, State::List),
state = State::List,
@@ -85,7 +85,7 @@ fn render_overview_minimal_commit() {
let commit = CommitBuilder::new("0123456789abcdef0123456789abcdef").build();
let commit_date = commit.committed_date().format("%c %z").to_string();
let diff = CommitDiffBuilder::new(commit).build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -115,7 +115,7 @@ fn render_overview_minimal_commit_compact() {
let commit = CommitBuilder::new("0123456789abcdef0123456789abcdef").build();
let commit_date = commit.committed_date().format("%c %z").to_string();
let diff = CommitDiffBuilder::new(commit).build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -146,7 +146,7 @@ fn render_overview_with_author() {
.build(),
)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -174,7 +174,7 @@ fn render_overview_with_author_compact() {
.build(),
)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -201,7 +201,7 @@ fn render_overview_with_committer() {
.build(),
)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -229,7 +229,7 @@ fn render_overview_with_committer_compact() {
.build(),
)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -256,7 +256,7 @@ fn render_overview_with_commit_summary() {
.build(),
)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -283,7 +283,7 @@ fn render_overview_with_commit_body() {
.build(),
)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -311,7 +311,7 @@ fn render_overview_with_commit_summary_and_body() {
.build(),
)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -374,7 +374,7 @@ fn render_overview_with_file_stats() {
.build(),
])
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -443,7 +443,7 @@ fn render_overview_with_file_stats_compact() {
.build(),
])
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -473,7 +473,7 @@ fn render_overview_single_file_changed() {
let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789abcdef0123456789abcdef").build())
.number_files_changed(1)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -497,7 +497,7 @@ fn render_overview_more_than_one_file_changed() {
let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789abcdef0123456789abcdef").build())
.number_files_changed(2)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -522,7 +522,7 @@ fn render_overview_single_insertion() {
let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789abcdef0123456789abcdef").build())
.number_insertions(1)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -547,7 +547,7 @@ fn render_overview_more_than_one_insertion() {
let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789abcdef0123456789abcdef").build())
.number_insertions(2)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -572,7 +572,7 @@ fn render_overview_single_deletion() {
let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789abcdef0123456789abcdef").build())
.number_deletions(1)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -597,7 +597,7 @@ fn render_overview_more_than_one_deletion() {
let diff = CommitDiffBuilder::new(CommitBuilder::new("0123456789abcdef0123456789abcdef").build())
.number_deletions(2)
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -623,7 +623,7 @@ fn render_diff_minimal_commit() {
config.diff_show_whitespace = DiffShowWhitespaceSetting::None;
let diff =
CommitDiffBuilder::new(CommitBuilder::new("0123456789abcdef0123456789abcdef").build()).build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -654,7 +654,7 @@ fn render_diff_minimal_commit_compact() {
config.diff_show_whitespace = DiffShowWhitespaceSetting::None;
let diff =
CommitDiffBuilder::new(CommitBuilder::new("0123456789abcdef0123456789abcdef").build()).build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -719,7 +719,7 @@ fn render_diff_basic_file_stats() {
.build(),
])
.build();
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -770,7 +770,7 @@ fn render_diff_end_new_line_missing() {
.push_delta(delta)
.build()])
.build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -813,7 +813,7 @@ fn render_diff_add_line() {
.push_delta(delta)
.build()])
.build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -855,7 +855,7 @@ fn render_diff_delete_line() {
.push_delta(delta)
.build()])
.build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -900,7 +900,7 @@ fn render_diff_context_add_remove_lines() {
.push_delta(delta)
.build()])
.build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -968,7 +968,7 @@ fn render_diff_show_both_whitespace() {
.push_delta(generate_white_space_delta())
.build()])
.build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -1008,7 +1008,7 @@ fn render_diff_show_leading_whitespace() {
.push_delta(generate_white_space_delta())
.build()])
.build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -1048,7 +1048,7 @@ fn render_diff_show_no_whitespace() {
.push_delta(generate_white_space_delta())
.build()])
.build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -1090,7 +1090,7 @@ fn render_diff_show_whitespace_all_spaces() {
.push_delta(delta)
.build()])
.build();
- let mut module = ShowCommit::new(&config, &repo);
+ let mut module = ShowCommit::new(&config, Git::new(repo));
module.diff = Some(diff);
module.state = ShowCommitState::Diff;
assert_rendered_output!(
@@ -1111,7 +1111,7 @@ fn handle_event_toggle_diff_to_overview() {
&["pick 0123456789abcdef0123456789abcdef c1"],
&[Event::from(MetaEvent::ShowDiff)],
|mut test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module
.diff_view_data
.update_view_data(|updater| updater.push_line(ViewLine::from("foo")));
@@ -1135,7 +1135,7 @@ fn handle_event_toggle_overview_to_diff() {
&["pick 0123456789abcdef0123456789abcdef c1"],
&[Event::from('d')],
|mut test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module
.overview_view_data
.update_view_data(|updater| updater.push_line(ViewLine::from("foo")));
@@ -1159,7 +1159,7 @@ fn handle_event_resize() {
&["pick 0123456789abcdef0123456789abcdef c1"],
&[Event::Resize(100, 100)],
|mut test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
assert_process_result!(test_context.handle_event(&mut module), event = Event::Resize(100, 100));
},
);
@@ -1171,7 +1171,7 @@ fn handle_event_resize() {
fn render_help() {
with_temp_repository(|repo| {
module_test(&["pick aaa c1"], &[Event::from(MetaEvent::Help)], |mut test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
let _ = test_context.handle_all_events(&mut module);
assert_rendered_output!(
test_context.build_view_data(&mut module),
@@ -1199,7 +1199,7 @@ fn render_help() {
fn handle_help_event_show() {
with_temp_repository(|repo| {
module_test(&["pick aaa c1"], &[Event::from(MetaEvent::Help)], |mut test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
let _ = test_context.handle_all_events(&mut module);
assert!(module.help.is_active());
});
@@ -1213,7 +1213,7 @@ fn handle_help_event_hide() {
&["pick aaa c1"],
&[Event::from(MetaEvent::Help), Event::from('?')],
|mut test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
let _ = test_context.handle_all_events(&mut module);
assert!(!module.help.is_active());
},
@@ -1229,7 +1229,7 @@ fn handle_event_other_key_from_diff() {
&["pick 0123456789abcdef0123456789abcdef c1"],
&[Event::from('a')],
|mut test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.state = ShowCommitState::Diff;
assert_process_result!(test_context.handle_event(&mut module), event = Event::from('a'));
assert_eq!(module.state, ShowCommitState::Overview);
@@ -1246,7 +1246,7 @@ fn handle_event_other_key_from_overview() {
&["pick 0123456789abcdef0123456789abcdef c1"],
&[Event::from('a')],
|mut test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
module.state = ShowCommitState::Overview;
assert_process_result!(
test_context.handle_event(&mut module),
@@ -1269,7 +1269,7 @@ fn handle_event_other_key_from_overview() {
fn scroll_events(#[case] event: MetaEvent) {
with_temp_repository(|repo| {
module_test(&[], &[Event::from(event)], |mut test_context| {
- let mut module = ShowCommit::new(&Config::new(), &repo);
+ let mut module = ShowCommit::new(&Config::new(), Git::new(repo));
assert_process_result!(test_context.handle_event(&mut module), event = Event::from(event));
});
Ok(())
diff --git a/src/core/src/process/tests.rs b/src/core/src/process/tests.rs
index e0e3984..2e4ffe0 100644
--- a/src/core/src/process/tests.rs
+++ b/src/core/src/process/tests.rs
@@ -83,7 +83,7 @@ fn render_error() {
let mut modules = create_modules();
let sender = process.view_sender.clone();
let mut test_module = TestModule::new();
- test_module.view_data_callback = Box::new(move |_| while sender.end().is_ok() {});
+ test_module.view_data_callback(move |_| while sender.end().is_ok() {});
modules.register_module(State::List, test_module);
assert_eq!(process.run(modules).unwrap(), ExitStatus::StateError);
}
@@ -104,7 +104,7 @@ fn stop_error() {
let mut modules = create_modules();
let mut test_module = TestModule::new();
let sender = process.view_sender.clone();
- test_module.event_callback = Box::new(move |event, _, _| {
+ test_module.event_callback(move |event, _, _| {
while sender.end().is_ok() {}
ProcessResult::from(event)
});
@@ -120,7 +120,7 @@ fn handle_exit_event_that_is_not_kill() {
let mut process = create_process(rebase_todo_file, &[Event::from(MetaEvent::Exit)]);
let mut modules = create_modules();
let mut test_module = TestModule::new();
- test_module.event_callback = Box::new(|_, _, _| {
+ test_module.event_callback(|_, _, _| {
ProcessResult::new()
.event(Event::from(MetaEvent::Rebase))
.exit_status(ExitStatus::Good)
@@ -139,7 +139,7 @@ fn handle_exit_event_that_is_kill() {
let mut process = create_process(rebase_todo_file, &[]);
let mut modules = create_modules();
let mut test_module = TestModule::new();
- test_module.event_callback = Box::new(|_, _, _| {
+ test_module.event_callback(|_, _, _| {
ProcessResult::new()
.event(Event::from(MetaEvent::Kill))
.exit_status(ExitStatus::Kill)
diff --git a/src/core/src/run.rs b/src/core/src/run.rs
index d0fbe45..833d3cf 100644
--- a/src/core/src/run.rs
+++ b/src/core/src/run.rs
@@ -12,6 +12,7 @@ use view::View;
use crate::{
arguments::Args,
exit::Exit,
+ git::Git,
help::build_help,
module::{ExitStatus, Modules, State},
modules::{ConfirmAbort, ConfirmRebase, Error, ExternalEditor, Insert, List, ShowCommit, WindowSizeError},
@@ -45,11 +46,11 @@ pub(super) fn load_todo_file(filepath: &str, config: &Config) -> Result<TodoFile
Ok(todo_file)
}
-pub(super) fn create_modules<'modules>(config: &'modules Config, repo: &'modules Repository) -> Modules<'modules> {
+pub(super) fn create_modules(config: &Config, git: Git) -> Modules<'_> {
let mut modules = Modules::new(EventHandler::new(KeyBindings::new(&config.key_bindings)));
modules.register_module(State::Error, Error::new());
modules.register_module(State::List, List::new(config));
- modules.register_module(State::ShowCommit, ShowCommit::new(config, repo));
+ modules.register_module(State::ShowCommit, ShowCommit::new(config, git));
modules.register_module(State::WindowSizeError, WindowSizeError::new());
modules.register_module(
State::ConfirmAbort,
@@ -108,8 +109,9 @@ pub(crate) fn run(args: &Args) -> Exit {
Ok(todo_file) => todo_file,
Err(exit) => return exit,
};
+
let process = create_process(todo_file, &config);
- run_process(process, create_modules(&config, &repo))
+ run_process(process, create_modules(&config, Git::new(repo)))
}
else {
Exit::new(
diff --git a/src/core/src/tests.rs b/src/core/src/tests.rs
index 451c860..c0f986e 100644
--- a/src/core/src/tests.rs
+++ b/src/core/src/tests.rs
@@ -1,10 +1,11 @@
use std::{env::set_var, fs::File, path::Path};
-use git::Repository;
+use ::git::Repository;
use input::{Event, MetaEvent};
use super::*;
use crate::{
+ git::Git,
module::{ExitStatus, ProcessResult, State},
run::{create_modules, create_process, load_config, load_todo_file, run_process},
testutil::TestModule,
@@ -137,8 +138,8 @@ fn run_process_error() {
let rebase_todo_file = load_todo_file(todo_file_path.to_str().unwrap(), &config).unwrap();
let process = create_process(rebase_todo_file, &config);
let mut module = TestModule::new();
- module.event_callback = Box::new(move |_, _, _| ProcessResult::from(Event::from(MetaEvent::Exit)));
- let mut modules = create_modules(&config, &repo);
+ module.event_callback(move |_, _, _| ProcessResult::from(Event::from(MetaEvent::Exit)));
+ let mut modules = create_modules(&config, Git::new(repo));
modules.register_module(State::WindowSizeError, module);
assert_eq!(
run_process(process, modules),
@@ -159,8 +160,8 @@ fn run_process_success() {
let rebase_todo_file = load_todo_file(todo_file.to_str().unwrap(), &config).unwrap();
let process = create_process(rebase_todo_file, &config);
let mut module = TestModule::new();
- module.event_callback = Box::new(move |_, _, _| ProcessResult::from(Event::from(MetaEvent::Exit)));
- let mut modules = create_modules(&config, &repo);
+ module.event_callback(move |_, _, _| ProcessResult::from(Event::from(MetaEvent::Exit)));
+ let mut modules = create_modules(&config, Git::new(repo));
modules.register_module(State::WindowSizeError, module);
assert_eq!(run_process(process, modules), Exit::from(ExitStatus::Abort));
}
diff --git a/src/core/src/testutil/test_module.rs b/src/core/src/testutil/test_module.rs
index 16d7195..61e8975 100644
--- a/src/core/src/testutil/test_module.rs
+++ b/src/core/src/testutil/test_module.rs
@@ -4,13 +4,13 @@ use view::{RenderContext, ViewData, ViewSender};
use crate::module::{Module, ProcessResult};
-pub(crate) struct TestModule {
- pub(crate) event_callback: Box<dyn Fn(Event, &ViewSender, &mut TodoFile) -> ProcessResult>,
- pub(crate) view_data: ViewData,
- pub(crate) view_data_callback: Box<dyn Fn(&mut ViewData)>,
+pub(crate) struct TestModule<'module> {
+ event_callback: Box<dyn Fn(Event, &ViewSender, &mut TodoFile) -> ProcessResult + Send + 'module>,
+ view_data: ViewData,
+ view_data_callback: Box<dyn Fn(&mut ViewData) + Send + 'module>,
}
-impl TestModule {
+impl<'module> TestModule<'module> {
pub(crate) fn new() -> Self {
Self {
event_callback: Box::new(|event, _, _| ProcessResult::from(event)),
@@ -18,9 +18,25 @@ impl TestModule {
view_data_callback: Box::new(|_| {}),
}
}
+
+ pub(crate) fn event_callback<EC>(&mut self, callback: EC)
+ where
+ EC: Fn(Event, &ViewSender, &mut TodoFile) -> ProcessResult,
+ EC: Send + 'module,
+ {
+ self.event_callback = Box::new(callback);
+ }
+
+ pub(crate) fn view_data_callback<VDC>(&mut self, callback: VDC)
+ where
+ VDC: Fn(&mut ViewData),
+ VDC: Send + 'module,
+ {
+ self.view_data_callback = Box::new(callback);
+ }
}
-impl Module for TestModule {
+impl Module for TestModule<'_> {
fn build_view_data(&mut self, _render_context: &RenderContext, _rebase_todo: &TodoFile) -> &ViewData {
(self.view_data_callback)(&mut self.view_data);
&self.view_data