diff options
Diffstat (limited to 'src/options/set.rs')
-rw-r--r-- | src/options/set.rs | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/options/set.rs b/src/options/set.rs index 4fc0a1fd..c80be822 100644 --- a/src/options/set.rs +++ b/src/options/set.rs @@ -574,8 +574,13 @@ fn set_git_config_entries(opt: &mut cli::Opt, git_config: &mut GitConfig) { // Strings for key in &["remote.origin.url"] { - if let Some(string) = git_config.get::<String>(key) { - if let Ok(repo) = GitRemoteRepo::from_str(&string) { + // We use libgit2 Repository::find_remote() instead of using the value + // of remote.origin.url directly, in order that "insteadOf" replacements + // are honored. + // See https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf + // and #693 + if let Some(url) = get_remote_url(git_config) { + if let Ok(repo) = GitRemoteRepo::from_str(&url) { opt.git_config_entries .insert(key.to_string(), GitConfigEntry::GitRemote(repo)); } @@ -592,6 +597,18 @@ fn set_git_config_entries(opt: &mut cli::Opt, git_config: &mut GitConfig) { } } +fn get_remote_url(git_config: &GitConfig) -> Option<String> { + Some( + git_config + .repo + .as_ref()? + .find_remote("origin") + .ok()? + .url()? + .to_owned(), + ) +} + #[cfg(test)] pub mod tests { use std::fs::remove_file; |