pub mod common;
use anyhow::Result;
use function_name::named;
#[test]
#[named]
fn plant_empty_repo() -> Result<()> {
let fixture = common::BareRepoFixture::new(function_name!());
common::exec_garden(&["--chdir", &fixture.root(), "init"])?;
fixture.path("garden.yaml");
let cmd = ["git", "init", "--quiet", "repo1"];
common::assert_cmd(&cmd, &fixture.root());
let cmd = ["git", "init", "--quiet", "repo2"];
common::assert_cmd(&cmd, &fixture.root());
let cmd = ["git", "remote", "add", "origin", "repo-1-url"];
let worktree_repo1 = fixture.worktree("repo1");
common::assert_cmd(&cmd, &worktree_repo1);
let cmd = ["git", "remote", "add", "remote-1", "remote-1-url"];
common::assert_cmd(&cmd, &worktree_repo1);
common::exec_garden(&["--chdir", &fixture.root(), "plant", "repo1"])?;
let path = Some(std::path::PathBuf::from(fixture.path("garden.yaml")));
let cfg = garden::config::new(&path, "", 0, None)?;
assert_eq!(1, cfg.trees.len());
assert_eq!("repo1", cfg.trees[0].get_name());
assert_eq!(2, cfg.trees[0].remotes.len());
assert_eq!("origin", cfg.trees[0].remotes[0].get_name());
assert_eq!("repo-1-url", cfg.trees[0].remotes[0].get_expr());
assert_eq!("remote-1", cfg.trees[0].remotes[1].get_name());
assert_eq!("remote-1-url", cfg.trees[0].remotes[1].get_expr());
let worktree_repo2 = fixture.worktree("repo2");
let cmd = ["git", "remote", "add", "remote-1", "remote-1-url"];
common::assert_cmd(&cmd, &worktree_repo2);
let cmd = ["git", "remote", "add", "remote-2", "remote-2-url"];
common::assert_cmd(&cmd, &worktree_repo2);
common::exec_garden(&["--chdir", &fixture.root(), "plant", "repo2"])?;
let cfg = garden::config::new(&path, "", 0, None)?;
assert_eq!(2, cfg.trees.len()); assert_eq!("repo2", cfg.trees[1].get_name());
assert_eq!(2, cfg.trees[1].remotes.len());
assert_eq!("remote-1", cfg.trees[1].remotes[0].get_name());
assert_eq!("remote-1-url", cfg.trees[1].remotes[0].get_expr());
assert_eq!("remote-2", cfg.trees[1].remotes[1].get_name());
assert_eq!("remote-2-url", cfg.trees[1].remotes[1].get_expr());
let cmd = ["git", "config", "remote.origin.url", "repo-1-new-url"];
common::assert_cmd(&cmd, &worktree_repo1);
let cmd = ["git", "config", "remote.remote-2.url", "remote-2-new-url"];
common::assert_cmd(&cmd, &worktree_repo2);
common::exec_garden(&["--chdir", &fixture.root(), "plant", "repo1", "repo2"])?;
let cfg = garden::config::new(&path, "", 0, None)?;
assert_eq!(2, cfg.trees.len());
assert_eq!("repo1", cfg.trees[0].get_name());
assert_eq!(2, cfg.trees[0].remotes.len());
assert_eq!("origin", cfg.trees[0].remotes[0].get_name());
assert_eq!("repo-1-new-url", cfg.trees[0].remotes[0].get_expr()); assert_eq!("remote-1", cfg.trees[0].remotes[1].get_name());
assert_eq!("remote-1-url", cfg.trees[0].remotes[1].get_expr());
assert_eq!("repo2", cfg.trees[1].get_name());
assert_eq!(2, cfg.trees[1].remotes.len());
assert_eq!("remote-1", cfg.trees[1].remotes[0].get_name());
assert_eq!("remote-1-url", cfg.trees[1].remotes[0].get_expr());
assert_eq!("remote-2", cfg.trees[1].remotes[1].get_name());
assert_eq!("remote-2-new-url", cfg.trees[1].remotes[1].get_expr());
Ok(())
}
#[test]
#[named]
fn plant_bare_repo() -> Result<()> {
let fixture = common::BareRepoFixture::new(function_name!());
common::exec_garden(&["--chdir", &fixture.root(), "init"])?;
let garden_yaml = fixture.path("garden.yaml");
common::exec_garden(&["--chdir", &fixture.root(), "plant", "repos/example.git"])?;
let path = Some(std::path::PathBuf::from(&garden_yaml));
let cfg = garden::config::new(&path, "", 0, None)?;
assert_eq!(1, cfg.trees.len());
assert_eq!("repos/example.git", cfg.trees[0].get_name());
assert!(cfg.trees[0].is_bare_repository);
Ok(())
}
#[test]
#[named]
fn plant_git_worktree() -> Result<()> {
let fixture = common::BareRepoFixture::new(function_name!());
common::exec_garden(&["--chdir", &fixture.root(), "init"])?;
let cmd = ["git", "clone", "--quiet", "repos/example.git", "parent"];
common::assert_cmd(&cmd, &fixture.root());
let cmd = [
"git",
"worktree",
"add",
"--track",
"-B",
"dev",
"../child",
"origin/dev",
];
common::assert_cmd(&cmd, &fixture.path("parent"));
common::exec_garden(&["--chdir", &fixture.root(), "plant", "parent"])?;
common::exec_garden(&["--chdir", &fixture.root(), "plant", "child"])?;
let garden_yaml = fixture.path("garden.yaml");
let path = Some(std::path::PathBuf::from(&garden_yaml));
let cfg = garden::config::new(&path, &fixture.root(), 0, None)?;
assert_eq!(2, cfg.trees.len());
assert_eq!("parent", cfg.trees[0].get_name());
assert!(cfg.trees[1].is_worktree);
assert_eq!(cfg.trees[1].worktree.get_expr(), "parent");
assert_eq!(cfg.trees[1].branch.get_expr(), "dev");
Ok(())
}