diff --git a/e2e_tests/test_repos_find_remote.py b/e2e_tests/test_repos_find_remote.py index 0ada999..f0f37cf 100644 --- a/e2e_tests/test_repos_find_remote.py +++ b/e2e_tests/test_repos_find_remote.py @@ -248,6 +248,7 @@ def test_repos_find_remote_user_empty( @pytest.mark.parametrize("force_ssh", [True, False]) @pytest.mark.parametrize("use_alternate_endpoint", [True, False]) @pytest.mark.parametrize("use_config", [True, False]) +@pytest.mark.parametrize("override_remote_name", [True, False]) def test_repos_find_remote_user( provider, configtype, @@ -258,6 +259,7 @@ def test_repos_find_remote_user( force_ssh, use_alternate_endpoint, use_config, + override_remote_name, ): if use_config: with tempfile.NamedTemporaryFile() as config: @@ -274,6 +276,8 @@ def test_repos_find_remote_user( cfg += f"worktree = {str(worktree).lower()}\n" if force_ssh: cfg += f"force_ssh = true\n" + if override_remote_name: + cfg += f'remote_name = "otherremote"\n' if use_owner: cfg += """ [filters] @@ -310,6 +314,8 @@ def test_repos_find_remote_user( args += ["--user", "myuser1"] if force_ssh: args += ["--force-ssh"] + if override_remote_name: + args += ["--remote-name", "otherremote"] if not worktree_default: args += ["--worktree", str(worktree).lower()] if use_alternate_endpoint: @@ -350,7 +356,10 @@ def test_repos_find_remote_user( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + if override_remote_name: + assert repo["remotes"][0]["name"] == "otherremote" + else: + assert repo["remotes"][0]["name"] == provider if force_ssh or i == 1: assert ( repo["remotes"][0]["url"] diff --git a/src/config.rs b/src/config.rs index f8e9464..2858050 100644 --- a/src/config.rs +++ b/src/config.rs @@ -53,6 +53,8 @@ pub struct ConfigProvider { pub worktree: Option, pub init_worktree: Option, + + pub remote_name: Option, } #[derive(Debug, Serialize, Deserialize)] @@ -192,6 +194,7 @@ impl Config { .get_repos( config.worktree.unwrap_or(false), config.force_ssh.unwrap_or(false), + config.remote_name, )? } RemoteProvider::Gitlab => { @@ -205,6 +208,7 @@ impl Config { .get_repos( config.worktree.unwrap_or(false), config.force_ssh.unwrap_or(false), + config.remote_name, )? } }; diff --git a/src/grm/cmd.rs b/src/grm/cmd.rs index 593474b..178f28e 100644 --- a/src/grm/cmd.rs +++ b/src/grm/cmd.rs @@ -103,6 +103,9 @@ pub struct FindRemoteArgs { #[clap(arg_enum, short, long, help = "Remote provider to use")] pub provider: RemoteProvider, + #[clap(short, long, help = "Name of the remote to use")] + pub remote_name: Option, + #[clap( multiple_occurrences = true, name = "user", @@ -189,6 +192,9 @@ pub struct SyncRemoteArgs { #[clap(arg_enum, short, long, help = "Remote provider to use")] pub provider: RemoteProvider, + #[clap(short, long, help = "Name of the remote to use")] + pub remote_name: Option, + #[clap( multiple_occurrences = true, name = "user", diff --git a/src/grm/main.rs b/src/grm/main.rs index ebf9b1f..6c7ab86 100644 --- a/src/grm/main.rs +++ b/src/grm/main.rs @@ -64,7 +64,11 @@ fn main() { process::exit(1); } } - .get_repos(worktree, args.force_ssh) + .get_repos( + worktree, + args.force_ssh, + args.remote_name, + ) } cmd::RemoteProvider::Gitlab => { match provider::Gitlab::new(filter, token, args.api_url) { @@ -74,7 +78,11 @@ fn main() { process::exit(1); } } - .get_repos(worktree, args.force_ssh) + .get_repos( + worktree, + args.force_ssh, + args.remote_name, + ) } }; @@ -280,6 +288,7 @@ fn main() { .get_repos( config.worktree.unwrap_or(false), config.force_ssh.unwrap_or(false), + config.remote_name, ) { Ok(provider) => provider, Err(error) => { @@ -299,6 +308,7 @@ fn main() { .get_repos( config.worktree.unwrap_or(false), config.force_ssh.unwrap_or(false), + config.remote_name, ) { Ok(provider) => provider, Err(error) => { @@ -382,7 +392,11 @@ fn main() { process::exit(1); } } - .get_repos(worktree, args.force_ssh) + .get_repos( + worktree, + args.force_ssh, + args.remote_name, + ) } cmd::RemoteProvider::Gitlab => { match provider::Gitlab::new(filter, token, args.api_url) { @@ -392,7 +406,11 @@ fn main() { process::exit(1); } } - .get_repos(worktree, args.force_ssh) + .get_repos( + worktree, + args.force_ssh, + args.remote_name, + ) } }; diff --git a/src/provider/mod.rs b/src/provider/mod.rs index da72500..cbf4007 100644 --- a/src/provider/mod.rs +++ b/src/provider/mod.rs @@ -213,6 +213,7 @@ pub trait Provider { &self, worktree_setup: bool, force_ssh: bool, + remote_name: Option, ) -> Result, Vec>, String> { let mut repos = vec![]; @@ -292,10 +293,12 @@ pub trait Provider { let mut ret: HashMap, Vec> = HashMap::new(); + let remote_name = remote_name.unwrap_or_else(|| self.name().to_string()); + for repo in repos { let namespace = repo.namespace(); - let mut repo = repo.into_repo_config(self.name(), worktree_setup, force_ssh); + let mut repo = repo.into_repo_config(&remote_name, worktree_setup, force_ssh); // Namespace is already part of the hashmap key. I'm not too happy // about the data exchange format here.