use super::ServerState;
use std::path::Path;
pub fn list(
cwd: &Path,
) -> Result<bcode_worktree_models::WorktreeListResponse, bcode_worktree::WorktreeError> {
bcode_worktree::list_worktrees(cwd)
}
#[derive(Debug, thiserror::Error)]
pub enum RemoveError {
#[error(
"session {session_id} is rooted inside worktree {path}; move or delete it before removal"
)]
SessionInside {
session_id: bcode_session_models::SessionId,
path: String,
},
#[error(transparent)]
Worktree(#[from] bcode_worktree::WorktreeError),
}
pub async fn remove(
state: &ServerState,
cwd: &Path,
path: &Path,
force: bool,
) -> Result<bcode_worktree_models::WorktreeRemoveResponse, RemoveError> {
let sessions = state.sessions.cached_sessions(cwd).await;
if let Some(session) = sessions
.iter()
.find(|session| super::path_is_inside(&session.working_directory, path))
{
return Err(RemoveError::SessionInside {
session_id: session.id,
path: bcode_plugin_sdk::path::display_from_current_dir(path).to_string(),
});
}
Ok(bcode_worktree::remove_worktree(cwd, path, force)?)
}