diff options
Diffstat (limited to 'test_utils/src/git.rs')
| -rw-r--r-- | test_utils/src/git.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/test_utils/src/git.rs b/test_utils/src/git.rs index a18f81c..2668b3f 100644 --- a/test_utils/src/git.rs +++ b/test_utils/src/git.rs | |||
| @@ -276,6 +276,49 @@ impl GitTestRepo { | |||
| 276 | Ok(()) | 276 | Ok(()) |
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | /// Creates a git worktree linked to this repository. | ||
| 280 | /// Returns a `GitTestRepo` whose `dir` points to the worktree working | ||
| 281 | /// directory. | ||
| 282 | pub fn create_worktree(&self, branch_name: &str) -> Result<GitTestRepo> { | ||
| 283 | let worktree_path = self | ||
| 284 | .dir | ||
| 285 | .parent() | ||
| 286 | .unwrap() | ||
| 287 | .join(format!("tmpgit-worktree-{}", rand::random::<u64>())); | ||
| 288 | |||
| 289 | // Create the branch at the current HEAD | ||
| 290 | let head_commit = self.git_repo.head()?.peel_to_commit()?; | ||
| 291 | self.git_repo | ||
| 292 | .branch(branch_name, &head_commit, false) | ||
| 293 | .context("failed to create branch for worktree")?; | ||
| 294 | |||
| 295 | // Add worktree via git2 | ||
| 296 | let worktree = self | ||
| 297 | .git_repo | ||
| 298 | .worktree( | ||
| 299 | branch_name, | ||
| 300 | &worktree_path, | ||
| 301 | Some( | ||
| 302 | git2::WorktreeAddOptions::new().reference(Some( | ||
| 303 | &self | ||
| 304 | .git_repo | ||
| 305 | .find_branch(branch_name, git2::BranchType::Local)? | ||
| 306 | .into_reference(), | ||
| 307 | )), | ||
| 308 | ), | ||
| 309 | ) | ||
| 310 | .context("failed to create worktree")?; | ||
| 311 | |||
| 312 | let worktree_repo = git2::Repository::open_from_worktree(&worktree) | ||
| 313 | .context("failed to open repo from worktree")?; | ||
| 314 | |||
| 315 | Ok(GitTestRepo { | ||
| 316 | dir: worktree_path, | ||
| 317 | git_repo: worktree_repo, | ||
| 318 | delete_dir_on_drop: true, | ||
| 319 | }) | ||
| 320 | } | ||
| 321 | |||
| 279 | pub fn checkout_remote_branch(&self, branch_name: &str) -> Result<Oid> { | 322 | pub fn checkout_remote_branch(&self, branch_name: &str) -> Result<Oid> { |
| 280 | self.checkout(&format!("remotes/origin/{branch_name}"))?; | 323 | self.checkout(&format!("remotes/origin/{branch_name}"))?; |
| 281 | let mut branch = self.create_branch(branch_name)?; | 324 | let mut branch = self.create_branch(branch_name)?; |