summaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorNeil Kistner <neil.kistner@gmail.com>2019-09-09 18:14:38 -0500
committerMatan Kushner <hello@matchai.me>2019-09-09 19:14:38 -0400
commit9f70ffb7a7d2eeef64c360c553e909d38e44adf0 (patch)
tree4dccf8a935e027dcf7bc77781eed1554a645d72a /src/modules
parentdc8409333e194624896c74c5e5cdb4f664f53f9d (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.rs2
-rw-r--r--src/modules/character.rs2
-rw-r--r--src/modules/cmd_duration.rs2
-rw-r--r--src/modules/directory.rs6
-rw-r--r--src/modules/git_branch.rs5
-rw-r--r--src/modules/git_state.rs41
-rw-r--r--src/modules/git_status.rs13
-rw-r--r--src/modules/golang.rs2
-rw-r--r--src/modules/hostname.rs2
-rw-r--r--src/modules/jobs.rs2
-rw-r--r--src/modules/line_break.rs2
-rw-r--r--src/modules/nix_shell.rs2
-rw-r--r--src/modules/nodejs.rs2
-rw-r--r--src/modules/package.rs2
-rw-r--r--src/modules/python.rs2
-rw-r--r--src/modules/ruby.rs2
-rw-r--r--src/modules/rust.rs2
-rw-r--r--src/modules/username.rs2
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?);