From d74ba8ca9e49d9d94a4e59a0ee0bdbd1128af76e Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Thu, 18 Jun 2026 16:05:05 +0300 Subject: fix: emit plugin lifecycle events from ui worktree flows refs #662 --- src/app/api/plugins/mod.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) (limited to 'src/app/api/plugins/mod.rs') diff --git a/src/app/api/plugins/mod.rs b/src/app/api/plugins/mod.rs index 8c0e4212..833134b5 100644 --- a/src/app/api/plugins/mod.rs +++ b/src/app/api/plugins/mod.rs @@ -1906,6 +1906,76 @@ command = ["sh", "-c", "printf '%s' \"$HERDR_PLUGIN_CONTEXT_JSON\" > {}"] pane_context.focused_pane_id.as_deref(), Some(active_public_pane_id.as_str()) ); + + app.state.workspaces[0].worktree_space = Some(crate::workspace::WorktreeSpaceMembership { + key: "repo-key".into(), + label: "herdr".into(), + repo_root: "/repo/herdr".into(), + checkout_path: "/repo/herdr-issue".into(), + is_linked_worktree: true, + }); + let workspace = app.workspace_info(0); + let worktree = crate::api::schema::WorktreeInfo { + path: "/repo/herdr-issue".into(), + branch: Some("worktree/issue".into()), + is_bare: false, + is_detached: false, + is_prunable: false, + is_linked_worktree: true, + open_workspace_id: None, + label: "herdr".into(), + }; + app.state.workspaces[0].worktree_space = Some(crate::workspace::WorktreeSpaceMembership { + key: "repo-key".into(), + label: "herdr".into(), + repo_root: "/repo/herdr".into(), + checkout_path: "/repo/herdr-other".into(), + is_linked_worktree: true, + }); + let changed_context = app.plugin_context_for_event( + &crate::api::schema::EventEnvelope { + event: crate::api::schema::EventKind::WorktreeRemoved, + data: crate::api::schema::EventData::WorktreeRemoved { + workspace_id: workspace_id.clone(), + workspace: Some(workspace.clone()), + worktree: worktree.clone(), + forced: true, + }, + }, + "worktree.removed", + ); + assert_eq!( + changed_context + .worktree + .as_ref() + .map(|worktree| worktree.checkout_path.as_str()), + Some("/repo/herdr-issue") + ); + + app.state.workspaces.clear(); + let removed_context = app.plugin_context_for_event( + &crate::api::schema::EventEnvelope { + event: crate::api::schema::EventKind::WorktreeRemoved, + data: crate::api::schema::EventData::WorktreeRemoved { + workspace_id: workspace_id.clone(), + workspace: Some(workspace), + worktree, + forced: true, + }, + }, + "worktree.removed", + ); + assert_eq!( + removed_context.workspace_id.as_deref(), + Some(workspace_id.as_str()) + ); + assert_eq!( + removed_context + .worktree + .as_ref() + .map(|worktree| worktree.checkout_path.as_str()), + Some("/repo/herdr-issue") + ); } #[cfg(unix)] -- cgit v1.2.3