1mod branch;
2mod clone;
3mod local_branch;
4mod remote;
5
6pub use branch::{branch_exists_remote, detect_default_branch};
7pub use clone::{bare_clone, git_fetch};
8pub use local_branch::{branch_exists_local, detect_local_default_branch};
9pub use remote::get_remote_url;
10
11use anyhow::{bail, Context, Result};
12use std::path::Path;
13use std::process::Command;
14
15pub(super) fn git_cmd() -> Command {
22 let mut cmd = Command::new("git");
23 cmd.env_remove("GIT_DIR")
24 .env_remove("GIT_WORK_TREE")
25 .env_remove("GIT_INDEX_FILE");
26 cmd
27}
28
29pub fn create_local_worktree(
38 repo: &Path,
39 dest: &Path,
40 branch: &str,
41 branch_exists: bool,
42) -> Result<()> {
43 let mut cmd = git_cmd();
44 cmd.args(["-C"]).arg(repo).arg("worktree").arg("add");
45
46 if branch_exists {
47 cmd.arg(dest).arg(branch);
48 } else {
49 cmd.arg(dest).arg("-b").arg(branch);
51 }
52
53 let status = cmd.status().context("Failed to run `git worktree add`")?;
54
55 if !status.success() {
56 bail!("git worktree add failed for branch {branch}"); }
58 Ok(())
59}
60
61pub fn create_worktree(
70 bare: &Path,
71 dest: &Path,
72 branch: &str,
73 base_branch: &str,
74 branch_exists: bool,
75) -> Result<()> {
76 let mut cmd = git_cmd();
77 cmd.args(["-C"]).arg(bare).arg("worktree").arg("add");
78
79 if branch_exists {
80 cmd.arg(dest).arg(branch);
81 } else {
82 cmd.arg(dest)
83 .arg("-b")
84 .arg(branch)
85 .arg(format!("origin/{base_branch}"));
86 }
87
88 let status = cmd.status().context("Failed to run `git worktree add`")?;
89
90 if !status.success() {
91 bail!("git worktree add failed for branch {branch}"); }
93 Ok(())
94}