#![cfg(feature = "git")]
mod common;
use prollytree::git::versioned_store::GitVersionedKvStore;
use prollytree::git::worktree::WorktreeManager;
#[test]
fn test_create_worktree_operate_independently() {
let (_temp, dataset) = common::setup_repo_and_dataset();
let mut store = GitVersionedKvStore::<32>::init(&dataset).unwrap();
store
.insert(b"main_key".to_vec(), b"main_val".to_vec())
.unwrap();
store.commit("initial").unwrap();
drop(store);
let git_root = _temp.path();
let mut manager = WorktreeManager::new(git_root).unwrap();
let wt_path = _temp.path().join("worktree_agent1");
let wt_info = manager
.add_worktree(&wt_path, "agent1-branch", true)
.unwrap();
assert!(!wt_info.id.is_empty(), "worktree should have an id");
assert!(wt_path.exists(), "worktree directory should exist");
let worktrees = manager.list_worktrees();
assert!(!worktrees.is_empty(), "should have at least one worktree");
std::mem::forget(_temp);
}
#[test]
fn test_worktree_locking() {
let (_temp, dataset) = common::setup_repo_and_dataset();
let mut store = GitVersionedKvStore::<32>::init(&dataset).unwrap();
store.insert(b"k".to_vec(), b"v".to_vec()).unwrap();
store.commit("init").unwrap();
drop(store);
let git_root = _temp.path();
let mut manager = WorktreeManager::new(git_root).unwrap();
let wt_path = _temp.path().join("wt_lock_test");
let wt_info = manager.add_worktree(&wt_path, "lock-branch", true).unwrap();
let wt_id = wt_info.id.clone();
manager.lock_worktree(&wt_id, "testing lock").unwrap();
assert!(manager.is_locked(&wt_id), "worktree should be locked");
manager.unlock_worktree(&wt_id).unwrap();
assert!(!manager.is_locked(&wt_id), "worktree should be unlocked");
std::mem::forget(_temp);
}
#[test]
fn test_remove_worktree() {
let (_temp, dataset) = common::setup_repo_and_dataset();
let mut store = GitVersionedKvStore::<32>::init(&dataset).unwrap();
store.insert(b"k".to_vec(), b"v".to_vec()).unwrap();
store.commit("init").unwrap();
drop(store);
let git_root = _temp.path();
let mut manager = WorktreeManager::new(git_root).unwrap();
let wt_path = _temp.path().join("wt_remove");
let wt_info = manager
.add_worktree(&wt_path, "remove-branch", true)
.unwrap();
let wt_id = wt_info.id.clone();
assert!(manager.get_worktree(&wt_id).is_some());
manager.remove_worktree(&wt_id).unwrap();
assert!(
manager.get_worktree(&wt_id).is_none(),
"removed worktree should not appear"
);
std::mem::forget(_temp);
}