arma3-wiki 0.1.13

A project to store data about Arma 3 commands in a useable format
use rand::distributions::Alphanumeric;
use rand::{thread_rng, Rng};

pub fn main() {
    use git2::Repository;
    let mut tmp = std::env::temp_dir().join("arma3-wiki");
    if std::env::var("CI").is_ok() {
        if !tmp.exists() {
            std::fs::create_dir_all(&tmp).unwrap();
        }
        let random: String = thread_rng()
            .sample_iter(&Alphanumeric)
            .take(10)
            .map(char::from)
            .collect();
        tmp.push(random);
    }
    let repo = Repository::open(&tmp).map_or_else(
        |_| {
            git2::build::RepoBuilder::new()
                .branch("dist")
                .clone("https://github.com/acemod/arma3-wiki", &tmp)
                .map_err(|e| format!("Failed to clone repository: {e}"))
                .unwrap()
        },
        |repo| repo,
    );
    repo.find_remote("origin")
        .and_then(|mut r| r.fetch(&["dist"], None, None))
        .map_err(|e| format!("Failed to fetch remote: {e}"))
        .unwrap();
    let fetch_head = repo
        .find_reference("FETCH_HEAD")
        .map_err(|e| format!("Failed to find FETCH_HEAD: {e}"))
        .unwrap();
    let commit = repo
        .reference_to_annotated_commit(&fetch_head)
        .map_err(|e| format!("Failed to find FETCH_HEAD: {e}"))
        .unwrap();
    let analysis = repo
        .merge_analysis(&[&commit])
        .map_err(|e| format!("Failed to analyze merge: {e}"))
        .unwrap();
    if !analysis.0.is_up_to_date() && analysis.0.is_fast_forward() {
        let mut reference = repo
            .find_reference("refs/heads/dist")
            .map_err(|e| format!("Failed to find reference: {e}"))
            .unwrap();
        reference
            .set_target(commit.id(), "Fast-Forward")
            .map_err(|e| format!("Failed to set reference: {e}"))
            .unwrap();
        repo.set_head("refs/heads/dist")
            .map_err(|e| format!("Failed to set HEAD: {e}"))
            .unwrap();
        repo.checkout_head(Some(git2::build::CheckoutBuilder::default().force()))
            .map_err(|e| format!("Failed to checkout HEAD: {e}"))
            .unwrap();
    }
    let dst = {
        let target_dir = std::env::var("OUT_DIR").unwrap();
        let target_dir = std::path::Path::new(&target_dir).join("arma3-wiki");
        target_dir
    };
    let _ = std::fs::remove_dir_all(&dst);
    fs_extra::dir::copy(
        &tmp,
        dst,
        &fs_extra::dir::CopyOptions::new().content_only(true),
    )
    .unwrap();
    if std::env::var("CI").is_ok() {
        std::fs::remove_dir_all(tmp).unwrap();
    }
}