use std::collections::BTreeMap;
use wsb::peer::model::{SharedWorktreeId, WorktreePresence};
use wsb::peer::protocol::WorktreeSummary;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SharedWorktree {
pub id: SharedWorktreeId,
pub display_name: String,
pub presence: WorktreePresence,
pub compatible: bool,
}
pub fn compare(mine: &[WorktreeSummary], theirs: &[WorktreeSummary]) -> Vec<SharedWorktree> {
let theirs_by_id: BTreeMap<&SharedWorktreeId, &WorktreeSummary> =
theirs.iter().map(|summary| (&summary.worktree, summary)).collect();
let mut out = Vec::new();
for summary in mine {
match theirs_by_id.get(&summary.worktree) {
Some(peer) => out.push(SharedWorktree {
id: summary.worktree.clone(),
display_name: summary.display_name.clone(),
presence: WorktreePresence::Shared,
compatible: peer.root_commit == summary.root_commit,
}),
None => out.push(SharedWorktree {
id: summary.worktree.clone(),
display_name: summary.display_name.clone(),
presence: WorktreePresence::LocalOnly,
compatible: true,
}),
}
}
let mine_ids: std::collections::BTreeSet<&SharedWorktreeId> =
mine.iter().map(|summary| &summary.worktree).collect();
for summary in theirs {
if !mine_ids.contains(&summary.worktree) {
out.push(SharedWorktree {
id: summary.worktree.clone(),
display_name: summary.display_name.clone(),
presence: WorktreePresence::PeerOnly,
compatible: true,
});
}
}
out.sort_by(|a, b| a.display_name.cmp(&b.display_name).then(a.id.cmp(&b.id)));
out
}
#[cfg(test)]
#[path = "inventory_tests.rs"]
mod tests;