diff --git a/radicle-cli/src/commands/clone.rs b/radicle-cli/src/commands/clone.rs index f46fe015..8e5bb00a 100644 --- a/radicle-cli/src/commands/clone.rs +++ b/radicle-cli/src/commands/clone.rs @@ -5,9 +5,10 @@ use std::str::FromStr; use std::time; use anyhow::anyhow; +use radicle::issue::cache::Issues as _; +use radicle::patch::cache::Patches as _; use thiserror::Error; -use radicle::cob; use radicle::git::raw; use radicle::identity::doc; use radicle::identity::doc::{DocError, RepoId}; @@ -186,8 +187,8 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> { info.push([term::format::bold(proj.name()).into()]); info.push([term::format::italic(proj.description()).into()]); - let issues = cob::issue::Issues::open(&repo)?.counts()?; - let patches = cob::patch::Patches::open(&repo)?.counts()?; + let issues = profile.issues(&repo)?.counts()?; + let patches = profile.patches(&repo)?.counts()?; info.push([term::Line::spaced([ term::format::tertiary(issues.open).into(), diff --git a/radicle-cli/src/commands/inbox.rs b/radicle-cli/src/commands/inbox.rs index 2997765c..620584c0 100644 --- a/radicle-cli/src/commands/inbox.rs +++ b/radicle-cli/src/commands/inbox.rs @@ -6,10 +6,10 @@ use anyhow::anyhow; use localtime::LocalTime; use radicle::identity::Identity; -use radicle::issue::Issues; +use radicle::issue::cache::Issues as _; use radicle::node::notifications; use radicle::node::notifications::*; -use radicle::patch::Patches; +use radicle::patch::cache::Patches as _; use radicle::prelude::{Profile, RepoId}; use radicle::storage::{ReadRepository, ReadStorage}; use radicle::{cob, Storage}; @@ -233,8 +233,8 @@ where let (_, head) = repo.head()?; let doc = repo.identity_doc()?; let proj = doc.project()?; - let issues = Issues::open(&repo)?; - let patches = Patches::open(&repo)?; + let issues = profile.issues(&repo)?; + let patches = profile.patches(&repo)?; let mut notifs = notifs.by_repo(&rid, sort_by.field)?.collect::>(); if !sort_by.reverse { @@ -406,13 +406,13 @@ fn show( match n.kind { NotificationKind::Cob { type_name, id } if type_name == *cob::issue::TYPENAME => { - let issues = Issues::open(&repo)?; + let issues = profile.issues(&repo)?; let issue = issues.get(&id)?.unwrap(); term::issue::show(&issue, &id, term::issue::Format::default(), profile)?; } NotificationKind::Cob { type_name, id } if type_name == *cob::patch::TYPENAME => { - let patches = Patches::open(&repo)?; + let patches = profile.patches(&repo)?; let patch = patches.get(&id)?.unwrap(); term::patch::show(&patch, &id, false, &repo, None, profile)?; diff --git a/radicle-cli/src/commands/issue.rs b/radicle-cli/src/commands/issue.rs index 8554ca6f..cacb394c 100644 --- a/radicle-cli/src/commands/issue.rs +++ b/radicle-cli/src/commands/issue.rs @@ -6,13 +6,14 @@ use anyhow::{anyhow, Context as _}; use radicle::cob::common::{Label, Reaction}; use radicle::cob::issue; -use radicle::cob::issue::{CloseReason, Issues, State}; +use radicle::cob::issue::{CloseReason, State}; use radicle::cob::thread; use radicle::crypto::Signer; +use radicle::issue::cache::Issues as _; use radicle::prelude::Did; use radicle::profile; use radicle::storage; -use radicle::storage::{WriteRepository, WriteStorage}; +use radicle::storage::{ReadRepository, WriteRepository, WriteStorage}; use radicle::Profile; use radicle::{cob, Node}; @@ -425,7 +426,7 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> { | Operation::Label { .. } ); - let mut issues = Issues::open(&repo)?; + let mut issues = profile.issues_mut(&repo)?; match options.op { Operation::Edit { @@ -546,7 +547,7 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> { issue.label(labels, &signer)?; } Operation::List { assigned, state } => { - list(&issues, &assigned, &state, &profile)?; + list(issues, &assigned, &state, &profile)?; } Operation::Delete { id } => { let id = id.resolve(&repo.backend)?; @@ -562,13 +563,16 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> { Ok(()) } -fn list( - issues: &Issues, +fn list( + cache: C, assigned: &Option, state: &Option, profile: &profile::Profile, -) -> anyhow::Result<()> { - if issues.is_empty()? { +) -> anyhow::Result<()> +where + C: issue::cache::Issues, +{ + if cache.is_empty()? { term::print(term::format::italic("Nothing to show.")); return Ok(()); } @@ -580,7 +584,8 @@ fn list( }; let mut all = Vec::new(); - for result in issues.all()? { + let issues = cache.list()?; + for result in issues { let Ok((id, issue)) = result else { // Skip issues that failed to load. continue; @@ -664,16 +669,20 @@ fn list( Ok(()) } -fn open( +fn open( title: Option, description: Option, labels: Vec