summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/application.rs49
-rw-r--r--src/color.rs10
-rw-r--r--src/config.rs48
-rw-r--r--src/git_config.rs57
-rw-r--r--src/main.rs7
-rw-r--r--src/mocks.rs1
-rw-r--r--src/window.rs91
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();
}
}
-