diff --git a/src/info.rs b/src/info.rs index b40f9ce3f..d2b1cef41 100644 --- a/src/info.rs +++ b/src/info.rs @@ -292,10 +292,10 @@ impl Info { let workdir = repo.workdir().ok_or(Error::BareGitRepo)?; let workdir_str = workdir.to_str().unwrap(); + let config = Info::get_configuration(&repo)?; + let current_commit_info = Info::get_current_commit_info(&repo)?; let authors = Info::get_authors(workdir_str, no_merges, 3); let (git_v, git_user) = Info::get_git_info(workdir_str); - let current_commit_info = Info::get_current_commit_info(&repo)?; - let config = Info::get_configuration(&repo)?; let version = Info::get_version(workdir_str)?; let commits = Info::get_commits(workdir_str, no_merges)?; let repo_size = Info::get_packed_size(workdir_str)?; @@ -329,6 +329,66 @@ impl Info { }) } + fn get_configuration(repo: &Repository) -> Result { + let config = repo.config().map_err(|_| Error::NoGitData)?; + let mut remote_url = String::new(); + let mut repository_name = String::new(); + let mut remote_upstream: Option = None; + + for entry in &config.entries(None).unwrap() { + let entry = entry.unwrap(); + match entry.name().unwrap() { + "remote.origin.url" => remote_url = entry.value().unwrap().to_string(), + "remote.upstream.url" => remote_upstream = Some(entry.value().unwrap().to_string()), + _ => (), + } + } + + if let Some(url) = remote_upstream { + remote_url = url.clone(); + } + + let url = remote_url.clone(); + let name_parts: Vec<&str> = url.split('/').collect(); + + if !name_parts.is_empty() { + repository_name = name_parts[name_parts.len() - 1].to_string(); + } + + if repository_name.contains(".git") { + let repo_name = repository_name.clone(); + let parts: Vec<&str> = repo_name.split(".git").collect(); + repository_name = parts[0].to_string(); + } + + Ok(Configuration { + repository_name: repository_name.clone(), + repository_url: name_parts.join("/"), + }) + } + + fn get_current_commit_info(repo: &Repository) -> Result { + let head = repo.head().map_err(|_| Error::ReferenceInfoError)?; + let head_oid = head.target().ok_or(Error::ReferenceInfoError)?; + let refs = repo.references().map_err(|_| Error::ReferenceInfoError)?; + let refs_info = refs + .filter_map(|reference| match reference { + Ok(reference) => match (reference.target(), reference.shorthand()) { + (Some(oid), Some(shorthand)) if oid == head_oid => { + Some(if reference.is_tag() { + String::from("tags/") + shorthand + } else { + String::from(shorthand) + }) + } + _ => None, + }, + Err(_) => None, + }) + .collect::>(); + Ok(CommitInfo::new(head_oid, refs_info)) + } + // Return first n most active commiters as authors within this project. fn get_authors(dir: &str, no_merges: bool, n: usize) -> Vec<(String, usize, usize)> { let mut args = vec!["-C", dir, "log", "--format='%aN'"]; @@ -394,66 +454,6 @@ impl Info { (version, username) } - fn get_current_commit_info(repo: &Repository) -> Result { - let head = repo.head().map_err(|_| Error::ReferenceInfoError)?; - let head_oid = head.target().ok_or(Error::ReferenceInfoError)?; - let refs = repo.references().map_err(|_| Error::ReferenceInfoError)?; - let refs_info = refs - .filter_map(|reference| match reference { - Ok(reference) => match (reference.target(), reference.shorthand()) { - (Some(oid), Some(shorthand)) if oid == head_oid => { - Some(if reference.is_tag() { - String::from("tags/") + shorthand - } else { - String::from(shorthand) - }) - } - _ => None, - }, - Err(_) => None, - }) - .collect::>(); - Ok(CommitInfo::new(head_oid, refs_info)) - } - - fn get_configuration(repo: &Repository) -> Result { - let config = repo.config().map_err(|_| Error::NoGitData)?; - let mut remote_url = String::new(); - let mut repository_name = String::new(); - let mut remote_upstream: Option = None; - - for entry in &config.entries(None).unwrap() { - let entry = entry.unwrap(); - match entry.name().unwrap() { - "remote.origin.url" => remote_url = entry.value().unwrap().to_string(), - "remote.upstream.url" => remote_upstream = Some(entry.value().unwrap().to_string()), - _ => (), - } - } - - if let Some(url) = remote_upstream { - remote_url = url.clone(); - } - - let url = remote_url.clone(); - let name_parts: Vec<&str> = url.split('/').collect(); - - if !name_parts.is_empty() { - repository_name = name_parts[name_parts.len() - 1].to_string(); - } - - if repository_name.contains(".git") { - let repo_name = repository_name.clone(); - let parts: Vec<&str> = repo_name.split(".git").collect(); - repository_name = parts[0].to_string(); - } - - Ok(Configuration { - repository_name: repository_name.clone(), - repository_url: name_parts.join("/"), - }) - } - fn get_version(dir: &str) -> Result { let output = Command::new("git") .arg("-C")