From 3ce1e1147ae634c3c0bcb01d1be303c122c8f16e Mon Sep 17 00:00:00 2001 From: Erik Kundt Date: Fri, 24 Mar 2023 13:43:12 +0100 Subject: [PATCH] tui: Add module providing access to patch cob Signed-off-by: Erik Kundt --- radicle-tui/src/cob.rs | 1 + radicle-tui/src/cob/patch.rs | 51 ++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 radicle-tui/src/cob.rs create mode 100644 radicle-tui/src/cob/patch.rs diff --git a/radicle-tui/src/cob.rs b/radicle-tui/src/cob.rs new file mode 100644 index 00000000..e268c5ac --- /dev/null +++ b/radicle-tui/src/cob.rs @@ -0,0 +1 @@ +pub mod patch; diff --git a/radicle-tui/src/cob/patch.rs b/radicle-tui/src/cob/patch.rs new file mode 100644 index 00000000..a9ae07bd --- /dev/null +++ b/radicle-tui/src/cob/patch.rs @@ -0,0 +1,51 @@ +use anyhow::Result; + +use radicle::git::raw::Oid; + +use radicle::cob::patch::{MergeTarget, Patch, PatchId, Patches}; +use radicle::prelude::*; +use radicle::storage::git::Repository; + +pub fn load_all(profile: &Profile, id: Id) -> Vec<(PatchId, Patch)> { + if let Ok(repository) = &profile.storage.repository(id) { + if let Ok(proposed) = load_proposed(repository) { + return proposed; + } + } + vec![] +} + +pub fn load_proposed(repository: &Repository) -> Result> { + let proposed = Patches::open(repository)? + .proposed()? + .into_iter() + .map(|(id, patch, _)| (id, patch)) + .collect(); + + Ok(proposed) +} + +pub fn sync_status(repository: &Repository, patch: &Patch) -> Result<(usize, usize)> { + let (_, revision) = patch.latest().unwrap(); + let target_oid = merge_target_oid(patch.target(), repository)?; + let (ahead, behind) = repository + .raw() + .graph_ahead_behind(*revision.head(), target_oid)?; + + Ok((ahead, behind)) +} + +pub fn merge_target_oid(target: MergeTarget, repository: &Repository) -> Result { + match target { + MergeTarget::Delegates => { + if let Ok((_, target)) = repository.head() { + Ok(*target) + } else { + anyhow::bail!( + "failed to determine default branch head for project {}", + repository.id, + ); + } + } + } +}