From 88674fd48d1f3c548a0424d2adab2154c893a0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Tue, 29 Oct 2024 09:36:19 +0100 Subject: [PATCH 01/19] Add snapshot test using insta --- Cargo.lock | 45 +++++++++++++ Cargo.toml | 2 + src/main.rs | 72 ++++++++++++++++++++- src/snapshots/gitui__tests__app_starts.snap | 45 +++++++++++++ 4 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 src/snapshots/gitui__tests__app_starts.snap diff --git a/Cargo.lock b/Cargo.lock index 90125caf47..60a3b0a73a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -493,6 +493,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -816,6 +828,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "env_filter" version = "0.1.3" @@ -1178,7 +1196,9 @@ dependencies = [ "filetreelist", "fuzzy-matcher", "gh-emoji", + "git2-testing", "indexmap", + "insta", "itertools 0.14.0", "log", "notify", @@ -2050,6 +2070,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "insta" +version = "1.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f72d3e19488cf7d8ea52d2fc0f8754fc933398b337cd3cbdb28aaeb35159ef" +dependencies = [ + "console", + "lazy_static", + "linked-hash-map", + "regex", + "similar", +] + [[package]] name = "instability" version = "0.3.6" @@ -2259,6 +2292,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -3206,6 +3245,12 @@ dependencies = [ "rand_core", ] +[[package]] +name = "similar" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" + [[package]] name = "simplelog" version = "0.12.2" diff --git a/Cargo.toml b/Cargo.toml index ae7b777f08..7f73cedb3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,6 +68,8 @@ which = "7.0" [dev-dependencies] env_logger = "0.11" +git2-testing = { path = "./git2-testing" } +insta = { version = "1.41.0", features = ["filters"] } pretty_assertions = "1.4" tempfile = "3" diff --git a/src/main.rs b/src/main.rs index 2e8e9b8575..29706e7a10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -305,7 +305,10 @@ fn shutdown_terminal() { } } -fn draw(terminal: &mut Terminal, app: &App) -> io::Result<()> { +fn draw( + terminal: &mut ratatui::Terminal, + app: &App, +) -> io::Result<()> { if app.requires_redraw() { terminal.clear()?; } @@ -408,3 +411,70 @@ fn set_panic_handler() -> Result<()> { Ok(()) } + +#[cfg(test)] +mod tests { + use std::{cell::RefCell, path::PathBuf}; + + use asyncgit::sync::RepoPath; + use crossbeam_channel::unbounded; + use git2_testing::repo_init; + use insta::assert_snapshot; + use ratatui::{backend::TestBackend, Terminal}; + + use crate::{ + app::App, draw, input::Input, keys::KeyConfig, + ui::style::Theme, + }; + + // Macro recommended by: https://insta.rs/docs/cmd/ + macro_rules! apply_common_filters { + {} => { + let mut settings = insta::Settings::clone_current(); + // MacOS Temp Folder + settings.add_filter(r"/var/folders/\S+?/T/\S+", "[TEMP_FILE]"); + // Linux Temp Folder + settings.add_filter(r"/tmp/\.tmp\S+", "[TEMP_FILE]"); + // Windows Temp folder + settings.add_filter(r"\b[A-Z]:\\.*\\Local\\Temp\\\S+", "[TEMP_FILE]"); + // Convert Windows paths to Unix paths + settings.add_filter(r"\\\\?([\w\d.])", "/$1"); + let _bound = settings.bind_to_scope(); + } + } + + #[test] + fn app_starts() { + apply_common_filters!(); + + let (temp_dir, _repo) = repo_init(); + let path: RepoPath = temp_dir.path().to_str().unwrap().into(); + + let (tx_git, _rx_git) = unbounded(); + let (tx_app, _rx_app) = unbounded(); + + let input = Input::new(); + + let theme = Theme::init(&PathBuf::new()); + let key_config = KeyConfig::init() + .map_err(|e| eprintln!("KeyConfig loading error: {e}")) + .unwrap_or_default(); + + let app = App::new( + RefCell::new(path), + tx_git, + tx_app, + input.clone(), + theme, + key_config, + ) + .unwrap(); + + let mut terminal = + Terminal::new(TestBackend::new(120, 40)).unwrap(); + + let _ = draw(&mut terminal, &app); + + assert_snapshot!(terminal.backend()); + } +} diff --git a/src/snapshots/gitui__tests__app_starts.snap b/src/snapshots/gitui__tests__app_starts.snap new file mode 100644 index 0000000000..f884e934cf --- /dev/null +++ b/src/snapshots/gitui__tests__app_starts.snap @@ -0,0 +1,45 @@ +--- +source: src/main.rs +expression: terminal.backend() +snapshot_kind: text +--- +" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5] [TEMP_FILE] " +" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" +"│Loading ... ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────{master}┘│ │" +"┌Staged Changes────────────────────────────────────────────┐│ │" +"│Loading ... ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" +" " From e141740c70a5c83aad14ec42abe533174affe6bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 30 Oct 2024 16:27:39 +0100 Subject: [PATCH 02/19] Adjust filters for long, but shortened file names --- src/main.rs | 6 +++--- src/snapshots/gitui__tests__app_starts.snap | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 29706e7a10..c7bf093e36 100644 --- a/src/main.rs +++ b/src/main.rs @@ -432,11 +432,11 @@ mod tests { {} => { let mut settings = insta::Settings::clone_current(); // MacOS Temp Folder - settings.add_filter(r"/var/folders/\S+?/T/\S+", "[TEMP_FILE]"); + settings.add_filter(r" *\[…\]\S+?/T/\S+", "[TEMP_FILE]"); // Linux Temp Folder - settings.add_filter(r"/tmp/\.tmp\S+", "[TEMP_FILE]"); + settings.add_filter(r" */tmp/\.tmp\S+", "[TEMP_FILE]"); // Windows Temp folder - settings.add_filter(r"\b[A-Z]:\\.*\\Local\\Temp\\\S+", "[TEMP_FILE]"); + settings.add_filter(r" *\[…\].*\\Local\\Temp\\\S+", "[TEMP_FILE]"); // Convert Windows paths to Unix paths settings.add_filter(r"\\\\?([\w\d.])", "/$1"); let _bound = settings.bind_to_scope(); diff --git a/src/snapshots/gitui__tests__app_starts.snap b/src/snapshots/gitui__tests__app_starts.snap index f884e934cf..8aa26f0720 100644 --- a/src/snapshots/gitui__tests__app_starts.snap +++ b/src/snapshots/gitui__tests__app_starts.snap @@ -3,7 +3,7 @@ source: src/main.rs expression: terminal.backend() snapshot_kind: text --- -" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5] [TEMP_FILE] " +" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " " ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " "┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" "│Loading ... ││ │" From 71fcefe73dc8b8b6324f8a6f039e75b7feb77565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 30 Oct 2024 18:50:00 +0100 Subject: [PATCH 03/19] Remove filter, hoping the Windows filter now matches --- src/main.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index c7bf093e36..0f1149482f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -437,8 +437,6 @@ mod tests { settings.add_filter(r" */tmp/\.tmp\S+", "[TEMP_FILE]"); // Windows Temp folder settings.add_filter(r" *\[…\].*\\Local\\Temp\\\S+", "[TEMP_FILE]"); - // Convert Windows paths to Unix paths - settings.add_filter(r"\\\\?([\w\d.])", "/$1"); let _bound = settings.bind_to_scope(); } } From 1a1aaf53b9b5059e536ecca9c75f595efe1e72e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 30 Oct 2024 20:15:53 +0100 Subject: [PATCH 04/19] Replace slashes in filter --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 0f1149482f..6e4ff76b61 100644 --- a/src/main.rs +++ b/src/main.rs @@ -436,7 +436,7 @@ mod tests { // Linux Temp Folder settings.add_filter(r" */tmp/\.tmp\S+", "[TEMP_FILE]"); // Windows Temp folder - settings.add_filter(r" *\[…\].*\\Local\\Temp\\\S+", "[TEMP_FILE]"); + settings.add_filter(r" *\[…\].*/Local/Temp/\S+", "[TEMP_FILE]"); let _bound = settings.bind_to_scope(); } } From 4a3329147f73880a9e6a121abb0c5b436a027491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Fri, 1 Nov 2024 08:28:35 +0100 Subject: [PATCH 05/19] Simulate key press in snapshot test --- src/main.rs | 48 ++++++++++++++++--- .../gitui__tests__app_loading_finished.snap | 45 +++++++++++++++++ ...tests__app_log_tab_showing_one_commit.snap | 45 +++++++++++++++++ 3 files changed, 131 insertions(+), 7 deletions(-) create mode 100644 src/snapshots/gitui__tests__app_loading_finished.snap create mode 100644 src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap diff --git a/src/main.rs b/src/main.rs index 6e4ff76b61..56912755fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -414,9 +414,11 @@ fn set_panic_handler() -> Result<()> { #[cfg(test)] mod tests { - use std::{cell::RefCell, path::PathBuf}; + use std::{ + cell::RefCell, path::PathBuf, thread::sleep, time::Duration, + }; - use asyncgit::sync::RepoPath; + use asyncgit::{sync::RepoPath, AsyncGitNotification}; use crossbeam_channel::unbounded; use git2_testing::repo_init; use insta::assert_snapshot; @@ -424,10 +426,10 @@ mod tests { use crate::{ app::App, draw, input::Input, keys::KeyConfig, - ui::style::Theme, + ui::style::Theme, AsyncNotification, }; - // Macro recommended by: https://insta.rs/docs/cmd/ + // Macro adapted from: https://insta.rs/docs/cmd/ macro_rules! apply_common_filters { {} => { let mut settings = insta::Settings::clone_current(); @@ -437,6 +439,8 @@ mod tests { settings.add_filter(r" */tmp/\.tmp\S+", "[TEMP_FILE]"); // Windows Temp folder settings.add_filter(r" *\[…\].*/Local/Temp/\S+", "[TEMP_FILE]"); + // Commit ids that follow a vertical bar + settings.add_filter(r"│[a-z0-9]{7} ", "│[AAAAA] "); let _bound = settings.bind_to_scope(); } } @@ -458,21 +462,51 @@ mod tests { .map_err(|e| eprintln!("KeyConfig loading error: {e}")) .unwrap_or_default(); - let app = App::new( + let mut app = App::new( RefCell::new(path), tx_git, tx_app, input.clone(), theme, - key_config, + key_config.clone(), ) .unwrap(); let mut terminal = Terminal::new(TestBackend::new(120, 40)).unwrap(); - let _ = draw(&mut terminal, &app); + draw(&mut terminal, &app).unwrap(); assert_snapshot!(terminal.backend()); + + let event = + AsyncNotification::Git(AsyncGitNotification::Status); + app.update_async(event).unwrap(); + + sleep(Duration::from_millis(5)); + + draw(&mut terminal, &app).unwrap(); + + assert_snapshot!("app_loading_finished", terminal.backend()); + + let event = crossterm::event::KeyEvent::new( + key_config.keys.tab_log.code, + key_config.keys.tab_log.modifiers, + ); + app.event(crate::input::InputEvent::Input( + crossterm::event::Event::Key(event), + )) + .unwrap(); + + sleep(Duration::from_millis(5)); + + app.update().unwrap(); + + draw(&mut terminal, &app).unwrap(); + + assert_snapshot!( + "app_log_tab_showing_one_commit", + terminal.backend() + ); } } diff --git a/src/snapshots/gitui__tests__app_loading_finished.snap b/src/snapshots/gitui__tests__app_loading_finished.snap new file mode 100644 index 0000000000..077ba4876d --- /dev/null +++ b/src/snapshots/gitui__tests__app_loading_finished.snap @@ -0,0 +1,45 @@ +--- +source: src/main.rs +expression: terminal.backend() +snapshot_kind: text +--- +" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " +" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────{master}┘│ │" +"┌Staged Changes────────────────────────────────────────────┐│ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" +"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [kjlh] Diff [l] To stage [w] more [.]" diff --git a/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap b/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap new file mode 100644 index 0000000000..ffa0d45cd7 --- /dev/null +++ b/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap @@ -0,0 +1,45 @@ +--- +source: src/main.rs +expression: terminal.backend() +snapshot_kind: text +--- +" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " +" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Commit 1/1────────────────────────────────────────────────────────────────────────────────────────────────────────────┐" +"│[AAAAA] <1m ago name initial █" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘" +"Scroll [kj] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] Checkout [⇧S] Tags [⇧T] more [.]" From 9757d7f6ae52f3ec832b3016fc30044d2d62389d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Fri, 1 Nov 2024 08:30:20 +0100 Subject: [PATCH 06/19] Rename snapshot --- src/main.rs | 2 +- ...i__tests__app_starts.snap => gitui__tests__app_loading.snap} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/snapshots/{gitui__tests__app_starts.snap => gitui__tests__app_loading.snap} (100%) diff --git a/src/main.rs b/src/main.rs index 56912755fe..72fb0973dd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -477,7 +477,7 @@ mod tests { draw(&mut terminal, &app).unwrap(); - assert_snapshot!(terminal.backend()); + assert_snapshot!("app_loading", terminal.backend()); let event = AsyncNotification::Git(AsyncGitNotification::Status); diff --git a/src/snapshots/gitui__tests__app_starts.snap b/src/snapshots/gitui__tests__app_loading.snap similarity index 100% rename from src/snapshots/gitui__tests__app_starts.snap rename to src/snapshots/gitui__tests__app_loading.snap From 1b182581a0b79df4cc215b52d16bb1e74c45f5e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Fri, 1 Nov 2024 10:26:28 +0100 Subject: [PATCH 07/19] Make snapshots independent of local key config --- src/main.rs | 4 +--- src/snapshots/gitui__tests__app_loading_finished.snap | 2 +- .../gitui__tests__app_log_tab_showing_one_commit.snap | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 72fb0973dd..14d5b6238e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -458,9 +458,7 @@ mod tests { let input = Input::new(); let theme = Theme::init(&PathBuf::new()); - let key_config = KeyConfig::init() - .map_err(|e| eprintln!("KeyConfig loading error: {e}")) - .unwrap_or_default(); + let key_config = KeyConfig::default(); let mut app = App::new( RefCell::new(path), diff --git a/src/snapshots/gitui__tests__app_loading_finished.snap b/src/snapshots/gitui__tests__app_loading_finished.snap index 077ba4876d..64a8db4f88 100644 --- a/src/snapshots/gitui__tests__app_loading_finished.snap +++ b/src/snapshots/gitui__tests__app_loading_finished.snap @@ -42,4 +42,4 @@ snapshot_kind: text "│ ││ │" "│ ││ │" "└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" -"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [kjlh] Diff [l] To stage [w] more [.]" +"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [↑↓→←] Diff [→] To stage [w] more [.]" diff --git a/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap b/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap index ffa0d45cd7..e8e25528d1 100644 --- a/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap +++ b/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap @@ -42,4 +42,4 @@ snapshot_kind: text "│ ║" "│ ║" "└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘" -"Scroll [kj] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] Checkout [⇧S] Tags [⇧T] more [.]" +"Scroll [↑↓] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] Checkout [⇧S] Tags [⇧T] more [.]" From bb96196662f480628d682d71305fe7656e4c1c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Fri, 1 Nov 2024 10:52:04 +0100 Subject: [PATCH 08/19] Sleep slightly longer This will hopefully make the test green on CI. --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 14d5b6238e..00f99451e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -481,7 +481,7 @@ mod tests { AsyncNotification::Git(AsyncGitNotification::Status); app.update_async(event).unwrap(); - sleep(Duration::from_millis(5)); + sleep(Duration::from_millis(20)); draw(&mut terminal, &app).unwrap(); @@ -496,7 +496,7 @@ mod tests { )) .unwrap(); - sleep(Duration::from_millis(5)); + sleep(Duration::from_millis(20)); app.update().unwrap(); From 43ad305d8a66855680b0f923b4b7987b90e2c966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Fri, 1 Nov 2024 11:08:50 +0100 Subject: [PATCH 09/19] Sleep longer This will hopefully make the test green on CI. --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 00f99451e6..3d88c534d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -481,7 +481,7 @@ mod tests { AsyncNotification::Git(AsyncGitNotification::Status); app.update_async(event).unwrap(); - sleep(Duration::from_millis(20)); + sleep(Duration::from_millis(500)); draw(&mut terminal, &app).unwrap(); @@ -496,7 +496,7 @@ mod tests { )) .unwrap(); - sleep(Duration::from_millis(20)); + sleep(Duration::from_millis(500)); app.update().unwrap(); From 3703e2776cfc0793d686f5d434a64d76a282b50b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 14 Nov 2024 10:33:15 +0100 Subject: [PATCH 10/19] Extract app setup into Gitui --- src/gitui.rs | 143 ++++++++++++++++++ src/main.rs | 1 + .../gitui__gitui__tests__app_loading.snap | 45 ++++++ ...i__gitui__tests__app_loading_finished.snap | 45 ++++++ ...tests__app_log_tab_showing_one_commit.snap | 45 ++++++ 5 files changed, 279 insertions(+) create mode 100644 src/gitui.rs create mode 100644 src/snapshots/gitui__gitui__tests__app_loading.snap create mode 100644 src/snapshots/gitui__gitui__tests__app_loading_finished.snap create mode 100644 src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap diff --git a/src/gitui.rs b/src/gitui.rs new file mode 100644 index 0000000000..c8240bdd6b --- /dev/null +++ b/src/gitui.rs @@ -0,0 +1,143 @@ +use std::{cell::RefCell, path::PathBuf}; + +use asyncgit::{sync::RepoPath, AsyncGitNotification}; +use crossbeam_channel::{unbounded, Receiver}; +use crossterm::event::{KeyCode, KeyModifiers}; + +use crate::{ + app::App, draw, input::Input, keys::KeyConfig, ui::style::Theme, + AsyncAppNotification, +}; + +struct Gitui { + app: crate::app::App, + _rx_git: Receiver, + _rx_app: Receiver, +} + +impl Gitui { + fn new(path: RepoPath) -> Self { + let (tx_git, rx_git) = unbounded(); + let (tx_app, rx_app) = unbounded(); + + let input = Input::new(); + + let theme = Theme::init(&PathBuf::new()); + let key_config = KeyConfig::default(); + + let app = App::new( + RefCell::new(path), + tx_git, + tx_app, + input.clone(), + theme, + key_config.clone(), + ) + .unwrap(); + + Self { + app, + _rx_git: rx_git, + _rx_app: rx_app, + } + } + + fn draw( + &mut self, + terminal: &mut ratatui::Terminal, + ) { + draw(terminal, &self.app).unwrap(); + } + + fn update_async(&mut self, event: crate::AsyncNotification) { + self.app.update_async(event).unwrap(); + } + + fn input_event( + &mut self, + code: KeyCode, + modifiers: KeyModifiers, + ) { + let event = crossterm::event::KeyEvent::new(code, modifiers); + self.app + .event(crate::input::InputEvent::Input( + crossterm::event::Event::Key(event), + )) + .unwrap(); + } + + fn update(&mut self) { + self.app.update().unwrap(); + } +} + +#[cfg(test)] +mod tests { + use std::{thread::sleep, time::Duration}; + + use asyncgit::{sync::RepoPath, AsyncGitNotification}; + use crossterm::event::{KeyCode, KeyModifiers}; + use git2_testing::repo_init; + use insta::assert_snapshot; + use ratatui::{backend::TestBackend, Terminal}; + + use crate::{gitui::Gitui, AsyncNotification}; + + // Macro adapted from: https://insta.rs/docs/cmd/ + macro_rules! apply_common_filters { + {} => { + let mut settings = insta::Settings::clone_current(); + // MacOS Temp Folder + settings.add_filter(r" *\[…\]\S+?/T/\S+", "[TEMP_FILE]"); + // Linux Temp Folder + settings.add_filter(r" */tmp/\.tmp\S+", "[TEMP_FILE]"); + // Windows Temp folder + settings.add_filter(r" *\[…\].*/Local/Temp/\S+", "[TEMP_FILE]"); + // Commit ids that follow a vertical bar + settings.add_filter(r"│[a-z0-9]{7} ", "│[AAAAA] "); + let _bound = settings.bind_to_scope(); + } + } + + #[test] + fn gitui_starts() { + apply_common_filters!(); + + let (temp_dir, _repo) = repo_init(); + let path: RepoPath = temp_dir.path().to_str().unwrap().into(); + + let mut terminal = + Terminal::new(TestBackend::new(120, 40)).unwrap(); + + let mut gitui = Gitui::new(path); + + gitui.draw(&mut terminal); + + sleep(Duration::from_millis(500)); + + assert_snapshot!("app_loading", terminal.backend()); + + let event = + AsyncNotification::Git(AsyncGitNotification::Status); + gitui.update_async(event); + + sleep(Duration::from_millis(500)); + + gitui.draw(&mut terminal); + + assert_snapshot!("app_loading_finished", terminal.backend()); + + gitui.input_event(KeyCode::Char('2'), KeyModifiers::empty()); + + sleep(Duration::from_millis(500)); + + gitui.update(); + + gitui.draw(&mut terminal); + + assert_snapshot!( + "app_log_tab_showing_one_commit", + terminal.backend() + ); + } +} diff --git a/src/main.rs b/src/main.rs index 3d88c534d5..7ba2c224bb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,6 +32,7 @@ mod bug_report; mod clipboard; mod cmdbar; mod components; +mod gitui; mod input; mod keys; mod notify_mutex; diff --git a/src/snapshots/gitui__gitui__tests__app_loading.snap b/src/snapshots/gitui__gitui__tests__app_loading.snap new file mode 100644 index 0000000000..53035b3495 --- /dev/null +++ b/src/snapshots/gitui__gitui__tests__app_loading.snap @@ -0,0 +1,45 @@ +--- +source: src/gitui.rs +expression: terminal.backend() +snapshot_kind: text +--- +" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " +" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" +"│Loading ... ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────{master}┘│ │" +"┌Staged Changes────────────────────────────────────────────┐│ │" +"│Loading ... ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" +" " diff --git a/src/snapshots/gitui__gitui__tests__app_loading_finished.snap b/src/snapshots/gitui__gitui__tests__app_loading_finished.snap new file mode 100644 index 0000000000..84ae798ccb --- /dev/null +++ b/src/snapshots/gitui__gitui__tests__app_loading_finished.snap @@ -0,0 +1,45 @@ +--- +source: src/gitui.rs +expression: terminal.backend() +snapshot_kind: text +--- +" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " +" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────{master}┘│ │" +"┌Staged Changes────────────────────────────────────────────┐│ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" +"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [↑↓→←] Diff [→] To stage [w] more [.]" diff --git a/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap b/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap new file mode 100644 index 0000000000..5061098334 --- /dev/null +++ b/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap @@ -0,0 +1,45 @@ +--- +source: src/gitui.rs +expression: terminal.backend() +snapshot_kind: text +--- +" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " +" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Commit 1/1────────────────────────────────────────────────────────────────────────────────────────────────────────────┐" +"│[AAAAA] <1m ago name initial █" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘" +"Scroll [↑↓] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] Checkout [⇧S] Tags [⇧T] more [.]" From e3dd300c5b694c5b81c4b5858d89ff0533293d33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 14 Nov 2024 10:46:01 +0100 Subject: [PATCH 11/19] Simplify main loop by extracting first event --- src/main.rs | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7ba2c224bb..dc1d4b4036 100644 --- a/src/main.rs +++ b/src/main.rs @@ -216,24 +216,20 @@ fn run_app( )?; let mut spinner = Spinner::default(); - let mut first_update = true; log::trace!("app start: {} ms", app_start.elapsed().as_millis()); + app.update()?; + loop { - let event = if first_update { - first_update = false; - QueueEvent::Notify - } else { - select_event( - &rx_input, - &rx_git, - &rx_app, - &rx_ticker, - &rx_watcher, - &spinner_ticker, - )? - }; + let event = select_event( + &rx_input, + &rx_git, + &rx_app, + &rx_ticker, + &rx_watcher, + &spinner_ticker, + )?; { if matches!(event, QueueEvent::SpinnerUpdate) { From e985305108033a5ad433cd98adede558d318b4d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 14 Nov 2024 11:32:58 +0100 Subject: [PATCH 12/19] Extract main loop into Gitui::run_main_loop --- src/gitui.rs | 153 +++++++++++++++++++++++++++++++++++++++++++------ src/main.rs | 107 +++------------------------------- src/spinner.rs | 9 +-- 3 files changed, 145 insertions(+), 124 deletions(-) diff --git a/src/gitui.rs b/src/gitui.rs index c8240bdd6b..687212ddb2 100644 --- a/src/gitui.rs +++ b/src/gitui.rs @@ -1,29 +1,59 @@ -use std::{cell::RefCell, path::PathBuf}; +use std::{cell::RefCell, time::Instant}; -use asyncgit::{sync::RepoPath, AsyncGitNotification}; -use crossbeam_channel::{unbounded, Receiver}; +use anyhow::Result; +use asyncgit::{ + sync::{utils::repo_work_dir, RepoPath}, + AsyncGitNotification, +}; +use crossbeam_channel::{never, tick, unbounded, Receiver}; +use scopetime::scope_time; + +#[cfg(test)] use crossterm::event::{KeyCode, KeyModifiers}; use crate::{ - app::App, draw, input::Input, keys::KeyConfig, ui::style::Theme, - AsyncAppNotification, + app::{App, QuitState}, + draw, + input::{Input, InputEvent, InputState}, + keys::KeyConfig, + select_event, + spinner::Spinner, + ui::style::Theme, + watcher::RepoWatcher, + AsyncAppNotification, AsyncNotification, QueueEvent, Updater, + SPINNER_INTERVAL, TICK_INTERVAL, }; -struct Gitui { +pub(crate) struct Gitui { app: crate::app::App, - _rx_git: Receiver, - _rx_app: Receiver, + rx_input: Receiver, + rx_git: Receiver, + rx_app: Receiver, + rx_ticker: Receiver, + rx_watcher: Receiver<()>, } impl Gitui { - fn new(path: RepoPath) -> Self { + pub(crate) fn new( + path: RepoPath, + theme: Theme, + key_config: &KeyConfig, + updater: Updater, + ) -> Result { let (tx_git, rx_git) = unbounded(); let (tx_app, rx_app) = unbounded(); let input = Input::new(); - let theme = Theme::init(&PathBuf::new()); - let key_config = KeyConfig::default(); + let (rx_ticker, rx_watcher) = match updater { + Updater::NotifyWatcher => { + let repo_watcher = + RepoWatcher::new(repo_work_dir(&path)?.as_str()); + + (never(), repo_watcher.receiver()) + } + Updater::Ticker => (tick(TICK_INTERVAL), never()), + }; let app = App::new( RefCell::new(path), @@ -35,11 +65,83 @@ impl Gitui { ) .unwrap(); - Self { + Ok(Self { app, - _rx_git: rx_git, - _rx_app: rx_app, + rx_input: input.receiver(), + rx_git, + rx_app, + rx_ticker, + rx_watcher, + }) + } + + pub(crate) fn run_main_loop( + &mut self, + terminal: &mut ratatui::Terminal, + ) -> Result { + let spinner_ticker = tick(SPINNER_INTERVAL); + let mut spinner = Spinner::default(); + + self.app.update()?; + + loop { + let event = select_event( + &self.rx_input, + &self.rx_git, + &self.rx_app, + &self.rx_ticker, + &self.rx_watcher, + &spinner_ticker, + )?; + + { + if matches!(event, QueueEvent::SpinnerUpdate) { + spinner.update(); + spinner.draw(terminal)?; + continue; + } + + scope_time!("loop"); + + match event { + QueueEvent::InputEvent(ev) => { + if matches!( + ev, + InputEvent::State(InputState::Polling) + ) { + //Note: external ed closed, we need to re-hide cursor + terminal.hide_cursor()?; + } + self.app.event(ev)?; + } + QueueEvent::Tick | QueueEvent::Notify => { + self.app.update()?; + } + QueueEvent::AsyncEvent(ev) => { + if !matches!( + ev, + AsyncNotification::Git( + AsyncGitNotification::FinishUnchanged + ) + ) { + self.app.update_async(ev)?; + } + } + QueueEvent::SpinnerUpdate => unreachable!(), + } + + self.draw(terminal); + + spinner.set_state(self.app.any_work_pending()); + spinner.draw(terminal)?; + + if self.app.is_quit() { + break; + } + } } + + Ok(self.app.quit_state()) } fn draw( @@ -49,10 +151,12 @@ impl Gitui { draw(terminal, &self.app).unwrap(); } + #[cfg(test)] fn update_async(&mut self, event: crate::AsyncNotification) { self.app.update_async(event).unwrap(); } + #[cfg(test)] fn input_event( &mut self, code: KeyCode, @@ -66,6 +170,7 @@ impl Gitui { .unwrap(); } + #[cfg(test)] fn update(&mut self) { self.app.update().unwrap(); } @@ -73,7 +178,7 @@ impl Gitui { #[cfg(test)] mod tests { - use std::{thread::sleep, time::Duration}; + use std::{path::PathBuf, thread::sleep, time::Duration}; use asyncgit::{sync::RepoPath, AsyncGitNotification}; use crossterm::event::{KeyCode, KeyModifiers}; @@ -81,7 +186,10 @@ mod tests { use insta::assert_snapshot; use ratatui::{backend::TestBackend, Terminal}; - use crate::{gitui::Gitui, AsyncNotification}; + use crate::{ + gitui::Gitui, keys::KeyConfig, ui::style::Theme, + AsyncNotification, Updater, + }; // Macro adapted from: https://insta.rs/docs/cmd/ macro_rules! apply_common_filters { @@ -106,11 +214,16 @@ mod tests { let (temp_dir, _repo) = repo_init(); let path: RepoPath = temp_dir.path().to_str().unwrap().into(); + let theme = Theme::init(&PathBuf::new()); + let key_config = KeyConfig::default(); + + let mut gitui = + Gitui::new(path, theme, &key_config, Updater::Ticker) + .unwrap(); + let mut terminal = Terminal::new(TestBackend::new(120, 40)).unwrap(); - let mut gitui = Gitui::new(path); - gitui.draw(&mut terminal); sleep(Duration::from_millis(500)); @@ -128,6 +241,10 @@ mod tests { assert_snapshot!("app_loading_finished", terminal.backend()); gitui.input_event(KeyCode::Char('2'), KeyModifiers::empty()); + gitui.input_event( + key_config.keys.tab_log.code, + key_config.keys.tab_log.modifiers, + ); sleep(Duration::from_millis(500)); diff --git a/src/main.rs b/src/main.rs index dc1d4b4036..3ce572a65c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -50,12 +50,9 @@ mod watcher; use crate::{app::App, args::process_cmdline}; use anyhow::{anyhow, bail, Result}; use app::QuitState; -use asyncgit::{ - sync::{utils::repo_work_dir, RepoPath}, - AsyncGitNotification, -}; +use asyncgit::{sync::RepoPath, AsyncGitNotification}; use backtrace::Backtrace; -use crossbeam_channel::{never, tick, unbounded, Receiver, Select}; +use crossbeam_channel::{Receiver, Select}; use crossterm::{ terminal::{ disable_raw_mode, enable_raw_mode, EnterAlternateScreen, @@ -63,21 +60,18 @@ use crossterm::{ }, ExecutableCommand, }; -use input::{Input, InputEvent, InputState}; +use gitui::Gitui; +use input::InputEvent; use keys::KeyConfig; use ratatui::backend::CrosstermBackend; use scopeguard::defer; -use scopetime::scope_time; -use spinner::Spinner; use std::{ - cell::RefCell, io::{self, Stdout}, panic, path::Path, time::{Duration, Instant}, }; use ui::style::Theme; -use watcher::RepoWatcher; type Terminal = ratatui::Terminal>; @@ -150,7 +144,6 @@ fn main() -> Result<()> { let mut repo_path = cliargs.repo_path; let mut terminal = start_terminal(io::stdout(), &repo_path)?; - let input = Input::new(); let updater = if cliargs.notify_watcher { Updater::NotifyWatcher @@ -164,7 +157,6 @@ fn main() -> Result<()> { repo_path.clone(), theme.clone(), key_config.clone(), - &input, updater, &mut terminal, )?; @@ -185,100 +177,15 @@ fn run_app( repo: RepoPath, theme: Theme, key_config: KeyConfig, - input: &Input, updater: Updater, terminal: &mut Terminal, ) -> Result { - let (tx_git, rx_git) = unbounded(); - let (tx_app, rx_app) = unbounded(); - - let rx_input = input.receiver(); - - let (rx_ticker, rx_watcher) = match updater { - Updater::NotifyWatcher => { - let repo_watcher = - RepoWatcher::new(repo_work_dir(&repo)?.as_str()); - - (never(), repo_watcher.receiver()) - } - Updater::Ticker => (tick(TICK_INTERVAL), never()), - }; - - let spinner_ticker = tick(SPINNER_INTERVAL); - - let mut app = App::new( - RefCell::new(repo), - tx_git, - tx_app, - input.clone(), - theme, - key_config, - )?; - - let mut spinner = Spinner::default(); + let mut gitui = + Gitui::new(repo.clone(), theme, &key_config, updater)?; log::trace!("app start: {} ms", app_start.elapsed().as_millis()); - app.update()?; - - loop { - let event = select_event( - &rx_input, - &rx_git, - &rx_app, - &rx_ticker, - &rx_watcher, - &spinner_ticker, - )?; - - { - if matches!(event, QueueEvent::SpinnerUpdate) { - spinner.update(); - spinner.draw(terminal)?; - continue; - } - - scope_time!("loop"); - - match event { - QueueEvent::InputEvent(ev) => { - if matches!( - ev, - InputEvent::State(InputState::Polling) - ) { - //Note: external ed closed, we need to re-hide cursor - terminal.hide_cursor()?; - } - app.event(ev)?; - } - QueueEvent::Tick | QueueEvent::Notify => { - app.update()?; - } - QueueEvent::AsyncEvent(ev) => { - if !matches!( - ev, - AsyncNotification::Git( - AsyncGitNotification::FinishUnchanged - ) - ) { - app.update_async(ev)?; - } - } - QueueEvent::SpinnerUpdate => unreachable!(), - } - - draw(terminal, &app)?; - - spinner.set_state(app.any_work_pending()); - spinner.draw(terminal)?; - - if app.is_quit() { - break; - } - } - } - - Ok(app.quit_state()) + gitui.run_main_loop(terminal) } fn setup_terminal() -> Result<()> { diff --git a/src/spinner.rs b/src/spinner.rs index 2fc6b3a2cb..c8066ae69e 100644 --- a/src/spinner.rs +++ b/src/spinner.rs @@ -1,7 +1,4 @@ -use ratatui::{ - backend::{Backend, CrosstermBackend}, - Terminal, -}; +use ratatui::{backend::Backend, Terminal}; use std::{cell::Cell, char, io}; // static SPINNER_CHARS: &[char] = &['◢', '◣', '◤', '◥']; @@ -39,9 +36,9 @@ impl Spinner { } /// draws or removes spinner char depending on `pending` state - pub fn draw( + pub fn draw( &self, - terminal: &mut Terminal>, + terminal: &mut Terminal, ) -> io::Result<()> { let idx = self.idx; From 4fbd5e467b06701375061a0fe920bbb84eb29baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 14 Nov 2024 11:39:08 +0100 Subject: [PATCH 13/19] Remove tests that have been moved to Gitui --- src/main.rs | 97 ----------------------------------------------------- 1 file changed, 97 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3ce572a65c..2cc56c77a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -315,100 +315,3 @@ fn set_panic_handler() -> Result<()> { Ok(()) } - -#[cfg(test)] -mod tests { - use std::{ - cell::RefCell, path::PathBuf, thread::sleep, time::Duration, - }; - - use asyncgit::{sync::RepoPath, AsyncGitNotification}; - use crossbeam_channel::unbounded; - use git2_testing::repo_init; - use insta::assert_snapshot; - use ratatui::{backend::TestBackend, Terminal}; - - use crate::{ - app::App, draw, input::Input, keys::KeyConfig, - ui::style::Theme, AsyncNotification, - }; - - // Macro adapted from: https://insta.rs/docs/cmd/ - macro_rules! apply_common_filters { - {} => { - let mut settings = insta::Settings::clone_current(); - // MacOS Temp Folder - settings.add_filter(r" *\[…\]\S+?/T/\S+", "[TEMP_FILE]"); - // Linux Temp Folder - settings.add_filter(r" */tmp/\.tmp\S+", "[TEMP_FILE]"); - // Windows Temp folder - settings.add_filter(r" *\[…\].*/Local/Temp/\S+", "[TEMP_FILE]"); - // Commit ids that follow a vertical bar - settings.add_filter(r"│[a-z0-9]{7} ", "│[AAAAA] "); - let _bound = settings.bind_to_scope(); - } - } - - #[test] - fn app_starts() { - apply_common_filters!(); - - let (temp_dir, _repo) = repo_init(); - let path: RepoPath = temp_dir.path().to_str().unwrap().into(); - - let (tx_git, _rx_git) = unbounded(); - let (tx_app, _rx_app) = unbounded(); - - let input = Input::new(); - - let theme = Theme::init(&PathBuf::new()); - let key_config = KeyConfig::default(); - - let mut app = App::new( - RefCell::new(path), - tx_git, - tx_app, - input.clone(), - theme, - key_config.clone(), - ) - .unwrap(); - - let mut terminal = - Terminal::new(TestBackend::new(120, 40)).unwrap(); - - draw(&mut terminal, &app).unwrap(); - - assert_snapshot!("app_loading", terminal.backend()); - - let event = - AsyncNotification::Git(AsyncGitNotification::Status); - app.update_async(event).unwrap(); - - sleep(Duration::from_millis(500)); - - draw(&mut terminal, &app).unwrap(); - - assert_snapshot!("app_loading_finished", terminal.backend()); - - let event = crossterm::event::KeyEvent::new( - key_config.keys.tab_log.code, - key_config.keys.tab_log.modifiers, - ); - app.event(crate::input::InputEvent::Input( - crossterm::event::Event::Key(event), - )) - .unwrap(); - - sleep(Duration::from_millis(500)); - - app.update().unwrap(); - - draw(&mut terminal, &app).unwrap(); - - assert_snapshot!( - "app_log_tab_showing_one_commit", - terminal.backend() - ); - } -} From 809be9769c6eba5ab7bb7f1c3ee5b5139625a187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 20 Nov 2024 10:50:36 +0100 Subject: [PATCH 14/19] Address clippy issues --- src/gitui.rs | 19 +++++++++---------- src/main.rs | 7 +++---- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/gitui.rs b/src/gitui.rs index 687212ddb2..4d0a8a5cb4 100644 --- a/src/gitui.rs +++ b/src/gitui.rs @@ -24,7 +24,7 @@ use crate::{ SPINNER_INTERVAL, TICK_INTERVAL, }; -pub(crate) struct Gitui { +pub struct Gitui { app: crate::app::App, rx_input: Receiver, rx_git: Receiver, @@ -62,8 +62,7 @@ impl Gitui { input.clone(), theme, key_config.clone(), - ) - .unwrap(); + )?; Ok(Self { app, @@ -130,7 +129,7 @@ impl Gitui { QueueEvent::SpinnerUpdate => unreachable!(), } - self.draw(terminal); + self.draw(terminal)?; spinner.set_state(self.app.any_work_pending()); spinner.draw(terminal)?; @@ -145,10 +144,10 @@ impl Gitui { } fn draw( - &mut self, + &self, terminal: &mut ratatui::Terminal, - ) { - draw(terminal, &self.app).unwrap(); + ) -> std::io::Result<()> { + draw(terminal, &self.app) } #[cfg(test)] @@ -224,7 +223,7 @@ mod tests { let mut terminal = Terminal::new(TestBackend::new(120, 40)).unwrap(); - gitui.draw(&mut terminal); + gitui.draw(&mut terminal).unwrap(); sleep(Duration::from_millis(500)); @@ -236,7 +235,7 @@ mod tests { sleep(Duration::from_millis(500)); - gitui.draw(&mut terminal); + gitui.draw(&mut terminal).unwrap(); assert_snapshot!("app_loading_finished", terminal.backend()); @@ -250,7 +249,7 @@ mod tests { gitui.update(); - gitui.draw(&mut terminal); + gitui.draw(&mut terminal).unwrap(); assert_snapshot!( "app_log_tab_showing_one_commit", diff --git a/src/main.rs b/src/main.rs index 2cc56c77a2..e96bfc268b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -156,7 +156,7 @@ fn main() -> Result<()> { app_start, repo_path.clone(), theme.clone(), - key_config.clone(), + &key_config, updater, &mut terminal, )?; @@ -176,12 +176,11 @@ fn run_app( app_start: Instant, repo: RepoPath, theme: Theme, - key_config: KeyConfig, + key_config: &KeyConfig, updater: Updater, terminal: &mut Terminal, ) -> Result { - let mut gitui = - Gitui::new(repo.clone(), theme, &key_config, updater)?; + let mut gitui = Gitui::new(repo, theme, key_config, updater)?; log::trace!("app start: {} ms", app_start.elapsed().as_millis()); From befa1f05476321572143291c7c6090dfc5b6304c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Sat, 14 Dec 2024 16:13:12 +0100 Subject: [PATCH 15/19] Replace sleep by wait for specific notification --- src/gitui.rs | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/gitui.rs b/src/gitui.rs index 4d0a8a5cb4..3fea865f75 100644 --- a/src/gitui.rs +++ b/src/gitui.rs @@ -169,6 +169,23 @@ impl Gitui { .unwrap(); } + #[cfg(test)] + fn wait_for_async_git_notification( + &self, + expected: AsyncGitNotification, + ) { + loop { + let actual = self + .rx_git + .recv_timeout(std::time::Duration::from_millis(100)) + .unwrap(); + + if actual == expected { + break; + } + } + } + #[cfg(test)] fn update(&mut self) { self.app.update().unwrap(); @@ -177,7 +194,7 @@ impl Gitui { #[cfg(test)] mod tests { - use std::{path::PathBuf, thread::sleep, time::Duration}; + use std::path::PathBuf; use asyncgit::{sync::RepoPath, AsyncGitNotification}; use crossterm::event::{KeyCode, KeyModifiers}; @@ -225,16 +242,12 @@ mod tests { gitui.draw(&mut terminal).unwrap(); - sleep(Duration::from_millis(500)); - assert_snapshot!("app_loading", terminal.backend()); let event = AsyncNotification::Git(AsyncGitNotification::Status); gitui.update_async(event); - sleep(Duration::from_millis(500)); - gitui.draw(&mut terminal).unwrap(); assert_snapshot!("app_loading_finished", terminal.backend()); @@ -245,7 +258,9 @@ mod tests { key_config.keys.tab_log.modifiers, ); - sleep(Duration::from_millis(500)); + gitui.wait_for_async_git_notification( + AsyncGitNotification::Log, + ); gitui.update(); From 77559fffab86b2ad72d793a8b63b561ede16dab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Thu, 9 Jan 2025 20:13:02 +0100 Subject: [PATCH 16/19] Decrease snapshot size --- src/gitui.rs | 3 +- .../gitui__gitui__tests__app_loading.snap | 50 ++++--------------- ...i__gitui__tests__app_loading_finished.snap | 50 ++++--------------- ...tests__app_log_tab_showing_one_commit.snap | 50 ++++--------------- 4 files changed, 35 insertions(+), 118 deletions(-) diff --git a/src/gitui.rs b/src/gitui.rs index 3fea865f75..cf0b40faf8 100644 --- a/src/gitui.rs +++ b/src/gitui.rs @@ -152,6 +152,7 @@ impl Gitui { #[cfg(test)] fn update_async(&mut self, event: crate::AsyncNotification) { + dbg!(event); self.app.update_async(event).unwrap(); } @@ -238,7 +239,7 @@ mod tests { .unwrap(); let mut terminal = - Terminal::new(TestBackend::new(120, 40)).unwrap(); + Terminal::new(TestBackend::new(100, 12)).unwrap(); gitui.draw(&mut terminal).unwrap(); diff --git a/src/snapshots/gitui__gitui__tests__app_loading.snap b/src/snapshots/gitui__gitui__tests__app_loading.snap index 53035b3495..a69c9dff89 100644 --- a/src/snapshots/gitui__gitui__tests__app_loading.snap +++ b/src/snapshots/gitui__gitui__tests__app_loading.snap @@ -4,42 +4,14 @@ expression: terminal.backend() snapshot_kind: text --- " Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" -"│Loading ... ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────{master}┘│ │" -"┌Staged Changes────────────────────────────────────────────┐│ │" -"│Loading ... ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" -" " +" ────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes────────────────────────────────┐┌Diff: ──────────────────────────────────────────┐" +"│Loading ... ││ │" +"│ ││ │" +"│ ││ │" +"└────────────────────────────────────────{master}┘│ │" +"┌Staged Changes──────────────────────────────────┐│ │" +"│Loading ... ││ │" +"│ ││ │" +"└────────────────────────────────────────────────┘└────────────────────────────────────────────────┘" +" " diff --git a/src/snapshots/gitui__gitui__tests__app_loading_finished.snap b/src/snapshots/gitui__gitui__tests__app_loading_finished.snap index 84ae798ccb..30a8c5b3dc 100644 --- a/src/snapshots/gitui__gitui__tests__app_loading_finished.snap +++ b/src/snapshots/gitui__gitui__tests__app_loading_finished.snap @@ -4,42 +4,14 @@ expression: terminal.backend() snapshot_kind: text --- " Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────{master}┘│ │" -"┌Staged Changes────────────────────────────────────────────┐│ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" -"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [↑↓→←] Diff [→] To stage [w] more [.]" +" ────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes────────────────────────────────┐┌Diff: ──────────────────────────────────────────┐" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└────────────────────────────────────────{master}┘│ │" +"┌Staged Changes──────────────────────────────────┐│ │" +"│ ││ │" +"│ ││ │" +"└────────────────────────────────────────────────┘└────────────────────────────────────────────────┘" +"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [↑↓→←] more [.]" diff --git a/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap b/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap index 5061098334..f00b552c7d 100644 --- a/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap +++ b/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap @@ -4,42 +4,14 @@ expression: terminal.backend() snapshot_kind: text --- " Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Commit 1/1────────────────────────────────────────────────────────────────────────────────────────────────────────────┐" -"│[AAAAA] <1m ago name initial █" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘" -"Scroll [↑↓] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] Checkout [⇧S] Tags [⇧T] more [.]" +" ────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Commit 1/1────────────────────────────────────────────────────────────────────────────────────────┐" +"│[AAAAA] <1m ago name initial █" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"└──────────────────────────────────────────────────────────────────────────────────────────────────┘" +"Scroll [↑↓] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] more [.]" From e3b14bc321963a306e98548d4ea575689c8600d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Fri, 10 Jan 2025 09:42:55 +0100 Subject: [PATCH 17/19] Increase snapshot width When snapshots are less wide, paths to Windows temp files are shortened by GitUI which results in our custom regex not matching them which in turn means they are not replaced by `[TEMP_FILE]` as they should be. This is relevant on Windows CI. --- src/gitui.rs | 2 +- .../gitui__gitui__tests__app_loading.snap | 22 +++++++++---------- ...i__gitui__tests__app_loading_finished.snap | 22 +++++++++---------- ...tests__app_log_tab_showing_one_commit.snap | 22 +++++++++---------- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/gitui.rs b/src/gitui.rs index cf0b40faf8..c9bbac41af 100644 --- a/src/gitui.rs +++ b/src/gitui.rs @@ -239,7 +239,7 @@ mod tests { .unwrap(); let mut terminal = - Terminal::new(TestBackend::new(100, 12)).unwrap(); + Terminal::new(TestBackend::new(120, 12)).unwrap(); gitui.draw(&mut terminal).unwrap(); diff --git a/src/snapshots/gitui__gitui__tests__app_loading.snap b/src/snapshots/gitui__gitui__tests__app_loading.snap index a69c9dff89..9da3809170 100644 --- a/src/snapshots/gitui__gitui__tests__app_loading.snap +++ b/src/snapshots/gitui__gitui__tests__app_loading.snap @@ -4,14 +4,14 @@ expression: terminal.backend() snapshot_kind: text --- " Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Unstaged Changes────────────────────────────────┐┌Diff: ──────────────────────────────────────────┐" -"│Loading ... ││ │" -"│ ││ │" -"│ ││ │" -"└────────────────────────────────────────{master}┘│ │" -"┌Staged Changes──────────────────────────────────┐│ │" -"│Loading ... ││ │" -"│ ││ │" -"└────────────────────────────────────────────────┘└────────────────────────────────────────────────┘" -" " +" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" +"│Loading ... ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────{master}┘│ │" +"┌Staged Changes────────────────────────────────────────────┐│ │" +"│Loading ... ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" +" " diff --git a/src/snapshots/gitui__gitui__tests__app_loading_finished.snap b/src/snapshots/gitui__gitui__tests__app_loading_finished.snap index 30a8c5b3dc..14ae462a6f 100644 --- a/src/snapshots/gitui__gitui__tests__app_loading_finished.snap +++ b/src/snapshots/gitui__gitui__tests__app_loading_finished.snap @@ -4,14 +4,14 @@ expression: terminal.backend() snapshot_kind: text --- " Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Unstaged Changes────────────────────────────────┐┌Diff: ──────────────────────────────────────────┐" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└────────────────────────────────────────{master}┘│ │" -"┌Staged Changes──────────────────────────────────┐│ │" -"│ ││ │" -"│ ││ │" -"└────────────────────────────────────────────────┘└────────────────────────────────────────────────┘" -"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [↑↓→←] more [.]" +" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────{master}┘│ │" +"┌Staged Changes────────────────────────────────────────────┐│ │" +"│ ││ │" +"│ ││ │" +"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" +"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [↑↓→←] Diff [→] To stage [w] more [.]" diff --git a/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap b/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap index f00b552c7d..fbe0ae69d6 100644 --- a/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap +++ b/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap @@ -4,14 +4,14 @@ expression: terminal.backend() snapshot_kind: text --- " Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Commit 1/1────────────────────────────────────────────────────────────────────────────────────────┐" -"│[AAAAA] <1m ago name initial █" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"└──────────────────────────────────────────────────────────────────────────────────────────────────┘" -"Scroll [↑↓] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] more [.]" +" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " +"┌Commit 1/1────────────────────────────────────────────────────────────────────────────────────────────────────────────┐" +"│[AAAAA] <1m ago name initial █" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘" +"Scroll [↑↓] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] Checkout [⇧S] Tags [⇧T] more [.]" From 078aafccac1ba0fd201a3edded9ef86956d30deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 16 Apr 2025 18:45:16 +0200 Subject: [PATCH 18/19] Use suffix to match on path in snapshots --- git2-testing/src/lib.rs | 16 +++++++++++--- src/gitui.rs | 16 ++++++-------- .../gitui__gitui__tests__app_loading.snap | 22 +++++++++---------- ...i__gitui__tests__app_loading_finished.snap | 22 +++++++++---------- ...tests__app_log_tab_showing_one_commit.snap | 22 +++++++++---------- 5 files changed, 53 insertions(+), 45 deletions(-) diff --git a/git2-testing/src/lib.rs b/git2-testing/src/lib.rs index e8ca87477d..5feee2c75d 100644 --- a/git2-testing/src/lib.rs +++ b/git2-testing/src/lib.rs @@ -18,13 +18,18 @@ pub fn repo_init_empty() -> (TempDir, Repository) { (td, repo) } -/// initialize test repo in temp path with an empty first commit -pub fn repo_init() -> (TempDir, Repository) { +/// initialize test repo in temp path with given suffix and an empty first commit +pub fn repo_init_suffix>( + suffix: Option, +) -> (TempDir, Repository) { init_log(); sandbox_config_files(); - let td = TempDir::new().unwrap(); + let td = match suffix { + Some(suffix) => TempDir::with_suffix(suffix).unwrap(), + None => TempDir::new().unwrap(), + }; let repo = Repository::init(td.path()).unwrap(); { let mut config = repo.config().unwrap(); @@ -43,6 +48,11 @@ pub fn repo_init() -> (TempDir, Repository) { (td, repo) } +/// initialize test repo in temp path with an empty first commit +pub fn repo_init() -> (TempDir, Repository) { + repo_init_suffix::<&std::ffi::OsStr>(None) +} + // init log fn init_log() { let _ = env_logger::builder() diff --git a/src/gitui.rs b/src/gitui.rs index c9bbac41af..2c366957e1 100644 --- a/src/gitui.rs +++ b/src/gitui.rs @@ -152,7 +152,6 @@ impl Gitui { #[cfg(test)] fn update_async(&mut self, event: crate::AsyncNotification) { - dbg!(event); self.app.update_async(event).unwrap(); } @@ -199,7 +198,7 @@ mod tests { use asyncgit::{sync::RepoPath, AsyncGitNotification}; use crossterm::event::{KeyCode, KeyModifiers}; - use git2_testing::repo_init; + use git2_testing::repo_init_suffix; use insta::assert_snapshot; use ratatui::{backend::TestBackend, Terminal}; @@ -212,12 +211,11 @@ mod tests { macro_rules! apply_common_filters { {} => { let mut settings = insta::Settings::clone_current(); - // MacOS Temp Folder - settings.add_filter(r" *\[…\]\S+?/T/\S+", "[TEMP_FILE]"); + // Windows and MacOS + // We don't match on the full path, but on the suffix we pass to `repo_init_suffix` below. + settings.add_filter(r" *\[…\]\S+-insta/?", "[TEMP_FILE]"); // Linux Temp Folder - settings.add_filter(r" */tmp/\.tmp\S+", "[TEMP_FILE]"); - // Windows Temp folder - settings.add_filter(r" *\[…\].*/Local/Temp/\S+", "[TEMP_FILE]"); + settings.add_filter(r" */tmp/\.tmp\S+-insta/", "[TEMP_FILE]"); // Commit ids that follow a vertical bar settings.add_filter(r"│[a-z0-9]{7} ", "│[AAAAA] "); let _bound = settings.bind_to_scope(); @@ -228,7 +226,7 @@ mod tests { fn gitui_starts() { apply_common_filters!(); - let (temp_dir, _repo) = repo_init(); + let (temp_dir, _repo) = repo_init_suffix(Some("-insta")); let path: RepoPath = temp_dir.path().to_str().unwrap().into(); let theme = Theme::init(&PathBuf::new()); @@ -239,7 +237,7 @@ mod tests { .unwrap(); let mut terminal = - Terminal::new(TestBackend::new(120, 12)).unwrap(); + Terminal::new(TestBackend::new(90, 12)).unwrap(); gitui.draw(&mut terminal).unwrap(); diff --git a/src/snapshots/gitui__gitui__tests__app_loading.snap b/src/snapshots/gitui__gitui__tests__app_loading.snap index 9da3809170..6a8025c3fb 100644 --- a/src/snapshots/gitui__gitui__tests__app_loading.snap +++ b/src/snapshots/gitui__gitui__tests__app_loading.snap @@ -4,14 +4,14 @@ expression: terminal.backend() snapshot_kind: text --- " Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" -"│Loading ... ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────{master}┘│ │" -"┌Staged Changes────────────────────────────────────────────┐│ │" -"│Loading ... ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" -" " +" ──────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes───────────────────────────┐┌Diff: ─────────────────────────────────────┐" +"│Loading ... ││ │" +"│ ││ │" +"│ ││ │" +"└───────────────────────────────────{master}┘│ │" +"┌Staged Changes─────────────────────────────┐│ │" +"│Loading ... ││ │" +"│ ││ │" +"└───────────────────────────────────────────┘└───────────────────────────────────────────┘" +" " diff --git a/src/snapshots/gitui__gitui__tests__app_loading_finished.snap b/src/snapshots/gitui__gitui__tests__app_loading_finished.snap index 14ae462a6f..9722900170 100644 --- a/src/snapshots/gitui__gitui__tests__app_loading_finished.snap +++ b/src/snapshots/gitui__gitui__tests__app_loading_finished.snap @@ -4,14 +4,14 @@ expression: terminal.backend() snapshot_kind: text --- " Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────{master}┘│ │" -"┌Staged Changes────────────────────────────────────────────┐│ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" -"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [↑↓→←] Diff [→] To stage [w] more [.]" +" ──────────────────────────────────────────────────────────────────────────────────────── " +"┌Unstaged Changes───────────────────────────┐┌Diff: ─────────────────────────────────────┐" +"│ ││ │" +"│ ││ │" +"│ ││ │" +"└───────────────────────────────────{master}┘│ │" +"┌Staged Changes─────────────────────────────┐│ │" +"│ ││ │" +"│ ││ │" +"└───────────────────────────────────────────┘└───────────────────────────────────────────┘" +"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] more [.]" diff --git a/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap b/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap index fbe0ae69d6..bbdd5be8a4 100644 --- a/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap +++ b/src/snapshots/gitui__gitui__tests__app_log_tab_showing_one_commit.snap @@ -4,14 +4,14 @@ expression: terminal.backend() snapshot_kind: text --- " Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Commit 1/1────────────────────────────────────────────────────────────────────────────────────────────────────────────┐" -"│[AAAAA] <1m ago name initial █" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘" -"Scroll [↑↓] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] Checkout [⇧S] Tags [⇧T] more [.]" +" ──────────────────────────────────────────────────────────────────────────────────────── " +"┌Commit 1/1──────────────────────────────────────────────────────────────────────────────┐" +"│[AAAAA] <1m ago name initial █" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"│ ║" +"└────────────────────────────────────────────────────────────────────────────────────────┘" +"Scroll [↑↓] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] more [.]" From e889dc68539fc5b5f95027dde22bf4ab9b331dd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20R=C3=BC=C3=9Fler?= Date: Wed, 16 Apr 2025 19:05:00 +0200 Subject: [PATCH 19/19] Remove obsolete snapshots --- src/snapshots/gitui__tests__app_loading.snap | 45 ------------------- .../gitui__tests__app_loading_finished.snap | 45 ------------------- ...tests__app_log_tab_showing_one_commit.snap | 45 ------------------- 3 files changed, 135 deletions(-) delete mode 100644 src/snapshots/gitui__tests__app_loading.snap delete mode 100644 src/snapshots/gitui__tests__app_loading_finished.snap delete mode 100644 src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap diff --git a/src/snapshots/gitui__tests__app_loading.snap b/src/snapshots/gitui__tests__app_loading.snap deleted file mode 100644 index 8aa26f0720..0000000000 --- a/src/snapshots/gitui__tests__app_loading.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/main.rs -expression: terminal.backend() -snapshot_kind: text ---- -" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" -"│Loading ... ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────{master}┘│ │" -"┌Staged Changes────────────────────────────────────────────┐│ │" -"│Loading ... ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" -" " diff --git a/src/snapshots/gitui__tests__app_loading_finished.snap b/src/snapshots/gitui__tests__app_loading_finished.snap deleted file mode 100644 index 64a8db4f88..0000000000 --- a/src/snapshots/gitui__tests__app_loading_finished.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/main.rs -expression: terminal.backend() -snapshot_kind: text ---- -" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Unstaged Changes──────────────────────────────────────────┐┌Diff: ────────────────────────────────────────────────────┐" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────{master}┘│ │" -"┌Staged Changes────────────────────────────────────────────┐│ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"│ ││ │" -"└──────────────────────────────────────────────────────────┘└──────────────────────────────────────────────────────────┘" -"Branches [b] Push [p] Fetch [⇧F] Pull [f] Undo Commit [⇧U] Submodules [⇧S] Nav [↑↓→←] Diff [→] To stage [w] more [.]" diff --git a/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap b/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap deleted file mode 100644 index e8e25528d1..0000000000 --- a/src/snapshots/gitui__tests__app_log_tab_showing_one_commit.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: src/main.rs -expression: terminal.backend() -snapshot_kind: text ---- -" Status [1] | Log [2] | Files [3] | Stashing [4] | Stashes [5][TEMP_FILE] " -" ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── " -"┌Commit 1/1────────────────────────────────────────────────────────────────────────────────────────────────────────────┐" -"│[AAAAA] <1m ago name initial █" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"│ ║" -"└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘" -"Scroll [↑↓] Mark [˽] Details [⏎] Branches [b] Compare [⇧C] Copy Hash [y] Tag [t] Checkout [⇧S] Tags [⇧T] more [.]"