diff options
Diffstat (limited to 'src/bin/git-autosave.rs')
| -rw-r--r-- | src/bin/git-autosave.rs | 100 |
1 files changed, 5 insertions, 95 deletions
diff --git a/src/bin/git-autosave.rs b/src/bin/git-autosave.rs index 3df94b6..64ffd67 100644 --- a/src/bin/git-autosave.rs +++ b/src/bin/git-autosave.rs @@ -1,105 +1,15 @@ -use std::path::Path; - -use auth_git2::{GitAuthenticator, Prompter}; -use git_autosave::{Config, commit_autosave, push_autosaves}; +use auth_git2::GitAuthenticator; +use git_autosave::{Config, authenticate::Inquirer, commit_autosave, push_autosaves}; use git2::{RemoteCallbacks, Repository}; -use inquire::{InquireError, PasswordDisplayMode}; - -#[derive(Default, Debug, Clone, PartialEq, Eq)] -struct Inquirer(Config); - -fn config_value(git_config: &git2::Config, name: &str) -> Option<String> { - git_config - .get_entry(name) - .ok() - .and_then(|entry| entry.value().map(|entry| entry.to_string())) -} - -fn prompt_secret(message: &str) -> Result<String, InquireError> { - inquire::Password::new(message) - .without_confirmation() - .with_display_mode(PasswordDisplayMode::Masked) - .prompt() -} - -impl Prompter for Inquirer { - fn prompt_username_password( - &mut self, - url: &str, - git_config: &git2::Config, - ) -> Option<(String, String)> { - let username = self - .0 - .username_for_url(url) - .cloned() - .or_else(|| config_value(git_config, "autosave.username")); - let password = self - .0 - .password_for_url(url) - .cloned() - .or_else(|| config_value(git_config, "autosave.password")); - if let Some(username) = username - && let Some(password) = password - { - return Some((username, password)); - } - - println!("Authenticating to {url}"); - let username = inquire::prompt_text("Username:").ok()?; - let password = prompt_secret("Password:").ok()?; - - Some((username, password)) - } - - fn prompt_password( - &mut self, - username: &str, - url: &str, - git_config: &git2::Config, - ) -> Option<String> { - let password = self - .0 - .password_for_url(url) - .cloned() - .or_else(|| config_value(git_config, "autosave.password")); - if let Some(password) = password { - return Some(password); - } - - println!("Authenticating to {url}"); - prompt_secret(&format!("Password for {username}:")).ok() - } - - fn prompt_ssh_key_passphrase( - &mut self, - private_key_path: &Path, - git_config: &git2::Config, - ) -> Option<String> { - let password = self - .0 - .passphrase_for_key(private_key_path) - .cloned() - .or_else(|| config_value(git_config, "autosave.password")); - if let Some(password) = password { - return Some(password); - } - - prompt_secret(&format!( - "Passphrase for {}:", - private_key_path.to_string_lossy() - )) - .ok() - } -} fn main() -> Result<(), anyhow::Error> { let repository = Repository::discover(".")?; let gitconfig = repository.config()?; - let mut config = git_autosave::load_config()?; + let config: &'static mut Config = Box::leak(Box::new(git_autosave::load_config()?)); if std::env::args().any(|arg| arg == "--init") { - git_autosave::init(&repository, Some(&mut config))?; - git_autosave::save_config(&config)?; + git_autosave::init(&repository, Some(config))?; + git_autosave::save_config(config)?; } let auth = GitAuthenticator::new().set_prompter(Inquirer(config)); |
