| use crate::util::CargoResult; |
| use cargo_util::ProcessBuilder; |
| use cargo_util::paths; |
| use std::path::Path; |
| |
| // Check if we are in an existing repo. We define that to be true if either: |
| // |
| // 1. We are in a git repo and the path to the new package is not an ignored |
| // path in that repo. |
| // 2. We are in an HG repo. |
| pub fn existing_vcs_repo(path: &Path, cwd: &Path) -> bool { |
| fn in_git_repo(path: &Path, cwd: &Path) -> bool { |
| if let Ok(repo) = GitRepo::discover(path, cwd) { |
| // Don't check if the working directory itself is ignored. |
| if repo.workdir().map_or(false, |workdir| workdir == path) { |
| true |
| } else { |
| !repo.is_path_ignored(path).unwrap_or(false) |
| } |
| } else { |
| false |
| } |
| } |
| |
| in_git_repo(path, cwd) || HgRepo::discover(path, cwd).is_ok() |
| } |
| |
| pub struct HgRepo; |
| pub struct GitRepo; |
| pub struct PijulRepo; |
| pub struct FossilRepo; |
| |
| impl GitRepo { |
| pub fn init(path: &Path, _: &Path) -> CargoResult<GitRepo> { |
| git2::Repository::init(path)?; |
| Ok(GitRepo) |
| } |
| pub fn discover(path: &Path, _: &Path) -> Result<git2::Repository, git2::Error> { |
| git2::Repository::discover(path) |
| } |
| } |
| |
| impl HgRepo { |
| pub fn init(path: &Path, cwd: &Path) -> CargoResult<HgRepo> { |
| ProcessBuilder::new("hg") |
| .cwd(cwd) |
| .arg("init") |
| .arg("--") |
| .arg(path) |
| .exec()?; |
| Ok(HgRepo) |
| } |
| pub fn discover(path: &Path, cwd: &Path) -> CargoResult<HgRepo> { |
| ProcessBuilder::new("hg") |
| .cwd(cwd) |
| .arg("--cwd") |
| .arg(path) |
| .arg("root") |
| .exec_with_output()?; |
| Ok(HgRepo) |
| } |
| } |
| |
| impl PijulRepo { |
| pub fn init(path: &Path, cwd: &Path) -> CargoResult<PijulRepo> { |
| ProcessBuilder::new("pijul") |
| .cwd(cwd) |
| .arg("init") |
| .arg("--") |
| .arg(path) |
| .exec()?; |
| Ok(PijulRepo) |
| } |
| } |
| |
| impl FossilRepo { |
| pub fn init(path: &Path, cwd: &Path) -> CargoResult<FossilRepo> { |
| // fossil doesn't create the directory so we'll do that first |
| paths::create_dir_all(path)?; |
| |
| // set up the paths we'll use |
| let db_fname = ".fossil"; |
| let mut db_path = path.to_owned(); |
| db_path.push(db_fname); |
| |
| // then create the fossil DB in that location |
| ProcessBuilder::new("fossil") |
| .cwd(cwd) |
| .arg("init") |
| .arg("--") |
| .arg(&db_path) |
| .exec()?; |
| |
| // open it in that new directory |
| ProcessBuilder::new("fossil") |
| .cwd(&path) |
| .arg("open") |
| .arg("--") |
| .arg(db_fname) |
| .exec()?; |
| |
| Ok(FossilRepo) |
| } |
| } |