use std::collections::BTreeMap;
use crate::{error::Error, repo::GitRepository};
pub type GitConfig = BTreeMap<String, String>;
pub const USER_EMAIL: &str = "user.email";
pub const USER_NAME: &str = "user.name";
pub fn get_config(repo: &GitRepository) -> Result<GitConfig, Error> {
let git2_cfg = repo.config().unwrap();
let mut cfg = BTreeMap::new();
git2_cfg.entries(None).into_iter().for_each(|entries| {
entries
.for_each(|entry| {
let name = entry.name().unwrap().to_string();
let value = entry.value().unwrap_or("").to_string();
cfg.insert(name, value);
})
.unwrap();
});
Ok(cfg)
}
pub fn get_origin_url(repo: &GitRepository, origin_name: &str) -> Result<Option<String>, Error> {
let cfg = get_config(repo)?;
let key = format!("remote.{}.url", origin_name);
Ok(cfg.get(key.as_str()).map(|s| s.to_string()))
}
#[cfg(test)]
mod tests {
use crate::repo::discover_repo;
use super::*;
#[test]
fn test_cfg() {
let cwd = std::env::current_dir().unwrap();
let repo = discover_repo(&cwd).unwrap();
let cfg = get_config(&repo).unwrap();
for (k, v) in cfg.iter() {
eprintln!("{}: {}", k, v);
}
}
}