use anyhow::{Context, Result}; use ngit::{ git::remove_git_config_item, login::{SignerInfoSource, existing::load_existing_login}, }; use crate::{ git::Repo, sub_commands::login::{format_items_as_list, get_global_login_config_items_set}, }; pub async fn launch() -> Result<()> { let git_repo_result = Repo::discover().context("failed to find a git repository"); let git_repo = { git_repo_result.ok() }; logout(git_repo.as_ref()).await } async fn logout(git_repo: Option<&Repo>) -> Result<()> { for source in if std::env::var("NGITTEST").is_ok() { vec![SignerInfoSource::GitLocal] } else { vec![SignerInfoSource::GitLocal, SignerInfoSource::GitGlobal] } { if let Ok((_, user_ref, source)) = load_existing_login( &git_repo, &None, &None, &Some(source), None, true, false, false, ) .await { for item in [ "nostr.nsec", "nostr.npub", "nostr.bunker-uri", "nostr.bunker-app-key", ] { if let Err(error) = remove_git_config_item( if source == SignerInfoSource::GitLocal { &git_repo } else { &None }, item, ) { println!( "failed to log out {}as {}", if source == SignerInfoSource::GitLocal { "from local git repository " } else { "" }, user_ref.metadata.name ); eprintln!("{error:?}"); eprintln!( "consider manually removing {} git config items: {}", if source == SignerInfoSource::GitGlobal { "global" } else { "local" }, format_items_as_list(&get_global_login_config_items_set()) ); return Ok(()); } } println!( "logged out {}as {}", if source == SignerInfoSource::GitLocal { "from local git repository " } else { "" }, user_ref.metadata.name ); return Ok(()); } } Ok(()) }