diff options
author | Neil Kistner <neil.kistner@gmail.com> | 2019-09-09 18:14:38 -0500 |
---|---|---|
committer | Matan Kushner <hello@matchai.me> | 2019-09-09 19:14:38 -0400 |
commit | 9f70ffb7a7d2eeef64c360c553e909d38e44adf0 (patch) | |
tree | 4dccf8a935e027dcf7bc77781eed1554a645d72a /src/modules | |
parent | dc8409333e194624896c74c5e5cdb4f664f53f9d (diff) |
fix: Lazy load git repo and only run module if not disabled (#306)
A couple of optimizations are done in this PR. One, we now will check config ahead of time to see if a module is disabled before running any module code. Also, we won't try to discover a git repository unless the module requests access to it.
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/battery.rs | 2 | ||||
-rw-r--r-- | src/modules/character.rs | 2 | ||||
-rw-r--r-- | src/modules/cmd_duration.rs | 2 | ||||
-rw-r--r-- | src/modules/directory.rs | 6 | ||||
-rw-r--r-- | src/modules/git_branch.rs | 5 | ||||
-rw-r--r-- | src/modules/git_state.rs | 41 | ||||
-rw-r--r-- | src/modules/git_status.rs | 13 | ||||
-rw-r--r-- | src/modules/golang.rs | 2 | ||||
-rw-r--r-- | src/modules/hostname.rs | 2 | ||||
-rw-r--r-- | src/modules/jobs.rs | 2 | ||||
-rw-r--r-- | src/modules/line_break.rs | 2 | ||||
-rw-r--r-- | src/modules/nix_shell.rs | 2 | ||||
-rw-r--r-- | src/modules/nodejs.rs | 2 | ||||
-rw-r--r-- | src/modules/package.rs | 2 | ||||
-rw-r--r-- | src/modules/python.rs | 2 | ||||
-rw-r--r-- | src/modules/ruby.rs | 2 | ||||
-rw-r--r-- | src/modules/rust.rs | 2 | ||||
-rw-r--r-- | src/modules/username.rs | 2 |
18 files changed, 45 insertions, 48 deletions
diff --git a/src/modules/battery.rs b/src/modules/battery.rs index 47c9eee73..81edfbf0b 100644 --- a/src/modules/battery.rs +++ b/src/modules/battery.rs @@ -29,7 +29,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { } // TODO: Set style based on percentage when threshold is modifiable - let mut module = context.new_module("battery")?; + let mut module = context.new_module("battery"); let module_style = module .config_value_style("style") .unwrap_or_else(|| Color::Red.bold()); diff --git a/src/modules/character.rs b/src/modules/character.rs index 704fe5c9f..9385e53c9 100644 --- a/src/modules/character.rs +++ b/src/modules/character.rs @@ -20,7 +20,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { const ASSUMED_MODE: ShellEditMode = ShellEditMode::Insert; // TODO: extend config to more modes - let mut module = context.new_module("character")?; + let mut module = context.new_module("character"); module.get_prefix().set_value(""); let style_success = module diff --git a/src/modules/cmd_duration.rs b/src/modules/cmd_duration.rs index ac7102284..35a7e6858 100644 --- a/src/modules/cmd_duration.rs +++ b/src/modules/cmd_duration.rs @@ -7,7 +7,7 @@ use super::{Context, Module}; /// Will only print if last command took more than a certain amount of time to /// execute. Default is two seconds, but can be set by config option `min_time`. pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { - let mut module = context.new_module("cmd_duration")?; + let mut module = context.new_module("cmd_duration"); let arguments = &context.arguments; let elapsed = arguments diff --git a/src/modules/directory.rs b/src/modules/directory.rs index 952701262..096b07646 100644 --- a/src/modules/directory.rs +++ b/src/modules/directory.rs @@ -18,7 +18,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { const DIR_TRUNCATION_LENGTH: i64 = 3; const FISH_STYLE_PWD_DIR_LENGTH: i64 = 0; - let mut module = context.new_module("directory")?; + let mut module = context.new_module("directory"); let module_color = module .config_value_style("style") .unwrap_or_else(|| Color::Cyan.bold()); @@ -36,7 +36,9 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { let current_dir = &context.current_dir; log::debug!("Current directory: {:?}", current_dir); - let dir_string = match &context.repo_root { + let repo = &context.get_repo().ok()?; + + let dir_string = match &repo.root { Some(repo_root) if truncate_to_repo => { let repo_folder_name = repo_root.file_name().unwrap().to_str().unwrap(); diff --git a/src/modules/git_branch.rs b/src/modules/git_branch.rs index d6b64c4e0..6d07e8905 100644 --- a/src/modules/git_branch.rs +++ b/src/modules/git_branch.rs @@ -9,7 +9,7 @@ use super::{Context, Module}; pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { const GIT_BRANCH_CHAR: &str = "๎ "; - let mut module = context.new_module("git_branch")?; + let mut module = context.new_module("git_branch"); let segment_color = module .config_value_style("style") @@ -38,7 +38,8 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { } else { unsafe_truncation_length as usize }; - let branch_name = context.branch_name.as_ref()?; + let repo = context.get_repo().ok()?; + let branch_name = repo.branch.as_ref()?; let truncated_graphemes = get_graphemes(&branch_name, len); // The truncation symbol should only be added if we truncated let truncated_and_symbol = if len < graphemes_len(&branch_name) { diff --git a/src/modules/git_state.rs b/src/modules/git_state.rs index 8d242b0ca..c26a6007b 100644 --- a/src/modules/git_state.rs +++ b/src/modules/git_state.rs @@ -1,6 +1,6 @@ use ansi_term::Color; -use git2::{Repository, RepositoryState}; -use std::path::Path; +use git2::RepositoryState; +use std::path::{Path, PathBuf}; use super::{Context, Module}; @@ -9,11 +9,12 @@ use super::{Context, Module}; /// During a git operation it will show: REBASING, BISECTING, MERGING, etc. /// If the progress information is available (e.g. rebasing 3/10), it will show that too. pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { - let mut module = context.new_module("git_state")?; + let mut module = context.new_module("git_state"); - let repo_root = context.repo_root.as_ref()?; - let mut repository = Repository::open(repo_root).ok()?; - let state_description = get_state_description(&mut repository); + let repo = context.get_repo().ok()?; + let repo_root = repo.root.as_ref()?; + let repo_state = repo.state?; + let state_description = get_state_description(repo_state, repo_root); if let StateDescription::Clean = state_description { return None; @@ -79,8 +80,11 @@ static AM_OR_REBASE_LABEL: StateLabel = StateLabel { message_default: "AM/REBASE", }; -fn get_state_description(repository: &mut Repository) -> StateDescription { - match repository.state() { +/// Returns the state of the current repository +/// +/// During a git operation it will show: REBASING, BISECTING, MERGING, etc. +fn get_state_description(state: RepositoryState, root: &PathBuf) -> StateDescription { + match state { RepositoryState::Clean => StateDescription::Clean, RepositoryState::Merge => StateDescription::Label(&MERGE_LABEL), RepositoryState::Revert => StateDescription::Label(&REVERT_LABEL), @@ -90,13 +94,13 @@ fn get_state_description(repository: &mut Repository) -> StateDescription { RepositoryState::Bisect => StateDescription::Label(&BISECT_LABEL), RepositoryState::ApplyMailbox => StateDescription::Label(&AM_LABEL), RepositoryState::ApplyMailboxOrRebase => StateDescription::Label(&AM_OR_REBASE_LABEL), - RepositoryState::Rebase => describe_rebase(repository), - RepositoryState::RebaseInteractive => describe_rebase(repository), - RepositoryState::RebaseMerge => describe_rebase(repository), + RepositoryState::Rebase => describe_rebase(root), + RepositoryState::RebaseInteractive => describe_rebase(root), + RepositoryState::RebaseMerge => describe_rebase(root), } } -fn describe_rebase(repository: &mut Repository) -> StateDescription { +fn describe_rebase(root: &PathBuf) -> StateDescription { /* * Sadly, libgit2 seems to have some issues with reading the state of * interactive rebases. So, instead, we'll poke a few of the .git files @@ -107,18 +111,7 @@ fn describe_rebase(repository: &mut Repository) -> StateDescription { let just_label = StateDescription::Label(&REBASE_LABEL); - let dot_git = repository - .workdir() - .and_then(|d| Some(d.join(Path::new(".git")))); - - let dot_git = match dot_git { - None => { - // We didn't find the .git directory. - // Something very odd is going on. We'll just back away slowly. - return just_label; - } - Some(path) => path, - }; + let dot_git = root.join(".git"); let has_path = |relative_path: &str| { let path = dot_git.join(Path::new(relative_path)); diff --git a/src/modules/git_status.rs b/src/modules/git_status.rs index aa82fb739..badf0face 100644 --- a/src/modules/git_status.rs +++ b/src/modules/git_status.rs @@ -30,11 +30,12 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { const GIT_STATUS_RENAMED: &str = "ยป"; const GIT_STATUS_DELETED: &str = "โ"; - let branch_name = context.branch_name.as_ref()?; - let repo_root = context.repo_root.as_ref()?; + let repo = context.get_repo().ok()?; + let branch_name = repo.branch.as_ref()?; + let repo_root = repo.root.as_ref()?; let repository = Repository::open(repo_root).ok()?; - let mut module = context.new_module("git_status")?; + let mut module = context.new_module("git_status"); let show_sync_count = module.config_value_bool("show_sync_count").unwrap_or(false); let module_style = module .config_value_style("style") @@ -133,10 +134,10 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { } if module.is_empty() { - None - } else { - Some(module) + return None; } + + Some(module) } /// Gets the bitflags associated with the repo's git status diff --git a/src/modules/golang.rs b/src/modules/golang.rs index bf632bf72..4676f9e6d 100644 --- a/src/modules/golang.rs +++ b/src/modules/golang.rs @@ -29,7 +29,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { Some(go_version) => { const GO_CHAR: &str = "๐น "; - let mut module = context.new_module("golang")?; + let mut module = context.new_module("golang"); let module_style = module .config_value_style("style") .unwrap_or_else(|| Color::Cyan.bold()); diff --git a/src/modules/hostname.rs b/src/modules/hostname.rs index 9b0690d8f..d71f733fa 100644 --- a/src/modules/hostname.rs +++ b/src/modules/hostname.rs @@ -10,7 +10,7 @@ use std::ffi::OsString; /// - hostname.disabled is absent or false /// - hostname.ssh_only is false OR the user is currently connected as an SSH session (`$SSH_CONNECTION`) pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { - let mut module = context.new_module("hostname")?; + let mut module = context.new_module("hostname"); let module_style = module .config_value_style("style") .unwrap_or_else(|| Color::Green.bold().dimmed()); diff --git a/src/modules/jobs.rs b/src/modules/jobs.rs index bb8a2d7d4..8a667049e 100644 --- a/src/modules/jobs.rs +++ b/src/modules/jobs.rs @@ -4,7 +4,7 @@ use super::{Context, Module}; /// Creates a segment to show if there are any active jobs running pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { - let mut module = context.new_module("jobs")?; + let mut module = context.new_module("jobs"); let threshold = module.config_value_i64("threshold").unwrap_or(1); diff --git a/src/modules/line_break.rs b/src/modules/line_break.rs index 5cbe3a1a9..259e60877 100644 --- a/src/modules/line_break.rs +++ b/src/modules/line_break.rs @@ -4,7 +4,7 @@ use super::{Context, Module}; pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { const LINE_ENDING: &str = "\n"; - let mut module = context.new_module("line_break")?; + let mut module = context.new_module("line_break"); module.get_prefix().set_value(""); module.get_suffix().set_value(""); diff --git a/src/modules/nix_shell.rs b/src/modules/nix_shell.rs index 5fc98dfc9..36228993d 100644 --- a/src/modules/nix_shell.rs +++ b/src/modules/nix_shell.rs @@ -22,7 +22,7 @@ use super::{Context, Module}; /// - pure // use_name == false in a pure nix-shell /// - impure // use_name == false in an impure nix-shell pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { - let mut module = context.new_module("nix_shell")?; + let mut module = context.new_module("nix_shell"); env::var("IN_NIX_SHELL") .ok() diff --git a/src/modules/nodejs.rs b/src/modules/nodejs.rs index 8f8219c7a..180e143ff 100644 --- a/src/modules/nodejs.rs +++ b/src/modules/nodejs.rs @@ -25,7 +25,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { Some(node_version) => { const NODE_CHAR: &str = "โฌข "; - let mut module = context.new_module("nodejs")?; + let mut module = context.new_module("nodejs"); let module_style = module .config_value_style("style") .unwrap_or_else(|| Color::Green.bold()); diff --git a/src/modules/package.rs b/src/modules/package.rs index ceb34bc6c..0debe162d 100644 --- a/src/modules/package.rs +++ b/src/modules/package.rs @@ -13,7 +13,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { Some(package_version) => { const PACKAGE_CHAR: &str = "๐ฆ "; - let mut module = context.new_module("package")?; + let mut module = context.new_module("package"); let module_style = module .config_value_style("style") .unwrap_or_else(|| Color::Red.bold()); diff --git a/src/modules/python.rs b/src/modules/python.rs index 61d8189db..487d033d5 100644 --- a/src/modules/python.rs +++ b/src/modules/python.rs @@ -30,7 +30,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { return None; } - let mut module = context.new_module("python")?; + let mut module = context.new_module("python"); let pyenv_version_name = module .config_value_bool("pyenv_version_name") .unwrap_or(false); diff --git a/src/modules/ruby.rs b/src/modules/ruby.rs index a39bda75c..7e689234d 100644 --- a/src/modules/ruby.rs +++ b/src/modules/ruby.rs @@ -23,7 +23,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { Some(ruby_version) => { const RUBY_CHAR: &str = "๐ "; - let mut module = context.new_module("ruby")?; + let mut module = context.new_module("ruby"); let module_style = module .config_value_style("style") .unwrap_or_else(|| Color::Red.bold()); diff --git a/src/modules/rust.rs b/src/modules/rust.rs index 401f6e4ce..26ee377c9 100644 --- a/src/modules/rust.rs +++ b/src/modules/rust.rs @@ -23,7 +23,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { Some(rust_version) => { const RUST_CHAR: &str = "๐ฆ "; - let mut module = context.new_module("rust")?; + let mut module = context.new_module("rust"); let module_style = module .config_value_style("style") .unwrap_or_else(|| Color::Red.bold()); diff --git a/src/modules/username.rs b/src/modules/username.rs index 07ecc5b14..c27896987 100644 --- a/src/modules/username.rs +++ b/src/modules/username.rs @@ -18,7 +18,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { const ROOT_UID: Option<u32> = Some(0); let user_uid = get_uid(); if user != logname || ssh_connection.is_some() || user_uid == ROOT_UID { - let mut module = context.new_module("username")?; + let mut module = context.new_module("username"); let module_style = get_mod_style(user_uid, &module); module.set_style(module_style); module.new_segment("username", &user?); |