use git_next_config::{ BranchName, ForgeConfig, ForgeDetails, ForgeName, GitDir, RepoAlias, RepoConfig, RepoPath, ServerRepoConfig, }; use super::{Generation, GitRemote}; /// The derived information about a repo, used to interact with it #[derive(Clone, Debug, derive_more::Display)] #[display("gen-{}:{}:{}/{}:{}@{}/{}@{}", generation, forge.forge_type(), forge.forge_name(), repo_alias, forge.user(), forge.hostname(), repo_path, branch)] pub struct RepoDetails { pub generation: Generation, pub repo_alias: RepoAlias, pub repo_path: RepoPath, pub branch: BranchName, pub forge: ForgeDetails, pub repo_config: Option, pub gitdir: GitDir, } impl RepoDetails { pub fn new( generation: Generation, repo_alias: &RepoAlias, server_repo_config: &ServerRepoConfig, forge_name: &ForgeName, forge_config: &ForgeConfig, gitdir: GitDir, ) -> Self { Self { generation, repo_alias: repo_alias.clone(), repo_path: server_repo_config.repo(), repo_config: server_repo_config.repo_config(), branch: server_repo_config.branch(), gitdir, forge: ForgeDetails::new( forge_name.clone(), forge_config.forge_type(), forge_config.hostname(), forge_config.user(), forge_config.token(), ), } } pub fn origin(&self) -> secrecy::Secret { let repo_details = self; let user = &repo_details.forge.user(); let hostname = &repo_details.forge.hostname(); let repo_path = &repo_details.repo_path; let expose_secret = repo_details.forge.token(); use secrecy::ExposeSecret; let token = expose_secret.expose_secret(); let origin = format!("https://{user}:{token}@{hostname}/{repo_path}.git"); origin.into() } pub fn git_remote(&self) -> GitRemote { GitRemote::new(self.forge.hostname().clone(), self.repo_path.clone()) } }