1use git2::{build::CheckoutBuilder, Error, Repository};
2use macro_log::*;
3
4pub fn repo_switch(
12 repo: &Repository,
13 remote_name: &str,
14 branch_name: &str,
15 force_checkout: bool,
16) -> Result<(), Error> {
17 repo.set_head(&format!("refs/remotes/{remote_name}/{branch_name}"))?;
19 let mut opts = CheckoutBuilder::new();
21 if force_checkout {
22 opts.force();
23 }
24 repo.checkout_head(Some(&mut opts))?;
25 Ok(())
26}
27
28pub fn repo_checkout(
32 repo: &Repository,
33 remote_name: &str,
34 branch_name: &str,
35 force_checkout: bool,
36) -> Result<(), Error> {
37 let obj = repo.revparse_single(&format!("refs/remotes/{remote_name}/{branch_name}"))?;
38 let Some(commit) = obj.as_commit() else {
39 return Err(Error::from_str("Failed revparse_single commit"));
40 };
41
42 repo.set_head(&format!("refs/remotes/{remote_name}/{branch_name}"))?;
44 if let Ok(mut branch) = repo.find_branch(branch_name, git2::BranchType::Local) {
46 w!("分支 {branch_name} 已存在,更新");
47 branch.delete()?;
48 }
49 let _branch = repo.branch(branch_name, commit, false)?;
51 repo.set_head(&format!("refs/heads/{branch_name}"))?;
53
54 let mut opts = CheckoutBuilder::new();
56 if force_checkout {
57 opts.force();
58 }
59 repo.checkout_head(Some(&mut opts))?;
60
61 Ok(())
62}