Compare commits

..

2 commits

Author SHA1 Message Date
ba47a4bcd6 better git testing 2025-07-05 11:39:45 -06:00
b6787224c3 fixup git 2025-07-05 11:10:38 -06:00
2 changed files with 53 additions and 26 deletions

View file

@ -7,6 +7,7 @@ edition = "2024"
anyhow = "1.0.95"
clap = { version = "4.5.26", features = ["derive"] }
mktemp = "0.5.1"
rand = "0.9.1"
serde = { version = "1.0.217", features = ["derive"] }
thiserror = "2.0.11"
toml = "0.8.19"

View file

@ -23,8 +23,7 @@ pub fn checkout_branch_in_worktree(
Ok(())
}
pub fn remove_worktree(worktree_dir: &std::path::Path) -> Result<(), GitError> {
std::fs::remove_dir_all(worktree_dir)?;
pub fn git_worktree_prune() -> Result<(), GitError> {
let result = std::process::Command::new("git")
.args(["worktree", "prune"])
.output()?;
@ -36,22 +35,27 @@ pub fn remove_worktree(worktree_dir: &std::path::Path) -> Result<(), GitError> {
Ok(())
}
pub fn create_orphan_branch(branch: &str) -> Result<(), GitError> {
let tmp_worktree = mktemp::Temp::new_path();
let tmp_worktree_pathbuf = tmp_worktree.to_path_buf();
let Some(tmp_worktree_dir) = tmp_worktree_pathbuf.as_path().to_str() else {
pub fn git_remove_branch(branch: &str) -> Result<(), GitError> {
let result = std::process::Command::new("git")
.args(["branch", "-D", branch])
.output()?;
if !result.status.success() {
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
};
}
Ok(())
}
pub fn create_orphan_branch(branch: &str) -> Result<(), GitError> {
{
let tmp_worktree = mktemp::Temp::new_path();
create_orphan_branch_at_path(branch, &tmp_worktree.to_path_buf())?;
}
// The temp dir is now removed / cleaned up.
let result = std::process::Command::new("git")
.args([
"worktree",
"add",
"--orphan",
"-b",
branch,
tmp_worktree_dir,
])
.args(["worktree", "prune"])
.output()?;
if !result.status.success() {
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
@ -59,10 +63,27 @@ pub fn create_orphan_branch(branch: &str) -> Result<(), GitError> {
return Err(GitError::Oops);
}
let mut readme_filename = tmp_worktree_pathbuf.clone();
Ok(())
}
pub fn create_orphan_branch_at_path(
branch: &str,
worktree_path: &std::path::PathBuf,
) -> Result<(), GitError> {
let Some(worktree_dir) = worktree_path.to_str() else {
return Err(GitError::Oops);
};
let result = std::process::Command::new("git")
.args(["worktree", "add", "--orphan", "-b", branch, worktree_dir])
.output()?;
if !result.status.success() {
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
println!("stderr: {}", std::str::from_utf8(&result.stderr).unwrap());
return Err(GitError::Oops);
}
let mut readme_filename = worktree_path.clone();
readme_filename.push("README.md");
println!("readme_filename: {:?}", readme_filename);
println!("tmp_worktree_pathbuf: {:?}", tmp_worktree_pathbuf);
let mut readme = std::fs::File::create(readme_filename)?;
write!(
readme,
@ -71,7 +92,7 @@ pub fn create_orphan_branch(branch: &str) -> Result<(), GitError> {
let result = std::process::Command::new("git")
.args(["add", "README.md"])
.current_dir(tmp_worktree_dir)
.current_dir(worktree_dir)
.output()?;
if !result.status.success() {
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
@ -81,7 +102,7 @@ pub fn create_orphan_branch(branch: &str) -> Result<(), GitError> {
let result = std::process::Command::new("git")
.args(["commit", "-m", "create entomologist issue branch"])
.current_dir(tmp_worktree_dir)
.current_dir(worktree_path)
.output()?;
if !result.status.success() {
println!("stdout: {}", std::str::from_utf8(&result.stdout).unwrap());
@ -89,8 +110,6 @@ pub fn create_orphan_branch(branch: &str) -> Result<(), GitError> {
return Err(GitError::Oops);
}
// git worktree prune
Ok(())
}
@ -100,13 +119,20 @@ mod tests {
#[test]
fn test_worktree() {
let worktree_dir = std::path::Path::new("/tmp/boo");
checkout_branch_in_worktree("origin/main", worktree_dir).unwrap();
remove_worktree(worktree_dir).unwrap();
{
let temp_worktree = mktemp::Temp::new_path();
checkout_branch_in_worktree("origin/main", temp_worktree.as_path()).unwrap();
// The temporary worktree directory is removed when the Temp variable is dropped.
}
git_worktree_prune().unwrap();
}
#[test]
fn test_create_orphan_branch() {
create_orphan_branch("bloppers").unwrap();
let rnd: u128 = rand::random();
let mut branch = std::string::String::from("entomologist-test-branch-");
branch.push_str(&format!("{:0x}", rnd));
create_orphan_branch(&branch).unwrap();
git_remove_branch(&branch).unwrap();
}
}