diff options
Diffstat (limited to 'asyncgit/src/sync/remotes/mod.rs')
-rw-r--r-- | asyncgit/src/sync/remotes/mod.rs | 338 |
1 files changed, 169 insertions, 169 deletions
diff --git a/asyncgit/src/sync/remotes/mod.rs b/asyncgit/src/sync/remotes/mod.rs index 1366ad83..133c761c 100644 --- a/asyncgit/src/sync/remotes/mod.rs +++ b/asyncgit/src/sync/remotes/mod.rs @@ -5,11 +5,11 @@ pub(crate) mod push; pub(crate) mod tags; use crate::{ - error::{Error, Result}, - sync::{ - cred::BasicAuthCredential, - remotes::push::ProgressNotification, utils, - }, + error::{Error, Result}, + sync::{ + cred::BasicAuthCredential, + remotes::push::ProgressNotification, utils, + }, }; use crossbeam_channel::Sender; use git2::{BranchType, FetchOptions, Repository}; @@ -24,193 +24,193 @@ pub const DEFAULT_REMOTE_NAME: &str = "origin"; /// pub fn get_remotes(repo_path: &str) -> Result<Vec<String>> { - scope_time!("get_remotes"); + scope_time!("get_remotes"); - let repo = utils::repo(repo_path)?; - let remotes = repo.remotes()?; - let remotes: Vec<String> = - remotes.iter().flatten().map(String::from).collect(); + let repo = utils::repo(repo_path)?; + let remotes = repo.remotes()?; + let remotes: Vec<String> = + remotes.iter().flatten().map(String::from).collect(); - Ok(remotes) + Ok(remotes) } /// tries to find origin or the only remote that is defined if any /// in case of multiple remotes and none named *origin* we fail pub fn get_default_remote(repo_path: &str) -> Result<String> { - let repo = utils::repo(repo_path)?; - get_default_remote_in_repo(&repo) + let repo = utils::repo(repo_path)?; + get_default_remote_in_repo(&repo) } /// see `get_default_remote` pub(crate) fn get_default_remote_in_repo( - repo: &Repository, + repo: &Repository, ) -> Result<String> { - scope_time!("get_default_remote_in_repo"); - - let remotes = repo.remotes()?; - - // if `origin` exists return that - let found_origin = remotes.iter().any(|r| { - r.map(|r| r == DEFAULT_REMOTE_NAME).unwrap_or_default() - }); - if found_origin { - return Ok(DEFAULT_REMOTE_NAME.into()); - } - - //if only one remote exists pick that - if remotes.len() == 1 { - let first_remote = remotes - .iter() - .next() - .flatten() - .map(String::from) - .ok_or_else(|| { - Error::Generic("no remote found".into()) - })?; - - return Ok(first_remote); - } - - //inconclusive - Err(Error::NoDefaultRemoteFound) + scope_time!("get_default_remote_in_repo"); + + let remotes = repo.remotes()?; + + // if `origin` exists return that + let found_origin = remotes.iter().any(|r| { + r.map(|r| r == DEFAULT_REMOTE_NAME).unwrap_or_default() + }); + if found_origin { + return Ok(DEFAULT_REMOTE_NAME.into()); + } + + //if only one remote exists pick that + if remotes.len() == 1 { + let first_remote = remotes + .iter() + .next() + .flatten() + .map(String::from) + .ok_or_else(|| { + Error::Generic("no remote found".into()) + })?; + + return Ok(first_remote); + } + + //inconclusive + Err(Error::NoDefaultRemoteFound) } /// fetches from upstream/remote for `branch` pub(crate) fn fetch( - repo_path: &str, - branch: &str, - basic_credential: Option<BasicAuthCredential>, - progress_sender: Option<Sender<ProgressNotification>>, + repo_path: &str, + branch: &str, + basic_credential: Option<BasicAuthCredential>, + progress_sender: Option<Sender<ProgressNotification>>, ) -> Result<usize> { - scope_time!("fetch_origin"); + scope_time!("fetch_origin"); - let repo = utils::repo(repo_path)?; - let branch_ref = repo - .find_branch(branch, BranchType::Local)? - .into_reference(); - let branch_ref = bytes2string(branch_ref.name_bytes())?; - let remote_name = repo.branch_upstream_remote(&branch_ref)?; - let remote_name = bytes2string(&*remote_name)?; - let mut remote = repo.find_remote(&remote_name)?; + let repo = utils::repo(repo_path)?; + let branch_ref = repo + .find_branch(branch, BranchType::Local)? + .into_reference(); + let branch_ref = bytes2string(branch_ref.name_bytes())?; + let remote_name = repo.branch_upstream_remote(&branch_ref)?; + let remote_name = bytes2string(&*remote_name)?; + let mut remote = repo.find_remote(&remote_name)?; - let mut options = FetchOptions::new(); - let callbacks = Callbacks::new(progress_sender, basic_credential); - options.remote_callbacks(callbacks.callbacks()); + let mut options = FetchOptions::new(); + let callbacks = Callbacks::new(progress_sender, basic_credential); + options.remote_callbacks(callbacks.callbacks()); - remote.fetch(&[branch], Some(&mut options), None)?; + remote.fetch(&[branch], Some(&mut options), None)?; - Ok(remote.stats().received_bytes()) + Ok(remote.stats().received_bytes()) } #[cfg(test)] mod tests { - use super::*; - use crate::sync::tests::{ - debug_cmd_print, repo_clone, repo_init, - }; - - #[test] - fn test_smoke() { - let (remote_dir, _remote) = repo_init().unwrap(); - let remote_path = remote_dir.path().to_str().unwrap(); - let (repo_dir, _repo) = repo_clone(remote_path).unwrap(); - let repo_path = repo_dir.path().as_os_str().to_str().unwrap(); - - let remotes = get_remotes(repo_path).unwrap(); - - assert_eq!(remotes, vec![String::from("origin")]); - - fetch(repo_path, "master", None, None).unwrap(); - } - - #[test] - fn test_default_remote() { - let (remote_dir, _remote) = repo_init().unwrap(); - let remote_path = remote_dir.path().to_str().unwrap(); - let (repo_dir, _repo) = repo_clone(remote_path).unwrap(); - let repo_path = repo_dir.path().as_os_str().to_str().unwrap(); - - debug_cmd_print( - repo_path, - &format!("git remote add second {}", remote_path)[..], - ); - - let remotes = get_remotes(repo_path).unwrap(); - - assert_eq!( - remotes, - vec![String::from("origin"), String::from("second")] - ); - - let first = get_default_remote_in_repo( - &utils::repo(repo_path).unwrap(), - ) - .unwrap(); - assert_eq!(first, String::from("origin")); - } - - #[test] - fn test_default_remote_out_of_order() { - let (remote_dir, _remote) = repo_init().unwrap(); - let remote_path = remote_dir.path().to_str().unwrap(); - let (repo_dir, _repo) = repo_clone(remote_path).unwrap(); - let repo_path = repo_dir.path().as_os_str().to_str().unwrap(); - - debug_cmd_print( - repo_path, - "git remote rename origin alternate", - ); - - debug_cmd_print( - repo_path, - &format!("git remote add origin {}", remote_path)[..], - ); - - //NOTE: aparently remotes are not chronolically sorted but alphabetically - let remotes = get_remotes(repo_path).unwrap(); - - assert_eq!( - remotes, - vec![String::from("alternate"), String::from("origin")] - ); - - let first = get_default_remote_in_repo( - &utils::repo(repo_path).unwrap(), - ) - .unwrap(); - assert_eq!(first, String::from("origin")); - } - - #[test] - fn test_default_remote_inconclusive() { - let (remote_dir, _remote) = repo_init().unwrap(); - let remote_path = remote_dir.path().to_str().unwrap(); - let (repo_dir, _repo) = repo_clone(remote_path).unwrap(); - let repo_path = repo_dir.path().as_os_str().to_str().unwrap(); - - debug_cmd_print( - repo_path, - "git remote rename origin alternate", - ); - - debug_cmd_print( - repo_path, - &format!("git remote add someremote {}", remote_path)[..], - ); - - let remotes = get_remotes(repo_path).unwrap(); - assert_eq!( - remotes, - vec![ - String::from("alternate"), - String::from("someremote") - ] - ); - - let res = get_default_remote_in_repo( - &utils::repo(repo_path).unwrap(), - ); - assert_eq!(res.is_err(), true); - assert!(matches!(res, Err(Error::NoDefaultRemoteFound))); - } + use super::*; + use crate::sync::tests::{ + debug_cmd_print, repo_clone, repo_init, + }; + + #[test] + fn test_smoke() { + let (remote_dir, _remote) = repo_init().unwrap(); + let remote_path = remote_dir.path().to_str().unwrap(); + let (repo_dir, _repo) = repo_clone(remote_path).unwrap(); + let repo_path = repo_dir.path().as_os_str().to_str().unwrap(); + + let remotes = get_remotes(repo_path).unwrap(); + + assert_eq!(remotes, vec![String::from("origin")]); + + fetch(repo_path, "master", None, None).unwrap(); + } + + #[test] + fn test_default_remote() { + let (remote_dir, _remote) = repo_init().unwrap(); + let remote_path = remote_dir.path().to_str().unwrap(); + let (repo_dir, _repo) = repo_clone(remote_path).unwrap(); + let repo_path = repo_dir.path().as_os_str().to_str().unwrap(); + + debug_cmd_print( + repo_path, + &format!("git remote add second {}", remote_path)[..], + ); + + let remotes = get_remotes(repo_path).unwrap(); + + assert_eq!( + remotes, + vec![String::from("origin"), String::from("second")] + ); + + let first = get_default_remote_in_repo( + &utils::repo(repo_path).unwrap(), + ) + .unwrap(); + assert_eq!(first, String::from("origin")); + } + + #[test] + fn test_default_remote_out_of_order() { + let (remote_dir, _remote) = repo_init().unwrap(); + let remote_path = remote_dir.path().to_str().unwrap(); + let (repo_dir, _repo) = repo_clone(remote_path).unwrap(); + let repo_path = repo_dir.path().as_os_str().to_str().unwrap(); + + debug_cmd_print( + repo_path, + "git remote rename origin alternate", + ); + + debug_cmd_print( + repo_path, + &format!("git remote add origin {}", remote_path)[..], + ); + + //NOTE: aparently remotes are not chronolically sorted but alphabetically + let remotes = get_remotes(repo_path).unwrap(); + + assert_eq!( + remotes, + vec![String::from("alternate"), String::from("origin")] + ); + + let first = get_default_remote_in_repo( + &utils::repo(repo_path).unwrap(), + ) + .unwrap(); + assert_eq!(first, String::from("origin")); + } + + #[test] + fn test_default_remote_inconclusive() { + let (remote_dir, _remote) = repo_init().unwrap(); + let remote_path = remote_dir.path().to_str().unwrap(); + let (repo_dir, _repo) = repo_clone(remote_path).unwrap(); + let repo_path = repo_dir.path().as_os_str().to_str().unwrap(); + + debug_cmd_print( + repo_path, + "git remote rename origin alternate", + ); + + debug_cmd_print( + repo_path, + &format!("git remote add someremote {}", remote_path)[..], + ); + + let remotes = get_remotes(repo_path).unwrap(); + assert_eq!( + remotes, + vec![ + String::from("alternate"), + String::from("someremote") + ] + ); + + let res = get_default_remote_in_repo( + &utils::repo(repo_path).unwrap(), + ); + assert_eq!(res.is_err(), true); + assert!(matches!(res, Err(Error::NoDefaultRemoteFound))); + } } |