Fix SSH auth, fall back to file if agent fails
This commit is contained in:
25
src/repo.rs
25
src/repo.rs
@@ -1,7 +1,7 @@
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use git2::{Cred, RemoteCallbacks, Repository};
|
use git2::Repository;
|
||||||
|
|
||||||
use crate::output::*;
|
use crate::output::*;
|
||||||
|
|
||||||
@@ -1302,20 +1302,15 @@ fn get_remote_callbacks() -> git2::RemoteCallbacks<'static> {
|
|||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
});
|
});
|
||||||
callbacks.credentials(|_url, username_from_url, _allowed_types| {
|
|
||||||
let username = match username_from_url {
|
|
||||||
Some(username) => username,
|
|
||||||
None => panic!("Could not get username. This is a bug"),
|
|
||||||
};
|
|
||||||
git2::Cred::ssh_key_from_agent(username)
|
|
||||||
});
|
|
||||||
|
|
||||||
callbacks.credentials(|_url, username_from_url, _allowed_types| {
|
callbacks.credentials(|_url, username_from_url, _allowed_types| {
|
||||||
let username = match username_from_url {
|
let username = match username_from_url {
|
||||||
Some(username) => username,
|
Some(username) => username,
|
||||||
None => panic!("Could not get username. This is a bug"),
|
None => panic!("Could not get username. This is a bug"),
|
||||||
};
|
};
|
||||||
git2::Cred::ssh_key(username, None, &crate::env_home().join(".ssh/id_rsa"), None)
|
git2::Cred::ssh_key_from_agent(username).or_else(|_| {
|
||||||
|
git2::Cred::ssh_key(username, None, &crate::env_home().join(".ssh/id_rsa"), None)
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
callbacks
|
callbacks
|
||||||
@@ -1392,17 +1387,17 @@ pub fn clone_repo(
|
|||||||
match remote.remote_type {
|
match remote.remote_type {
|
||||||
RemoteType::Https | RemoteType::File => {
|
RemoteType::Https | RemoteType::File => {
|
||||||
let mut builder = git2::build::RepoBuilder::new();
|
let mut builder = git2::build::RepoBuilder::new();
|
||||||
|
|
||||||
|
let fetchopts = git2::FetchOptions::new();
|
||||||
|
|
||||||
builder.bare(is_worktree);
|
builder.bare(is_worktree);
|
||||||
|
builder.fetch_options(fetchopts);
|
||||||
|
|
||||||
builder.clone(&remote.url, &clone_target)?;
|
builder.clone(&remote.url, &clone_target)?;
|
||||||
}
|
}
|
||||||
RemoteType::Ssh => {
|
RemoteType::Ssh => {
|
||||||
let mut callbacks = RemoteCallbacks::new();
|
|
||||||
callbacks.credentials(|_url, username_from_url, _allowed_types| {
|
|
||||||
Cred::ssh_key_from_agent(username_from_url.unwrap())
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut fo = git2::FetchOptions::new();
|
let mut fo = git2::FetchOptions::new();
|
||||||
fo.remote_callbacks(callbacks);
|
fo.remote_callbacks(get_remote_callbacks());
|
||||||
|
|
||||||
let mut builder = git2::build::RepoBuilder::new();
|
let mut builder = git2::build::RepoBuilder::new();
|
||||||
builder.bare(is_worktree);
|
builder.bare(is_worktree);
|
||||||
|
|||||||
Reference in New Issue
Block a user