ploys 0.6.0

A utility to manage projects, packages, releases and deployments.
Documentation
use ploys::project::{Error, Project};
use ploys::repository::revision::Revision;
use ploys::repository::types::git::{Error as GitError, Git};
use ploys::repository::{Commit, Open, Repository, Stage};
use tempfile::tempdir;

#[test]
fn test_repository() -> Result<(), GitError> {
    let dir = tempdir()?;
    let mut repo = Git::init(dir.path())?;

    repo.add_file("hello.txt", "Hello World!")?;
    repo.add_file("foo/bar/baz", "Baz")?;
    repo.commit("Initial commit")?;

    assert_eq!(repo.get_file("hello.txt")?, Some("Hello World!".into()));
    assert_eq!(repo.get_file("foo/bar/baz")?, Some("Baz".into()));

    repo.add_file("README.md", "# Readme")?;
    repo.remove_file("hello.txt")?;
    repo.remove_file("foo/bar/baz")?;
    repo.commit("Second commit")?;

    assert_eq!(repo.get_file("README.md")?, Some("# Readme".into()));
    assert_eq!(repo.get_file("hello.txt")?, None);
    assert_eq!(repo.get_file("foo/bar/baz")?, None);

    let mut repo = Git::open(dir.path())?;

    assert_eq!(repo.get_file("README.md")?, Some("# Readme".into()));
    assert_eq!(repo.get_file("hello.txt")?, None);
    assert_eq!(repo.get_file("foo/bar/baz")?, None);

    repo.add_file("Ploys.toml", "[project]\nname = \"example\"")?;
    repo.commit("Third commit")?;

    assert_eq!(
        repo.get_file("Ploys.toml")?,
        Some("[project]\nname = \"example\"".into())
    );

    let branch_name = gix::open(dir.path())?
        .head()?
        .referent_name()
        .map(|name| name.shorten().to_string())
        .unwrap_or_else(|| gix::init::DEFAULT_BRANCH_NAME.to_string());

    let mut repo = Git::open(dir.path())?.with_revision(Revision::branch(branch_name));

    repo.add_file("Cargo.toml", "[package]\nname = \"example\"")?;
    repo.commit("Fourth commit")?;

    assert_eq!(
        repo.get_file("Cargo.toml")?,
        Some("[package]\nname = \"example\"".into())
    );

    let sha = gix::open(dir.path())?
        .head_commit()
        .unwrap()
        .id()
        .to_string();

    let mut repo = Git::open(dir.path())?.with_revision(Revision::sha(sha));

    repo.remove_file("Cargo.toml")?;
    repo.add_file("commit", "5")?;
    repo.commit("Fifth commit")?;

    assert_eq!(repo.get_file("Cargo.toml")?, None);
    assert_eq!(
        repo.get_file("Ploys.toml")?,
        Some("[project]\nname = \"example\"".into())
    );
    assert_eq!(repo.get_file("commit")?, Some("5".into()));

    let repo = Git::open(dir.path())?;

    assert_eq!(
        repo.get_file("Cargo.toml")?,
        Some("[package]\nname = \"example\"".into())
    );
    assert_eq!(
        repo.get_file("Ploys.toml")?,
        Some("[project]\nname = \"example\"".into())
    );
    assert_eq!(repo.get_file("commit")?, None);

    dir.close()?;

    Ok(())
}

#[test]
#[ignore]
fn test_project() -> Result<(), Error<GitError>> {
    let project = Project::git("../..")?;

    assert_eq!(project.name(), "ploys");
    assert_eq!(
        project.repository().unwrap().to_url(),
        "https://github.com/ploys/ploys".parse().unwrap()
    );

    let packages = project.packages().collect::<Vec<_>>();

    let ploys = packages.iter().find(|pkg| pkg.name() == "ploys").unwrap();

    assert_eq!(ploys.name(), "ploys");
    assert_eq!(ploys.path(), "packages/ploys");
    assert_eq!(ploys.manifest_path(), "packages/ploys/Cargo.toml");

    let ploys_api = packages
        .iter()
        .find(|pkg| pkg.name() == "ploys-api")
        .unwrap();

    assert_eq!(ploys_api.name(), "ploys-api");
    assert_eq!(ploys_api.path(), "packages/ploys-api");
    assert_eq!(ploys_api.manifest_path(), "packages/ploys-api/Cargo.toml");

    let ploys_cli = packages
        .iter()
        .find(|pkg| pkg.name() == "ploys-cli")
        .unwrap();

    assert_eq!(ploys_cli.name(), "ploys-cli");
    assert_eq!(ploys_cli.path(), "packages/ploys-cli");
    assert_eq!(ploys_cli.manifest_path(), "packages/ploys-cli/Cargo.toml");

    Ok(())
}