From 98485fcfec8edff271dd5df5413f6809cc003825 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Fri, 20 Aug 2021 12:39:19 -0700 Subject: Support `insteadOf` replacements in git remote URLs Use libgit2 to query remote URL instead of querying remote.origin.url directly. This has the consequence that `insteadOf` replacements are honored. See https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf Fixes #693 --- src/options/set.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'src') 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::(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 { + Some( + git_config + .repo + .as_ref()? + .find_remote("origin") + .ok()? + .url()? + .to_owned(), + ) +} + #[cfg(test)] pub mod tests { use std::fs::remove_file; -- cgit v1.2.3