cargo-gra 0.6.2

Cargo subcommand for gtk-rust-app.
Documentation
use std::{
    env::temp_dir,
    fs::create_dir_all,
    path::{Path, PathBuf},
    process::Command,
};

use fs_extra::dir::CopyOptions;
use gra::FlatpakArgs;

#[ignore]
#[test]
fn _test_build_minimal() {
    let test_project = PathBuf::new().join("examples/minimal");
    let target_dir = test_project.join("target");
    assert!(test_project.exists());

    Command::new("rm")
        .arg("-rf")
        .arg(test_project.join("target"))
        .output()
        .unwrap();
    assert!(!test_project.join("target").exists());

    gra::generate(&test_project);

    gra::flatpak(
        &test_project,
        FlatpakArgs {
            release: None,
            arch: None,
            prepare_only: false,
        },
    )
    .expect("Could not build flatpak");

    assert!(target_dir.join("minimal.flatpak").exists());

    println!("\n\nTesting release\n\n");

    gra::flatpak(
        &test_project,
        FlatpakArgs {
            release: Some("local".into()),
            arch: None,
            prepare_only: false,
        },
    )
    .expect("Could not prepare flatpak");

    let mut options = CopyOptions::new();
    options.overwrite = true;
    options.copy_inside = true;
    let test_dir = temp_dir().join("gtk-rust-app-prod-flatpak-test");
    create_dir_all(&test_dir).ok();
    std::fs::copy(
        target_dir.join("minimal.tar.xz"),
        test_dir.join("minimal.tar.xz"),
    )
    .unwrap();
    std::fs::copy(
        target_dir.join("org.example.Minimal.yml"),
        test_dir.join("org.example.Minimal.yml"),
    )
    .unwrap();
    run_flatpak_builder("org.example.Minimal", &test_dir);
    run_flatpak_bundle("org.example.Minimal", &test_dir);
    assert!(test_dir.join("org.example.Minimal.flatpak").exists());
}

#[ignore]
#[test]
fn test_build_complete_example_with_release() {
    let test_project = PathBuf::new()
        .join("examples/complete")
        .canonicalize()
        .unwrap();
    let target_dir = test_project.join("target");
    let flatpak_temp = target_dir.join("flatpak-temp");
    assert!(test_project.exists());

    Command::new("rm")
        .arg("-rf")
        .arg(test_project.join("target"))
        .output()
        .unwrap();
    assert!(!test_project.join("target").exists());

    gra::generate(&test_project);
    assert_gra_gen_dir("org.example.Complete", "complete", &test_project);

    gra::flatpak(
        &test_project,
        FlatpakArgs {
            release: None,
            arch: None,
            prepare_only: true,
        },
    )
    .expect("Could not prepare flatpak");

    assert!(flatpak_temp.exists());
    assert!(flatpak_temp.join(".cargo/config.toml").exists());
    assert!(flatpak_temp.join("target/vendor").exists());
    assert!(flatpak_temp.join("target/vendor/gtk-rust-app").exists());
    assert!(flatpak_temp.join("po").exists());
    assert!(flatpak_temp.join("src").exists());
    assert!(flatpak_temp.join("Cargo.toml").exists());
}

fn run_flatpak_builder(id: &str, current_dir: &PathBuf) {
    let mut build_task = Command::new("flatpak-builder")
        .current_dir(current_dir)
        .arg("--repo=repo")
        .arg("--state-dir=state")
        .arg("--force-clean")
        .arg("host")
        .arg(format!("{}.yml", id))
        .spawn()
        .unwrap();
    build_task.wait().unwrap();
}

fn run_flatpak_bundle(id: &str, current_dir: &PathBuf) {
    let mut bundle_task = Command::new("flatpak")
        .current_dir(current_dir)
        .arg("build-bundle")
        .arg("repo")
        .arg(format!("{}.flatpak", id))
        .arg(id)
        .spawn()
        .unwrap();
    bundle_task.wait().unwrap();
}

fn assert_gra_gen_dir(id: &str, name: &str, project_dir: &Path) {
    let gra_gen_dir = project_dir.join("target/gra-gen");

    assert!(gra_gen_dir.join("assets/resources.gresource.xml").exists());

    assert!(gra_gen_dir.join(format!("data/{}.64.png", id)).exists());
    assert!(gra_gen_dir.join(format!("data/{}.128.png", id)).exists());
    assert!(gra_gen_dir
        .join(format!("data/{}.appdata.xml", id))
        .exists());
    assert!(gra_gen_dir.join(format!("data/{}.desktop", id)).exists());
    assert!(gra_gen_dir.join(format!("data/{}.dev.yml", id)).exists());
    assert!(gra_gen_dir.join(format!("data/{}.svg", id)).exists());
    assert!(gra_gen_dir.join(format!("data/{}.yml", id)).exists());

    assert!(gra_gen_dir
        .join(format!("locale/de/LC_MESSAGES/{}.mo", name))
        .exists());

    assert!(gra_gen_dir.join("po/de.pot").exists());
    assert!(gra_gen_dir.join("po/POTFILES").exists());

    assert!(gra_gen_dir.join("actions.rs").exists());
    assert!(gra_gen_dir.join("compiled.gresource").exists());
    assert!(gra_gen_dir.join("Makefile").exists());
    assert!(gra_gen_dir.join(format!("{}.gschema.xml", id)).exists());
}