diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-07 01:16:42 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-07 01:16:42 +0300 |
| commit | 5d7e56737ef30d9de5802b0684a9428c40131dda (patch) | |
| tree | a5c3c5870fc4686fd9bb24c819465e8f8bcc33f6 /src/app | |
| parent | 4001fd2ec8ff05a982da18744b8cbde9df3ab530 (diff) | |
fix: support worktree actions from bare repos
refs #497
Diffstat (limited to 'src/app')
| -rw-r--r-- | src/app/worktrees.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/app/worktrees.rs b/src/app/worktrees.rs index 7874cb0b..f7d906ee 100644 --- a/src/app/worktrees.rs +++ b/src/app/worktrees.rs @@ -1015,6 +1015,55 @@ mod tests { } #[test] + fn open_new_worktree_dialog_supports_standalone_bare_repo_source() { + let repo = create_committed_repo("app-worktree-dialog-bare-origin"); + let bare = unique_temp_path("app-worktree-dialog-bare-repo"); + run_git( + &repo, + &["clone", "--quiet", "--bare", ".", bare.to_str().unwrap()], + ); + let worktree_root = unique_temp_path("app-worktree-dialog-bare-root"); + + let mut app = app_for_worktree_tests(); + app.state.worktree_directory = worktree_root.clone(); + app.state.workspaces = vec![crate::workspace::Workspace::test_new("source")]; + app.state.workspaces[0].identity_cwd = bare.clone(); + + app.open_new_linked_worktree_dialog(0); + + assert_eq!(app.state.mode, Mode::NewLinkedWorktree); + assert!(app.state.config_diagnostic.is_none()); + let create = app.state.worktree_create.as_ref().unwrap(); + assert_eq!(create.source_checkout_path, bare); + assert_eq!(create.source_repo_root, create.source_checkout_path); + let source_checkout_path = create.source_checkout_path.clone(); + + let branch = "worktree/from-bare-source"; + let repo_name = create.repo_name.clone(); + let checkout = crate::worktree::default_checkout_path(&worktree_root, &repo_name, branch); + app.state.name_input = branch.into(); + + app.start_worktree_add(); + + let event = wait_for_worktree_event(&mut app); + match event { + AppEvent::WorktreeAddFinished(result) => { + assert_eq!(result.path, checkout); + assert_eq!(result.result, Ok(())); + } + other => panic!("unexpected event: {other:?}"), + } + assert!(checkout.join("README.md").exists()); + + let remove_new = + crate::worktree::build_worktree_remove_command(&source_checkout_path, &checkout, false); + crate::worktree::run_worktree_command(&remove_new).unwrap(); + let _ = std::fs::remove_dir_all(worktree_root); + let _ = std::fs::remove_dir_all(source_checkout_path); + let _ = std::fs::remove_dir_all(repo); + } + + #[test] fn start_worktree_add_uses_source_checkout_head_as_base() { let repo = create_committed_repo("app-worktree-add-source-repo"); let source_checkout = unique_temp_path("app-worktree-add-source-checkout"); |
