feat(git_status): dont render module output if not in git repository (#2897)

* refactor get_repo method to not swallow error

* module git status don't render if not in git repository
This commit is contained in:
filip 2021-08-14 15:19:43 +02:00 committed by GitHub
parent fe42ec94bc
commit 3139c6b8a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 26 deletions

View File

@ -221,31 +221,20 @@ impl<'a> Context<'a> {
} }
/// Will lazily get repo root and branch when a module requests it. /// Will lazily get repo root and branch when a module requests it.
pub fn get_repo(&self) -> Result<&Repo, std::io::Error> { pub fn get_repo(&self) -> Result<&Repo, git2::Error> {
self.repo self.repo.get_or_try_init(|| -> Result<Repo, git2::Error> {
.get_or_try_init(|| -> Result<Repo, std::io::Error> { let repository = if env::var("GIT_DIR").is_ok() {
let repository = if env::var("GIT_DIR").is_ok() { Repository::open_from_env()
Repository::open_from_env().ok() } else {
} else { Repository::discover(&self.current_dir)
Repository::discover(&self.current_dir).ok() }?;
}; Ok(Repo {
let branch = repository branch: get_current_branch(&repository),
.as_ref() root: repository.workdir().map(Path::to_path_buf),
.and_then(|repo| get_current_branch(repo)); state: repository.state(),
let root = repository remote: get_remote_repository_info(&repository),
.as_ref()
.and_then(|repo| repo.workdir().map(Path::to_path_buf));
let state = repository.as_ref().map(git2::Repository::state);
let remote = repository
.as_ref()
.and_then(|repo| get_remote_repository_info(repo));
Ok(Repo {
branch,
root,
state,
remote,
})
}) })
})
} }
pub fn dir_contents(&self) -> Result<&DirContents, std::io::Error> { pub fn dir_contents(&self) -> Result<&DirContents, std::io::Error> {
@ -397,7 +386,7 @@ pub struct Repo {
pub root: Option<PathBuf>, pub root: Option<PathBuf>,
/// State /// State
pub state: Option<RepositoryState>, pub state: RepositoryState,
/// Remote repository /// Remote repository
pub remote: Option<Remote>, pub remote: Option<Remote>,

View File

@ -15,7 +15,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
let repo = context.get_repo().ok()?; let repo = context.get_repo().ok()?;
let repo_root = repo.root.as_ref()?; let repo_root = repo.root.as_ref()?;
let repo_state = repo.state?; let repo_state = repo.state;
let state_description = get_state_description(repo_state, repo_root, &config)?; let state_description = get_state_description(repo_state, repo_root, &config)?;

View File

@ -31,6 +31,9 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
let mut module = context.new_module("git_status"); let mut module = context.new_module("git_status");
let config: GitStatusConfig = GitStatusConfig::try_load(module.config); let config: GitStatusConfig = GitStatusConfig::try_load(module.config);
//Return None if not in git repository
context.get_repo().ok()?;
let parsed = StringFormatter::new(config.format).and_then(|formatter| { let parsed = StringFormatter::new(config.format).and_then(|formatter| {
formatter formatter
.map_meta(|variable, _| match variable { .map_meta(|variable, _| match variable {