From 5d7e56737ef30d9de5802b0684a9428c40131dda Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Sun, 7 Jun 2026 01:16:42 +0300 Subject: fix: support worktree actions from bare repos refs #497 --- src/app/worktrees.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/app') 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 @@ -1014,6 +1014,55 @@ mod tests { let _ = std::fs::remove_dir_all(repo); } + #[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"); -- cgit v1.2.3