diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/application.rs | 49 | ||||
-rw-r--r-- | src/color.rs | 10 | ||||
-rw-r--r-- | src/config.rs | 48 | ||||
-rw-r--r-- | src/git_config.rs | 57 | ||||
-rw-r--r-- | src/main.rs | 7 | ||||
-rw-r--r-- | src/mocks.rs | 1 | ||||
-rw-r--r-- | src/window.rs | 91 |
7 files changed, 197 insertions, 66 deletions
diff --git a/src/application.rs b/src/application.rs index 00a7714..602d0bb 100644 --- a/src/application.rs +++ b/src/application.rs @@ -167,11 +167,14 @@ mod tests { Input }; use action::Action; - + use config::Config; + use git_config::GitConfig; + #[test] fn application_read_all_actions() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let app = Application::new(gi, window); assert_eq!(app.git_interactive.get_lines().len(), 12); } @@ -179,7 +182,8 @@ mod tests { #[test] fn application_show_help() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('?'); app.process_input(); @@ -190,7 +194,8 @@ mod tests { fn application_show_commit() { // first commit in let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-show-commit.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('c'); app.process_input(); @@ -200,7 +205,8 @@ mod tests { #[test] fn application_scroll_basic() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-long.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::KeyDown; app.process_input(); @@ -219,7 +225,8 @@ mod tests { #[test] fn application_scroll_limits() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-short.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::KeyUp; app.process_input(); @@ -241,7 +248,8 @@ mod tests { #[test] fn application_set_pick() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); // first item is already pick app.window.window.next_char = Input::KeyDown; @@ -254,7 +262,8 @@ mod tests { #[test] fn application_set_reword() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('r'); app.process_input(); @@ -264,7 +273,8 @@ mod tests { #[test] fn application_set_edit() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('e'); app.process_input(); @@ -274,7 +284,8 @@ mod tests { #[test] fn application_set_squash() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('s'); app.process_input(); @@ -284,7 +295,8 @@ mod tests { #[test] fn application_set_drop() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('d'); app.process_input(); @@ -294,7 +306,8 @@ mod tests { #[test] fn application_swap_down() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('j'); app.process_input(); @@ -306,7 +319,8 @@ mod tests { #[test] fn application_swap_up() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::KeyDown; app.process_input(); @@ -320,7 +334,8 @@ mod tests { #[test] fn application_quit() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('Q'); app.process_input(); @@ -331,7 +346,8 @@ mod tests { #[test] fn application_finish() { let gi = GitInteractive::new_from_filepath("test/git-rebase-todo-all-actions.in", "#").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('W'); app.process_input(); @@ -342,7 +358,8 @@ mod tests { #[test] fn application_alternative_comment_character() { let gi = GitInteractive::new_from_filepath("test/git-rebase-alternative-comment-character.in", "%").unwrap(); - let window = Window::new(); + let config = Config::new(&GitConfig::new().unwrap()); + let window = Window::new(config); let mut app = Application::new(gi, window); app.window.window.next_char = Input::Character('W'); app.process_input(); diff --git a/src/color.rs b/src/color.rs new file mode 100644 index 0000000..80e6f5e --- /dev/null +++ b/src/color.rs @@ -0,0 +1,10 @@ +pub enum Color { + Black, + Blue, + Cyan, + Green, + Magenta, + Red, + White, + Yellow, +} diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..a880f9e --- /dev/null +++ b/src/config.rs @@ -0,0 +1,48 @@ +use color::Color; +use git_config::GitConfig; + +pub struct Config { + pub foreground_color: Color, + pub indicator_color: Color, + pub error_color: Color, + pub diff_add_color: Color, + pub diff_remove_color: Color, + pub pick_color: Color, + pub reword_color: Color, + pub edit_color: Color, + pub squash_color: Color, + pub fixup_color: Color, + pub drop_color: Color, +} + +fn string_to_color(color_string: &str, default_color: Color) -> Color { + match color_string { + "black" => Color::Black, + "blue" => Color::Blue, + "cyan" => Color::Cyan, + "green" => Color::Green, + "magenta" => Color::Magenta, + "red" => Color::Red, + "white" => Color::White, + "yellow" => Color::Yellow, + _ => default_color, + } +} + +impl Config { + pub fn new(git_config: &GitConfig) -> Self { + Config { + foreground_color: string_to_color(git_config.foreground_color.as_ref(), Color::White), + indicator_color: string_to_color(git_config.indicator_color.as_ref(), Color::Yellow), + error_color: string_to_color(git_config.error_color.as_ref(), Color::Red), + diff_add_color: string_to_color(git_config.diff_add_color.as_ref(), Color::Green), + diff_remove_color: string_to_color(git_config.diff_add_color.as_ref(), Color::Red), + pick_color: string_to_color(git_config.pick_color.as_ref(), Color::Green), + reword_color: string_to_color(git_config.reword_color.as_ref(), Color::Yellow), + edit_color: string_to_color(git_config.edit_color.as_ref(), Color::Blue), + squash_color: string_to_color(git_config.squash_color.as_ref(), Color::Cyan), + fixup_color: string_to_color(git_config.fixup_color.as_ref(), Color::Magenta), + drop_color: string_to_color(git_config.drop_color.as_ref(), Color::Red), + } + } +} diff --git a/src/git_config.rs b/src/git_config.rs index 2dd252f..ec5391d 100644 --- a/src/git_config.rs +++ b/src/git_config.rs @@ -5,6 +5,17 @@ use std::path::Path; pub struct GitConfig { pub comment_char: String, + pub foreground_color: String, + pub indicator_color: String, + pub error_color: String, + pub diff_add_color: String, + pub diff_remove_color: String, + pub pick_color: String, + pub reword_color: String, + pub edit_color: String, + pub squash_color: String, + pub fixup_color: String, + pub drop_color: String, } impl GitConfig { @@ -31,7 +42,51 @@ impl GitConfig { comment_char: match config.get_string("core.commentChar") { Ok(comment_char_value) => comment_char_value, Err(_msg) => String::from("#") - } + }, + foreground_color: match config.get_string("interactive-rebase-tool.foregroundColor") { + Ok(foreground_color_value) => foreground_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + indicator_color: match config.get_string("interactive-rebase-tool.indicatorColor") { + Ok(indicator_color_value) => indicator_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + error_color: match config.get_string("interactive-rebase-tool.errorColor") { + Ok(error_color_value) => error_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + diff_add_color: match config.get_string("interactive-rebase-tool.diffAddColor") { + Ok(diff_add_color_value) => diff_add_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + diff_remove_color: match config.get_string("interactive-rebase-tool.diffRemoveColor") { + Ok(diff_remove_color_value) => diff_remove_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + pick_color: match config.get_string("interactive-rebase-tool.pickColor") { + Ok(pick_color_value) => pick_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + reword_color: match config.get_string("interactive-rebase-tool.rewordColor") { + Ok(reword_color_value) => reword_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + edit_color: match config.get_string("interactive-rebase-tool.editColor") { + Ok(edit_color_value) => edit_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + squash_color: match config.get_string("interactive-rebase-tool.squashColor") { + Ok(squash_color_value) => squash_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + fixup_color: match config.get_string("interactive-rebase-tool.fixupColor") { + Ok(fixup_color_value) => fixup_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, + drop_color: match config.get_string("interactive-rebase-tool.dropColor") { + Ok(drop_color_value) => drop_color_value.to_lowercase(), + Err(_msg) => String::from("") + }, }) }, Err(msg) => { diff --git a/src/main.rs b/src/main.rs index 2fc1cee..15cd709 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,9 @@ extern crate pancurses; mod action; mod application; mod cli; +mod color; mod commit; +mod config; mod git_config; mod git_interactive; mod line; @@ -22,6 +24,7 @@ use git_config::GitConfig; use git_interactive::GitInteractive; use std::process; use window::Window; +use config::Config; fn main() { let matches = cli::build_cli().get_matches(); @@ -36,6 +39,8 @@ fn main() { } }; + let config = Config::new(&git_config); + let git_interactive = match GitInteractive::new_from_filepath(filepath, &git_config.comment_char) { Ok(gi) => gi, Err(msg) => { @@ -49,7 +54,7 @@ fn main() { process::exit(0); } - let window = Window::new(); + let window = Window::new(config); let mut application = Application::new(git_interactive, window); diff --git a/src/mocks.rs b/src/mocks.rs index 50d2099..42ca93f 100644 --- a/src/mocks.rs +++ b/src/mocks.rs @@ -1,6 +1,7 @@ pub mod mockcurses { pub use pancurses::{ + COLOR_BLACK, COLOR_WHITE, COLOR_YELLOW, COLOR_BLUE, diff --git a/src/window.rs b/src/window.rs index 7317cb5..2460f45 100644 --- a/src/window.rs +++ b/src/window.rs @@ -21,35 +21,28 @@ use action::{ use line::Line; use commit::Commit; +use color::Color; +use config::Config; -const COLOR_TABLE: [i16; 7] = [ - pancurses::COLOR_WHITE, - pancurses::COLOR_YELLOW, +const COLOR_TABLE: [i16; 8] = [ + pancurses::COLOR_BLACK, pancurses::COLOR_BLUE, - pancurses::COLOR_GREEN, pancurses::COLOR_CYAN, + pancurses::COLOR_GREEN, pancurses::COLOR_MAGENTA, - pancurses::COLOR_RED + pancurses::COLOR_RED, + pancurses::COLOR_WHITE, + pancurses::COLOR_YELLOW, ]; -pub enum Color { - White, - Yellow, - Blue, - Green, - Cyan, - Magenta, - Red -} - pub struct Window { + config: Config, pub window: pancurses::Window, top: usize } impl Window { - pub fn new() -> Self { - + pub fn new(config: Config) -> Self { let window = pancurses::initscr(); window.keypad(true); @@ -67,6 +60,7 @@ impl Window { Window { + config, window, top: 0 } @@ -100,7 +94,7 @@ impl Window { } fn draw_more_indicator(&self, remaining: usize) { - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); self.window.attron(pancurses::A_DIM); self.window.attron(pancurses::A_REVERSE); self.window.addstr(&format!(" -- {} -- ", remaining)); @@ -109,7 +103,7 @@ impl Window { } fn draw_title(&self) { - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); self.set_dim(true); self.set_underline(true); self.window.addstr("Git Interactive Rebase ? for help\n"); @@ -118,7 +112,7 @@ impl Window { } fn draw_line(&self, line: &Line, selected: bool) { - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); if selected { self.window.addstr(" > "); } @@ -126,20 +120,20 @@ impl Window { self.window.addstr(" "); } match *line.get_action() { - Action::Pick => self.set_color(&Color::Green), - Action::Reword => self.set_color(&Color::Yellow), - Action::Edit => self.set_color(&Color::Blue), - Action::Squash => self.set_color(&Color::Cyan), - Action::Fixup => self.set_color(&Color::Magenta), - Action::Drop => self.set_color(&Color::Red) + Action::Pick => self.set_color(&self.config.pick_color), + Action::Reword => self.set_color(&self.config.reword_color), + Action::Edit => self.set_color(&self.config.edit_color), + Action::Squash => self.set_color(&self.config.squash_color), + Action::Fixup => self.set_color(&self.config.fixup_color), + Action::Drop => self.set_color(&self.config.drop_color) } self.window.addstr(&format!("{:6}", action_to_str(line.get_action()))); - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); self.window.addstr(&format!(" {} {}\n", line.get_hash(), line.get_comment())); } fn draw_footer(&self) { - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); self.set_dim(true); self.window.mvaddstr( self.window.get_max_y() - 1, @@ -165,12 +159,12 @@ impl Window { self.draw_title(); match result { Ok(output) => { - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); match Commit::new(&String::from_utf8_lossy(&output.stdout)) { Ok(commit_data) => { - self.set_color(&Color::Yellow); + self.set_color(&self.config.indicator_color); self.window.addstr(&format!("\nCommit: {}\n", commit)); - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); self.window.addstr(&format!( "Author: {} <{}>\n", commit_data.get_author_name(), commit_data.get_author_email() )); @@ -195,32 +189,32 @@ impl Window { .fold(0, |a, x| cmp::max(a, x.get_added().len())); for file_stat in commit_data.get_file_stats() { - self.set_color(&Color::Green); + self.set_color(&self.config.diff_add_color); self.window.addstr( &file_stat.get_added().pad_to_width_with_alignment(max_add_change_length, Alignment::Right) ); - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); self.window.addstr(" | "); - self.set_color(&Color::Red); + self.set_color(&self.config.diff_remove_color); self.window.addstr( &file_stat.get_removed().pad_to_width_with_alignment(max_remove_change_length, Alignment::Left) ); - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); self.window.addstr(&format!(" {}\n", &file_stat.get_name())); } }, Err(msg) => { - self.set_color(&Color::Red); + self.set_color(&self.config.error_color); self.window.addstr(&msg); } } }, Err(msg) => { - self.set_color(&Color::Red); + self.set_color(&self.config.error_color); self.window.addstr(msg.description()); } } - self.set_color(&Color::Yellow); + self.set_color(&self.config.indicator_color); self.window.addstr("\n\nHit any key to close"); self.window.refresh(); } @@ -228,7 +222,7 @@ impl Window { pub fn draw_help(&self) { self.window.clear(); self.draw_title(); - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); self.window.addstr("\n Key Action\n"); self.window.addstr(" --------------------------------------------------\n"); self.draw_help_command("Up", "Move selection up"); @@ -249,26 +243,28 @@ impl Window { self.draw_help_command("s", "Set selected commit to be squashed"); self.draw_help_command("f", "Set selected commit to be fixed-up"); self.draw_help_command("d", "Set selected commit to be dropped"); + self.set_color(&self.config.indicator_color); self.window.addstr("\n\nHit any key to close help"); self.window.refresh(); } fn draw_help_command(&self, command: &str, help: &str) { - self.set_color(&Color::Blue); + self.set_color(&self.config.indicator_color); self.window.addstr(&format!(" {:9} ", command)); - self.set_color(&Color::White); + self.set_color(&self.config.foreground_color); self.window.addstr(&format!("{}\n", help)); } fn set_color(&self, color: &Color) { match *color { - Color::White => self.window.attrset(pancurses::COLOR_PAIR(0)), - Color::Yellow => self.window.attrset(pancurses::COLOR_PAIR(1)), - Color::Blue => self.window.attrset(pancurses::COLOR_PAIR(2)), + Color::Black => self.window.attrset(pancurses::COLOR_PAIR(0)), + Color::Blue => self.window.attrset(pancurses::COLOR_PAIR(1)), + Color::Cyan => self.window.attrset(pancurses::COLOR_PAIR(2)), Color::Green => self.window.attrset(pancurses::COLOR_PAIR(3)), - Color::Cyan => self.window.attrset(pancurses::COLOR_PAIR(4)), - Color::Magenta => self.window.attrset(pancurses::COLOR_PAIR(5)), - Color::Red => self.window.attrset(pancurses::COLOR_PAIR(6)) + Color::Magenta => self.window.attrset(pancurses::COLOR_PAIR(4)), + Color::Red => self.window.attrset(pancurses::COLOR_PAIR(5)), + Color::White => self.window.attrset(pancurses::COLOR_PAIR(6)), + Color::Yellow => self.window.attrset(pancurses::COLOR_PAIR(7)) }; } @@ -326,4 +322,3 @@ impl Window { pancurses::endwin(); } } - |