├── .gitignore ├── .github ├── pull_request_template.md └── workflows │ ├── winget.yml │ ├── publish.yml │ └── test.yml ├── src ├── ui │ ├── panel │ │ ├── mod.rs │ │ ├── details_panel.rs │ │ └── log_panel.rs │ ├── styles.rs │ ├── message_popup.rs │ ├── utils.rs │ ├── help_popup.rs │ ├── mod.rs │ ├── command_popup.rs │ ├── rebase_popup.rs │ ├── command_log_tab.rs │ └── bookmark_set_popup.rs ├── commander │ ├── snapshots │ │ ├── lazyjj__commander__log__tests__get_log.snap │ │ ├── lazyjj__commander__files__tests__get_file_diff.snap │ │ ├── lazyjj__commander__files__tests__get_file_diff-3.snap │ │ ├── lazyjj__commander__files__tests__get_file_diff-7.snap │ │ ├── lazyjj__commander__files__tests__get_file_diff-5.snap │ │ ├── lazyjj__commander__files__tests__get_file_diff-6.snap │ │ ├── lazyjj__commander__log__tests__get_commit_show.snap │ │ ├── lazyjj__commander__bookmarks__tests__get_bookmark_show.snap │ │ ├── lazyjj__commander__files__tests__get_file_diff-2.snap │ │ ├── lazyjj__commander__files__tests__get_file_diff-8.snap │ │ └── lazyjj__commander__files__tests__get_file_diff-4.snap │ ├── ids.rs │ ├── bookmarks.rs │ ├── mod.rs │ ├── files.rs │ └── log.rs ├── keybinds │ ├── config.rs │ ├── keybinds_store.rs │ ├── rebase_popup.rs │ ├── log_tab.rs │ └── mod.rs ├── main.rs ├── env.rs └── app.rs ├── CHANGELOG.md ├── docs └── keybindings.md ├── Cargo.toml ├── README.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | lazyjj.log 3 | trace-*.json 4 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/ui/panel/mod.rs: -------------------------------------------------------------------------------- 1 | mod details_panel; 2 | mod log_panel; 3 | 4 | pub use details_panel::DetailsPanel; 5 | pub use log_panel::LogPanel; 6 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__log__tests__get_log.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/log.rs 3 | expression: log.graph 4 | --- 5 | "@ [LINE]\n│ (empty) (no description set)\n◆ [LINE]\n" 6 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__files__tests__get_file_diff.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/files.rs 3 | expression: "test_repo.commander.get_file_diff(&head, &file, &DiffFormat::ColorWords)?" 4 | --- 5 | Some( 6 | "Added regular file README:\n 1: AAA\n", 7 | ) 8 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__files__tests__get_file_diff-3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/files.rs 3 | expression: "test_repo.commander.get_file_diff(&head, &file, &DiffFormat::ColorWords)?" 4 | --- 5 | Some( 6 | "Modified regular file README:\n 1 1: AAABBB\n", 7 | ) 8 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__files__tests__get_file_diff-7.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/files.rs 3 | expression: "test_repo.commander.get_file_diff(&head, &file, &DiffFormat::ColorWords)?" 4 | --- 5 | Some( 6 | "Removed regular file README2:\n 1 : BBB\n", 7 | ) 8 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__files__tests__get_file_diff-5.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/files.rs 3 | expression: "test_repo.commander.get_file_diff(&head, &file, &DiffFormat::ColorWords)?" 4 | --- 5 | Some( 6 | "Modified regular file README2 (README => README2):\n", 7 | ) 8 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__files__tests__get_file_diff-6.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/files.rs 3 | expression: "test_repo.commander.get_file_diff(&head, &file, &DiffFormat::Git)?" 4 | --- 5 | Some( 6 | "diff --git a/README b/README2\nrename from README\nrename to README2\n", 7 | ) 8 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__log__tests__get_commit_show.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/log.rs 3 | expression: show 4 | --- 5 | "Commit ID: [COMMIT_ID]\nChange ID: [Change ID]\nAuthor : lazyjj (([DATE_TIME]))\nCommitter: lazyjj (([DATE_TIME]))\n\n (no description set)\n\nAdded regular file README:\n 1: AAA" 6 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__bookmarks__tests__get_bookmark_show.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/bookmarks.rs 3 | expression: bookmark_show 4 | --- 5 | "Commit ID: [COMMIT_ID]\nChange ID: [Change ID]\nBookmarks: test test@git\nAuthor : lazyjj (([DATE_TIME]))\nCommitter: lazyjj (([DATE_TIME]))\n\n (no description set)\n" 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] 9 | 10 | ### Added 11 | 12 | - Details panel responds to mouse scroll in all tabs 13 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__files__tests__get_file_diff-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/files.rs 3 | expression: "test_repo.commander.get_file_diff(&head, &file, &DiffFormat::Git)?" 4 | --- 5 | Some( 6 | "diff --git a/README b/README\nnew file mode 100644\nindex 0000000000..43d88b6586\n--- /dev/null\n+++ b/README\n@@ -0,0 +1,1 @@\n+AAA\n\\ No newline at end of file\n", 7 | ) 8 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__files__tests__get_file_diff-8.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/files.rs 3 | expression: "test_repo.commander.get_file_diff(&head, &file, &DiffFormat::Git)?" 4 | --- 5 | Some( 6 | "diff --git a/README2 b/README2\ndeleted file mode 100644\nindex f6d5afa370..0000000000\n--- a/README2\n+++ /dev/null\n@@ -1,1 +0,0 @@\n-BBB\n\\ No newline at end of file\n", 7 | ) 8 | -------------------------------------------------------------------------------- /src/commander/snapshots/lazyjj__commander__files__tests__get_file_diff-4.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: src/commander/files.rs 3 | expression: "test_repo.commander.get_file_diff(&head, &file, &DiffFormat::Git)?" 4 | --- 5 | Some( 6 | "diff --git a/README b/README\nindex 43d88b6586..f6d5afa370 100644\n--- a/README\n+++ b/README\n@@ -1,1 +1,1 @@\n-AAA\n\\ No newline at end of file\n+BBB\n\\ No newline at end of file\n", 7 | ) 8 | -------------------------------------------------------------------------------- /src/ui/styles.rs: -------------------------------------------------------------------------------- 1 | use std::sync::LazyLock; 2 | 3 | use ratatui::{ 4 | layout::Alignment, 5 | style::{Color, Style, Stylize}, 6 | text::Span, 7 | widgets::{Block, BorderType, Padding}, 8 | }; 9 | 10 | pub static POPUP_BLOCK: LazyLock> = LazyLock::new(|| { 11 | Block::<'static>::bordered() 12 | .padding(Padding::horizontal(1)) 13 | .border_type(BorderType::Rounded) 14 | .border_style(Style::default().fg(Color::Green)) 15 | }); 16 | pub static POPUP_BLOCK_TITLE_STYLE: LazyLock