git-clone-canonical 0.1.5

Clone git repositories into a local path derived from the URL.
Documentation
use crate::{get_repo_path, git, log_init, BaseDir, Error, Result, Url};
use std::path::PathBuf;

pub fn clone(basedir: BaseDir, url: Url) -> Result<()> {
    log_init()?;
    let repopath = get_repo_path(basedir, &url);
    log::info!("repository path {:?}", repopath.display());
    if repopath.exists() {
        git::fetch(&repopath, url)
    } else {
        new_clone(repopath, url)
    }
}

fn new_clone(repopath: PathBuf, url: Url) -> Result<()> {
    let parent = repopath
        .parent()
        .ok_or_else(|| Error::InvalidRepoPath(repopath.clone()))?;
    if !parent.exists() {
        log::info!("creating parent directory {:?}", parent.display());
        std::fs::create_dir_all(parent)?;
    }
    git::clone(parent, url)
}