mirror of
https://github.com/Llewellynvdm/starship.git
synced 2024-11-28 15:56:28 +00:00
178f177dac
perf: don't use hg process to get branch / bookmark information, each call was taking 250ms and it was making on average 2 calls. the branch and bookmark information is available in files in the root of the repo, use that instead. now takes 300 micro seconds fix: do not use .hgignore to decide if it is an hg repo. was providing false positives. #721 fix: after changing branch the new branch was not show (the old branch was shown), the new branch is now correctly shown. #722 fix: if no branch override was set it would say (no branch) however if you commited in that state you would commit to the branch default so say that instead
79 lines
2.4 KiB
Rust
79 lines
2.4 KiB
Rust
use unicode_segmentation::UnicodeSegmentation;
|
|
|
|
use super::{Context, Module, RootModuleConfig};
|
|
|
|
use crate::configs::hg_branch::HgBranchConfig;
|
|
|
|
/// Creates a module with the Hg bookmark or branch in the current directory
|
|
///
|
|
/// Will display the bookmark or branch name if the current directory is an hg repo
|
|
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
|
|
let is_hg_repo = context.try_begin_scan()?.set_folders(&[".hg"]).is_match();
|
|
|
|
if !is_hg_repo {
|
|
return None;
|
|
}
|
|
|
|
let mut module = context.new_module("hg_branch");
|
|
let config = HgBranchConfig::try_load(module.config);
|
|
module.set_style(config.style);
|
|
|
|
module.get_prefix().set_value("on ");
|
|
|
|
module.create_segment("symbol", &config.symbol);
|
|
|
|
// TODO: Once error handling is implemented, warn the user if their config
|
|
// truncation length is nonsensical
|
|
let len = if config.truncation_length <= 0 {
|
|
log::warn!(
|
|
"\"truncation_length\" should be a positive value, found {}",
|
|
config.truncation_length
|
|
);
|
|
std::usize::MAX
|
|
} else {
|
|
config.truncation_length as usize
|
|
};
|
|
|
|
let branch_name =
|
|
get_hg_current_bookmark(context).unwrap_or_else(|| get_hg_branch_name(context));
|
|
|
|
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) {
|
|
let truncation_symbol = get_graphemes(config.truncation_symbol, 1);
|
|
truncated_graphemes + &truncation_symbol
|
|
} else {
|
|
truncated_graphemes
|
|
};
|
|
|
|
module.create_segment(
|
|
"name",
|
|
&config.branch_name.with_value(&truncated_and_symbol),
|
|
);
|
|
|
|
Some(module)
|
|
}
|
|
|
|
fn get_hg_branch_name(ctx: &Context) -> String {
|
|
std::fs::read_to_string(ctx.current_dir.join(".hg").join("branch"))
|
|
.map(|s| s.trim().into())
|
|
.unwrap_or_else(|_| "default".to_string())
|
|
}
|
|
|
|
fn get_hg_current_bookmark(ctx: &Context) -> Option<String> {
|
|
std::fs::read_to_string(ctx.current_dir.join(".hg").join("bookmarks.current"))
|
|
.map(|s| s.trim().into())
|
|
.ok()
|
|
}
|
|
|
|
fn get_graphemes(text: &str, length: usize) -> String {
|
|
UnicodeSegmentation::graphemes(text, true)
|
|
.take(length)
|
|
.collect::<Vec<&str>>()
|
|
.concat()
|
|
}
|
|
|
|
fn graphemes_len(text: &str) -> usize {
|
|
UnicodeSegmentation::graphemes(&text[..], true).count()
|
|
}
|