Rename `Id` to `RepoId`

Rename the type to make it clearer and consistent with `NodeId`.
This commit is contained in:
cloudhead 2024-01-22 15:51:44 +01:00
parent 7208d89c31
commit f87dfba9cd
No known key found for this signature in database
78 changed files with 472 additions and 457 deletions

View File

@ -32,7 +32,7 @@ Options
}; };
pub struct Options { pub struct Options {
pub id: Id, pub id: RepoId,
pub remote: Option<Did>, pub remote: Option<Did>,
} }

View File

@ -2,7 +2,7 @@ use std::ffi::OsString;
use anyhow::anyhow; use anyhow::anyhow;
use radicle::identity::Id; use radicle::identity::RepoId;
use radicle::storage; use radicle::storage;
use radicle::storage::WriteStorage; use radicle::storage::WriteStorage;
@ -32,7 +32,7 @@ Options
}; };
pub struct Options { pub struct Options {
rid: Id, rid: RepoId,
confirm: bool, confirm: bool,
} }
@ -41,7 +41,7 @@ impl Args for Options {
use lexopt::prelude::*; use lexopt::prelude::*;
let mut parser = lexopt::Parser::from_args(args); let mut parser = lexopt::Parser::from_args(args);
let mut id: Option<Id> = None; let mut id: Option<RepoId> = None;
let mut confirm = true; let mut confirm = true;
while let Some(arg) = parser.next()? { while let Some(arg) = parser.next()? {

View File

@ -10,7 +10,7 @@ use thiserror::Error;
use radicle::cob; use radicle::cob;
use radicle::git::raw; use radicle::git::raw;
use radicle::identity::doc; use radicle::identity::doc;
use radicle::identity::doc::{DocError, Id}; use radicle::identity::doc::{DocError, RepoId};
use radicle::node; use radicle::node;
use radicle::node::policy::Scope; use radicle::node::policy::Scope;
use radicle::node::{Handle as _, Node}; use radicle::node::{Handle as _, Node};
@ -55,7 +55,7 @@ Options
#[derive(Debug)] #[derive(Debug)]
pub struct Options { pub struct Options {
/// The RID of the repository. /// The RID of the repository.
id: Id, id: RepoId,
/// The target directory for the repository to be cloned into. /// The target directory for the repository to be cloned into.
directory: Option<PathBuf>, directory: Option<PathBuf>,
/// The seeding scope of the repository. /// The seeding scope of the repository.
@ -71,7 +71,7 @@ impl Args for Options {
use lexopt::prelude::*; use lexopt::prelude::*;
let mut parser = lexopt::Parser::from_args(args); let mut parser = lexopt::Parser::from_args(args);
let mut id: Option<Id> = None; let mut id: Option<RepoId> = None;
let mut scope = Scope::All; let mut scope = Scope::All;
let mut mode = sync::RepoSync::default(); let mut mode = sync::RepoSync::default();
let mut timeout = time::Duration::from_secs(9); let mut timeout = time::Duration::from_secs(9);
@ -110,7 +110,7 @@ impl Args for Options {
Value(val) if id.is_none() => { Value(val) if id.is_none() => {
let val = val.to_string_lossy(); let val = val.to_string_lossy();
let val = val.strip_prefix("rad://").unwrap_or(&val); let val = val.strip_prefix("rad://").unwrap_or(&val);
let val = Id::from_str(val)?; let val = RepoId::from_str(val)?;
id = Some(val); id = Some(val);
} }
@ -229,13 +229,13 @@ pub enum CloneError {
#[error(transparent)] #[error(transparent)]
Repository(#[from] RepositoryError), Repository(#[from] RepositoryError),
#[error("repository {0} not found")] #[error("repository {0} not found")]
NotFound(Id), NotFound(RepoId),
#[error("no seeds found for {0}")] #[error("no seeds found for {0}")]
NoSeeds(Id), NoSeeds(RepoId),
} }
pub fn clone<G: Signer>( pub fn clone<G: Signer>(
id: Id, id: RepoId,
directory: Option<PathBuf>, directory: Option<PathBuf>,
scope: Scope, scope: Scope,
mode: sync::RepoSync, mode: sync::RepoSync,

View File

@ -5,7 +5,7 @@ use anyhow::anyhow;
use chrono::prelude::*; use chrono::prelude::*;
use nonempty::NonEmpty; use nonempty::NonEmpty;
use radicle::cob; use radicle::cob;
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::storage::ReadStorage; use radicle::storage::ReadStorage;
use radicle_cob::object::collaboration::list; use radicle_cob::object::collaboration::list;
@ -46,7 +46,7 @@ enum Operation {
} }
pub struct Options { pub struct Options {
rid: Id, rid: RepoId,
op: Operation, op: Operation,
type_name: cob::TypeName, type_name: cob::TypeName,
} }
@ -59,7 +59,7 @@ impl Args for Options {
let mut op: Option<OperationName> = None; let mut op: Option<OperationName> = None;
let mut type_name: Option<cob::TypeName> = None; let mut type_name: Option<cob::TypeName> = None;
let mut oid: Option<Rev> = None; let mut oid: Option<Rev> = None;
let mut rid: Option<Id> = None; let mut rid: Option<RepoId> = None;
while let Some(arg) = parser.next()? { while let Some(arg) = parser.next()? {
match arg { match arg {

View File

@ -2,7 +2,7 @@ use std::ffi::OsString;
use anyhow::Context as _; use anyhow::Context as _;
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::rad; use radicle::rad;
use crate::terminal as term; use crate::terminal as term;
@ -25,7 +25,7 @@ Options
}; };
pub struct Options { pub struct Options {
rid: Option<Id>, rid: Option<RepoId>,
} }
impl Args for Options { impl Args for Options {

View File

@ -5,7 +5,7 @@ use anyhow::{anyhow, Context};
use nonempty::NonEmpty; use nonempty::NonEmpty;
use radicle::cob::identity::{self, IdentityMut, Revision, RevisionId}; use radicle::cob::identity::{self, IdentityMut, Revision, RevisionId};
use radicle::identity::{doc, Identity, Visibility}; use radicle::identity::{doc, Identity, Visibility};
use radicle::prelude::{Did, Doc, Id, Signer}; use radicle::prelude::{Did, Doc, RepoId, Signer};
use radicle::storage::refs; use radicle::storage::refs;
use radicle::storage::{ReadRepository, ReadStorage as _, WriteRepository}; use radicle::storage::{ReadRepository, ReadStorage as _, WriteRepository};
use radicle::{cob, Profile}; use radicle::{cob, Profile};
@ -92,7 +92,7 @@ pub enum OperationName {
pub struct Options { pub struct Options {
pub op: Operation, pub op: Operation,
pub rid: Option<Id>, pub rid: Option<RepoId>,
pub interactive: Interactive, pub interactive: Interactive,
pub quiet: bool, pub quiet: bool,
} }
@ -104,7 +104,7 @@ impl Args for Options {
let mut parser = lexopt::Parser::from_args(args); let mut parser = lexopt::Parser::from_args(args);
let mut op: Option<OperationName> = None; let mut op: Option<OperationName> = None;
let mut revision: Option<Rev> = None; let mut revision: Option<Rev> = None;
let mut rid: Option<Id> = None; let mut rid: Option<RepoId> = None;
let mut title: Option<String> = None; let mut title: Option<String> = None;
let mut description: Option<String> = None; let mut description: Option<String> = None;
let mut delegate: Vec<Did> = Vec::new(); let mut delegate: Vec<Did> = Vec::new();

View File

@ -13,7 +13,7 @@ use serde_json as json;
use radicle::crypto::{ssh, Verified}; use radicle::crypto::{ssh, Verified};
use radicle::explorer::ExplorerUrl; use radicle::explorer::ExplorerUrl;
use radicle::git::RefString; use radicle::git::RefString;
use radicle::identity::{Id, Visibility}; use radicle::identity::{RepoId, Visibility};
use radicle::node::policy::Scope; use radicle::node::policy::Scope;
use radicle::node::{Event, Handle, NodeId}; use radicle::node::{Event, Handle, NodeId};
use radicle::prelude::Doc; use radicle::prelude::Doc;
@ -354,7 +354,7 @@ enum SyncResult<T> {
} }
fn sync( fn sync(
rid: Id, rid: RepoId,
node: &mut Node, node: &mut Node,
config: &profile::Config, config: &profile::Config,
) -> Result<SyncResult<Option<ExplorerUrl>>, radicle::node::Error> { ) -> Result<SyncResult<Option<ExplorerUrl>>, radicle::node::Error> {
@ -438,7 +438,7 @@ fn sync(
} }
pub fn announce( pub fn announce(
rid: Id, rid: RepoId,
doc: Doc<Verified>, doc: Doc<Verified>,
node: &mut Node, node: &mut Node,
config: &profile::Config, config: &profile::Config,

View File

@ -7,8 +7,8 @@ use std::str::FromStr;
use anyhow::{anyhow, Context as _}; use anyhow::{anyhow, Context as _};
use chrono::prelude::*; use chrono::prelude::*;
use radicle::identity::Id;
use radicle::identity::Identity; use radicle::identity::Identity;
use radicle::identity::RepoId;
use radicle::node::policy::Policy; use radicle::node::policy::Policy;
use radicle::node::AliasStore as _; use radicle::node::AliasStore as _;
use radicle::storage::refs::RefsAt; use radicle::storage::refs::RefsAt;
@ -64,7 +64,7 @@ pub enum Target {
#[derive(Default, Debug, Eq, PartialEq)] #[derive(Default, Debug, Eq, PartialEq)]
pub struct Options { pub struct Options {
pub rid: Option<Id>, pub rid: Option<RepoId>,
pub target: Target, pub target: Target,
} }
@ -73,7 +73,7 @@ impl Args for Options {
use lexopt::prelude::*; use lexopt::prelude::*;
let mut parser = lexopt::Parser::from_args(args); let mut parser = lexopt::Parser::from_args(args);
let mut rid: Option<Id> = None; let mut rid: Option<RepoId> = None;
let mut target = Target::default(); let mut target = Target::default();
while let Some(arg) = parser.next()? { while let Some(arg) = parser.next()? {
@ -111,7 +111,7 @@ impl Args for Options {
Value(val) if rid.is_none() => { Value(val) if rid.is_none() => {
let val = val.to_string_lossy(); let val = val.to_string_lossy();
if let Ok(val) = Id::from_str(&val) { if let Ok(val) = RepoId::from_str(&val) {
rid = Some(val); rid = Some(val);
} else if let Ok(val) = PathBuf::from_str(&val) { } else if let Ok(val) = PathBuf::from_str(&val) {
rid = radicle::rad::at(val) rid = radicle::rad::at(val)

View File

@ -4,7 +4,7 @@ use std::time;
use anyhow::anyhow; use anyhow::anyhow;
use radicle::node::{Address, Node, NodeId, PeerAddr}; use radicle::node::{Address, Node, NodeId, PeerAddr};
use radicle::prelude::Id; use radicle::prelude::RepoId;
use crate::terminal as term; use crate::terminal as term;
use crate::terminal::args::{Args, Error, Help}; use crate::terminal::args::{Args, Error, Help};
@ -73,7 +73,7 @@ pub enum Operation {
}, },
Routing { Routing {
json: bool, json: bool,
rid: Option<Id>, rid: Option<RepoId>,
nid: Option<NodeId>, nid: Option<NodeId>,
}, },
Start { Start {
@ -112,7 +112,7 @@ impl Args for Options {
let mut parser = lexopt::Parser::from_args(args); let mut parser = lexopt::Parser::from_args(args);
let mut op: Option<OperationName> = None; let mut op: Option<OperationName> = None;
let mut nid: Option<NodeId> = None; let mut nid: Option<NodeId> = None;
let mut rid: Option<Id> = None; let mut rid: Option<RepoId> = None;
let mut json: bool = false; let mut json: bool = false;
let mut addr: Option<PeerAddr<NodeId, Address>> = None; let mut addr: Option<PeerAddr<NodeId, Address>> = None;
let mut lines: usize = 60; let mut lines: usize = 60;

View File

@ -1,12 +1,12 @@
use radicle::node; use radicle::node;
use radicle::prelude::{Id, NodeId}; use radicle::prelude::{NodeId, RepoId};
use crate::terminal as term; use crate::terminal as term;
use crate::terminal::Element; use crate::terminal::Element;
pub fn run<S: node::routing::Store>( pub fn run<S: node::routing::Store>(
routing: &S, routing: &S,
rid: Option<Id>, rid: Option<RepoId>,
nid: Option<NodeId>, nid: Option<NodeId>,
json: bool, json: bool,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
@ -25,7 +25,7 @@ pub fn run<S: node::routing::Store>(
Ok(()) Ok(())
} }
fn print_table(entries: impl IntoIterator<Item = (Id, NodeId)>) { fn print_table(entries: impl IntoIterator<Item = (RepoId, NodeId)>) {
let mut t = term::Table::new(term::table::TableOptions::bordered()); let mut t = term::Table::new(term::table::TableOptions::bordered());
t.push([ t.push([
term::format::default(String::from("RID")), term::format::default(String::from("RID")),
@ -42,7 +42,7 @@ fn print_table(entries: impl IntoIterator<Item = (Id, NodeId)>) {
t.print(); t.print();
} }
fn print_json(entries: impl IntoIterator<Item = (Id, NodeId)>) { fn print_json(entries: impl IntoIterator<Item = (RepoId, NodeId)>) {
for (rid, nid) in entries { for (rid, nid) in entries {
println!("{}", serde_json::json!({ "rid": rid, "nid": nid })); println!("{}", serde_json::json!({ "rid": rid, "nid": nid }));
} }

View File

@ -4,7 +4,7 @@ use anyhow::{anyhow, Context as _};
use radicle::identity::{Identity, Visibility}; use radicle::identity::{Identity, Visibility};
use radicle::node::Handle as _; use radicle::node::Handle as _;
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::storage::{SignRepository, ValidateRepository, WriteRepository, WriteStorage}; use radicle::storage::{SignRepository, ValidateRepository, WriteRepository, WriteStorage};
use crate::terminal as term; use crate::terminal as term;
@ -38,7 +38,7 @@ Options
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct Options { pub struct Options {
pub rid: Option<Id>, pub rid: Option<RepoId>,
} }
impl Args for Options { impl Args for Options {

View File

@ -13,7 +13,7 @@ use crate::commands::rad_sync as sync;
use crate::project::SetupRemote; use crate::project::SetupRemote;
pub fn run( pub fn run(
rid: Id, rid: RepoId,
nid: &PublicKey, nid: &PublicKey,
name: Option<RefString>, name: Option<RefString>,
tracking: Option<BranchName>, tracking: Option<BranchName>,

View File

@ -1,7 +1,7 @@
use std::collections::HashSet; use std::collections::HashSet;
use radicle::git::Url; use radicle::git::Url;
use radicle::identity::{Did, Id}; use radicle::identity::{Did, RepoId};
use radicle::node::{Alias, AliasStore as _, NodeId}; use radicle::node::{Alias, AliasStore as _, NodeId};
use radicle::storage::ReadStorage as _; use radicle::storage::ReadStorage as _;
use radicle::Profile; use radicle::Profile;
@ -56,7 +56,7 @@ pub fn tracked(working: &git::Repository) -> anyhow::Result<Vec<Tracked>> {
} }
pub fn untracked<'a>( pub fn untracked<'a>(
rid: Id, rid: RepoId,
profile: &Profile, profile: &Profile,
tracked: impl Iterator<Item = &'a Tracked>, tracked: impl Iterator<Item = &'a Tracked>,
) -> anyhow::Result<Vec<Untracked>> { ) -> anyhow::Result<Vec<Untracked>> {

View File

@ -46,9 +46,15 @@ Options
#[derive(Debug)] #[derive(Debug)]
pub enum Operation { pub enum Operation {
Seed { rid: Id, fetch: bool, scope: Scope }, Seed {
rid: RepoId,
fetch: bool,
scope: Scope,
},
List, List,
Unseed { rid: Id }, Unseed {
rid: RepoId,
},
} }
#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)] #[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
@ -69,7 +75,7 @@ impl Args for Options {
use lexopt::prelude::*; use lexopt::prelude::*;
let mut parser = lexopt::Parser::from_args(args); let mut parser = lexopt::Parser::from_args(args);
let mut rid: Option<Id> = None; let mut rid: Option<RepoId> = None;
let mut scope: Option<Scope> = None; let mut scope: Option<Scope> = None;
let mut fetch: Option<bool> = None; let mut fetch: Option<bool> = None;
let mut op: Option<OperationName> = None; let mut op: Option<OperationName> = None;
@ -144,7 +150,7 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
} }
pub fn update( pub fn update(
rid: Id, rid: RepoId,
scope: Scope, scope: Scope,
node: &mut Node, node: &mut Node,
profile: &Profile, profile: &Profile,
@ -160,7 +166,7 @@ pub fn update(
Ok(()) Ok(())
} }
pub fn delete(rid: Id, node: &mut Node, profile: &Profile) -> anyhow::Result<()> { pub fn delete(rid: RepoId, node: &mut Node, profile: &Profile) -> anyhow::Result<()> {
if project::unseed(rid, node, profile)? { if project::unseed(rid, node, profile)? {
term::success!("Seeding policy for {} removed", term::format::tertiary(rid)); term::success!("Seeding policy for {} removed", term::format::tertiary(rid));
} }

View File

@ -10,7 +10,7 @@ use radicle::node;
use radicle::node::AliasStore; use radicle::node::AliasStore;
use radicle::node::Seed; use radicle::node::Seed;
use radicle::node::{FetchResult, FetchResults, Handle as _, Node, SyncStatus}; use radicle::node::{FetchResult, FetchResults, Handle as _, Node, SyncStatus};
use radicle::prelude::{Id, NodeId, Profile}; use radicle::prelude::{NodeId, Profile, RepoId};
use radicle::storage::{ReadRepository, ReadStorage}; use radicle::storage::{ReadRepository, ReadStorage};
use radicle_term::Element; use radicle_term::Element;
@ -138,7 +138,7 @@ pub enum SyncDirection {
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct Options { pub struct Options {
pub rid: Option<Id>, pub rid: Option<RepoId>,
pub verbose: bool, pub verbose: bool,
pub timeout: time::Duration, pub timeout: time::Duration,
pub sort_by: SortBy, pub sort_by: SortBy,
@ -306,7 +306,7 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
} }
fn sync_status( fn sync_status(
rid: Id, rid: RepoId,
node: &mut Node, node: &mut Node,
profile: &Profile, profile: &Profile,
options: &Options, options: &Options,
@ -375,7 +375,7 @@ fn sync_status(
} }
fn announce_refs( fn announce_refs(
rid: Id, rid: RepoId,
mode: RepoSync, mode: RepoSync,
timeout: time::Duration, timeout: time::Duration,
mut node: Node, mut node: Node,
@ -482,7 +482,7 @@ pub fn announce_inventory(mut node: Node) -> anyhow::Result<()> {
} }
pub fn fetch( pub fn fetch(
rid: Id, rid: RepoId,
mode: RepoSync, mode: RepoSync,
timeout: time::Duration, timeout: time::Duration,
node: &mut Node, node: &mut Node,
@ -501,7 +501,7 @@ pub fn fetch(
} }
fn fetch_all( fn fetch_all(
rid: Id, rid: RepoId,
count: usize, count: usize,
timeout: time::Duration, timeout: time::Duration,
node: &mut Node, node: &mut Node,
@ -562,7 +562,7 @@ fn fetch_all(
} }
fn fetch_from( fn fetch_from(
rid: Id, rid: RepoId,
seed: &NodeId, seed: &NodeId,
timeout: time::Duration, timeout: time::Duration,
node: &mut Node, node: &mut Node,

View File

@ -4,7 +4,7 @@ use std::{thread, time};
use anyhow::{anyhow, Context as _}; use anyhow::{anyhow, Context as _};
use radicle::git; use radicle::git;
use radicle::prelude::{Id, NodeId}; use radicle::prelude::{NodeId, RepoId};
use radicle::storage::{ReadRepository, ReadStorage}; use radicle::storage::{ReadRepository, ReadStorage};
use crate::terminal as term; use crate::terminal as term;
@ -39,7 +39,7 @@ Options
}; };
pub struct Options { pub struct Options {
rid: Option<Id>, rid: Option<RepoId>,
refstr: git::RefString, refstr: git::RefString,
target: Option<git::Oid>, target: Option<git::Oid>,
nid: Option<NodeId>, nid: Option<NodeId>,

View File

@ -22,7 +22,7 @@ use radicle::crypto::ssh;
use radicle::git; use radicle::git;
use radicle::git::raw as git2; use radicle::git::raw as git2;
use radicle::git::{Version, VERSION_REQUIRED}; use radicle::git::{Version, VERSION_REQUIRED};
use radicle::prelude::{Id, NodeId}; use radicle::prelude::{NodeId, RepoId};
use radicle::storage::git::transport; use radicle::storage::git::transport;
pub use radicle::git::raw::{ pub use radicle::git::raw::{
@ -260,7 +260,7 @@ pub fn is_remote(repo: &git2::Repository, alias: &str) -> anyhow::Result<bool> {
} }
/// Get the repository's "rad" remote. /// Get the repository's "rad" remote.
pub fn rad_remote(repo: &Repository) -> anyhow::Result<(git2::Remote, Id)> { pub fn rad_remote(repo: &Repository) -> anyhow::Result<(git2::Remote, RepoId)> {
match radicle::rad::remote(repo) { match radicle::rad::remote(repo) {
Ok((remote, id)) => Ok((remote, id)), Ok((remote, id)) => Ok((remote, id)),
Err(radicle::rad::RemoteError::NotFound(_)) => Err(anyhow!( Err(radicle::rad::RemoteError::NotFound(_)) => Err(anyhow!(
@ -270,7 +270,7 @@ pub fn rad_remote(repo: &Repository) -> anyhow::Result<(git2::Remote, Id)> {
} }
} }
pub fn remove_remote(repo: &Repository, rid: &Id) -> anyhow::Result<()> { pub fn remove_remote(repo: &Repository, rid: &RepoId) -> anyhow::Result<()> {
// N.b. ensure that we are removing the remote for the correct RID // N.b. ensure that we are removing the remote for the correct RID
match radicle::rad::remote(repo) { match radicle::rad::remote(repo) {
Ok((_, rid_)) => { Ok((_, rid_)) => {

View File

@ -1,7 +1,7 @@
use std::ops::ControlFlow; use std::ops::ControlFlow;
use std::time::Duration; use std::time::Duration;
use radicle::identity::Id; use radicle::identity::RepoId;
use radicle::node; use radicle::node;
use radicle::node::Handle as _; use radicle::node::Handle as _;
use radicle::Node; use radicle::Node;
@ -9,7 +9,7 @@ use radicle::Node;
use crate::terminal as term; use crate::terminal as term;
/// Announce changes to the network. /// Announce changes to the network.
pub fn announce(rid: Id, node: &mut Node) -> anyhow::Result<()> { pub fn announce(rid: RepoId, node: &mut Node) -> anyhow::Result<()> {
match announce_(rid, node) { match announce_(rid, node) {
Ok(()) => Ok(()), Ok(()) => Ok(()),
Err(e) if e.is_connection_err() => { Err(e) if e.is_connection_err() => {
@ -20,7 +20,7 @@ pub fn announce(rid: Id, node: &mut Node) -> anyhow::Result<()> {
} }
} }
fn announce_(rid: Id, node: &mut Node) -> Result<(), radicle::node::Error> { fn announce_(rid: RepoId, node: &mut Node) -> Result<(), radicle::node::Error> {
let seeds = node.seeds(rid)?; let seeds = node.seeds(rid)?;
let connected = seeds.connected().map(|s| s.nid).collect::<Vec<_>>(); let connected = seeds.connected().map(|s| s.nid).collect::<Vec<_>>();

View File

@ -6,10 +6,10 @@ use radicle::node::policy::Scope;
use radicle::node::{Handle, NodeId}; use radicle::node::{Handle, NodeId};
use radicle::Node; use radicle::Node;
/// Setup a project remote and tracking branch. /// Setup a repository remote and tracking branch.
pub struct SetupRemote<'a> { pub struct SetupRemote<'a> {
/// The project id. /// The repository id.
pub rid: Id, pub rid: RepoId,
/// Whether or not to setup a remote tracking branch. /// Whether or not to setup a remote tracking branch.
pub tracking: Option<BranchName>, pub tracking: Option<BranchName>,
/// Whether or not to fetch the remote immediately. /// Whether or not to fetch the remote immediately.
@ -55,7 +55,7 @@ impl<'a> SetupRemote<'a> {
/// Seed a repository by first trying to seed through the node, and if the node isn't running, /// Seed a repository by first trying to seed through the node, and if the node isn't running,
/// by updating the policy database directly. /// by updating the policy database directly.
pub fn seed( pub fn seed(
rid: Id, rid: RepoId,
scope: Scope, scope: Scope,
node: &mut Node, node: &mut Node,
profile: &Profile, profile: &Profile,
@ -72,7 +72,7 @@ pub fn seed(
/// Unseed a repository by first trying to unseed through the node, and if the node isn't running, /// Unseed a repository by first trying to unseed through the node, and if the node isn't running,
/// by updating the policy database directly. /// by updating the policy database directly.
pub fn unseed(rid: Id, node: &mut Node, profile: &Profile) -> Result<bool, anyhow::Error> { pub fn unseed(rid: RepoId, node: &mut Node, profile: &Profile) -> Result<bool, anyhow::Error> {
match node.unseed(rid) { match node.unseed(rid) {
Ok(updated) => Ok(updated), Ok(updated) => Ok(updated),
Err(e) if e.is_connection_err() => { Err(e) if e.is_connection_err() => {

View File

@ -9,7 +9,7 @@ use radicle::cob::{self, issue, patch};
use radicle::crypto; use radicle::crypto;
use radicle::git::{Oid, RefString}; use radicle::git::{Oid, RefString};
use radicle::node::{Address, Alias}; use radicle::node::{Address, Alias};
use radicle::prelude::{Did, Id, NodeId}; use radicle::prelude::{Did, NodeId, RepoId};
use crate::git::Rev; use crate::git::Rev;
@ -116,9 +116,9 @@ pub fn nid(val: &OsString) -> anyhow::Result<NodeId> {
NodeId::from_str(&val).map_err(|_| anyhow!("invalid Node ID '{}'", val)) NodeId::from_str(&val).map_err(|_| anyhow!("invalid Node ID '{}'", val))
} }
pub fn rid(val: &OsString) -> anyhow::Result<Id> { pub fn rid(val: &OsString) -> anyhow::Result<RepoId> {
let val = val.to_string_lossy(); let val = val.to_string_lossy();
Id::from_str(&val).map_err(|_| anyhow!("invalid Repository ID '{}'", val)) RepoId::from_str(&val).map_err(|_| anyhow!("invalid Repository ID '{}'", val))
} }
pub fn pubkey(val: &OsString) -> anyhow::Result<NodeId> { pub fn pubkey(val: &OsString) -> anyhow::Result<NodeId> {

View File

@ -8,7 +8,7 @@ use radicle::node::address::Store as _;
use radicle::node::routing::Store as _; use radicle::node::routing::Store as _;
use radicle::node::Handle as _; use radicle::node::Handle as _;
use radicle::node::{Alias, DEFAULT_TIMEOUT}; use radicle::node::{Alias, DEFAULT_TIMEOUT};
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::profile; use radicle::profile;
use radicle::profile::{Home, PreferredSeeds}; use radicle::profile::{Home, PreferredSeeds};
use radicle::storage::{ReadStorage, RemoteRepository}; use radicle::storage::{ReadStorage, RemoteRepository};
@ -301,7 +301,7 @@ fn rad_id() {
let bob = environment.node(config::node("bob")); let bob = environment.node(config::node("bob"));
let working = tempfile::tempdir().unwrap(); let working = tempfile::tempdir().unwrap();
let working = working.path(); let working = working.path();
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
// Setup a test repository. // Setup a test repository.
fixtures::repository(working.join("alice")); fixtures::repository(working.join("alice"));
@ -350,7 +350,7 @@ fn rad_id_multi_delegate() {
let eve = environment.node(Config::test(Alias::new("eve"))); let eve = environment.node(Config::test(Alias::new("eve")));
let working = tempfile::tempdir().unwrap(); let working = tempfile::tempdir().unwrap();
let working = working.path(); let working = working.path();
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
// Setup a test repository. // Setup a test repository.
fixtures::repository(working.join("alice")); fixtures::repository(working.join("alice"));
@ -409,7 +409,7 @@ fn rad_id_collaboration() {
let distrustful = environment.node(config::seed("distrustful")); let distrustful = environment.node(config::seed("distrustful"));
let working = tempfile::tempdir().unwrap(); let working = tempfile::tempdir().unwrap();
let working = working.path(); let working = working.path();
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
// Setup a test repository. // Setup a test repository.
fixtures::repository(working.join("alice")); fixtures::repository(working.join("alice"));
@ -511,7 +511,7 @@ fn rad_id_conflict() {
let bob = environment.node(Config::test(Alias::new("bob"))); let bob = environment.node(Config::test(Alias::new("bob")));
let working = tempfile::tempdir().unwrap(); let working = tempfile::tempdir().unwrap();
let working = working.path(); let working = working.path();
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
// Setup a test repository. // Setup a test repository.
fixtures::repository(working.join("alice")); fixtures::repository(working.join("alice"));
@ -696,7 +696,7 @@ fn rad_patch_checkout_force() {
let alice = environment.node(Config::test(Alias::new("alice"))); let alice = environment.node(Config::test(Alias::new("alice")));
let bob = environment.node(Config::test(Alias::new("bob"))); let bob = environment.node(Config::test(Alias::new("bob")));
let working = environment.tmp().join("working"); let working = environment.tmp().join("working");
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
// Setup a test repository. // Setup a test repository.
fixtures::repository(working.join("alice")); fixtures::repository(working.join("alice"));
@ -895,7 +895,7 @@ fn rad_clean() {
let working = environment.tmp().join("working"); let working = environment.tmp().join("working");
// Setup a test project. // Setup a test project.
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
fixtures::repository(working.join("acme")); fixtures::repository(working.join("acme"));
test( test(
"examples/rad-init.md", "examples/rad-init.md",
@ -1060,7 +1060,7 @@ fn rad_clone_connect() {
let alice = environment.node(Config::test(Alias::new("alice"))); let alice = environment.node(Config::test(Alias::new("alice")));
let bob = environment.node(Config::test(Alias::new("bob"))); let bob = environment.node(Config::test(Alias::new("bob")));
let mut eve = environment.node(Config::test(Alias::new("eve"))); let mut eve = environment.node(Config::test(Alias::new("eve")));
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
let now = localtime::LocalTime::now().as_secs(); let now = localtime::LocalTime::now().as_secs();
fixtures::repository(working.join("acme")); fixtures::repository(working.join("acme"));
@ -1134,7 +1134,7 @@ fn rad_sync_without_node() {
let bob = environment.node(Config::test(Alias::new("bob"))); let bob = environment.node(Config::test(Alias::new("bob")));
let mut eve = environment.node(Config::test(Alias::new("eve"))); let mut eve = environment.node(Config::test(Alias::new("eve")));
let rid = Id::from_urn("rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5").unwrap(); let rid = RepoId::from_urn("rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5").unwrap();
eve.policies.seed(&rid, Scope::All).unwrap(); eve.policies.seed(&rid, Scope::All).unwrap();
formula(&environment.tmp(), "examples/rad-sync-without-node.md") formula(&environment.tmp(), "examples/rad-sync-without-node.md")
@ -1527,7 +1527,7 @@ fn rad_sync() {
let alice = environment.node(config::node("alice")); let alice = environment.node(config::node("alice"));
let bob = environment.node(config::node("bob")); let bob = environment.node(config::node("bob"));
let eve = environment.node(config::node("eve")); let eve = environment.node(config::node("eve"));
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
fixtures::repository(working.join("acme")); fixtures::repository(working.join("acme"));
@ -1576,7 +1576,7 @@ fn test_replication_via_seed() {
..Config::test(Alias::new("seed")) ..Config::test(Alias::new("seed"))
}); });
let working = environment.tmp().join("working"); let working = environment.tmp().join("working");
let rid = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let rid = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
let mut alice = alice.spawn(); let mut alice = alice.spawn();
let mut bob = bob.spawn(); let mut bob = bob.spawn();
@ -1657,7 +1657,7 @@ fn rad_remote() {
let eve = environment.node(Config::test(Alias::new("eve"))); let eve = environment.node(Config::test(Alias::new("eve")));
let working = environment.tmp().join("working"); let working = environment.tmp().join("working");
let home = alice.home.clone(); let home = alice.home.clone();
let rid = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let rid = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
// Setup a test repository. // Setup a test repository.
fixtures::repository(working.join("alice")); fixtures::repository(working.join("alice"));
@ -1991,7 +1991,7 @@ fn git_push_diverge() {
let alice = environment.node(Config::test(Alias::new("alice"))); let alice = environment.node(Config::test(Alias::new("alice")));
let bob = environment.node(Config::test(Alias::new("bob"))); let bob = environment.node(Config::test(Alias::new("bob")));
let working = environment.tmp().join("working"); let working = environment.tmp().join("working");
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
fixtures::repository(working.join("alice")); fixtures::repository(working.join("alice"));
@ -2032,7 +2032,7 @@ fn rad_push_and_pull_patches() {
let alice = environment.node(Config::test(Alias::new("alice"))); let alice = environment.node(Config::test(Alias::new("alice")));
let bob = environment.node(Config::test(Alias::new("bob"))); let bob = environment.node(Config::test(Alias::new("bob")));
let working = environment.tmp().join("working"); let working = environment.tmp().join("working");
let acme = Id::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap(); let acme = RepoId::from_str("z42hL2jL4XNk6K8oHQaSWfMgCL7ji").unwrap();
fixtures::repository(working.join("alice")); fixtures::repository(working.join("alice"));

View File

@ -87,7 +87,7 @@ pub mod error {
use std::io; use std::io;
use radicle::node::policy; use radicle::node::policy;
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::{git, storage}; use radicle::{git, storage};
use thiserror::Error; use thiserror::Error;
@ -103,15 +103,15 @@ pub mod error {
pub enum Tracking { pub enum Tracking {
#[error("failed to find policy for {rid}")] #[error("failed to find policy for {rid}")]
FailedPolicy { FailedPolicy {
rid: Id, rid: RepoId,
#[source] #[source]
err: policy::store::Error, err: policy::store::Error,
}, },
#[error("cannot fetch {rid} as it is not seeded")] #[error("cannot fetch {rid} as it is not seeded")]
BlockedPolicy { rid: Id }, BlockedPolicy { rid: RepoId },
#[error("failed to get tracking nodes for {rid}")] #[error("failed to get tracking nodes for {rid}")]
FailedNodes { FailedNodes {
rid: Id, rid: RepoId,
#[source] #[source]
err: policy::store::Error, err: policy::store::Error,
}, },

View File

@ -3,7 +3,7 @@ use std::collections::HashSet;
use radicle::crypto::PublicKey; use radicle::crypto::PublicKey;
use radicle::node::policy::config::Config; use radicle::node::policy::config::Config;
use radicle::node::policy::store::Read; use radicle::node::policy::store::Read;
use radicle::prelude::Id; use radicle::prelude::RepoId;
pub use radicle::node::policy::{Policy, Scope}; pub use radicle::node::policy::{Policy, Scope};
@ -14,7 +14,7 @@ pub enum Allowed {
} }
impl Allowed { impl Allowed {
pub fn from_config(rid: Id, config: &Config<Read>) -> Result<Self, error::Policy> { pub fn from_config(rid: RepoId, config: &Config<Read>) -> Result<Self, error::Policy> {
let entry = config let entry = config
.repo_policy(&rid) .repo_policy(&rid)
.map_err(|err| error::Policy::FailedPolicy { rid, err })?; .map_err(|err| error::Policy::FailedPolicy { rid, err })?;
@ -71,7 +71,7 @@ impl BlockList {
pub mod error { pub mod error {
use radicle::node::policy; use radicle::node::policy;
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::storage; use radicle::storage;
use thiserror::Error; use thiserror::Error;
@ -83,15 +83,15 @@ pub mod error {
pub enum Policy { pub enum Policy {
#[error("failed to find policy for {rid}")] #[error("failed to find policy for {rid}")]
FailedPolicy { FailedPolicy {
rid: Id, rid: RepoId,
#[source] #[source]
err: policy::store::Error, err: policy::store::Error,
}, },
#[error("cannot fetch {rid} as it is not seeded")] #[error("cannot fetch {rid} as it is not seeded")]
BlockedPolicy { rid: Id }, BlockedPolicy { rid: RepoId },
#[error("failed to get followed nodes for {rid}")] #[error("failed to get followed nodes for {rid}")]
FailedNodes { FailedNodes {
rid: Id, rid: RepoId,
#[source] #[source]
err: policy::store::Error, err: policy::store::Error,
}, },

View File

@ -16,7 +16,7 @@ use tower_http::cors::{self, CorsLayer};
use radicle::cob::issue; use radicle::cob::issue;
use radicle::cob::patch; use radicle::cob::patch;
use radicle::identity::{DocAt, Id}; use radicle::identity::{DocAt, RepoId};
use radicle::node::policy::Scope; use radicle::node::policy::Scope;
use radicle::node::routing::Store; use radicle::node::routing::Store;
use radicle::node::{Handle, NodeId}; use radicle::node::{Handle, NodeId};
@ -52,7 +52,7 @@ impl Context {
} }
} }
pub fn project_info(&self, id: Id) -> Result<project::Info, error::Error> { pub fn project_info(&self, id: RepoId) -> Result<project::Info, error::Error> {
let storage = &self.profile.storage; let storage = &self.profile.storage;
let repo = storage.repository(id)?; let repo = storage.repository(id)?;
let (_, head) = repo.head()?; let (_, head) = repo.head()?;
@ -196,7 +196,7 @@ mod project {
use radicle::cob; use radicle::cob;
use radicle::git::Oid; use radicle::git::Oid;
use radicle::identity::project::Project; use radicle::identity::project::Project;
use radicle::identity::{Id, Visibility}; use radicle::identity::{RepoId, Visibility};
use radicle::prelude::Did; use radicle::prelude::Did;
/// Project info. /// Project info.
@ -211,13 +211,13 @@ mod project {
pub head: Oid, pub head: Oid,
pub patches: cob::patch::PatchCounts, pub patches: cob::patch::PatchCounts,
pub issues: cob::issue::IssueCounts, pub issues: cob::issue::IssueCounts,
pub id: Id, pub id: RepoId,
pub seeding: usize, pub seeding: usize,
} }
} }
/// Announce refs to the network for the given RID. /// Announce refs to the network for the given RID.
pub fn announce_refs(mut node: Node, rid: Id) -> Result<(), Error> { pub fn announce_refs(mut node: Node, rid: RepoId) -> Result<(), Error> {
match node.announce_refs(rid) { match node.announce_refs(rid) {
Ok(_) => Ok(()), Ok(_) => Ok(()),
Err(e) if e.is_connection_err() => Ok(()), Err(e) if e.is_connection_err() => Ok(()),

View File

@ -6,7 +6,7 @@ use axum_auth::AuthBearer;
use hyper::StatusCode; use hyper::StatusCode;
use serde_json::json; use serde_json::json;
use radicle::identity::Id; use radicle::identity::RepoId;
use radicle::node::{policy, Handle, DEFAULT_TIMEOUT}; use radicle::node::{policy, Handle, DEFAULT_TIMEOUT};
use radicle::Node; use radicle::Node;
@ -74,7 +74,7 @@ async fn node_policies_repos_handler(State(ctx): State<Context>) -> impl IntoRes
async fn node_policies_seed_handler( async fn node_policies_seed_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
AuthBearer(token): AuthBearer, AuthBearer(token): AuthBearer,
Path(project): Path<Id>, Path(project): Path<RepoId>,
Query(qs): Query<PoliciesQuery>, Query(qs): Query<PoliciesQuery>,
) -> impl IntoResponse { ) -> impl IntoResponse {
api::auth::validate(&ctx, &token).await?; api::auth::validate(&ctx, &token).await?;
@ -96,7 +96,7 @@ async fn node_policies_seed_handler(
async fn node_policies_unseed_handler( async fn node_policies_unseed_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
AuthBearer(token): AuthBearer, AuthBearer(token): AuthBearer,
Path(project): Path<Id>, Path(project): Path<RepoId>,
) -> impl IntoResponse { ) -> impl IntoResponse {
api::auth::validate(&ctx, &token).await?; api::auth::validate(&ctx, &token).await?;
let mut node = Node::new(ctx.profile.socket()); let mut node = Node::new(ctx.profile.socket());

View File

@ -15,7 +15,7 @@ use serde_json::json;
use tower_http::set_header::SetResponseHeaderLayer; use tower_http::set_header::SetResponseHeaderLayer;
use radicle::cob::{issue, patch, resolve_embed, Embed, Label, Uri}; use radicle::cob::{issue, patch, resolve_embed, Embed, Label, Uri};
use radicle::identity::{Did, Id, Visibility}; use radicle::identity::{Did, RepoId, Visibility};
use radicle::node::routing::Store; use radicle::node::routing::Store;
use radicle::node::{AliasStore, Node, NodeId}; use radicle::node::{AliasStore, Node, NodeId};
use radicle::storage::git::paths; use radicle::storage::git::paths;
@ -141,7 +141,7 @@ async fn project_root_handler(
/// Get project metadata. /// Get project metadata.
/// `GET /projects/:project` /// `GET /projects/:project`
async fn project_handler(State(ctx): State<Context>, Path(id): Path<Id>) -> impl IntoResponse { async fn project_handler(State(ctx): State<Context>, Path(id): Path<RepoId>) -> impl IntoResponse {
let info = ctx.project_info(id)?; let info = ctx.project_info(id)?;
Ok::<_, Error>(Json(info)) Ok::<_, Error>(Json(info))
@ -161,7 +161,7 @@ pub struct CommitsQueryString {
/// `GET /projects/:project/commits?since=<sha>` /// `GET /projects/:project/commits?since=<sha>`
async fn history_handler( async fn history_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path(project): Path<Id>, Path(project): Path<RepoId>,
Query(qs): Query<CommitsQueryString>, Query(qs): Query<CommitsQueryString>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let CommitsQueryString { let CommitsQueryString {
@ -242,7 +242,7 @@ async fn history_handler(
/// `GET /projects/:project/commits/:sha` /// `GET /projects/:project/commits/:sha`
async fn commit_handler( async fn commit_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path((project, sha)): Path<(Id, Oid)>, Path((project, sha)): Path<(RepoId, Oid)>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let storage = &ctx.profile.storage; let storage = &ctx.profile.storage;
let repo = Repository::open(paths::repository(storage, &project))?; let repo = Repository::open(paths::repository(storage, &project))?;
@ -308,7 +308,7 @@ async fn commit_handler(
/// `GET /projects/:project/diff/:base/:oid` /// `GET /projects/:project/diff/:base/:oid`
async fn diff_handler( async fn diff_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path((project, base, oid)): Path<(Id, Oid, Oid)>, Path((project, base, oid)): Path<(RepoId, Oid, Oid)>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let storage = &ctx.profile.storage; let storage = &ctx.profile.storage;
let repo = Repository::open(paths::repository(storage, &project))?; let repo = Repository::open(paths::repository(storage, &project))?;
@ -375,7 +375,7 @@ async fn diff_handler(
/// `GET /projects/:project/activity` /// `GET /projects/:project/activity`
async fn activity_handler( async fn activity_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path(project): Path<Id>, Path(project): Path<RepoId>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let current_date = chrono::Utc::now().timestamp(); let current_date = chrono::Utc::now().timestamp();
let one_year_ago = chrono::Duration::weeks(52); let one_year_ago = chrono::Duration::weeks(52);
@ -402,7 +402,7 @@ async fn activity_handler(
/// `GET /projects/:project/tree/:sha/` /// `GET /projects/:project/tree/:sha/`
async fn tree_handler_root( async fn tree_handler_root(
State(ctx): State<Context>, State(ctx): State<Context>,
Path((project, sha)): Path<(Id, Oid)>, Path((project, sha)): Path<(RepoId, Oid)>,
) -> impl IntoResponse { ) -> impl IntoResponse {
tree_handler(State(ctx), Path((project, sha, String::new()))).await tree_handler(State(ctx), Path((project, sha, String::new()))).await
} }
@ -411,7 +411,7 @@ async fn tree_handler_root(
/// `GET /projects/:project/tree/:sha/*path` /// `GET /projects/:project/tree/:sha/*path`
async fn tree_handler( async fn tree_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path((project, sha, path)): Path<(Id, Oid, String)>, Path((project, sha, path)): Path<(RepoId, Oid, String)>,
) -> impl IntoResponse { ) -> impl IntoResponse {
if let Some(ref cache) = ctx.cache { if let Some(ref cache) = ctx.cache {
let cache = &mut cache.tree.lock().await; let cache = &mut cache.tree.lock().await;
@ -436,7 +436,10 @@ async fn tree_handler(
/// Get all project remotes. /// Get all project remotes.
/// `GET /projects/:project/remotes` /// `GET /projects/:project/remotes`
async fn remotes_handler(State(ctx): State<Context>, Path(project): Path<Id>) -> impl IntoResponse { async fn remotes_handler(
State(ctx): State<Context>,
Path(project): Path<RepoId>,
) -> impl IntoResponse {
let storage = &ctx.profile.storage; let storage = &ctx.profile.storage;
let repo = storage.repository(project)?; let repo = storage.repository(project)?;
let delegates = repo.delegates()?; let delegates = repo.delegates()?;
@ -478,7 +481,7 @@ async fn remotes_handler(State(ctx): State<Context>, Path(project): Path<Id>) ->
/// `GET /projects/:project/remotes/:peer` /// `GET /projects/:project/remotes/:peer`
async fn remote_handler( async fn remote_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path((project, node_id)): Path<(Id, NodeId)>, Path((project, node_id)): Path<(RepoId, NodeId)>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let storage = &ctx.profile.storage; let storage = &ctx.profile.storage;
let repo = storage.repository(project)?; let repo = storage.repository(project)?;
@ -506,7 +509,7 @@ async fn remote_handler(
/// `GET /projects/:project/blob/:sha/*path` /// `GET /projects/:project/blob/:sha/*path`
async fn blob_handler( async fn blob_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path((project, sha, path)): Path<(Id, Oid, String)>, Path((project, sha, path)): Path<(RepoId, Oid, String)>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let storage = &ctx.profile.storage; let storage = &ctx.profile.storage;
let repo = Repository::open(paths::repository(storage, &project))?; let repo = Repository::open(paths::repository(storage, &project))?;
@ -520,7 +523,7 @@ async fn blob_handler(
/// `GET /projects/:project/readme/:sha` /// `GET /projects/:project/readme/:sha`
async fn readme_handler( async fn readme_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path((project, sha)): Path<(Id, Oid)>, Path((project, sha)): Path<(RepoId, Oid)>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let storage = &ctx.profile.storage; let storage = &ctx.profile.storage;
let repo = Repository::open(paths::repository(storage, &project))?; let repo = Repository::open(paths::repository(storage, &project))?;
@ -551,7 +554,7 @@ async fn readme_handler(
/// `GET /projects/:project/issues` /// `GET /projects/:project/issues`
async fn issues_handler( async fn issues_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path(project): Path<Id>, Path(project): Path<RepoId>,
Query(qs): Query<CobsQuery<api::IssueState>>, Query(qs): Query<CobsQuery<api::IssueState>>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let CobsQuery { let CobsQuery {
@ -599,7 +602,7 @@ pub struct IssueCreate {
async fn issue_create_handler( async fn issue_create_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
AuthBearer(token): AuthBearer, AuthBearer(token): AuthBearer,
Path(project): Path<Id>, Path(project): Path<RepoId>,
Json(issue): Json<IssueCreate>, Json(issue): Json<IssueCreate>,
) -> impl IntoResponse { ) -> impl IntoResponse {
api::auth::validate(&ctx, &token).await?; api::auth::validate(&ctx, &token).await?;
@ -641,7 +644,7 @@ async fn issue_create_handler(
async fn issue_update_handler( async fn issue_update_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
AuthBearer(token): AuthBearer, AuthBearer(token): AuthBearer,
Path((project, issue_id)): Path<(Id, Oid)>, Path((project, issue_id)): Path<(RepoId, Oid)>,
Json(action): Json<issue::Action>, Json(action): Json<issue::Action>,
) -> impl IntoResponse { ) -> impl IntoResponse {
api::auth::validate(&ctx, &token).await?; api::auth::validate(&ctx, &token).await?;
@ -696,7 +699,7 @@ async fn issue_update_handler(
/// `GET /projects/:project/issues/:id` /// `GET /projects/:project/issues/:id`
async fn issue_handler( async fn issue_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path((project, issue_id)): Path<(Id, Oid)>, Path((project, issue_id)): Path<(RepoId, Oid)>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let storage = &ctx.profile.storage; let storage = &ctx.profile.storage;
let repo = storage.repository(project)?; let repo = storage.repository(project)?;
@ -722,7 +725,7 @@ pub struct PatchCreate {
async fn patch_create_handler( async fn patch_create_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
AuthBearer(token): AuthBearer, AuthBearer(token): AuthBearer,
Path(project): Path<Id>, Path(project): Path<RepoId>,
Json(patch): Json<PatchCreate>, Json(patch): Json<PatchCreate>,
) -> impl IntoResponse { ) -> impl IntoResponse {
api::auth::validate(&ctx, &token).await?; api::auth::validate(&ctx, &token).await?;
@ -761,7 +764,7 @@ async fn patch_create_handler(
async fn patch_update_handler( async fn patch_update_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
AuthBearer(token): AuthBearer, AuthBearer(token): AuthBearer,
Path((project, patch_id)): Path<(Id, Oid)>, Path((project, patch_id)): Path<(RepoId, Oid)>,
Json(action): Json<patch::Action>, Json(action): Json<patch::Action>,
) -> impl IntoResponse { ) -> impl IntoResponse {
api::auth::validate(&ctx, &token).await?; api::auth::validate(&ctx, &token).await?;
@ -901,7 +904,7 @@ async fn patch_update_handler(
/// `GET /projects/:project/patches` /// `GET /projects/:project/patches`
async fn patches_handler( async fn patches_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path(project): Path<Id>, Path(project): Path<RepoId>,
Query(qs): Query<CobsQuery<api::PatchState>>, Query(qs): Query<CobsQuery<api::PatchState>>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let CobsQuery { let CobsQuery {
@ -938,7 +941,7 @@ async fn patches_handler(
/// `GET /projects/:project/patches/:id` /// `GET /projects/:project/patches/:id`
async fn patch_handler( async fn patch_handler(
State(ctx): State<Context>, State(ctx): State<Context>,
Path((project, patch_id)): Path<(Id, Oid)>, Path((project, patch_id)): Path<(RepoId, Oid)>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let storage = &ctx.profile.storage; let storage = &ctx.profile.storage;
let repo = storage.repository(project)?; let repo = storage.repository(project)?;

View File

@ -4,12 +4,12 @@ use std::sync::Arc;
use lru::LruCache; use lru::LruCache;
use tokio::sync::Mutex; use tokio::sync::Mutex;
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle_surf::Oid; use radicle_surf::Oid;
#[derive(Clone)] #[derive(Clone)]
pub struct Cache { pub struct Cache {
pub tree: Arc<Mutex<LruCache<(Id, Oid, String), serde_json::Value>>>, pub tree: Arc<Mutex<LruCache<(RepoId, Oid, String), serde_json::Value>>>,
} }
impl Cache { impl Cache {

View File

@ -16,19 +16,19 @@ use axum::Router;
use flate2::write::GzDecoder; use flate2::write::GzDecoder;
use hyper::body::Buf as _; use hyper::body::Buf as _;
use radicle::identity::Id; use radicle::identity::RepoId;
use radicle::profile::Profile; use radicle::profile::Profile;
use crate::error::GitError as Error; use crate::error::GitError as Error;
pub fn router(profile: Arc<Profile>, aliases: HashMap<String, Id>) -> Router { pub fn router(profile: Arc<Profile>, aliases: HashMap<String, RepoId>) -> Router {
Router::new() Router::new()
.route("/:project/*request", any(git_handler)) .route("/:project/*request", any(git_handler))
.with_state((profile, aliases)) .with_state((profile, aliases))
} }
async fn git_handler( async fn git_handler(
State((profile, aliases)): State<(Arc<Profile>, HashMap<String, Id>)>, State((profile, aliases)): State<(Arc<Profile>, HashMap<String, RepoId>)>,
AxumPath((project, request)): AxumPath<(String, String)>, AxumPath((project, request)): AxumPath<(String, String)>,
method: Method, method: Method,
headers: HeaderMap, headers: HeaderMap,
@ -38,7 +38,7 @@ async fn git_handler(
) -> impl IntoResponse { ) -> impl IntoResponse {
let query = query.0.unwrap_or_default(); let query = query.0.unwrap_or_default();
let name = project.strip_suffix(".git").unwrap_or(&project); let name = project.strip_suffix(".git").unwrap_or(&project);
let rid: Id = match name.parse() { let rid: RepoId = match name.parse() {
Ok(rid) => rid, Ok(rid) => rid,
Err(_) => { Err(_) => {
let Some(rid) = aliases.get(name) else { let Some(rid) = aliases.get(name) else {
@ -70,7 +70,7 @@ async fn git_http_backend(
headers: HeaderMap, headers: HeaderMap,
mut body: Bytes, mut body: Bytes,
remote: net::SocketAddr, remote: net::SocketAddr,
id: Id, id: RepoId,
path: &str, path: &str,
query: String, query: String,
) -> Result<(StatusCode, HashMap<String, Vec<String>>, Vec<u8>), Error> { ) -> Result<(StatusCode, HashMap<String, Vec<String>>, Vec<u8>), Error> {
@ -210,7 +210,7 @@ mod routes {
use axum::extract::connect_info::MockConnectInfo; use axum::extract::connect_info::MockConnectInfo;
use axum::http::StatusCode; use axum::http::StatusCode;
use radicle::identity::Id; use radicle::identity::RepoId;
use crate::test::{self, get, RID}; use crate::test::{self, get, RID};
@ -232,7 +232,7 @@ mod routes {
let ctx = test::seed(tmp.path()); let ctx = test::seed(tmp.path());
let app = super::router( let app = super::router(
ctx.profile().to_owned(), ctx.profile().to_owned(),
HashMap::from_iter([(String::from("heartwood"), Id::from_str(RID).unwrap())]), HashMap::from_iter([(String::from("heartwood"), RepoId::from_str(RID).unwrap())]),
) )
.layer(MockConnectInfo(SocketAddr::from(([0, 0, 0, 0], 8080)))); .layer(MockConnectInfo(SocketAddr::from(([0, 0, 0, 0], 8080))));

View File

@ -21,7 +21,7 @@ use tokio::net::TcpListener;
use tower_http::trace::TraceLayer; use tower_http::trace::TraceLayer;
use tracing::Span; use tracing::Span;
use radicle::identity::Id; use radicle::identity::RepoId;
use radicle::Profile; use radicle::Profile;
use tracing_extra::{tracing_middleware, ColoredStatus, Paint, RequestId, TracingInfo}; use tracing_extra::{tracing_middleware, ColoredStatus, Paint, RequestId, TracingInfo};
@ -40,7 +40,7 @@ pub const DEFAULT_CACHE_SIZE: NonZeroUsize = unsafe { NonZeroUsize::new_unchecke
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Options { pub struct Options {
pub aliases: HashMap<String, Id>, pub aliases: HashMap<String, RepoId>,
pub listen: SocketAddr, pub listen: SocketAddr,
pub cache: Option<NonZeroUsize>, pub cache: Option<NonZeroUsize>,
} }

View File

@ -1,7 +1,7 @@
use std::num::NonZeroUsize; use std::num::NonZeroUsize;
use std::{collections::HashMap, process}; use std::{collections::HashMap, process};
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle_httpd as httpd; use radicle_httpd as httpd;
#[tokio::main] #[tokio::main]
@ -39,7 +39,7 @@ fn parse_options() -> Result<httpd::Options, lexopt::Error> {
} }
Long("alias") | Short('a') => { Long("alias") | Short('a') => {
let alias: String = parser.value()?.parse()?; let alias: String = parser.value()?.parse()?;
let id: Id = parser.value()?.parse()?; let id: RepoId = parser.value()?.parse()?;
aliases.insert(alias, id); aliases.insert(alias, id);
} }

View File

@ -9,7 +9,7 @@ use axum::Router;
use hyper::HeaderMap; use hyper::HeaderMap;
use tower_http::cors; use tower_http::cors;
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::profile::Profile; use radicle::profile::Profile;
use radicle::storage::{ReadRepository, ReadStorage}; use radicle::storage::{ReadRepository, ReadStorage};
use radicle_surf::{Oid, Repository}; use radicle_surf::{Oid, Repository};
@ -107,7 +107,7 @@ pub fn router(profile: Arc<Profile>) -> Router {
} }
async fn file_by_path_handler( async fn file_by_path_handler(
Path((project, sha, path)): Path<(Id, Oid, String)>, Path((project, sha, path)): Path<(RepoId, Oid, String)>,
State(profile): State<Arc<Profile>>, State(profile): State<Arc<Profile>>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let storage = &profile.storage; let storage = &profile.storage;
@ -134,7 +134,7 @@ async fn file_by_path_handler(
} }
async fn file_by_oid_handler( async fn file_by_oid_handler(
Path((project, oid)): Path<(Id, Oid)>, Path((project, oid)): Path<(RepoId, Oid)>,
State(profile): State<Arc<Profile>>, State(profile): State<Arc<Profile>>,
Query(qs): Query<RawQuery>, Query(qs): Query<RawQuery>,
) -> impl IntoResponse { ) -> impl IntoResponse {

View File

@ -10,7 +10,7 @@ use std::{io, net, time};
use radicle::node::Handle; use radicle::node::Handle;
use serde_json as json; use serde_json as json;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node::NodeId; use crate::node::NodeId;
use crate::node::{Command, CommandResult}; use crate::node::{Command, CommandResult};
use crate::runtime; use crate::runtime;
@ -201,7 +201,7 @@ where
} }
fn fetch<W: Write, H: Handle<Error = runtime::HandleError>>( fn fetch<W: Write, H: Handle<Error = runtime::HandleError>>(
id: Id, id: RepoId,
node: NodeId, node: NodeId,
timeout: time::Duration, timeout: time::Duration,
mut writer: W, mut writer: W,
@ -225,7 +225,7 @@ mod tests {
use std::thread; use std::thread;
use super::*; use super::*;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node::Handle; use crate::node::Handle;
use crate::node::{Alias, Node, NodeId}; use crate::node::{Alias, Node, NodeId};
use crate::service::policy::Scope; use crate::service::policy::Scope;
@ -236,7 +236,7 @@ mod tests {
let tmp = tempfile::tempdir().unwrap(); let tmp = tempfile::tempdir().unwrap();
let handle = test::handle::Handle::default(); let handle = test::handle::Handle::default();
let socket = tmp.path().join("alice.sock"); let socket = tmp.path().join("alice.sock");
let rids = test::arbitrary::set::<Id>(1..3); let rids = test::arbitrary::set::<RepoId>(1..3);
let listener = UnixListener::bind(&socket).unwrap(); let listener = UnixListener::bind(&socket).unwrap();
thread::spawn({ thread::spawn({
@ -283,7 +283,7 @@ mod tests {
fn test_seed_unseed() { fn test_seed_unseed() {
let tmp = tempfile::tempdir().unwrap(); let tmp = tempfile::tempdir().unwrap();
let socket = tmp.path().join("node.sock"); let socket = tmp.path().join("node.sock");
let proj = test::arbitrary::gen::<Id>(1); let proj = test::arbitrary::gen::<RepoId>(1);
let peer = test::arbitrary::gen::<NodeId>(1); let peer = test::arbitrary::gen::<NodeId>(1);
let listener = UnixListener::bind(&socket).unwrap(); let listener = UnixListener::bind(&socket).unwrap();
let mut handle = Node::new(&socket); let mut handle = Node::new(&socket);

View File

@ -21,7 +21,7 @@ pub mod prelude {
pub use crate::bounded::BoundedVec; pub use crate::bounded::BoundedVec;
pub use crate::crypto::{PublicKey, Signature, Signer}; pub use crate::crypto::{PublicKey, Signature, Signer};
pub use crate::deserializer::Deserializer; pub use crate::deserializer::Deserializer;
pub use crate::identity::{Did, Id}; pub use crate::identity::{Did, RepoId};
pub use crate::node::Address; pub use crate::node::Address;
pub use crate::service::filter::Filter; pub use crate::service::filter::Filter;
pub use crate::service::{DisconnectReason, Event, Message, Network, NodeId}; pub use crate::service::{DisconnectReason, Event, Message, Network, NodeId};

View File

@ -9,7 +9,7 @@ use radicle::storage::refs::RefsAt;
use reactor::poller::popol::PopolWaker; use reactor::poller::popol::PopolWaker;
use thiserror::Error; use thiserror::Error;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node::{Alias, Command, FetchResult}; use crate::node::{Alias, Command, FetchResult};
use crate::profile::Home; use crate::profile::Home;
use crate::runtime::Emitter; use crate::runtime::Emitter;
@ -178,7 +178,7 @@ impl radicle::node::Handle for Handle {
.map_err(Error::from) .map_err(Error::from)
} }
fn seeds(&mut self, id: Id) -> Result<Seeds, Self::Error> { fn seeds(&mut self, id: RepoId) -> Result<Seeds, Self::Error> {
let (sender, receiver) = chan::bounded(1); let (sender, receiver) = chan::bounded(1);
self.command(service::Command::Seeds(id, sender))?; self.command(service::Command::Seeds(id, sender))?;
receiver.recv().map_err(Error::from) receiver.recv().map_err(Error::from)
@ -192,7 +192,7 @@ impl radicle::node::Handle for Handle {
fn fetch( fn fetch(
&mut self, &mut self,
id: Id, id: RepoId,
from: NodeId, from: NodeId,
timeout: time::Duration, timeout: time::Duration,
) -> Result<FetchResult, Error> { ) -> Result<FetchResult, Error> {
@ -213,19 +213,19 @@ impl radicle::node::Handle for Handle {
receiver.recv().map_err(Error::from) receiver.recv().map_err(Error::from)
} }
fn seed(&mut self, id: Id, scope: policy::Scope) -> Result<bool, Error> { fn seed(&mut self, id: RepoId, scope: policy::Scope) -> Result<bool, Error> {
let (sender, receiver) = chan::bounded(1); let (sender, receiver) = chan::bounded(1);
self.command(service::Command::Seed(id, scope, sender))?; self.command(service::Command::Seed(id, scope, sender))?;
receiver.recv().map_err(Error::from) receiver.recv().map_err(Error::from)
} }
fn unseed(&mut self, id: Id) -> Result<bool, Error> { fn unseed(&mut self, id: RepoId) -> Result<bool, Error> {
let (sender, receiver) = chan::bounded(1); let (sender, receiver) = chan::bounded(1);
self.command(service::Command::Unseed(id, sender))?; self.command(service::Command::Unseed(id, sender))?;
receiver.recv().map_err(Error::from) receiver.recv().map_err(Error::from)
} }
fn announce_refs(&mut self, id: Id) -> Result<RefsAt, Error> { fn announce_refs(&mut self, id: RepoId) -> Result<RefsAt, Error> {
let (sender, receiver) = chan::bounded(1); let (sender, receiver) = chan::bounded(1);
self.command(service::Command::AnnounceRefs(id, sender))?; self.command(service::Command::AnnounceRefs(id, sender))?;
receiver.recv().map_err(Error::from) receiver.recv().map_err(Error::from)

View File

@ -34,7 +34,7 @@ use radicle::storage::RepositoryError;
use crate::crypto; use crate::crypto;
use crate::crypto::{Signer, Verified}; use crate::crypto::{Signer, Verified};
use crate::identity::{Doc, Id}; use crate::identity::{Doc, RepoId};
use crate::node::routing; use crate::node::routing;
use crate::node::routing::InsertResult; use crate::node::routing::InsertResult;
use crate::node::{ use crate::node::{
@ -105,11 +105,11 @@ pub use message::REF_REMOTE_LIMIT;
#[derive(Default)] #[derive(Default)]
struct SyncedRouting { struct SyncedRouting {
/// Repo entries added. /// Repo entries added.
added: Vec<Id>, added: Vec<RepoId>,
/// Repo entries removed. /// Repo entries removed.
removed: Vec<Id>, removed: Vec<RepoId>,
/// Repo entries updated (time). /// Repo entries updated (time).
updated: Vec<Id>, updated: Vec<RepoId>,
} }
impl SyncedRouting { impl SyncedRouting {
@ -166,7 +166,7 @@ pub type QueryState = dyn Fn(&dyn ServiceState) -> Result<(), CommandError> + Se
/// Commands sent to the service by the operator. /// Commands sent to the service by the operator.
pub enum Command { pub enum Command {
/// Announce repository references for given repository to peers. /// Announce repository references for given repository to peers.
AnnounceRefs(Id, chan::Sender<RefsAt>), AnnounceRefs(RepoId, chan::Sender<RefsAt>),
/// Announce local repositories to peers. /// Announce local repositories to peers.
AnnounceInventory, AnnounceInventory,
/// Announce local inventory to peers. /// Announce local inventory to peers.
@ -178,13 +178,13 @@ pub enum Command {
/// Get the node configuration. /// Get the node configuration.
Config(chan::Sender<Config>), Config(chan::Sender<Config>),
/// Lookup seeds for the given repository in the routing table. /// Lookup seeds for the given repository in the routing table.
Seeds(Id, chan::Sender<Seeds>), Seeds(RepoId, chan::Sender<Seeds>),
/// Fetch the given repository from the network. /// Fetch the given repository from the network.
Fetch(Id, NodeId, time::Duration, chan::Sender<FetchResult>), Fetch(RepoId, NodeId, time::Duration, chan::Sender<FetchResult>),
/// Seed the given repository. /// Seed the given repository.
Seed(Id, Scope, chan::Sender<bool>), Seed(RepoId, Scope, chan::Sender<bool>),
/// Unseed the given repository. /// Unseed the given repository.
Unseed(Id, chan::Sender<bool>), Unseed(RepoId, chan::Sender<bool>),
/// Follow the given node. /// Follow the given node.
Follow(NodeId, Option<Alias>, chan::Sender<bool>), Follow(NodeId, Option<Alias>, chan::Sender<bool>),
/// Unfollow the given node. /// Unfollow the given node.
@ -261,7 +261,7 @@ impl FetchState {
#[derive(Debug)] #[derive(Debug)]
struct QueuedFetch { struct QueuedFetch {
/// Repo being fetched. /// Repo being fetched.
rid: Id, rid: RepoId,
/// Peer being fetched from. /// Peer being fetched from.
from: NodeId, from: NodeId,
/// Result channel. /// Result channel.
@ -347,7 +347,7 @@ pub struct Service<D, S, G> {
/// Source of entropy. /// Source of entropy.
rng: Rng, rng: Rng,
/// Ongoing fetches. /// Ongoing fetches.
fetching: HashMap<Id, FetchState>, fetching: HashMap<RepoId, FetchState>,
/// Fetch queue. /// Fetch queue.
queue: VecDeque<QueuedFetch>, queue: VecDeque<QueuedFetch>,
/// Request/connection rate limitter. /// Request/connection rate limitter.
@ -439,7 +439,7 @@ where
/// Seed a repository. /// Seed a repository.
/// Returns whether or not the repo policy was updated. /// Returns whether or not the repo policy was updated.
pub fn seed(&mut self, id: &Id, scope: Scope) -> Result<bool, policy::Error> { pub fn seed(&mut self, id: &RepoId, scope: Scope) -> Result<bool, policy::Error> {
let updated = self.policies.seed(id, scope)?; let updated = self.policies.seed(id, scope)?;
self.filter.insert(id); self.filter.insert(id);
@ -450,7 +450,7 @@ where
/// Returns whether or not the repo policy was updated. /// Returns whether or not the repo policy was updated.
/// Note that when unseeding, we don't announce anything to the network. This is because by /// Note that when unseeding, we don't announce anything to the network. This is because by
/// simply not announcing it anymore, it will eventually be pruned by nodes. /// simply not announcing it anymore, it will eventually be pruned by nodes.
pub fn unseed(&mut self, id: &Id) -> Result<bool, policy::Error> { pub fn unseed(&mut self, id: &RepoId) -> Result<bool, policy::Error> {
let updated = self.policies.unseed(id)?; let updated = self.policies.unseed(id)?;
// Nb. This is potentially slow if we have lots of repos. We should probably // Nb. This is potentially slow if we have lots of repos. We should probably
// only re-compute the filter when we've unseeded a certain amount of repos // only re-compute the filter when we've unseeded a certain amount of repos
@ -514,7 +514,7 @@ where
} }
/// Lookup a repository, both locally and in the routing table. /// Lookup a repository, both locally and in the routing table.
pub fn lookup(&self, rid: Id) -> Result<Lookup, LookupError> { pub fn lookup(&self, rid: RepoId) -> Result<Lookup, LookupError> {
let remote = self.db.routing().get(&rid)?.iter().cloned().collect(); let remote = self.db.routing().get(&rid)?.iter().cloned().collect();
Ok(Lookup { Ok(Lookup {
@ -787,7 +787,7 @@ where
/// another node's announcement. /// another node's announcement.
fn fetch_refs_at( fn fetch_refs_at(
&mut self, &mut self,
rid: Id, rid: RepoId,
from: NodeId, from: NodeId,
refs: NonEmpty<RefsAt>, refs: NonEmpty<RefsAt>,
timeout: time::Duration, timeout: time::Duration,
@ -798,7 +798,7 @@ where
/// Initiate an outgoing fetch for some repository. /// Initiate an outgoing fetch for some repository.
fn fetch( fn fetch(
&mut self, &mut self,
rid: Id, rid: RepoId,
from: NodeId, from: NodeId,
timeout: time::Duration, timeout: time::Duration,
channel: Option<chan::Sender<FetchResult>>, channel: Option<chan::Sender<FetchResult>>,
@ -808,7 +808,7 @@ where
fn _fetch( fn _fetch(
&mut self, &mut self,
rid: Id, rid: RepoId,
from: NodeId, from: NodeId,
refs_at: Vec<RefsAt>, refs_at: Vec<RefsAt>,
timeout: time::Duration, timeout: time::Duration,
@ -852,7 +852,7 @@ where
fn try_fetch( fn try_fetch(
&mut self, &mut self,
rid: Id, rid: RepoId,
from: &NodeId, from: &NodeId,
refs_at: Vec<RefsAt>, refs_at: Vec<RefsAt>,
timeout: time::Duration, timeout: time::Duration,
@ -897,7 +897,7 @@ where
pub fn fetched( pub fn fetched(
&mut self, &mut self,
rid: Id, rid: RepoId,
remote: NodeId, remote: NodeId,
result: Result<fetch::FetchResult, FetchError>, result: Result<fetch::FetchResult, FetchError>,
) { ) {
@ -1683,12 +1683,12 @@ where
/// given inventory. /// given inventory.
fn sync_routing( fn sync_routing(
&mut self, &mut self,
inventory: &[Id], inventory: &[RepoId],
from: NodeId, from: NodeId,
timestamp: Timestamp, timestamp: Timestamp,
) -> Result<SyncedRouting, Error> { ) -> Result<SyncedRouting, Error> {
let mut synced = SyncedRouting::default(); let mut synced = SyncedRouting::default();
let included: HashSet<&Id> = HashSet::from_iter(inventory); let included: HashSet<&RepoId> = HashSet::from_iter(inventory);
for (rid, result) in self.db.routing_mut().insert(inventory, from, timestamp)? { for (rid, result) in self.db.routing_mut().insert(inventory, from, timestamp)? {
match result { match result {
@ -1726,7 +1726,7 @@ where
/// Return a refs announcement including the given remotes. /// Return a refs announcement including the given remotes.
fn refs_announcement_for( fn refs_announcement_for(
&self, &self,
rid: Id, rid: RepoId,
remotes: impl IntoIterator<Item = NodeId>, remotes: impl IntoIterator<Item = NodeId>,
) -> Result<(Announcement, Vec<RefsAt>), Error> { ) -> Result<(Announcement, Vec<RefsAt>), Error> {
let repo = self.storage.repository(rid)?; let repo = self.storage.repository(rid)?;
@ -1757,7 +1757,7 @@ where
/// Announce local refs for given id. /// Announce local refs for given id.
fn announce_refs( fn announce_refs(
&mut self, &mut self,
rid: Id, rid: RepoId,
remotes: impl IntoIterator<Item = NodeId>, remotes: impl IntoIterator<Item = NodeId>,
) -> Result<Vec<RefsAt>, Error> { ) -> Result<Vec<RefsAt>, Error> {
let repo = self.storage.repository(rid)?; let repo = self.storage.repository(rid)?;
@ -1850,7 +1850,7 @@ where
true true
} }
fn seeds(&self, rid: &Id) -> Result<Seeds, Error> { fn seeds(&self, rid: &RepoId) -> Result<Seeds, Error> {
let mut seeds = Seeds::new(self.rng.clone()); let mut seeds = Seeds::new(self.rng.clone());
// First build a list from peers that have synced our own refs, if any. // First build a list from peers that have synced our own refs, if any.
@ -1915,7 +1915,7 @@ where
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
/// Announce our inventory to all connected peers. /// Announce our inventory to all connected peers.
fn announce_inventory(&mut self, inventory: Vec<Id>) -> Result<(), storage::Error> { fn announce_inventory(&mut self, inventory: Vec<RepoId>) -> Result<(), storage::Error> {
let time = if self.clock > self.last_announce { let time = if self.clock > self.last_announce {
self.clock.as_millis() self.clock.as_millis()
} else if self.last_announce - self.clock < LocalDuration::from_secs(1) { } else if self.last_announce - self.clock < LocalDuration::from_secs(1) {
@ -2140,7 +2140,7 @@ pub trait ServiceState {
/// Get the existing sessions. /// Get the existing sessions.
fn sessions(&self) -> &Sessions; fn sessions(&self) -> &Sessions;
/// Get a repository from storage. /// Get a repository from storage.
fn get(&self, rid: Id) -> Result<Option<Doc<Verified>>, RepositoryError>; fn get(&self, rid: RepoId) -> Result<Option<Doc<Verified>>, RepositoryError>;
/// Get the clock. /// Get the clock.
fn clock(&self) -> &LocalTime; fn clock(&self) -> &LocalTime;
/// Get the clock mutably. /// Get the clock mutably.
@ -2163,7 +2163,7 @@ where
&self.sessions &self.sessions
} }
fn get(&self, rid: Id) -> Result<Option<Doc<Verified>>, RepositoryError> { fn get(&self, rid: RepoId) -> Result<Option<Doc<Verified>>, RepositoryError> {
self.storage.get(rid) self.storage.get(rid)
} }

View File

@ -3,7 +3,7 @@ use std::ops::{Deref, DerefMut};
pub use bloomy::BloomFilter; pub use bloomy::BloomFilter;
use crate::identity::Id; use crate::identity::RepoId;
/// Size in bytes of *large* bloom filter. /// Size in bytes of *large* bloom filter.
/// It can store about 13'675 items with a false positive rate of 1%. /// It can store about 13'675 items with a false positive rate of 1%.
@ -28,7 +28,7 @@ pub const FILTER_HASHES: usize = 7;
/// The [`Default`] instance has all bits set to `1`, ie. it will match /// The [`Default`] instance has all bits set to `1`, ie. it will match
/// everything. /// everything.
#[derive(Clone, PartialEq, Eq, Debug)] #[derive(Clone, PartialEq, Eq, Debug)]
pub struct Filter(BloomFilter<Id>); pub struct Filter(BloomFilter<RepoId>);
impl Default for Filter { impl Default for Filter {
fn default() -> Self { fn default() -> Self {
@ -40,7 +40,7 @@ impl Filter {
/// Create a new filter with the given items. /// Create a new filter with the given items.
/// ///
/// Uses the iterator's size hint to determine the size of the filter. /// Uses the iterator's size hint to determine the size of the filter.
pub fn new(ids: impl IntoIterator<Item = Id>) -> Self { pub fn new(ids: impl IntoIterator<Item = RepoId>) -> Self {
let iterator = ids.into_iter(); let iterator = ids.into_iter();
let (min, _) = iterator.size_hint(); let (min, _) = iterator.size_hint();
let size = bloomy::bloom::optimal_bits(min, FILTER_FP_RATE) / 8; let size = bloomy::bloom::optimal_bits(min, FILTER_FP_RATE) / 8;
@ -71,7 +71,7 @@ impl Filter {
} }
impl Deref for Filter { impl Deref for Filter {
type Target = BloomFilter<Id>; type Target = BloomFilter<RepoId>;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
&self.0 &self.0
@ -84,8 +84,8 @@ impl DerefMut for Filter {
} }
} }
impl From<BloomFilter<Id>> for Filter { impl From<BloomFilter<RepoId>> for Filter {
fn from(bloom: BloomFilter<Id>) -> Self { fn from(bloom: BloomFilter<RepoId>) -> Self {
Self(bloom) Self(bloom)
} }
} }
@ -136,7 +136,7 @@ mod test {
#[test] #[test]
fn test_sizes() { fn test_sizes() {
let ids = arbitrary::vec::<Id>(3420); let ids = arbitrary::vec::<RepoId>(3420);
let f = Filter::new(ids.iter().cloned().take(10)); let f = Filter::new(ids.iter().cloned().take(10));
assert_eq!(f.size(), FILTER_SIZE_S); assert_eq!(f.size(), FILTER_SIZE_S);
@ -147,7 +147,7 @@ mod test {
assert_eq!(f.size(), FILTER_SIZE_L); assert_eq!(f.size(), FILTER_SIZE_L);
// Just checking that iterators over hash sets give correct size hints. // Just checking that iterators over hash sets give correct size hints.
let hs = arbitrary::set::<Id>(42..=42); let hs = arbitrary::set::<RepoId>(42..=42);
assert_eq!(hs.iter().size_hint(), (42, Some(42))); assert_eq!(hs.iter().size_hint(), (42, Some(42)));
} }
} }

View File

@ -23,8 +23,8 @@ pub fn node(config: &Config, timestamp: Timestamp) -> NodeAnnouncement {
} }
} }
pub fn inventory(timestamp: Timestamp, inventory: Vec<Id>) -> InventoryAnnouncement { pub fn inventory(timestamp: Timestamp, inventory: Vec<RepoId>) -> InventoryAnnouncement {
type Inventory = BoundedVec<Id, INVENTORY_LIMIT>; type Inventory = BoundedVec<RepoId, INVENTORY_LIMIT>;
if inventory.len() > Inventory::max() { if inventory.len() > Inventory::max() {
error!( error!(

View File

@ -24,7 +24,7 @@ pub enum Io {
/// Fetch repository data from a peer. /// Fetch repository data from a peer.
Fetch { Fetch {
/// Repo being fetched. /// Repo being fetched.
rid: Id, rid: RepoId,
/// Remote node being fetched from. /// Remote node being fetched from.
remote: NodeId, remote: NodeId,
/// Namespaces being fetched. /// Namespaces being fetched.
@ -113,7 +113,7 @@ impl Outbox {
pub fn fetch( pub fn fetch(
&mut self, &mut self,
remote: &mut Session, remote: &mut Session,
rid: Id, rid: RepoId,
namespaces: Namespaces, namespaces: Namespaces,
refs_at: Vec<RefsAt>, refs_at: Vec<RefsAt>,
timeout: time::Duration, timeout: time::Duration,

View File

@ -5,7 +5,7 @@ use radicle::storage::refs::RefsAt;
use radicle::storage::ReadRepository; use radicle::storage::ReadRepository;
use crate::crypto; use crate::crypto;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node; use crate::node;
use crate::node::{Address, Alias}; use crate::node::{Address, Alias};
use crate::prelude::BoundedVec; use crate::prelude::BoundedVec;
@ -158,7 +158,7 @@ impl wire::Decode for NodeAnnouncement {
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct RefsAnnouncement { pub struct RefsAnnouncement {
/// Repository identifier. /// Repository identifier.
pub rid: Id, pub rid: RepoId,
/// Updated `rad/sigrefs`. /// Updated `rad/sigrefs`.
pub refs: BoundedVec<RefsAt, REF_REMOTE_LIMIT>, pub refs: BoundedVec<RefsAt, REF_REMOTE_LIMIT>,
/// Time of announcement. /// Time of announcement.
@ -247,7 +247,7 @@ impl RefsAnnouncement {
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct InventoryAnnouncement { pub struct InventoryAnnouncement {
/// Node inventory. /// Node inventory.
pub inventory: BoundedVec<Id, INVENTORY_LIMIT>, pub inventory: BoundedVec<RepoId, INVENTORY_LIMIT>,
/// Time of announcement. /// Time of announcement.
pub timestamp: Timestamp, pub timestamp: Timestamp,
} }
@ -260,7 +260,7 @@ pub struct InventoryAnnouncement {
pub enum Info { pub enum Info {
/// Tell a node that sent a refs announcement that it was already synced at the given `Oid`, /// Tell a node that sent a refs announcement that it was already synced at the given `Oid`,
/// for this particular `rid`. /// for this particular `rid`.
RefsAlreadySynced { rid: Id, at: git::Oid }, RefsAlreadySynced { rid: RepoId, at: git::Oid },
} }
/// Announcement messages are messages that are relayed between peers. /// Announcement messages are messages that are relayed between peers.
@ -664,7 +664,7 @@ mod tests {
} }
#[quickcheck] #[quickcheck]
fn prop_refs_announcement_signing(rid: Id) { fn prop_refs_announcement_signing(rid: RepoId) {
let signer = MockSigner::new(&mut fastrand::Rng::new()); let signer = MockSigner::new(&mut fastrand::Rng::new());
let timestamp = 0; let timestamp = 0;
let at = raw::Oid::zero().into(); let at = raw::Oid::zero().into();

View File

@ -5,7 +5,7 @@ use crate::node::config::Limits;
use crate::node::Severity; use crate::node::Severity;
use crate::service::message; use crate::service::message;
use crate::service::message::Message; use crate::service::message::Message;
use crate::service::{Address, Id, LocalTime, NodeId, Outbox, Rng}; use crate::service::{Address, LocalTime, NodeId, Outbox, RepoId, Rng};
use crate::Link; use crate::Link;
pub use crate::node::{PingState, State}; pub use crate::node::{PingState, State};
@ -155,7 +155,7 @@ impl Session {
false false
} }
pub fn is_fetching(&self, rid: &Id) -> bool { pub fn is_fetching(&self, rid: &RepoId) -> bool {
if let State::Connected { fetching, .. } = &self.state { if let State::Connected { fetching, .. } = &self.state {
return fetching.contains(rid); return fetching.contains(rid);
} }
@ -171,7 +171,7 @@ impl Session {
/// # Panics /// # Panics
/// ///
/// If it is already fetching that RID, or the session is disconnected. /// If it is already fetching that RID, or the session is disconnected.
pub fn fetching(&mut self, rid: Id) { pub fn fetching(&mut self, rid: RepoId) {
if let State::Connected { fetching, .. } = &mut self.state { if let State::Connected { fetching, .. } = &mut self.state {
assert!( assert!(
fetching.insert(rid), fetching.insert(rid),
@ -185,7 +185,7 @@ impl Session {
} }
} }
pub fn fetched(&mut self, rid: Id) { pub fn fetched(&mut self, rid: RepoId) {
if let State::Connected { fetching, .. } = &mut self.state { if let State::Connected { fetching, .. } = &mut self.state {
if !fetching.remove(&rid) { if !fetching.remove(&rid) {
log::warn!(target: "service", "Fetched unknown repository {rid}"); log::warn!(target: "service", "Fetched unknown repository {rid}");

View File

@ -3,7 +3,7 @@ use qcheck::Arbitrary;
use crate::crypto; use crate::crypto;
use crate::node::Alias; use crate::node::Alias;
use crate::prelude::{BoundedVec, Id, NodeId, Timestamp}; use crate::prelude::{BoundedVec, NodeId, RepoId, Timestamp};
use crate::service::filter::{Filter, FILTER_SIZE_L, FILTER_SIZE_M, FILTER_SIZE_S}; use crate::service::filter::{Filter, FILTER_SIZE_L, FILTER_SIZE_M, FILTER_SIZE_S};
use crate::service::message::{ use crate::service::message::{
Announcement, Info, InventoryAnnouncement, Message, NodeAnnouncement, Ping, RefsAnnouncement, Announcement, Info, InventoryAnnouncement, Message, NodeAnnouncement, Ping, RefsAnnouncement,
@ -55,7 +55,7 @@ impl Arbitrary for Message {
MessageType::RefsAnnouncement => Announcement { MessageType::RefsAnnouncement => Announcement {
node: NodeId::arbitrary(g), node: NodeId::arbitrary(g),
message: RefsAnnouncement { message: RefsAnnouncement {
rid: Id::arbitrary(g), rid: RepoId::arbitrary(g),
refs: BoundedVec::arbitrary(g), refs: BoundedVec::arbitrary(g),
timestamp: Timestamp::arbitrary(g), timestamp: Timestamp::arbitrary(g),
} }
@ -84,7 +84,7 @@ impl Arbitrary for Message {
} }
MessageType::Info => { MessageType::Info => {
let message = Info::RefsAlreadySynced { let message = Info::RefsAlreadySynced {
rid: Id::arbitrary(g), rid: RepoId::arbitrary(g),
at: oid(), at: oid(),
}; };
Self::Info(message) Self::Info(message)

View File

@ -15,7 +15,7 @@ use radicle::crypto::test::signer::MockSigner;
use radicle::crypto::{KeyPair, Seed, Signer}; use radicle::crypto::{KeyPair, Seed, Signer};
use radicle::git; use radicle::git;
use radicle::git::refname; use radicle::git::refname;
use radicle::identity::{Id, Visibility}; use radicle::identity::{RepoId, Visibility};
use radicle::node::config::ConnectAddress; use radicle::node::config::ConnectAddress;
use radicle::node::policy::store as policy; use radicle::node::policy::store as policy;
use radicle::node::routing::Store; use radicle::node::routing::Store;
@ -233,7 +233,7 @@ impl<G: Signer + cyphernet::Ecdh> NodeHandle<G> {
} }
/// Get routing table entries. /// Get routing table entries.
pub fn routing(&self) -> impl Iterator<Item = (Id, NodeId)> { pub fn routing(&self) -> impl Iterator<Item = (RepoId, NodeId)> {
Database::reader(self.home.node().join(node::NODE_DB_FILE)) Database::reader(self.home.node().join(node::NODE_DB_FILE))
.unwrap() .unwrap()
.entries() .entries()
@ -244,13 +244,13 @@ impl<G: Signer + cyphernet::Ecdh> NodeHandle<G> {
pub fn converge<'a>( pub fn converge<'a>(
&'a self, &'a self,
remotes: impl IntoIterator<Item = &'a NodeHandle<G>>, remotes: impl IntoIterator<Item = &'a NodeHandle<G>>,
) -> BTreeSet<(Id, NodeId)> { ) -> BTreeSet<(RepoId, NodeId)> {
converge(iter::once(self).chain(remotes)) converge(iter::once(self).chain(remotes))
} }
/// Wait until this node's routing table contains the given routes. /// Wait until this node's routing table contains the given routes.
#[track_caller] #[track_caller]
pub fn routes_to(&self, routes: &[(Id, NodeId)]) { pub fn routes_to(&self, routes: &[(RepoId, NodeId)]) {
log::debug!(target: "test", "Waiting for {} to route to {:?}", self.id, routes); log::debug!(target: "test", "Waiting for {} to route to {:?}", self.id, routes);
let events = self.handle.events(); let events = self.handle.events();
@ -276,7 +276,7 @@ impl<G: Signer + cyphernet::Ecdh> NodeHandle<G> {
/// Wait until this node has the inventory of another node. /// Wait until this node has the inventory of another node.
#[track_caller] #[track_caller]
pub fn has_inventory_of(&self, rid: &Id, nid: &NodeId) { pub fn has_inventory_of(&self, rid: &RepoId, nid: &NodeId) {
log::debug!(target: "test", "Waiting for {} to have {rid}/{nid}", self.id); log::debug!(target: "test", "Waiting for {} to have {rid}/{nid}", self.id);
let events = self.handle.events(); let events = self.handle.events();
@ -296,12 +296,12 @@ impl<G: Signer + cyphernet::Ecdh> NodeHandle<G> {
} }
/// Clone a repo into a directory. /// Clone a repo into a directory.
pub fn clone<P: AsRef<Path>>(&self, rid: Id, cwd: P) -> io::Result<()> { pub fn clone<P: AsRef<Path>>(&self, rid: RepoId, cwd: P) -> io::Result<()> {
self.rad("clone", &[rid.to_string().as_str()], cwd) self.rad("clone", &[rid.to_string().as_str()], cwd)
} }
/// Fork a repo. /// Fork a repo.
pub fn fork<P: AsRef<Path>>(&self, rid: Id, cwd: P) -> io::Result<()> { pub fn fork<P: AsRef<Path>>(&self, rid: RepoId, cwd: P) -> io::Result<()> {
self.clone(rid, &cwd)?; self.clone(rid, &cwd)?;
self.rad("fork", &[rid.to_string().as_str()], &cwd)?; self.rad("fork", &[rid.to_string().as_str()], &cwd)?;
self.announce(rid, &cwd)?; self.announce(rid, &cwd)?;
@ -310,7 +310,7 @@ impl<G: Signer + cyphernet::Ecdh> NodeHandle<G> {
} }
/// Announce a repo. /// Announce a repo.
pub fn announce<P: AsRef<Path>>(&self, rid: Id, cwd: P) -> io::Result<()> { pub fn announce<P: AsRef<Path>>(&self, rid: RepoId, cwd: P) -> io::Result<()> {
self.rad("sync", &[rid.to_string().as_str(), "--announce"], cwd) self.rad("sync", &[rid.to_string().as_str(), "--announce"], cwd)
} }
@ -377,7 +377,7 @@ impl<G: Signer + cyphernet::Ecdh> NodeHandle<G> {
} }
/// Create an [`issue::Issue`] in the `NodeHandle`'s storage. /// Create an [`issue::Issue`] in the `NodeHandle`'s storage.
pub fn issue(&self, rid: Id, title: &str, desc: &str) -> cob::ObjectId { pub fn issue(&self, rid: RepoId, title: &str, desc: &str) -> cob::ObjectId {
let repo = self.storage.repository(rid).unwrap(); let repo = self.storage.repository(rid).unwrap();
let mut issues = issue::Issues::open(&repo).unwrap(); let mut issues = issue::Issues::open(&repo).unwrap();
*issues *issues
@ -459,7 +459,7 @@ impl<G: cyphernet::Ecdh<Pk = NodeId> + Signer + Clone> Node<G> {
name: &str, name: &str,
description: &str, description: &str,
repo: &git::raw::Repository, repo: &git::raw::Repository,
) -> Id { ) -> RepoId {
transport::local::register(self.storage.clone()); transport::local::register(self.storage.clone());
let branch = refname!("master"); let branch = refname!("master");
@ -516,7 +516,7 @@ impl<G: cyphernet::Ecdh<Pk = NodeId> + Signer + Clone> Node<G> {
} }
/// Populate a storage instance with a project. /// Populate a storage instance with a project.
pub fn project(&mut self, name: &str, description: &str) -> Id { pub fn project(&mut self, name: &str, description: &str) -> RepoId {
let tmp = tempfile::tempdir().unwrap(); let tmp = tempfile::tempdir().unwrap();
let (repo, _) = fixtures::repository(tmp.path()); let (repo, _) = fixtures::repository(tmp.path());
@ -528,10 +528,10 @@ impl<G: cyphernet::Ecdh<Pk = NodeId> + Signer + Clone> Node<G> {
#[track_caller] #[track_caller]
pub fn converge<'a, G: Signer + cyphernet::Ecdh + 'static>( pub fn converge<'a, G: Signer + cyphernet::Ecdh + 'static>(
nodes: impl IntoIterator<Item = &'a NodeHandle<G>>, nodes: impl IntoIterator<Item = &'a NodeHandle<G>>,
) -> BTreeSet<(Id, NodeId)> { ) -> BTreeSet<(RepoId, NodeId)> {
let nodes = nodes.into_iter().collect::<Vec<_>>(); let nodes = nodes.into_iter().collect::<Vec<_>>();
let mut all_routes = BTreeSet::<(Id, NodeId)>::new(); let mut all_routes = BTreeSet::<(RepoId, NodeId)>::new();
let mut remaining = BTreeMap::from_iter(nodes.iter().map(|node| (node.id, node))); let mut remaining = BTreeMap::from_iter(nodes.iter().map(|node| (node.id, node)));
// First build the set of all routes. // First build the set of all routes.

View File

@ -6,7 +6,7 @@ use std::time;
use radicle::git; use radicle::git;
use radicle::storage::refs::RefsAt; use radicle::storage::refs::RefsAt;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node::{Alias, Config, ConnectOptions, ConnectResult, Event, FetchResult, Seeds}; use crate::node::{Alias, Config, ConnectOptions, ConnectResult, Event, FetchResult, Seeds};
use crate::runtime::HandleError; use crate::runtime::HandleError;
use crate::service::policy; use crate::service::policy;
@ -14,8 +14,8 @@ use crate::service::NodeId;
#[derive(Default, Clone)] #[derive(Default, Clone)]
pub struct Handle { pub struct Handle {
pub updates: Arc<Mutex<Vec<Id>>>, pub updates: Arc<Mutex<Vec<RepoId>>>,
pub seeding: Arc<Mutex<HashSet<Id>>>, pub seeding: Arc<Mutex<HashSet<RepoId>>>,
pub following: Arc<Mutex<HashSet<NodeId>>>, pub following: Arc<Mutex<HashSet<NodeId>>>,
} }
@ -44,13 +44,13 @@ impl radicle::node::Handle for Handle {
unimplemented!(); unimplemented!();
} }
fn seeds(&mut self, _id: Id) -> Result<Seeds, Self::Error> { fn seeds(&mut self, _id: RepoId) -> Result<Seeds, Self::Error> {
unimplemented!(); unimplemented!();
} }
fn fetch( fn fetch(
&mut self, &mut self,
_id: Id, _id: RepoId,
_from: NodeId, _from: NodeId,
_timeout: time::Duration, _timeout: time::Duration,
) -> Result<FetchResult, Self::Error> { ) -> Result<FetchResult, Self::Error> {
@ -60,11 +60,11 @@ impl radicle::node::Handle for Handle {
}) })
} }
fn seed(&mut self, id: Id, _scope: policy::Scope) -> Result<bool, Self::Error> { fn seed(&mut self, id: RepoId, _scope: policy::Scope) -> Result<bool, Self::Error> {
Ok(self.seeding.lock().unwrap().insert(id)) Ok(self.seeding.lock().unwrap().insert(id))
} }
fn unseed(&mut self, id: Id) -> Result<bool, Self::Error> { fn unseed(&mut self, id: RepoId) -> Result<bool, Self::Error> {
Ok(self.seeding.lock().unwrap().remove(&id)) Ok(self.seeding.lock().unwrap().remove(&id))
} }
@ -83,7 +83,7 @@ impl radicle::node::Handle for Handle {
Ok(self.following.lock().unwrap().remove(&id)) Ok(self.following.lock().unwrap().remove(&id))
} }
fn announce_refs(&mut self, id: Id) -> Result<RefsAt, Self::Error> { fn announce_refs(&mut self, id: RepoId) -> Result<RefsAt, Self::Error> {
self.updates.lock().unwrap().push(id); self.updates.lock().unwrap().push(id);
Ok(RefsAt { Ok(RefsAt {

View File

@ -17,7 +17,7 @@ use radicle::Storage;
use crate::crypto::test::signer::MockSigner; use crate::crypto::test::signer::MockSigner;
use crate::crypto::Signer; use crate::crypto::Signer;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node; use crate::node;
use crate::prelude::*; use crate::prelude::*;
use crate::runtime::Emitter; use crate::runtime::Emitter;
@ -132,7 +132,7 @@ impl Default for Config<MockSigner> {
} }
impl<G: Signer> Peer<Storage, G> { impl<G: Signer> Peer<Storage, G> {
pub fn project(&mut self, name: &str, description: &str) -> Id { pub fn project(&mut self, name: &str, description: &str) -> RepoId {
radicle::storage::git::transport::local::register(self.storage().clone()); radicle::storage::git::transport::local::register(self.storage().clone());
let (repo, _) = fixtures::repository(self.tempdir.path().join(name)); let (repo, _) = fixtures::repository(self.tempdir.path().join(name));
@ -256,7 +256,7 @@ where
self.service.storage().inventory().unwrap() self.service.storage().inventory().unwrap()
} }
pub fn git_url(&self, repo: Id, namespace: Option<RemoteId>) -> remote::Url { pub fn git_url(&self, repo: RepoId, namespace: Option<RemoteId>) -> remote::Url {
remote::Url { remote::Url {
node: self.node_id(), node: self.node_id(),
repo, repo,
@ -297,7 +297,7 @@ where
) )
} }
pub fn refs_announcement(&self, rid: Id) -> Message { pub fn refs_announcement(&self, rid: RepoId) -> Message {
let mut refs = BoundedVec::new(); let mut refs = BoundedVec::new();
if let Ok(repo) = self.storage().repository(rid) { if let Ok(repo) = self.storage().repository(rid) {
if let Ok(false) = repo.is_empty() { if let Ok(false) = repo.is_empty() {
@ -468,7 +468,7 @@ where
} }
/// Get a draining iterator over the peer's I/O outbox, which only returns fetches. /// Get a draining iterator over the peer's I/O outbox, which only returns fetches.
pub fn fetches(&mut self) -> impl Iterator<Item = (Id, NodeId, Namespaces)> + '_ { pub fn fetches(&mut self) -> impl Iterator<Item = (RepoId, NodeId, Namespaces)> + '_ {
iter::from_fn(|| self.service.outbox().next()).filter_map(|io| { iter::from_fn(|| self.service.outbox().next()).filter_map(|io| {
if let Io::Fetch { if let Io::Fetch {
rid, rid,

View File

@ -15,7 +15,7 @@ use localtime::{LocalDuration, LocalTime};
use log::*; use log::*;
use crate::crypto::Signer; use crate::crypto::Signer;
use crate::prelude::{Address, Id}; use crate::prelude::{Address, RepoId};
use crate::service::io::Io; use crate::service::io::Io;
use crate::service::{DisconnectReason, Event, Message, NodeId}; use crate::service::{DisconnectReason, Event, Message, NodeId};
use crate::storage::Namespaces; use crate::storage::Namespaces;
@ -66,7 +66,7 @@ pub enum Input {
/// Received a message from a remote peer. /// Received a message from a remote peer.
Received(NodeId, Vec<Message>), Received(NodeId, Vec<Message>),
/// Fetch completed for a node. /// Fetch completed for a node.
Fetched(Id, NodeId, Rc<Result<fetch::FetchResult, FetchError>>), Fetched(RepoId, NodeId, Rc<Result<fetch::FetchResult, FetchError>>),
/// Used to advance the state machine after some wall time has passed. /// Used to advance the state machine after some wall time has passed.
Wake, Wake,
} }

View File

@ -16,7 +16,7 @@ use radicle::storage::refs::RefsAt;
use crate::collections::{RandomMap, RandomSet}; use crate::collections::{RandomMap, RandomSet};
use crate::crypto::test::signer::MockSigner; use crate::crypto::test::signer::MockSigner;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node; use crate::node;
use crate::node::config::*; use crate::node::config::*;
use crate::prelude::*; use crate::prelude::*;
@ -57,7 +57,7 @@ use crate::{git, identity, rad, runtime, service, test};
#[test] #[test]
fn test_inventory_decode() { fn test_inventory_decode() {
let inventory: Vec<Id> = arbitrary::gen(300); let inventory: Vec<RepoId> = arbitrary::gen(300);
let timestamp = LocalTime::now().as_millis(); let timestamp = LocalTime::now().as_millis();
let mut buf = Vec::new(); let mut buf = Vec::new();
@ -369,7 +369,9 @@ fn test_inventory_pruning() {
bob.id(), bob.id(),
Message::inventory( Message::inventory(
InventoryAnnouncement { InventoryAnnouncement {
inventory: test::arbitrary::vec::<Id>(num_projs).try_into().unwrap(), inventory: test::arbitrary::vec::<RepoId>(num_projs)
.try_into()
.unwrap(),
timestamp: bob.local_time().as_millis(), timestamp: bob.local_time().as_millis(),
}, },
peer.signer(), peer.signer(),
@ -391,7 +393,7 @@ fn test_inventory_pruning() {
#[test] #[test]
fn test_seeding() { fn test_seeding() {
let mut alice = Peer::new("alice", [7, 7, 7, 7]); let mut alice = Peer::new("alice", [7, 7, 7, 7]);
let proj_id: identity::Id = test::arbitrary::gen(1); let proj_id: identity::RepoId = test::arbitrary::gen(1);
let (sender, receiver) = chan::bounded(1); let (sender, receiver) = chan::bounded(1);
alice.command(Command::Seed(proj_id, policy::Scope::default(), sender)); alice.command(Command::Seed(proj_id, policy::Scope::default(), sender));
@ -473,7 +475,7 @@ fn test_announcement_rebroadcast_duplicates() {
let mut alice = Peer::new("alice", [7, 7, 7, 7]); let mut alice = Peer::new("alice", [7, 7, 7, 7]);
let bob = Peer::new("bob", [8, 8, 8, 8]); let bob = Peer::new("bob", [8, 8, 8, 8]);
let eve = Peer::new("eve", [9, 9, 9, 9]); let eve = Peer::new("eve", [9, 9, 9, 9]);
let rids = arbitrary::set::<Id>(3..=3); let rids = arbitrary::set::<RepoId>(3..=3);
alice.connect_to(&bob); alice.connect_to(&bob);
alice.receive(bob.id, carol.node_announcement()); alice.receive(bob.id, carol.node_announcement());
@ -1249,7 +1251,7 @@ fn test_maintain_connections_failed_attempt() {
fn test_seed_repo_subscribe() { fn test_seed_repo_subscribe() {
let mut alice = Peer::new("alice", [7, 7, 7, 7]); let mut alice = Peer::new("alice", [7, 7, 7, 7]);
let bob = Peer::new("bob", [8, 8, 8, 8]); let bob = Peer::new("bob", [8, 8, 8, 8]);
let rid = arbitrary::gen::<Id>(1); let rid = arbitrary::gen::<RepoId>(1);
let (send, recv) = chan::bounded(1); let (send, recv) = chan::bounded(1);
alice.connect_to(&bob); alice.connect_to(&bob);
@ -1268,7 +1270,7 @@ fn test_seed_repo_subscribe() {
#[test] #[test]
fn test_fetch_missing_inventory_on_gossip() { fn test_fetch_missing_inventory_on_gossip() {
let rid = arbitrary::gen::<Id>(1); let rid = arbitrary::gen::<RepoId>(1);
let mut alice = Peer::new("alice", [7, 7, 7, 7]); let mut alice = Peer::new("alice", [7, 7, 7, 7]);
let bob = Peer::new("bob", [8, 8, 8, 8]); let bob = Peer::new("bob", [8, 8, 8, 8]);
let now = LocalTime::now(); let now = LocalTime::now();
@ -1293,7 +1295,7 @@ fn test_fetch_missing_inventory_on_gossip() {
#[test] #[test]
fn test_fetch_missing_inventory_on_schedule() { fn test_fetch_missing_inventory_on_schedule() {
let rid = arbitrary::gen::<Id>(1); let rid = arbitrary::gen::<RepoId>(1);
let mut alice = Peer::new("alice", [7, 7, 7, 7]); let mut alice = Peer::new("alice", [7, 7, 7, 7]);
let bob = Peer::new("bob", [8, 8, 8, 8]); let bob = Peer::new("bob", [8, 8, 8, 8]);
let now = LocalTime::now(); let now = LocalTime::now();

View File

@ -19,7 +19,7 @@ use byteorder::{NetworkEndian, ReadBytesExt, WriteBytesExt};
use crate::crypto::{PublicKey, Signature, Unverified}; use crate::crypto::{PublicKey, Signature, Unverified};
use crate::git; use crate::git;
use crate::git::fmt; use crate::git::fmt;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node; use crate::node;
use crate::node::Alias; use crate::node::Alias;
use crate::prelude::*; use crate::prelude::*;
@ -215,7 +215,7 @@ impl Encode for git::Url {
} }
} }
impl Encode for Id { impl Encode for RepoId {
fn encode<W: io::Write + ?Sized>(&self, writer: &mut W) -> Result<usize, io::Error> { fn encode<W: io::Write + ?Sized>(&self, writer: &mut W) -> Result<usize, io::Error> {
self.deref().encode(writer) self.deref().encode(writer)
} }
@ -420,7 +420,7 @@ impl Decode for String {
} }
} }
impl Decode for Id { impl Decode for RepoId {
fn decode<R: io::Read + ?Sized>(reader: &mut R) -> Result<Self, Error> { fn decode<R: io::Read + ?Sized>(reader: &mut R) -> Result<Self, Error> {
let oid: git::Oid = Decode::decode(reader)?; let oid: git::Oid = Decode::decode(reader)?;
@ -572,8 +572,8 @@ mod tests {
} }
#[quickcheck] #[quickcheck]
fn prop_id(input: Id) { fn prop_id(input: RepoId) {
assert_eq!(deserialize::<Id>(&serialize(&input)).unwrap(), input); assert_eq!(deserialize::<RepoId>(&serialize(&input)).unwrap(), input);
} }
#[quickcheck] #[quickcheck]

View File

@ -149,7 +149,7 @@ impl wire::Encode for RefsAnnouncement {
impl wire::Decode for RefsAnnouncement { impl wire::Decode for RefsAnnouncement {
fn decode<R: std::io::Read + ?Sized>(reader: &mut R) -> Result<Self, wire::Error> { fn decode<R: std::io::Read + ?Sized>(reader: &mut R) -> Result<Self, wire::Error> {
let rid = Id::decode(reader)?; let rid = RepoId::decode(reader)?;
let refs = BoundedVec::<_, REF_REMOTE_LIMIT>::decode(reader)?; let refs = BoundedVec::<_, REF_REMOTE_LIMIT>::decode(reader)?;
let timestamp = Timestamp::decode(reader)?; let timestamp = Timestamp::decode(reader)?;
@ -244,7 +244,7 @@ impl wire::Decode for Info {
match InfoType::try_from(info_type) { match InfoType::try_from(info_type) {
Ok(InfoType::RefsAlreadySynced) => { Ok(InfoType::RefsAlreadySynced) => {
let rid = Id::decode(reader)?; let rid = RepoId::decode(reader)?;
let at = Oid::decode(reader)?; let at = Oid::decode(reader)?;
Ok(Self::RefsAlreadySynced { rid, at }) Ok(Self::RefsAlreadySynced { rid, at })
@ -478,7 +478,7 @@ mod tests {
#[test] #[test]
fn test_inv_ann_max_size() { fn test_inv_ann_max_size() {
let signer = MockSigner::default(); let signer = MockSigner::default();
let inv: [Id; INVENTORY_LIMIT] = arbitrary::gen(1); let inv: [RepoId; INVENTORY_LIMIT] = arbitrary::gen(1);
let ann = AnnouncementMessage::Inventory(InventoryAnnouncement { let ann = AnnouncementMessage::Inventory(InventoryAnnouncement {
inventory: BoundedVec::collect_from(&mut inv.into_iter()), inventory: BoundedVec::collect_from(&mut inv.into_iter()),
timestamp: arbitrary::gen(1), timestamp: arbitrary::gen(1),

View File

@ -10,7 +10,7 @@ use std::{io, time};
use crossbeam_channel as chan; use crossbeam_channel as chan;
use radicle::identity::Id; use radicle::identity::RepoId;
use radicle::prelude::NodeId; use radicle::prelude::NodeId;
use radicle::storage::refs::RefsAt; use radicle::storage::refs::RefsAt;
use radicle::storage::{ReadRepository, ReadStorage}; use radicle::storage::{ReadRepository, ReadStorage};
@ -78,7 +78,7 @@ pub enum UploadError {
#[error(transparent)] #[error(transparent)]
Io(#[from] io::Error), Io(#[from] io::Error),
#[error("{0} is not authorized to fetch {1}")] #[error("{0} is not authorized to fetch {1}")]
Unauthorized(NodeId, Id), Unauthorized(NodeId, RepoId),
#[error(transparent)] #[error(transparent)]
Storage(#[from] radicle::storage::Error), Storage(#[from] radicle::storage::Error),
#[error(transparent)] #[error(transparent)]
@ -103,7 +103,7 @@ pub enum FetchRequest {
/// `rid` from the peer identified by `remote`. /// `rid` from the peer identified by `remote`.
Initiator { Initiator {
/// Repo to fetch. /// Repo to fetch.
rid: Id, rid: RepoId,
/// Remote peer we are interacting with. /// Remote peer we are interacting with.
remote: NodeId, remote: NodeId,
/// If this fetch is for a particular set of `rad/sigrefs`. /// If this fetch is for a particular set of `rad/sigrefs`.
@ -132,7 +132,7 @@ impl FetchRequest {
pub enum FetchResult { pub enum FetchResult {
Initiator { Initiator {
/// Repo fetched. /// Repo fetched.
rid: Id, rid: RepoId,
/// Fetch result, including remotes fetched. /// Fetch result, including remotes fetched.
result: Result<fetch::FetchResult, FetchError>, result: Result<fetch::FetchResult, FetchError>,
}, },
@ -261,7 +261,7 @@ impl Worker {
} }
} }
fn is_authorized(&self, remote: NodeId, rid: Id) -> Result<(), UploadError> { fn is_authorized(&self, remote: NodeId, rid: RepoId) -> Result<(), UploadError> {
let policy = self.policies.repo_policy(&rid)?.policy; let policy = self.policies.repo_policy(&rid)?.policy;
let repo = self.storage.repository(rid)?; let repo = self.storage.repository(rid)?;
let doc = repo.canonical_identity_doc()?; let doc = repo.canonical_identity_doc()?;
@ -274,7 +274,7 @@ impl Worker {
fn fetch( fn fetch(
&mut self, &mut self,
rid: Id, rid: RepoId,
remote: NodeId, remote: NodeId,
refs_at: Option<Vec<RefsAt>>, refs_at: Option<Vec<RefsAt>>,
channels: channels::ChannelsFlush, channels: channels::ChannelsFlush,

View File

@ -3,7 +3,7 @@ pub mod error;
use std::collections::HashSet; use std::collections::HashSet;
use radicle::crypto::PublicKey; use radicle::crypto::PublicKey;
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::storage::refs::RefsAt; use radicle::storage::refs::RefsAt;
use radicle::storage::{ReadStorage as _, RefUpdate, WriteRepository as _}; use radicle::storage::{ReadStorage as _, RefUpdate, WriteRepository as _};
use radicle::Storage; use radicle::Storage;
@ -31,7 +31,7 @@ pub enum Handle {
impl Handle { impl Handle {
pub fn new( pub fn new(
rid: Id, rid: RepoId,
local: PublicKey, local: PublicKey,
storage: &Storage, storage: &Storage,
follow: Allowed, follow: Allowed,
@ -52,7 +52,7 @@ impl Handle {
pub fn fetch( pub fn fetch(
self, self,
rid: Id, rid: RepoId,
storage: &Storage, storage: &Storage,
limit: FetchLimit, limit: FetchLimit,
remote: PublicKey, remote: PublicKey,
@ -113,7 +113,7 @@ impl Handle {
/// ///
/// # Errors /// # Errors
/// - Will fail if `storage` contains `rid` already. /// - Will fail if `storage` contains `rid` already.
fn mv(tmp: tempfile::TempDir, storage: &Storage, rid: &Id) -> Result<(), error::Fetch> { fn mv(tmp: tempfile::TempDir, storage: &Storage, rid: &RepoId) -> Result<(), error::Fetch> {
use std::io::{Error, ErrorKind}; use std::io::{Error, ErrorKind};
let from = tmp.path(); let from = tmp.path();

View File

@ -1,7 +1,7 @@
use std::process::{Command, ExitStatus, Stdio}; use std::process::{Command, ExitStatus, Stdio};
use std::{fmt, io}; use std::{fmt, io};
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::storage::ReadStorage; use radicle::storage::ReadStorage;
/// Default expiry time for objects. /// Default expiry time for objects.
@ -36,7 +36,7 @@ impl fmt::Display for Expiry {
} }
/// Run Git garbage collector. /// Run Git garbage collector.
pub fn collect(storage: &impl ReadStorage, rid: Id, expiry: Expiry) -> io::Result<ExitStatus> { pub fn collect(storage: &impl ReadStorage, rid: RepoId, expiry: Expiry) -> io::Result<ExitStatus> {
let git_dir = storage.path_of(&rid); let git_dir = storage.path_of(&rid);
let mut gc = Command::new("git"); let mut gc = Command::new("git");
gc.current_dir(git_dir) gc.current_dir(git_dir)

View File

@ -132,7 +132,7 @@ pub(super) mod pktline {
use std::io::Read; use std::io::Read;
use std::str; use std::str;
use radicle::prelude::Id; use radicle::prelude::RepoId;
pub const HEADER_LEN: usize = 4; pub const HEADER_LEN: usize = 4;
@ -195,7 +195,7 @@ pub(super) mod pktline {
/// Example: `0032git-upload-pack /rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5.git\0host=myserver.com\0` /// Example: `0032git-upload-pack /rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5.git\0host=myserver.com\0`
#[derive(Debug)] #[derive(Debug)]
pub struct GitRequest { pub struct GitRequest {
pub repo: Id, pub repo: RepoId,
pub path: String, pub path: String,
pub host: Option<(String, Option<u16>)>, pub host: Option<(String, Option<u16>)>,
pub extra: Vec<(String, Option<String>)>, pub extra: Vec<(String, Option<String>)>,

View File

@ -15,7 +15,7 @@ use radicle::explorer::ExplorerResource;
use radicle::identity::Did; use radicle::identity::Did;
use radicle::node; use radicle::node;
use radicle::node::{Handle, NodeId}; use radicle::node::{Handle, NodeId};
use radicle::prelude::Id; use radicle::prelude::RepoId;
use radicle::storage; use radicle::storage;
use radicle::storage::git::transport::local::Url; use radicle::storage::git::transport::local::Url;
use radicle::storage::{ReadRepository, SignRepository as _, WriteRepository}; use radicle::storage::{ReadRepository, SignRepository as _, WriteRepository};
@ -631,7 +631,7 @@ fn push_ref(
/// Sync with the network. /// Sync with the network.
fn sync( fn sync(
rid: Id, rid: RepoId,
updated: impl Iterator<Item = ExplorerResource>, updated: impl Iterator<Item = ExplorerResource>,
mut node: radicle::Node, mut node: radicle::Node,
profile: &Profile, profile: &Profile,

View File

@ -18,7 +18,7 @@ use crate::{
ActorId, Timestamp, ActorId, Timestamp,
}, },
identity::{ identity::{
doc::{Doc, DocError, Id}, doc::{Doc, DocError, RepoId},
Did, Did,
}, },
storage::{ReadRepository, RepositoryError, WriteRepository}, storage::{ReadRepository, RepositoryError, WriteRepository},
@ -137,7 +137,7 @@ pub enum Error {
pub struct Identity { pub struct Identity {
/// The canonical identifier for this identity. /// The canonical identifier for this identity.
/// This is the object id of the initial document blob. /// This is the object id of the initial document blob.
pub id: Id, pub id: RepoId,
/// The current revision of the document. /// The current revision of the document.
/// Equal to the head of the identity branch. /// Equal to the head of the identity branch.
pub current: RevisionId, pub current: RevisionId,
@ -241,7 +241,7 @@ impl Identity {
impl Identity { impl Identity {
/// The repository identifier. /// The repository identifier.
pub fn id(&self) -> Id { pub fn id(&self) -> RepoId {
self.id self.id
} }
@ -1004,7 +1004,7 @@ mod test {
use crate::identity::doc::PayloadId; use crate::identity::doc::PayloadId;
#[quickcheck] #[quickcheck]
fn prop_json_eq_str(pk: PublicKey, proj: Id, did: Did) { fn prop_json_eq_str(pk: PublicKey, proj: RepoId, did: Did) {
let json = serde_json::to_string(&pk).unwrap(); let json = serde_json::to_string(&pk).unwrap();
assert_eq!(format!("\"{pk}\""), json); assert_eq!(format!("\"{pk}\""), json);

View File

@ -2557,7 +2557,7 @@ mod test {
let base = git::Oid::from_str("cb18e95ada2bb38aadd8e6cef0963ce37a87add3").unwrap(); let base = git::Oid::from_str("cb18e95ada2bb38aadd8e6cef0963ce37a87add3").unwrap();
let oid = git::Oid::from_str("518d5069f94c03427f694bb494ac1cd7d1339380").unwrap(); let oid = git::Oid::from_str("518d5069f94c03427f694bb494ac1cd7d1339380").unwrap();
let mut alice = Actor::new(MockSigner::default()); let mut alice = Actor::new(MockSigner::default());
let rid = gen::<Id>(1); let rid = gen::<RepoId>(1);
let doc = Doc::new( let doc = Doc::new(
gen::<Project>(1), gen::<Project>(1),
nonempty::NonEmpty::new(alice.did()), nonempty::NonEmpty::new(alice.did()),

View File

@ -2,7 +2,7 @@ use std::str::FromStr;
use thiserror::Error; use thiserror::Error;
use crate::prelude::Id; use crate::prelude::RepoId;
use crate::{cob, git}; use crate::{cob, git};
#[derive(Debug, Error)] #[derive(Debug, Error)]
@ -47,7 +47,7 @@ pub struct ExplorerUrl {
/// Host serving the repository. /// Host serving the repository.
pub host: String, pub host: String,
/// Repository. /// Repository.
pub rid: Id, pub rid: RepoId,
/// Resource under the repository. /// Resource under the repository.
pub resource: Option<ExplorerResource>, pub resource: Option<ExplorerResource>,
} }
@ -95,7 +95,7 @@ impl Default for Explorer {
impl Explorer { impl Explorer {
/// Get the explorer URL, filling in the host and RID. /// Get the explorer URL, filling in the host and RID.
pub fn url(&self, host: impl ToString, rid: Id) -> ExplorerUrl { pub fn url(&self, host: impl ToString, rid: RepoId) -> ExplorerUrl {
ExplorerUrl { ExplorerUrl {
template: self.clone(), template: self.clone(),
host: host.to_string(), host: host.to_string(),

View File

@ -5,7 +5,7 @@ pub mod project;
pub use crypto::PublicKey; pub use crypto::PublicKey;
pub use did::Did; pub use did::Did;
pub use doc::{Doc, DocAt, DocError, Id, IdError, PayloadError, Visibility}; pub use doc::{Doc, DocAt, DocError, IdError, PayloadError, RepoId, Visibility};
pub use project::Project; pub use project::Project;
pub use crate::cob::identity::{Error, Identity, IdentityMut}; pub use crate::cob::identity::{Error, Identity, IdentityMut};

View File

@ -482,7 +482,7 @@ mod test {
let tempdir = tempfile::tempdir().unwrap(); let tempdir = tempfile::tempdir().unwrap();
let storage = Storage::open(tempdir.path().join("storage"), fixtures::user()).unwrap(); let storage = Storage::open(tempdir.path().join("storage"), fixtures::user()).unwrap();
let remote = arbitrary::gen::<RemoteId>(1); let remote = arbitrary::gen::<RemoteId>(1);
let proj = arbitrary::gen::<Id>(1); let proj = arbitrary::gen::<RepoId>(1);
let repo = storage.create(proj).unwrap(); let repo = storage.create(proj).unwrap();
let oid = git2::Oid::from_str("2d52a53ce5e4f141148a5f770cfd3ead2d6a45b8").unwrap(); let oid = git2::Oid::from_str("2d52a53ce5e4f141148a5f770cfd3ead2d6a45b8").unwrap();

View File

@ -18,23 +18,23 @@ pub enum IdError {
Multibase(#[from] multibase::Error), Multibase(#[from] multibase::Error),
} }
/// A radicle identifier. Commonly used to uniquely identify radicle projects. /// A repository identifier.
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Id(git::Oid); pub struct RepoId(git::Oid);
impl fmt::Display for Id { impl fmt::Display for RepoId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.urn().as_str()) f.write_str(self.urn().as_str())
} }
} }
impl fmt::Debug for Id { impl fmt::Debug for RepoId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Id({self})") write!(f, "RepoId({self})")
} }
} }
impl Id { impl RepoId {
/// Format the identifier as a human-readable URN. /// Format the identifier as a human-readable URN.
/// ///
/// Eg. `rad:z3XncAdkZjeK9mQS5Sdc4qhw98BUX`. /// Eg. `rad:z3XncAdkZjeK9mQS5Sdc4qhw98BUX`.
@ -69,7 +69,7 @@ impl Id {
} }
} }
impl FromStr for Id { impl FromStr for RepoId {
type Err = IdError; type Err = IdError;
fn from_str(s: &str) -> Result<Self, Self::Err> { fn from_str(s: &str) -> Result<Self, Self::Err> {
@ -77,7 +77,7 @@ impl FromStr for Id {
} }
} }
impl TryFrom<OsString> for Id { impl TryFrom<OsString> for RepoId {
type Error = IdError; type Error = IdError;
fn try_from(value: OsString) -> Result<Self, Self::Error> { fn try_from(value: OsString) -> Result<Self, Self::Error> {
@ -86,19 +86,19 @@ impl TryFrom<OsString> for Id {
} }
} }
impl From<git::Oid> for Id { impl From<git::Oid> for RepoId {
fn from(oid: git::Oid) -> Self { fn from(oid: git::Oid) -> Self {
Self(oid) Self(oid)
} }
} }
impl From<git2::Oid> for Id { impl From<git2::Oid> for RepoId {
fn from(oid: git2::Oid) -> Self { fn from(oid: git2::Oid) -> Self {
Self(oid.into()) Self(oid.into())
} }
} }
impl Deref for Id { impl Deref for RepoId {
type Target = git::Oid; type Target = git::Oid;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
@ -106,7 +106,7 @@ impl Deref for Id {
} }
} }
impl serde::Serialize for Id { impl serde::Serialize for RepoId {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where where
S: serde::Serializer, S: serde::Serializer,
@ -115,7 +115,7 @@ impl serde::Serialize for Id {
} }
} }
impl<'de> serde::Deserialize<'de> for Id { impl<'de> serde::Deserialize<'de> for RepoId {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where where
D: serde::Deserializer<'de>, D: serde::Deserializer<'de>,
@ -124,11 +124,11 @@ impl<'de> serde::Deserialize<'de> for Id {
} }
} }
impl From<&Id> for Component<'_> { impl From<&RepoId> for Component<'_> {
fn from(id: &Id) -> Self { fn from(id: &RepoId) -> Self {
let refstr = let refstr =
RefString::try_from(id.0.to_string()).expect("project id's are valid ref strings"); RefString::try_from(id.0.to_string()).expect("repository id's are valid ref strings");
Component::from_refstr(refstr).expect("project id's are valid refname components") Component::from_refstr(refstr).expect("repository id's are valid refname components")
} }
} }
@ -139,9 +139,9 @@ mod test {
use qcheck_macros::quickcheck; use qcheck_macros::quickcheck;
#[quickcheck] #[quickcheck]
fn prop_from_str(input: Id) { fn prop_from_str(input: RepoId) {
let encoded = input.to_string(); let encoded = input.to_string();
let decoded = Id::from_str(&encoded).unwrap(); let decoded = RepoId::from_str(&encoded).unwrap();
assert_eq!(input, decoded); assert_eq!(input, decoded);
} }

View File

@ -38,7 +38,7 @@ pub mod prelude {
use super::*; use super::*;
pub use crypto::{PublicKey, Signer, Verified}; pub use crypto::{PublicKey, Signer, Verified};
pub use identity::{project::Project, Did, Doc, Id}; pub use identity::{project::Project, Did, Doc, RepoId};
pub use node::{Alias, NodeId, Timestamp}; pub use node::{Alias, NodeId, Timestamp};
pub use profile::Profile; pub use profile::Profile;
pub use storage::{ pub use storage::{

View File

@ -26,7 +26,7 @@ use serde_json as json;
use crate::crypto::PublicKey; use crate::crypto::PublicKey;
use crate::git; use crate::git;
use crate::identity::Id; use crate::identity::RepoId;
use crate::profile; use crate::profile;
use crate::storage::refs::RefsAt; use crate::storage::refs::RefsAt;
use crate::storage::RefUpdate; use crate::storage::RefUpdate;
@ -92,7 +92,7 @@ pub enum State {
#[serde(skip)] #[serde(skip)]
ping: PingState, ping: PingState,
/// Ongoing fetches. /// Ongoing fetches.
fetching: HashSet<Id>, fetching: HashSet<RepoId>,
}, },
/// When a peer is disconnected. /// When a peer is disconnected.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
@ -411,7 +411,7 @@ impl From<Address> for HostName {
pub enum Command { pub enum Command {
/// Announce repository references for given repository to peers. /// Announce repository references for given repository to peers.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
AnnounceRefs { rid: Id }, AnnounceRefs { rid: RepoId },
/// Announce local repositories to peers. /// Announce local repositories to peers.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
@ -432,7 +432,7 @@ pub enum Command {
/// Lookup seeds for the given repository in the routing table. /// Lookup seeds for the given repository in the routing table.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
Seeds { rid: Id }, Seeds { rid: RepoId },
/// Get the current peer sessions. /// Get the current peer sessions.
Sessions, Sessions,
@ -440,18 +440,18 @@ pub enum Command {
/// Fetch the given repository from the network. /// Fetch the given repository from the network.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
Fetch { Fetch {
rid: Id, rid: RepoId,
nid: NodeId, nid: NodeId,
timeout: time::Duration, timeout: time::Duration,
}, },
/// Seed the given repository. /// Seed the given repository.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
Seed { rid: Id, scope: policy::Scope }, Seed { rid: RepoId, scope: policy::Scope },
/// Unseed the given repository. /// Unseed the given repository.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
Unseed { rid: Id }, Unseed { rid: RepoId },
/// Follow the given node. /// Follow the given node.
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
@ -803,25 +803,25 @@ pub trait Handle: Clone + Sync + Send {
opts: ConnectOptions, opts: ConnectOptions,
) -> Result<ConnectResult, Self::Error>; ) -> Result<ConnectResult, Self::Error>;
/// Lookup the seeds of a given repository in the routing table. /// Lookup the seeds of a given repository in the routing table.
fn seeds(&mut self, id: Id) -> Result<Seeds, Self::Error>; fn seeds(&mut self, id: RepoId) -> Result<Seeds, Self::Error>;
/// Fetch a repository from the network. /// Fetch a repository from the network.
fn fetch( fn fetch(
&mut self, &mut self,
id: Id, id: RepoId,
from: NodeId, from: NodeId,
timeout: time::Duration, timeout: time::Duration,
) -> Result<FetchResult, Self::Error>; ) -> Result<FetchResult, Self::Error>;
/// Start seeding the given repo. May update the scope. Does nothing if the /// Start seeding the given repo. May update the scope. Does nothing if the
/// repo is already seeded. /// repo is already seeded.
fn seed(&mut self, id: Id, scope: policy::Scope) -> Result<bool, Self::Error>; fn seed(&mut self, id: RepoId, scope: policy::Scope) -> Result<bool, Self::Error>;
/// Start following the given peer. /// Start following the given peer.
fn follow(&mut self, id: NodeId, alias: Option<Alias>) -> Result<bool, Self::Error>; fn follow(&mut self, id: NodeId, alias: Option<Alias>) -> Result<bool, Self::Error>;
/// Un-seed the given repo and delete it from storage. /// Un-seed the given repo and delete it from storage.
fn unseed(&mut self, id: Id) -> Result<bool, Self::Error>; fn unseed(&mut self, id: RepoId) -> Result<bool, Self::Error>;
/// Unfollow the given peer. /// Unfollow the given peer.
fn unfollow(&mut self, id: NodeId) -> Result<bool, Self::Error>; fn unfollow(&mut self, id: NodeId) -> Result<bool, Self::Error>;
/// Notify the service that a project has been updated, and announce local refs. /// Notify the service that a project has been updated, and announce local refs.
fn announce_refs(&mut self, id: Id) -> Result<RefsAt, Self::Error>; fn announce_refs(&mut self, id: RepoId) -> Result<RefsAt, Self::Error>;
/// Announce local inventory. /// Announce local inventory.
fn announce_inventory(&mut self) -> Result<(), Self::Error>; fn announce_inventory(&mut self) -> Result<(), Self::Error>;
/// Notify the service that our inventory was updated. /// Notify the service that our inventory was updated.
@ -889,7 +889,7 @@ impl Node {
/// within the given time. /// within the given time.
pub fn announce( pub fn announce(
&mut self, &mut self,
rid: Id, rid: RepoId,
seeds: impl IntoIterator<Item = NodeId>, seeds: impl IntoIterator<Item = NodeId>,
timeout: time::Duration, timeout: time::Duration,
mut callback: impl FnMut(AnnounceEvent, &[PublicKey]) -> ControlFlow<()>, mut callback: impl FnMut(AnnounceEvent, &[PublicKey]) -> ControlFlow<()>,
@ -984,7 +984,7 @@ impl Handle for Node {
Ok(result) Ok(result)
} }
fn seeds(&mut self, rid: Id) -> Result<Seeds, Error> { fn seeds(&mut self, rid: RepoId) -> Result<Seeds, Error> {
let seeds = self let seeds = self
.call::<Seeds>(Command::Seeds { rid }, DEFAULT_TIMEOUT)? .call::<Seeds>(Command::Seeds { rid }, DEFAULT_TIMEOUT)?
.next() .next()
@ -995,7 +995,7 @@ impl Handle for Node {
fn fetch( fn fetch(
&mut self, &mut self,
rid: Id, rid: RepoId,
from: NodeId, from: NodeId,
timeout: time::Duration, timeout: time::Duration,
) -> Result<FetchResult, Error> { ) -> Result<FetchResult, Error> {
@ -1021,7 +1021,7 @@ impl Handle for Node {
Ok(response.updated) Ok(response.updated)
} }
fn seed(&mut self, rid: Id, scope: policy::Scope) -> Result<bool, Error> { fn seed(&mut self, rid: RepoId, scope: policy::Scope) -> Result<bool, Error> {
let mut line = self.call::<Success>(Command::Seed { rid, scope }, DEFAULT_TIMEOUT)?; let mut line = self.call::<Success>(Command::Seed { rid, scope }, DEFAULT_TIMEOUT)?;
let response = line.next().ok_or(Error::EmptyResponse)??; let response = line.next().ok_or(Error::EmptyResponse)??;
@ -1035,14 +1035,14 @@ impl Handle for Node {
Ok(response.updated) Ok(response.updated)
} }
fn unseed(&mut self, rid: Id) -> Result<bool, Error> { fn unseed(&mut self, rid: RepoId) -> Result<bool, Error> {
let mut line = self.call::<Success>(Command::Unseed { rid }, DEFAULT_TIMEOUT)?; let mut line = self.call::<Success>(Command::Unseed { rid }, DEFAULT_TIMEOUT)?;
let response = line.next().ok_or(Error::EmptyResponse {})??; let response = line.next().ok_or(Error::EmptyResponse {})??;
Ok(response.updated) Ok(response.updated)
} }
fn announce_refs(&mut self, rid: Id) -> Result<RefsAt, Error> { fn announce_refs(&mut self, rid: RepoId) -> Result<RefsAt, Error> {
let refs: RefsAt = self let refs: RefsAt = self
.call(Command::AnnounceRefs { rid }, DEFAULT_TIMEOUT)? .call(Command::AnnounceRefs { rid }, DEFAULT_TIMEOUT)?
.next() .next()

View File

@ -14,20 +14,20 @@ use crate::storage::{refs, RefUpdate};
pub enum Event { pub enum Event {
RefsFetched { RefsFetched {
remote: NodeId, remote: NodeId,
rid: Id, rid: RepoId,
updated: Vec<RefUpdate>, updated: Vec<RefUpdate>,
}, },
RefsSynced { RefsSynced {
remote: NodeId, remote: NodeId,
rid: Id, rid: RepoId,
at: Oid, at: Oid,
}, },
SeedDiscovered { SeedDiscovered {
rid: Id, rid: RepoId,
nid: NodeId, nid: NodeId,
}, },
SeedDropped { SeedDropped {
rid: Id, rid: RepoId,
nid: NodeId, nid: NodeId,
}, },
PeerConnected { PeerConnected {
@ -39,12 +39,12 @@ pub enum Event {
}, },
InventoryAnnounced { InventoryAnnounced {
nid: NodeId, nid: NodeId,
inventory: Vec<Id>, inventory: Vec<RepoId>,
timestamp: Timestamp, timestamp: Timestamp,
}, },
RefsAnnounced { RefsAnnounced {
nid: NodeId, nid: NodeId,
rid: Id, rid: RepoId,
refs: Vec<refs::RefsAt>, refs: Vec<refs::RefsAt>,
timestamp: Timestamp, timestamp: Timestamp,
}, },

View File

@ -7,14 +7,14 @@ use std::str::FromStr;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use thiserror::Error; use thiserror::Error;
use crate::prelude::Id; use crate::prelude::RepoId;
pub use super::{Alias, NodeId}; pub use super::{Alias, NodeId};
/// Repository seeding policy. /// Repository seeding policy.
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Repo { pub struct Repo {
pub id: Id, pub id: RepoId,
pub scope: Scope, pub scope: Scope,
pub policy: Policy, pub policy: Policy,
} }

View File

@ -6,7 +6,7 @@ use log::error;
use thiserror::Error; use thiserror::Error;
use crate::crypto::PublicKey; use crate::crypto::PublicKey;
use crate::prelude::{Id, NodeId}; use crate::prelude::{NodeId, RepoId};
use crate::storage::{Namespaces, ReadRepository as _, ReadStorage, RepositoryError}; use crate::storage::{Namespaces, ReadRepository as _, ReadStorage, RepositoryError};
pub use crate::node::policy::store; pub use crate::node::policy::store;
@ -18,28 +18,28 @@ pub use crate::node::policy::{Alias, Node, Policy, Repo, Scope};
pub enum NamespacesError { pub enum NamespacesError {
#[error("failed to find policy for {rid}")] #[error("failed to find policy for {rid}")]
FailedPolicy { FailedPolicy {
rid: Id, rid: RepoId,
#[source] #[source]
err: Error, err: Error,
}, },
#[error("cannot fetch {rid} as it is not seeded")] #[error("cannot fetch {rid} as it is not seeded")]
BlockedPolicy { rid: Id }, BlockedPolicy { rid: RepoId },
#[error("failed to get node policies for {rid}")] #[error("failed to get node policies for {rid}")]
FailedNodes { FailedNodes {
rid: Id, rid: RepoId,
#[source] #[source]
err: Error, err: Error,
}, },
#[error("failed to get delegates for {rid}")] #[error("failed to get delegates for {rid}")]
FailedDelegates { FailedDelegates {
rid: Id, rid: RepoId,
#[source] #[source]
err: RepositoryError, err: RepositoryError,
}, },
#[error(transparent)] #[error(transparent)]
Git(#[from] crate::git::raw::Error), Git(#[from] crate::git::raw::Error),
#[error("could not find any followed nodes for {rid}")] #[error("could not find any followed nodes for {rid}")]
NoFollowed { rid: Id }, NoFollowed { rid: RepoId },
} }
/// Policies configuration. /// Policies configuration.
@ -75,7 +75,7 @@ impl<T> Config<T> {
} }
/// Check if a repository is seeded. /// Check if a repository is seeded.
pub fn is_seeding(&self, id: &Id) -> Result<bool, Error> { pub fn is_seeding(&self, id: &RepoId) -> Result<bool, Error> {
self.repo_policy(id) self.repo_policy(id)
.map(|entry| entry.policy == Policy::Allow) .map(|entry| entry.policy == Policy::Allow)
} }
@ -98,7 +98,7 @@ impl<T> Config<T> {
/// Get a repository's seediing information. /// Get a repository's seediing information.
/// Returns the default policy if the repo isn't found. /// Returns the default policy if the repo isn't found.
pub fn repo_policy(&self, id: &Id) -> Result<Repo, Error> { pub fn repo_policy(&self, id: &RepoId) -> Result<Repo, Error> {
Ok(self.store.seed_policy(id)?.unwrap_or(Repo { Ok(self.store.seed_policy(id)?.unwrap_or(Repo {
id: *id, id: *id,
scope: self.scope, scope: self.scope,
@ -106,7 +106,11 @@ impl<T> Config<T> {
})) }))
} }
pub fn namespaces_for<S>(&self, storage: &S, rid: &Id) -> Result<Namespaces, NamespacesError> pub fn namespaces_for<S>(
&self,
storage: &S,
rid: &RepoId,
) -> Result<Namespaces, NamespacesError>
where where
S: ReadStorage, S: ReadStorage,
{ {

View File

@ -7,7 +7,7 @@ use sqlite as sql;
use thiserror::Error; use thiserror::Error;
use crate::node::{Alias, AliasStore}; use crate::node::{Alias, AliasStore};
use crate::prelude::{Id, NodeId}; use crate::prelude::{NodeId, RepoId};
use super::{Node, Policy, Repo, Scope}; use super::{Node, Policy, Repo, Scope};
@ -132,7 +132,7 @@ impl Store<Write> {
} }
/// Seed a repository. /// Seed a repository.
pub fn seed(&mut self, id: &Id, scope: Scope) -> Result<bool, Error> { pub fn seed(&mut self, id: &RepoId, scope: Scope) -> Result<bool, Error> {
let mut stmt = self.db.prepare( let mut stmt = self.db.prepare(
"INSERT INTO `seeding` (id, scope) "INSERT INTO `seeding` (id, scope)
VALUES (?1, ?2) VALUES (?1, ?2)
@ -164,7 +164,7 @@ impl Store<Write> {
} }
/// Set a repository's seeding policy. /// Set a repository's seeding policy.
pub fn set_seed_policy(&mut self, id: &Id, policy: Policy) -> Result<bool, Error> { pub fn set_seed_policy(&mut self, id: &RepoId, policy: Policy) -> Result<bool, Error> {
let mut stmt = self.db.prepare( let mut stmt = self.db.prepare(
"INSERT INTO `seeding` (id, policy) "INSERT INTO `seeding` (id, policy)
VALUES (?1, ?2) VALUES (?1, ?2)
@ -190,7 +190,7 @@ impl Store<Write> {
} }
/// Unseed a repository. /// Unseed a repository.
pub fn unseed(&mut self, id: &Id) -> Result<bool, Error> { pub fn unseed(&mut self, id: &RepoId) -> Result<bool, Error> {
let mut stmt = self.db.prepare("DELETE FROM `seeding` WHERE id = ?")?; let mut stmt = self.db.prepare("DELETE FROM `seeding` WHERE id = ?")?;
stmt.bind((1, id))?; stmt.bind((1, id))?;
@ -215,7 +215,7 @@ impl<T> Store<T> {
} }
/// Check if a repository is seeded. /// Check if a repository is seeded.
pub fn is_seeded(&self, id: &Id) -> Result<bool, Error> { pub fn is_seeded(&self, id: &RepoId) -> Result<bool, Error> {
Ok(matches!( Ok(matches!(
self.seed_policy(id)?, self.seed_policy(id)?,
Some(Repo { Some(Repo {
@ -252,7 +252,7 @@ impl<T> Store<T> {
} }
/// Get a repository's seeding policy. /// Get a repository's seeding policy.
pub fn seed_policy(&self, id: &Id) -> Result<Option<Repo>, Error> { pub fn seed_policy(&self, id: &RepoId) -> Result<Option<Repo>, Error> {
let mut stmt = self let mut stmt = self
.db .db
.prepare("SELECT scope, policy FROM `seeding` WHERE id = ?")?; .prepare("SELECT scope, policy FROM `seeding` WHERE id = ?")?;
@ -343,7 +343,7 @@ mod test {
#[test] #[test]
fn test_seed_and_unseed_repo() { fn test_seed_and_unseed_repo() {
let id = arbitrary::gen::<Id>(1); let id = arbitrary::gen::<RepoId>(1);
let mut db = Store::open(":memory:").unwrap(); let mut db = Store::open(":memory:").unwrap();
assert!(db.seed(&id, Scope::All).unwrap()); assert!(db.seed(&id, Scope::All).unwrap());
@ -369,7 +369,7 @@ mod test {
#[test] #[test]
fn test_repo_policies() { fn test_repo_policies() {
let ids = arbitrary::vec::<Id>(3); let ids = arbitrary::vec::<RepoId>(3);
let mut db = Store::open(":memory:").unwrap(); let mut db = Store::open(":memory:").unwrap();
for id in &ids { for id in &ids {
@ -403,7 +403,7 @@ mod test {
#[test] #[test]
fn test_update_scope() { fn test_update_scope() {
let id = arbitrary::gen::<Id>(1); let id = arbitrary::gen::<RepoId>(1);
let mut db = Store::open(":memory:").unwrap(); let mut db = Store::open(":memory:").unwrap();
assert!(db.seed(&id, Scope::All).unwrap()); assert!(db.seed(&id, Scope::All).unwrap());
@ -414,7 +414,7 @@ mod test {
#[test] #[test]
fn test_repo_policy() { fn test_repo_policy() {
let id = arbitrary::gen::<Id>(1); let id = arbitrary::gen::<RepoId>(1);
let mut db = Store::open(":memory:").unwrap(); let mut db = Store::open(":memory:").unwrap();
assert!(db.seed(&id, Scope::All).unwrap()); assert!(db.seed(&id, Scope::All).unwrap());

View File

@ -6,7 +6,7 @@ use thiserror::Error;
use crate::node::Database; use crate::node::Database;
use crate::{ use crate::{
prelude::Timestamp, prelude::Timestamp,
prelude::{Id, NodeId}, prelude::{NodeId, RepoId},
sql::transaction, sql::transaction,
}; };
@ -35,11 +35,11 @@ pub enum Error {
/// Backing store for a routing table. /// Backing store for a routing table.
pub trait Store { pub trait Store {
/// Get the nodes seeding the given id. /// Get the nodes seeding the given id.
fn get(&self, id: &Id) -> Result<HashSet<NodeId>, Error>; fn get(&self, id: &RepoId) -> Result<HashSet<NodeId>, Error>;
/// Get the resources seeded by the given node. /// Get the resources seeded by the given node.
fn get_resources(&self, node_id: &NodeId) -> Result<HashSet<Id>, Error>; fn get_resources(&self, node_id: &NodeId) -> Result<HashSet<RepoId>, Error>;
/// Get a specific entry. /// Get a specific entry.
fn entry(&self, id: &Id, node: &NodeId) -> Result<Option<Timestamp>, Error>; fn entry(&self, id: &RepoId, node: &NodeId) -> Result<Option<Timestamp>, Error>;
/// Checks if any entries are available. /// Checks if any entries are available.
fn is_empty(&self) -> Result<bool, Error> { fn is_empty(&self) -> Result<bool, Error> {
Ok(self.len()? == 0) Ok(self.len()? == 0)
@ -47,24 +47,24 @@ pub trait Store {
/// Add a new node seeding the given id. /// Add a new node seeding the given id.
fn insert<'a>( fn insert<'a>(
&mut self, &mut self,
ids: impl IntoIterator<Item = &'a Id>, ids: impl IntoIterator<Item = &'a RepoId>,
node: NodeId, node: NodeId,
time: Timestamp, time: Timestamp,
) -> Result<Vec<(Id, InsertResult)>, Error>; ) -> Result<Vec<(RepoId, InsertResult)>, Error>;
/// Remove a node for the given id. /// Remove a node for the given id.
fn remove(&mut self, id: &Id, node: &NodeId) -> Result<bool, Error>; fn remove(&mut self, id: &RepoId, node: &NodeId) -> Result<bool, Error>;
/// Iterate over all entries in the routing table. /// Iterate over all entries in the routing table.
fn entries(&self) -> Result<Box<dyn Iterator<Item = (Id, NodeId)>>, Error>; fn entries(&self) -> Result<Box<dyn Iterator<Item = (RepoId, NodeId)>>, Error>;
/// Get the total number of routing entries. /// Get the total number of routing entries.
fn len(&self) -> Result<usize, Error>; fn len(&self) -> Result<usize, Error>;
/// Prune entries older than the given timestamp. /// Prune entries older than the given timestamp.
fn prune(&mut self, oldest: Timestamp, limit: Option<usize>) -> Result<usize, Error>; fn prune(&mut self, oldest: Timestamp, limit: Option<usize>) -> Result<usize, Error>;
/// Count the number of routes for a specific repo RID. /// Count the number of routes for a specific repo RID.
fn count(&self, id: &Id) -> Result<usize, Error>; fn count(&self, id: &RepoId) -> Result<usize, Error>;
} }
impl Store for Database { impl Store for Database {
fn get(&self, id: &Id) -> Result<HashSet<NodeId>, Error> { fn get(&self, id: &RepoId) -> Result<HashSet<NodeId>, Error> {
let mut stmt = self let mut stmt = self
.db .db
.prepare("SELECT (node) FROM routing WHERE repo = ?")?; .prepare("SELECT (node) FROM routing WHERE repo = ?")?;
@ -77,18 +77,18 @@ impl Store for Database {
Ok(nodes) Ok(nodes)
} }
fn get_resources(&self, node: &NodeId) -> Result<HashSet<Id>, Error> { fn get_resources(&self, node: &NodeId) -> Result<HashSet<RepoId>, Error> {
let mut stmt = self.db.prepare("SELECT repo FROM routing WHERE node = ?")?; let mut stmt = self.db.prepare("SELECT repo FROM routing WHERE node = ?")?;
stmt.bind((1, node))?; stmt.bind((1, node))?;
let mut resources = HashSet::new(); let mut resources = HashSet::new();
for row in stmt.into_iter() { for row in stmt.into_iter() {
resources.insert(row?.read::<Id, _>("repo")); resources.insert(row?.read::<RepoId, _>("repo"));
} }
Ok(resources) Ok(resources)
} }
fn entry(&self, id: &Id, node: &NodeId) -> Result<Option<Timestamp>, Error> { fn entry(&self, id: &RepoId, node: &NodeId) -> Result<Option<Timestamp>, Error> {
let mut stmt = self let mut stmt = self
.db .db
.prepare("SELECT (timestamp) FROM routing WHERE repo = ? AND node = ?")?; .prepare("SELECT (timestamp) FROM routing WHERE repo = ? AND node = ?")?;
@ -104,10 +104,10 @@ impl Store for Database {
fn insert<'a>( fn insert<'a>(
&mut self, &mut self,
ids: impl IntoIterator<Item = &'a Id>, ids: impl IntoIterator<Item = &'a RepoId>,
node: NodeId, node: NodeId,
time: Timestamp, time: Timestamp,
) -> Result<Vec<(Id, InsertResult)>, Error> { ) -> Result<Vec<(RepoId, InsertResult)>, Error> {
let time: i64 = time.try_into().map_err(|_| Error::UnitOverflow)?; let time: i64 = time.try_into().map_err(|_| Error::UnitOverflow)?;
let mut results = Vec::new(); let mut results = Vec::new();
@ -144,7 +144,7 @@ impl Store for Database {
}) })
} }
fn entries(&self) -> Result<Box<dyn Iterator<Item = (Id, NodeId)>>, Error> { fn entries(&self) -> Result<Box<dyn Iterator<Item = (RepoId, NodeId)>>, Error> {
let mut stmt = self let mut stmt = self
.db .db
.prepare("SELECT repo, node FROM routing ORDER BY repo")? .prepare("SELECT repo, node FROM routing ORDER BY repo")?
@ -160,7 +160,7 @@ impl Store for Database {
Ok(Box::new(entries.into_iter())) Ok(Box::new(entries.into_iter()))
} }
fn remove(&mut self, id: &Id, node: &NodeId) -> Result<bool, Error> { fn remove(&mut self, id: &RepoId, node: &NodeId) -> Result<bool, Error> {
let mut stmt = self let mut stmt = self
.db .db
.prepare("DELETE FROM routing WHERE repo = ? AND node = ?")?; .prepare("DELETE FROM routing WHERE repo = ? AND node = ?")?;
@ -201,7 +201,7 @@ impl Store for Database {
Ok(self.db.change_count()) Ok(self.db.change_count())
} }
fn count(&self, id: &Id) -> Result<usize, Error> { fn count(&self, id: &RepoId) -> Result<usize, Error> {
let mut stmt = self let mut stmt = self
.db .db
.prepare("SELECT COUNT(*) FROM routing WHERE repo = ?")?; .prepare("SELECT COUNT(*) FROM routing WHERE repo = ?")?;
@ -237,7 +237,7 @@ mod test {
#[test] #[test]
fn test_insert_and_get() { fn test_insert_and_get() {
let ids = arbitrary::set::<Id>(5..10); let ids = arbitrary::set::<RepoId>(5..10);
let nodes = arbitrary::set::<NodeId>(5..10); let nodes = arbitrary::set::<NodeId>(5..10);
let mut db = database(":memory:"); let mut db = database(":memory:");
@ -260,7 +260,7 @@ mod test {
#[test] #[test]
fn test_insert_and_get_resources() { fn test_insert_and_get_resources() {
let ids = arbitrary::set::<Id>(5..10); let ids = arbitrary::set::<RepoId>(5..10);
let nodes = arbitrary::set::<NodeId>(5..10); let nodes = arbitrary::set::<NodeId>(5..10);
let mut db = database(":memory:"); let mut db = database(":memory:");
@ -278,7 +278,7 @@ mod test {
#[test] #[test]
fn test_entries() { fn test_entries() {
let ids = arbitrary::set::<Id>(6..9); let ids = arbitrary::set::<RepoId>(6..9);
let nodes = arbitrary::set::<NodeId>(6..9); let nodes = arbitrary::set::<NodeId>(6..9);
let mut db = database(":memory:"); let mut db = database(":memory:");
@ -301,7 +301,7 @@ mod test {
#[test] #[test]
fn test_insert_and_remove() { fn test_insert_and_remove() {
let ids = arbitrary::set::<Id>(5..10); let ids = arbitrary::set::<RepoId>(5..10);
let nodes = arbitrary::set::<NodeId>(5..10); let nodes = arbitrary::set::<NodeId>(5..10);
let mut db = database(":memory:"); let mut db = database(":memory:");
@ -320,7 +320,7 @@ mod test {
#[test] #[test]
fn test_insert_duplicate() { fn test_insert_duplicate() {
let id = arbitrary::gen::<Id>(1); let id = arbitrary::gen::<RepoId>(1);
let node = arbitrary::gen::<NodeId>(1); let node = arbitrary::gen::<NodeId>(1);
let mut db = database(":memory:"); let mut db = database(":memory:");
@ -340,7 +340,7 @@ mod test {
#[test] #[test]
fn test_insert_existing_updated_time() { fn test_insert_existing_updated_time() {
let id = arbitrary::gen::<Id>(1); let id = arbitrary::gen::<RepoId>(1);
let node = arbitrary::gen::<NodeId>(1); let node = arbitrary::gen::<NodeId>(1);
let mut db = database(":memory:"); let mut db = database(":memory:");
@ -357,8 +357,8 @@ mod test {
#[test] #[test]
fn test_update_existing_multi() { fn test_update_existing_multi() {
let id1 = arbitrary::gen::<Id>(1); let id1 = arbitrary::gen::<RepoId>(1);
let id2 = arbitrary::gen::<Id>(1); let id2 = arbitrary::gen::<RepoId>(1);
let node = arbitrary::gen::<NodeId>(1); let node = arbitrary::gen::<NodeId>(1);
let mut db = database(":memory:"); let mut db = database(":memory:");
@ -384,7 +384,7 @@ mod test {
#[test] #[test]
fn test_remove_redundant() { fn test_remove_redundant() {
let id = arbitrary::gen::<Id>(1); let id = arbitrary::gen::<RepoId>(1);
let node = arbitrary::gen::<NodeId>(1); let node = arbitrary::gen::<NodeId>(1);
let mut db = database(":memory:"); let mut db = database(":memory:");
@ -399,7 +399,7 @@ mod test {
#[test] #[test]
fn test_len() { fn test_len() {
let mut db = database(":memory:"); let mut db = database(":memory:");
let ids = arbitrary::vec::<Id>(10); let ids = arbitrary::vec::<RepoId>(10);
let node = arbitrary::gen(1); let node = arbitrary::gen(1);
db.insert(&ids, node, LocalTime::now().as_millis()).unwrap(); db.insert(&ids, node, LocalTime::now().as_millis()).unwrap();
@ -411,7 +411,7 @@ mod test {
fn test_prune() { fn test_prune() {
let mut rng = fastrand::Rng::new(); let mut rng = fastrand::Rng::new();
let now = LocalTime::now(); let now = LocalTime::now();
let ids = arbitrary::vec::<Id>(10); let ids = arbitrary::vec::<RepoId>(10);
let nodes = arbitrary::vec::<NodeId>(10); let nodes = arbitrary::vec::<NodeId>(10);
let mut db = database(":memory:"); let mut db = database(":memory:");
@ -420,7 +420,7 @@ mod test {
db.insert(&ids, *node, time).unwrap(); db.insert(&ids, *node, time).unwrap();
} }
let ids = arbitrary::vec::<Id>(10); let ids = arbitrary::vec::<RepoId>(10);
let nodes = arbitrary::vec::<NodeId>(10); let nodes = arbitrary::vec::<NodeId>(10);
for node in &nodes { for node in &nodes {
@ -441,7 +441,7 @@ mod test {
#[test] #[test]
fn test_count() { fn test_count() {
let id = arbitrary::gen::<Id>(1); let id = arbitrary::gen::<RepoId>(1);
let nodes = arbitrary::set::<NodeId>(5..10); let nodes = arbitrary::set::<NodeId>(5..10);
let mut db = database(":memory:"); let mut db = database(":memory:");

View File

@ -10,7 +10,7 @@ use crate::node::address;
use crate::node::address::Store as _; use crate::node::address::Store as _;
use crate::node::NodeId; use crate::node::NodeId;
use crate::node::{seed::SyncedSeed, Database, SyncedAt}; use crate::node::{seed::SyncedSeed, Database, SyncedAt};
use crate::prelude::{Id, Timestamp}; use crate::prelude::{RepoId, Timestamp};
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum Error { pub enum Error {
@ -29,7 +29,7 @@ pub trait Store: address::Store {
/// Mark a repo as synced on the given node. /// Mark a repo as synced on the given node.
fn synced( fn synced(
&mut self, &mut self,
rid: &Id, rid: &RepoId,
nid: &NodeId, nid: &NodeId,
at: Oid, at: Oid,
timestamp: Timestamp, timestamp: Timestamp,
@ -38,18 +38,18 @@ pub trait Store: address::Store {
fn seeded_by( fn seeded_by(
&self, &self,
nid: &NodeId, nid: &NodeId,
) -> Result<Box<dyn Iterator<Item = Result<(Id, SyncedAt), Error>> + '_>, Error>; ) -> Result<Box<dyn Iterator<Item = Result<(RepoId, SyncedAt), Error>> + '_>, Error>;
/// Get nodes that have synced the given repo. /// Get nodes that have synced the given repo.
fn seeds_for( fn seeds_for(
&self, &self,
rid: &Id, rid: &RepoId,
) -> Result<Box<dyn Iterator<Item = Result<SyncedSeed, Error>> + '_>, Error>; ) -> Result<Box<dyn Iterator<Item = Result<SyncedSeed, Error>> + '_>, Error>;
} }
impl Store for Database { impl Store for Database {
fn synced( fn synced(
&mut self, &mut self,
rid: &Id, rid: &RepoId,
nid: &NodeId, nid: &NodeId,
at: Oid, at: Oid,
timestamp: Timestamp, timestamp: Timestamp,
@ -72,7 +72,7 @@ impl Store for Database {
fn seeds_for( fn seeds_for(
&self, &self,
rid: &Id, rid: &RepoId,
) -> Result<Box<dyn Iterator<Item = Result<SyncedSeed, Error>> + '_>, Error> { ) -> Result<Box<dyn Iterator<Item = Result<SyncedSeed, Error>> + '_>, Error> {
let mut stmt = self.db.prepare( let mut stmt = self.db.prepare(
"SELECT node, head, timestamp "SELECT node, head, timestamp
@ -106,7 +106,7 @@ impl Store for Database {
fn seeded_by( fn seeded_by(
&self, &self,
nid: &NodeId, nid: &NodeId,
) -> Result<Box<dyn Iterator<Item = Result<(Id, SyncedAt), Error>> + '_>, Error> { ) -> Result<Box<dyn Iterator<Item = Result<(RepoId, SyncedAt), Error>> + '_>, Error> {
let mut stmt = self.db.prepare( let mut stmt = self.db.prepare(
"SELECT repo, head, timestamp "SELECT repo, head, timestamp
FROM `repo-sync-status` FROM `repo-sync-status`
@ -116,7 +116,7 @@ impl Store for Database {
Ok(Box::new(stmt.into_iter().map(|row| { Ok(Box::new(stmt.into_iter().map(|row| {
let row = row?; let row = row?;
let rid = row.try_read::<Id, _>("repo")?; let rid = row.try_read::<RepoId, _>("repo")?;
let oid = row.try_read::<&str, _>("head")?; let oid = row.try_read::<&str, _>("head")?;
let oid = Oid::from_str(oid).map_err(|e| { let oid = Oid::from_str(oid).map_err(|e| {
Error::Internal(sql::Error { Error::Internal(sql::Error {

View File

@ -10,7 +10,7 @@ use crate::cob::ObjectId;
use crate::crypto::{Signer, Verified}; use crate::crypto::{Signer, Verified};
use crate::git; use crate::git;
use crate::identity::doc; use crate::identity::doc;
use crate::identity::doc::{DocError, Id, Visibility}; use crate::identity::doc::{DocError, RepoId, Visibility};
use crate::identity::project::Project; use crate::identity::project::Project;
use crate::storage::git::transport; use crate::storage::git::transport;
use crate::storage::git::Repository; use crate::storage::git::Repository;
@ -52,7 +52,7 @@ pub fn init<G: Signer, S: WriteStorage>(
visibility: Visibility, visibility: Visibility,
signer: &G, signer: &G,
storage: S, storage: S,
) -> Result<(Id, identity::Doc<Verified>, SignedRefs<Verified>), InitError> { ) -> Result<(RepoId, identity::Doc<Verified>, SignedRefs<Verified>), InitError> {
// TODO: Better error when project id already exists in storage, but remote doesn't. // TODO: Better error when project id already exists in storage, but remote doesn't.
let pk = signer.public_key(); let pk = signer.public_key();
let delegate = identity::Did::from(*pk); let delegate = identity::Did::from(*pk);
@ -127,14 +127,14 @@ pub enum ForkError {
#[error("payload: {0}")] #[error("payload: {0}")]
Payload(#[from] doc::PayloadError), Payload(#[from] doc::PayloadError),
#[error("project `{0}` was not found in storage")] #[error("project `{0}` was not found in storage")]
NotFound(Id), NotFound(RepoId),
#[error("repository: {0}")] #[error("repository: {0}")]
Repository(#[from] RepositoryError), Repository(#[from] RepositoryError),
} }
/// Create a local tree for an existing project, from an existing remote. /// Create a local tree for an existing project, from an existing remote.
pub fn fork_remote<G: Signer, S: storage::WriteStorage>( pub fn fork_remote<G: Signer, S: storage::WriteStorage>(
proj: Id, proj: RepoId,
remote: &RemoteId, remote: &RemoteId,
signer: &G, signer: &G,
storage: S, storage: S,
@ -169,7 +169,7 @@ pub fn fork_remote<G: Signer, S: storage::WriteStorage>(
} }
pub fn fork<G: Signer, S: storage::WriteStorage>( pub fn fork<G: Signer, S: storage::WriteStorage>(
rid: Id, rid: RepoId,
signer: &G, signer: &G,
storage: &S, storage: &S,
) -> Result<(), ForkError> { ) -> Result<(), ForkError> {
@ -198,7 +198,7 @@ pub enum CheckoutError {
#[error("payload: {0}")] #[error("payload: {0}")]
Payload(#[from] doc::PayloadError), Payload(#[from] doc::PayloadError),
#[error("project `{0}` was not found in storage")] #[error("project `{0}` was not found in storage")]
NotFound(Id), NotFound(RepoId),
#[error("repository: {0}")] #[error("repository: {0}")]
Repository(#[from] RepositoryError), Repository(#[from] RepositoryError),
} }
@ -206,7 +206,7 @@ pub enum CheckoutError {
/// Checkout a project from storage as a working copy. /// Checkout a project from storage as a working copy.
/// This effectively does a `git-clone` from storage. /// This effectively does a `git-clone` from storage.
pub fn checkout<P: AsRef<Path>, S: storage::ReadStorage>( pub fn checkout<P: AsRef<Path>, S: storage::ReadStorage>(
proj: Id, proj: RepoId,
remote: &RemoteId, remote: &RemoteId,
path: P, path: P,
storage: &S, storage: &S,
@ -265,11 +265,11 @@ pub enum RemoteError {
#[error("remote `{0}` not found")] #[error("remote `{0}` not found")]
NotFound(String), NotFound(String),
#[error("expected remote for {expected} but found {found}")] #[error("expected remote for {expected} but found {found}")]
RidMismatch { found: Id, expected: Id }, RidMismatch { found: RepoId, expected: RepoId },
} }
/// Get the radicle ("rad") remote of a repository, and return the associated project id. /// Get the radicle ("rad") remote of a repository, and return the associated project id.
pub fn remote(repo: &git2::Repository) -> Result<(git2::Remote<'_>, Id), RemoteError> { pub fn remote(repo: &git2::Repository) -> Result<(git2::Remote<'_>, RepoId), RemoteError> {
let remote = repo.find_remote(&REMOTE_NAME).map_err(|e| { let remote = repo.find_remote(&REMOTE_NAME).map_err(|e| {
if e.code() == git2::ErrorCode::NotFound { if e.code() == git2::ErrorCode::NotFound {
RemoteError::NotFound(REMOTE_NAME.to_string()) RemoteError::NotFound(REMOTE_NAME.to_string())
@ -305,7 +305,7 @@ pub fn remove_remote(repo: &git2::Repository) -> Result<(), RemoteError> {
/// This function should only perform read operations since we do not /// This function should only perform read operations since we do not
/// want to modify the wrong repository in the case that it found a /// want to modify the wrong repository in the case that it found a
/// Git repository that is not a Radicle repository. /// Git repository that is not a Radicle repository.
pub fn cwd() -> Result<(git2::Repository, Id), RemoteError> { pub fn cwd() -> Result<(git2::Repository, RepoId), RemoteError> {
let repo = repo()?; let repo = repo()?;
let (_, id) = remote(&repo)?; let (_, id) = remote(&repo)?;
@ -313,7 +313,7 @@ pub fn cwd() -> Result<(git2::Repository, Id), RemoteError> {
} }
/// Get the repository of project in specified directory /// Get the repository of project in specified directory
pub fn at(path: impl AsRef<Path>) -> Result<(git2::Repository, Id), RemoteError> { pub fn at(path: impl AsRef<Path>) -> Result<(git2::Repository, RepoId), RemoteError> {
let repo = git2::Repository::open(path)?; let repo = git2::Repository::open(path)?;
let (_, id) = remote(&repo)?; let (_, id) = remote(&repo)?;

View File

@ -4,7 +4,7 @@ use std::str::FromStr;
use sqlite as sql; use sqlite as sql;
use sqlite::Value; use sqlite::Value;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node; use crate::node;
use crate::node::Address; use crate::node::Address;
@ -28,12 +28,12 @@ pub fn transaction<T, E: From<sql::Error>>(
} }
} }
impl TryFrom<&Value> for Id { impl TryFrom<&Value> for RepoId {
type Error = sql::Error; type Error = sql::Error;
fn try_from(value: &Value) -> Result<Self, Self::Error> { fn try_from(value: &Value) -> Result<Self, Self::Error> {
match value { match value {
Value::String(id) => Id::from_urn(id).map_err(|e| sql::Error { Value::String(id) => RepoId::from_urn(id).map_err(|e| sql::Error {
code: None, code: None,
message: Some(e.to_string()), message: Some(e.to_string()),
}), }),
@ -45,7 +45,7 @@ impl TryFrom<&Value> for Id {
} }
} }
impl sqlite::BindableWithIndex for &Id { impl sqlite::BindableWithIndex for &RepoId {
fn bind<I: sql::ParameterIndex>(self, stmt: &mut sql::Statement<'_>, i: I) -> sql::Result<()> { fn bind<I: sql::ParameterIndex>(self, stmt: &mut sql::Statement<'_>, i: I) -> sql::Result<()> {
self.urn().as_str().bind(stmt, i) self.urn().as_str().bind(stmt, i)
} }

View File

@ -20,7 +20,7 @@ use crate::git::ext as git_ext;
use crate::git::{refspec::Refspec, PatternString, Qualified, RefError, RefString}; use crate::git::{refspec::Refspec, PatternString, Qualified, RefError, RefString};
use crate::identity::{Did, PayloadError}; use crate::identity::{Did, PayloadError};
use crate::identity::{Doc, DocAt, DocError}; use crate::identity::{Doc, DocAt, DocError};
use crate::identity::{Id, Identity}; use crate::identity::{Identity, RepoId};
use crate::storage::git::NAMESPACES_GLOB; use crate::storage::git::NAMESPACES_GLOB;
use crate::storage::refs::Refs; use crate::storage::refs::Refs;
@ -28,7 +28,7 @@ use self::git::UserInfo;
use self::refs::SignedRefs; use self::refs::SignedRefs;
pub type BranchName = git::RefString; pub type BranchName = git::RefString;
pub type Inventory = Vec<Id>; pub type Inventory = Vec<RepoId>;
/// Describes one or more namespaces. /// Describes one or more namespaces.
#[derive(Default, Debug, Clone, PartialEq, Eq)] #[derive(Default, Debug, Clone, PartialEq, Eq)]
@ -344,16 +344,16 @@ pub trait ReadStorage {
/// Get the storage base path. /// Get the storage base path.
fn path(&self) -> &Path; fn path(&self) -> &Path;
/// Get a repository's path. /// Get a repository's path.
fn path_of(&self, rid: &Id) -> PathBuf; fn path_of(&self, rid: &RepoId) -> PathBuf;
/// Check whether storage contains a repository. /// Check whether storage contains a repository.
fn contains(&self, rid: &Id) -> Result<bool, RepositoryError>; fn contains(&self, rid: &RepoId) -> Result<bool, RepositoryError>;
/// Get the inventory of repositories hosted under this storage. /// Get the inventory of repositories hosted under this storage.
/// This function should typically only return public repositories. /// This function should typically only return public repositories.
fn inventory(&self) -> Result<Inventory, Error>; fn inventory(&self) -> Result<Inventory, Error>;
/// Open or create a read-only repository. /// Open or create a read-only repository.
fn repository(&self, rid: Id) -> Result<Self::Repository, Error>; fn repository(&self, rid: RepoId) -> Result<Self::Repository, Error>;
/// Get a repository's identity if it exists. /// Get a repository's identity if it exists.
fn get(&self, rid: Id) -> Result<Option<Doc<Verified>>, RepositoryError> { fn get(&self, rid: RepoId) -> Result<Option<Doc<Verified>>, RepositoryError> {
match self.repository(rid) { match self.repository(rid) {
Ok(repo) => Ok(Some(repo.identity_doc()?.into())), Ok(repo) => Ok(Some(repo.identity_doc()?.into())),
Err(e) if e.is_not_found() => Ok(None), Err(e) if e.is_not_found() => Ok(None),
@ -367,9 +367,9 @@ pub trait WriteStorage: ReadStorage {
type RepositoryMut: WriteRepository; type RepositoryMut: WriteRepository;
/// Open a read-write repository. /// Open a read-write repository.
fn repository_mut(&self, rid: Id) -> Result<Self::RepositoryMut, Error>; fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error>;
/// Create a read-write repository. /// Create a read-write repository.
fn create(&self, rid: Id) -> Result<Self::RepositoryMut, Error>; fn create(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error>;
/// Clean the repository found at `rid`. /// Clean the repository found at `rid`.
/// ///
@ -379,13 +379,13 @@ pub trait WriteStorage: ReadStorage {
/// ///
/// If the local peer has no initialised `rad/sigrefs`, then the /// If the local peer has no initialised `rad/sigrefs`, then the
/// repository will be entirely removed from storage. /// repository will be entirely removed from storage.
fn clean(&self, rid: Id) -> Result<Vec<RemoteId>, RepositoryError>; fn clean(&self, rid: RepoId) -> Result<Vec<RemoteId>, RepositoryError>;
} }
/// Allows read-only access to a repository. /// Allows read-only access to a repository.
pub trait ReadRepository: Sized + ValidateRepository { pub trait ReadRepository: Sized + ValidateRepository {
/// Return the repository id. /// Return the repository id.
fn id(&self) -> Id; fn id(&self) -> RepoId;
/// Returns `true` if there are no references in the repository. /// Returns `true` if there are no references in the repository.
fn is_empty(&self) -> Result<bool, git2::Error>; fn is_empty(&self) -> Result<bool, git2::Error>;
@ -585,11 +585,11 @@ where
self.deref().path() self.deref().path()
} }
fn path_of(&self, rid: &Id) -> PathBuf { fn path_of(&self, rid: &RepoId) -> PathBuf {
self.deref().path_of(rid) self.deref().path_of(rid)
} }
fn contains(&self, rid: &Id) -> Result<bool, RepositoryError> { fn contains(&self, rid: &RepoId) -> Result<bool, RepositoryError> {
self.deref().contains(rid) self.deref().contains(rid)
} }
@ -597,11 +597,11 @@ where
self.deref().inventory() self.deref().inventory()
} }
fn get(&self, rid: Id) -> Result<Option<Doc<Verified>>, RepositoryError> { fn get(&self, rid: RepoId) -> Result<Option<Doc<Verified>>, RepositoryError> {
self.deref().get(rid) self.deref().get(rid)
} }
fn repository(&self, rid: Id) -> Result<Self::Repository, Error> { fn repository(&self, rid: RepoId) -> Result<Self::Repository, Error> {
self.deref().repository(rid) self.deref().repository(rid)
} }
} }
@ -613,15 +613,15 @@ where
{ {
type RepositoryMut = S::RepositoryMut; type RepositoryMut = S::RepositoryMut;
fn repository_mut(&self, rid: Id) -> Result<Self::RepositoryMut, Error> { fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error> {
self.deref().repository_mut(rid) self.deref().repository_mut(rid)
} }
fn create(&self, rid: Id) -> Result<Self::RepositoryMut, Error> { fn create(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error> {
self.deref().create(rid) self.deref().create(rid)
} }
fn clean(&self, rid: Id) -> Result<Vec<RemoteId>, RepositoryError> { fn clean(&self, rid: RepoId) -> Result<Vec<RemoteId>, RepositoryError> {
self.deref().clean(rid) self.deref().clean(rid)
} }
} }

View File

@ -14,7 +14,7 @@ use tempfile::TempDir;
use crate::crypto::Unverified; use crate::crypto::Unverified;
use crate::git; use crate::git;
use crate::identity::doc::DocError; use crate::identity::doc::DocError;
use crate::identity::{doc::DocAt, Doc, Id}; use crate::identity::{doc::DocAt, Doc, RepoId};
use crate::identity::{Identity, Project}; use crate::identity::{Identity, Project};
use crate::storage::refs; use crate::storage::refs;
use crate::storage::refs::{Refs, SignedRefs, SignedRefsAt}; use crate::storage::refs::{Refs, SignedRefs, SignedRefsAt};
@ -46,7 +46,7 @@ pub static CANONICAL_IDENTITY: Lazy<git::Qualified> = Lazy::new(|| {
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct RepositoryInfo<V> { pub struct RepositoryInfo<V> {
/// Repository identifier. /// Repository identifier.
pub rid: Id, pub rid: RepoId,
/// Head of default branch. /// Head of default branch.
pub head: Oid, pub head: Oid,
/// Identity document. /// Identity document.
@ -101,11 +101,11 @@ impl ReadStorage for Storage {
self.path.as_path() self.path.as_path()
} }
fn path_of(&self, rid: &Id) -> PathBuf { fn path_of(&self, rid: &RepoId) -> PathBuf {
paths::repository(&self, rid) paths::repository(&self, rid)
} }
fn contains(&self, rid: &Id) -> Result<bool, RepositoryError> { fn contains(&self, rid: &RepoId) -> Result<bool, RepositoryError> {
if paths::repository(&self, rid).exists() { if paths::repository(&self, rid).exists() {
let _ = self.repository(*rid)?.head()?; let _ = self.repository(*rid)?.head()?;
return Ok(true); return Ok(true);
@ -123,7 +123,7 @@ impl ReadStorage for Storage {
.collect()) .collect())
} }
fn repository(&self, rid: Id) -> Result<Self::Repository, Error> { fn repository(&self, rid: RepoId) -> Result<Self::Repository, Error> {
Repository::open(paths::repository(self, &rid), rid) Repository::open(paths::repository(self, &rid), rid)
} }
} }
@ -131,15 +131,15 @@ impl ReadStorage for Storage {
impl WriteStorage for Storage { impl WriteStorage for Storage {
type RepositoryMut = Repository; type RepositoryMut = Repository;
fn repository_mut(&self, rid: Id) -> Result<Self::RepositoryMut, Error> { fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error> {
Repository::open(paths::repository(self, &rid), rid) Repository::open(paths::repository(self, &rid), rid)
} }
fn create(&self, rid: Id) -> Result<Self::RepositoryMut, Error> { fn create(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error> {
Repository::create(paths::repository(self, &rid), rid, &self.info) Repository::create(paths::repository(self, &rid), rid, &self.info)
} }
fn clean(&self, rid: Id) -> Result<Vec<RemoteId>, RepositoryError> { fn clean(&self, rid: RepoId) -> Result<Vec<RemoteId>, RepositoryError> {
let repo = self.repository(rid)?; let repo = self.repository(rid)?;
// N.b. we remove the repository if the `local` peer has no // N.b. we remove the repository if the `local` peer has no
// `rad/sigrefs`. There's no risk of them corrupting data. // `rad/sigrefs`. There's no risk of them corrupting data.
@ -173,7 +173,7 @@ impl Storage {
/// N.b. it is important to keep the [`TempDir`] in scope while /// N.b. it is important to keep the [`TempDir`] in scope while
/// using the [`Repository`]. If it is dropped, any action on the /// using the [`Repository`]. If it is dropped, any action on the
/// `Repository` will fail. /// `Repository` will fail.
pub fn lock_repository(&self, rid: Id) -> Result<(Repository, TempDir), RepositoryError> { pub fn lock_repository(&self, rid: RepoId) -> Result<(Repository, TempDir), RepositoryError> {
if self.contains(&rid)? { if self.contains(&rid)? {
return Err(Error::Io(io::Error::new( return Err(Error::Io(io::Error::new(
io::ErrorKind::AlreadyExists, io::ErrorKind::AlreadyExists,
@ -213,8 +213,8 @@ impl Storage {
continue; continue;
} }
} }
let rid = let rid = RepoId::try_from(path.file_name())
Id::try_from(path.file_name()).map_err(|_| Error::InvalidId(path.file_name()))?; .map_err(|_| Error::InvalidId(path.file_name()))?;
let repo = match self.repository(rid) { let repo = match self.repository(rid) {
Ok(repo) => repo, Ok(repo) => repo,
@ -272,7 +272,7 @@ impl Storage {
/// Git implementation of [`WriteRepository`] using the `git2` crate. /// Git implementation of [`WriteRepository`] using the `git2` crate.
pub struct Repository { pub struct Repository {
/// The repository identifier (RID). /// The repository identifier (RID).
pub id: Id, pub id: RepoId,
/// The backing Git repository. /// The backing Git repository.
pub backend: git2::Repository, pub backend: git2::Repository,
} }
@ -335,14 +335,14 @@ pub enum Validation {
impl Repository { impl Repository {
/// Open an existing repository. /// Open an existing repository.
pub fn open<P: AsRef<Path>>(path: P, id: Id) -> Result<Self, Error> { pub fn open<P: AsRef<Path>>(path: P, id: RepoId) -> Result<Self, Error> {
let backend = git2::Repository::open_bare(path.as_ref())?; let backend = git2::Repository::open_bare(path.as_ref())?;
Ok(Self { id, backend }) Ok(Self { id, backend })
} }
/// Create a new repository. /// Create a new repository.
pub fn create<P: AsRef<Path>>(path: P, id: Id, info: &UserInfo) -> Result<Self, Error> { pub fn create<P: AsRef<Path>>(path: P, id: RepoId, info: &UserInfo) -> Result<Self, Error> {
let backend = git2::Repository::init_opts( let backend = git2::Repository::init_opts(
&path, &path,
git2::RepositoryInitOptions::new() git2::RepositoryInitOptions::new()
@ -426,7 +426,7 @@ impl Repository {
signer: &G, signer: &G,
) -> Result<(Self, git::Oid), RepositoryError> { ) -> Result<(Self, git::Oid), RepositoryError> {
let (doc_oid, _) = doc.encode()?; let (doc_oid, _) = doc.encode()?;
let id = Id::from(doc_oid); let id = RepoId::from(doc_oid);
let repo = Self::create(paths::repository(storage, &id), id, storage.info())?; let repo = Self::create(paths::repository(storage, &id), id, storage.info())?;
let commit = doc.init(&repo, signer)?; let commit = doc.init(&repo, signer)?;
@ -577,7 +577,7 @@ impl ValidateRepository for Repository {
} }
impl ReadRepository for Repository { impl ReadRepository for Repository {
fn id(&self) -> Id { fn id(&self) -> RepoId {
self.id self.id
} }
@ -988,10 +988,10 @@ pub mod trailers {
pub mod paths { pub mod paths {
use std::path::PathBuf; use std::path::PathBuf;
use super::Id;
use super::ReadStorage; use super::ReadStorage;
use super::RepoId;
pub fn repository<S: ReadStorage>(storage: &S, proj: &Id) -> PathBuf { pub fn repository<S: ReadStorage>(storage: &S, proj: &RepoId) -> PathBuf {
storage.path().join(proj.canonical()) storage.path().join(proj.canonical())
} }
} }
@ -1285,7 +1285,7 @@ mod tests {
let mut rng = fastrand::Rng::new(); let mut rng = fastrand::Rng::new();
let signer = MockSigner::new(&mut rng); let signer = MockSigner::new(&mut rng);
let storage = Storage::open(tmp.path(), fixtures::user()).unwrap(); let storage = Storage::open(tmp.path(), fixtures::user()).unwrap();
let proj_id = arbitrary::gen::<Id>(1); let proj_id = arbitrary::gen::<RepoId>(1);
let alice = *signer.public_key(); let alice = *signer.public_key();
let project = storage.create(proj_id).unwrap(); let project = storage.create(proj_id).unwrap();
let backend = &project.backend; let backend = &project.backend;

View File

@ -250,7 +250,7 @@ impl<'a, R: storage::ValidateRepository> ValidateRepository for DraftStore<'a, R
} }
impl<'a, R: storage::ReadRepository> ReadRepository for DraftStore<'a, R> { impl<'a, R: storage::ReadRepository> ReadRepository for DraftStore<'a, R> {
fn id(&self) -> identity::Id { fn id(&self) -> identity::RepoId {
self.repo.id() self.repo.id()
} }

View File

@ -6,7 +6,7 @@ use thiserror::Error;
use crate::{ use crate::{
crypto, crypto,
identity::{Id, IdError}, identity::{IdError, RepoId},
}; };
/// Repository namespace. /// Repository namespace.
@ -38,7 +38,7 @@ pub enum UrlError {
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Url { pub struct Url {
/// Repository identifier. /// Repository identifier.
pub repo: Id, pub repo: RepoId,
/// Repository sub-tree. /// Repository sub-tree.
pub namespace: Option<Namespace>, pub namespace: Option<Namespace>,
} }
@ -54,8 +54,8 @@ impl Url {
} }
} }
impl From<Id> for Url { impl From<RepoId> for Url {
fn from(repo: Id) -> Self { fn from(repo: RepoId) -> Self {
Self { Self {
repo, repo,
namespace: None, namespace: None,
@ -88,7 +88,7 @@ impl FromStr for Url {
_ => return Err(UrlError::InvalidFormat), _ => return Err(UrlError::InvalidFormat),
}; };
let resource = Id::from_canonical(resource).map_err(UrlError::InvalidRepository)?; let resource = RepoId::from_canonical(resource).map_err(UrlError::InvalidRepository)?;
let namespace = namespace let namespace = namespace
.map(|pk| Namespace::from_str(pk).map_err(UrlError::InvalidNamespace)) .map(|pk| Namespace::from_str(pk).map_err(UrlError::InvalidNamespace))
.transpose()?; .transpose()?;
@ -107,7 +107,7 @@ mod test {
#[test] #[test]
fn test_url_parse() { fn test_url_parse() {
let repo = Id::from_canonical("z2w8RArM3gaBXZxXhQUswE3hhLcss").unwrap(); let repo = RepoId::from_canonical("z2w8RArM3gaBXZxXhQUswE3hhLcss").unwrap();
let namespace = let namespace =
Namespace::from_str("z6Mkifeb5NPS6j7JP72kEQEeuqMTpCAVcHsJi1C86jGTzHRi").unwrap(); Namespace::from_str("z6Mkifeb5NPS6j7JP72kEQEeuqMTpCAVcHsJi1C86jGTzHRi").unwrap();
@ -137,7 +137,7 @@ mod test {
#[test] #[test]
fn test_url_to_string() { fn test_url_to_string() {
let repo = Id::from_canonical("z2w8RArM3gaBXZxXhQUswE3hhLcss").unwrap(); let repo = RepoId::from_canonical("z2w8RArM3gaBXZxXhQUswE3hhLcss").unwrap();
let namespace = let namespace =
Namespace::from_str("z6Mkifeb5NPS6j7JP72kEQEeuqMTpCAVcHsJi1C86jGTzHRi").unwrap(); Namespace::from_str("z6Mkifeb5NPS6j7JP72kEQEeuqMTpCAVcHsJi1C86jGTzHRi").unwrap();

View File

@ -6,7 +6,7 @@ use thiserror::Error;
use crate::{ use crate::{
crypto, crypto,
identity::{Id, IdError}, identity::{IdError, RepoId},
}; };
type NodeId = crypto::PublicKey; type NodeId = crypto::PublicKey;
@ -40,7 +40,7 @@ pub struct Url {
/// Node identifier. /// Node identifier.
pub node: NodeId, pub node: NodeId,
/// Repository identifier. /// Repository identifier.
pub repo: Id, pub repo: RepoId,
/// Repository sub-tree. /// Repository sub-tree.
pub namespace: Option<Namespace>, pub namespace: Option<Namespace>,
} }
@ -89,7 +89,7 @@ impl FromStr for Url {
}; };
let node = NodeId::from_str(node).map_err(UrlError::InvalidNode)?; let node = NodeId::from_str(node).map_err(UrlError::InvalidNode)?;
let resource = Id::from_canonical(resource).map_err(UrlError::InvalidRepository)?; let resource = RepoId::from_canonical(resource).map_err(UrlError::InvalidRepository)?;
let namespace = namespace let namespace = namespace
.map(|pk| Namespace::from_str(pk).map_err(UrlError::InvalidNamespace)) .map(|pk| Namespace::from_str(pk).map_err(UrlError::InvalidNamespace))
.transpose()?; .transpose()?;
@ -110,7 +110,7 @@ mod test {
#[test] #[test]
fn test_url_parse() { fn test_url_parse() {
let node = NodeId::from_str("z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK").unwrap(); let node = NodeId::from_str("z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK").unwrap();
let repo = Id::from_canonical("z2w8RArM3gaBXZxXhQUswE3hhLcss").unwrap(); let repo = RepoId::from_canonical("z2w8RArM3gaBXZxXhQUswE3hhLcss").unwrap();
let namespace = let namespace =
Namespace::from_str("z6Mkifeb5NPS6j7JP72kEQEeuqMTpCAVcHsJi1C86jGTzHRi").unwrap(); Namespace::from_str("z6Mkifeb5NPS6j7JP72kEQEeuqMTpCAVcHsJi1C86jGTzHRi").unwrap();

View File

@ -122,7 +122,7 @@ pub mod setup {
} }
} }
pub fn clone(&mut self, rid: Id, other: &Self) { pub fn clone(&mut self, rid: RepoId, other: &Self) {
let repo = self.storage.create(rid).unwrap(); let repo = self.storage.create(rid).unwrap();
super::fetch(&repo, other.signer.public_key(), Namespaces::All).unwrap(); super::fetch(&repo, other.signer.public_key(), Namespaces::All).unwrap();
@ -241,7 +241,7 @@ pub mod setup {
pub alice: NodeWithRepo, pub alice: NodeWithRepo,
pub bob: NodeWithRepo, pub bob: NodeWithRepo,
pub eve: NodeWithRepo, pub eve: NodeWithRepo,
pub rid: Id, pub rid: RepoId,
#[allow(dead_code)] #[allow(dead_code)]
tmp: tempfile::TempDir, tmp: tempfile::TempDir,

View File

@ -12,7 +12,7 @@ use qcheck::Arbitrary;
use crate::collections::RandomMap; use crate::collections::RandomMap;
use crate::identity::doc::Visibility; use crate::identity::doc::Visibility;
use crate::identity::{ use crate::identity::{
doc::{Doc, DocAt, Id}, doc::{Doc, DocAt, RepoId},
project::Project, project::Project,
Did, Did,
}; };
@ -68,7 +68,7 @@ pub fn vec<T: Eq + Arbitrary>(size: usize) -> Vec<T> {
pub fn nonempty_storage(size: usize) -> MockStorage { pub fn nonempty_storage(size: usize) -> MockStorage {
let mut storage = gen::<MockStorage>(size); let mut storage = gen::<MockStorage>(size);
for _ in 0..size { for _ in 0..size {
storage.inventory.insert(gen::<Id>(1), gen::<DocAt>(1)); storage.inventory.insert(gen::<RepoId>(1), gen::<DocAt>(1));
} }
storage storage
} }
@ -224,7 +224,7 @@ impl Arbitrary for MockStorage {
impl Arbitrary for MockRepository { impl Arbitrary for MockRepository {
fn arbitrary(g: &mut qcheck::Gen) -> Self { fn arbitrary(g: &mut qcheck::Gen) -> Self {
let rid = Id::arbitrary(g); let rid = RepoId::arbitrary(g);
let doc = Doc::<Verified>::arbitrary(g); let doc = Doc::<Verified>::arbitrary(g);
Self::new(rid, doc) Self::new(rid, doc)
@ -241,12 +241,12 @@ impl Arbitrary for storage::Remote<crypto::Verified> {
} }
} }
impl Arbitrary for Id { impl Arbitrary for RepoId {
fn arbitrary(g: &mut qcheck::Gen) -> Self { fn arbitrary(g: &mut qcheck::Gen) -> Self {
let bytes = <[u8; 20]>::arbitrary(g); let bytes = <[u8; 20]>::arbitrary(g);
let oid = git::Oid::try_from(bytes.as_slice()).unwrap(); let oid = git::Oid::try_from(bytes.as_slice()).unwrap();
Id::from(oid) RepoId::from(oid)
} }
} }

View File

@ -4,7 +4,7 @@ use std::str::FromStr;
use crate::crypto::{PublicKey, Signer, Verified}; use crate::crypto::{PublicKey, Signer, Verified};
use crate::git; use crate::git;
use crate::identity::doc::Visibility; use crate::identity::doc::Visibility;
use crate::identity::Id; use crate::identity::RepoId;
use crate::node::Alias; use crate::node::Alias;
use crate::rad; use crate::rad;
use crate::storage::git::transport; use crate::storage::git::transport;
@ -55,7 +55,7 @@ pub fn project<P: AsRef<Path>, G: Signer>(
path: P, path: P,
storage: &Storage, storage: &Storage,
signer: &G, signer: &G,
) -> Result<(Id, SignedRefs<Verified>, git2::Repository, git2::Oid), rad::InitError> { ) -> Result<(RepoId, SignedRefs<Verified>, git2::Repository, git2::Oid), rad::InitError> {
transport::local::register(storage.clone()); transport::local::register(storage.clone());
let (working, head) = repository(path); let (working, head) = repository(path);

View File

@ -6,7 +6,7 @@ use std::str::FromStr;
use git_ext::ref_format as fmt; use git_ext::ref_format as fmt;
use crate::crypto::{Signer, Verified}; use crate::crypto::{Signer, Verified};
use crate::identity::doc::{Doc, DocAt, DocError, Id}; use crate::identity::doc::{Doc, DocAt, DocError, RepoId};
use crate::node::NodeId; use crate::node::NodeId;
pub use crate::storage::*; pub use crate::storage::*;
@ -16,16 +16,16 @@ use super::fixtures;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct MockStorage { pub struct MockStorage {
pub path: PathBuf, pub path: PathBuf,
pub inventory: HashMap<Id, DocAt>, pub inventory: HashMap<RepoId, DocAt>,
pub info: git::UserInfo, pub info: git::UserInfo,
/// All refs keyed by RID. /// All refs keyed by RID.
/// Each value is a map of refs keyed by node Id (public key). /// Each value is a map of refs keyed by node Id (public key).
pub remotes: HashMap<Id, HashMap<NodeId, refs::SignedRefsAt>>, pub remotes: HashMap<RepoId, HashMap<NodeId, refs::SignedRefsAt>>,
} }
impl MockStorage { impl MockStorage {
pub fn new(inventory: Vec<(Id, DocAt)>) -> Self { pub fn new(inventory: Vec<(RepoId, DocAt)>) -> Self {
Self { Self {
path: PathBuf::default(), path: PathBuf::default(),
info: fixtures::user(), info: fixtures::user(),
@ -39,7 +39,7 @@ impl MockStorage {
} }
/// Add a remote `node` with `signed_refs` for the repo `rid`. /// Add a remote `node` with `signed_refs` for the repo `rid`.
pub fn insert_remote(&mut self, rid: Id, node: NodeId, refs: refs::SignedRefsAt) { pub fn insert_remote(&mut self, rid: RepoId, node: NodeId, refs: refs::SignedRefsAt) {
self.remotes.entry(rid).or_default().insert(node, refs); self.remotes.entry(rid).or_default().insert(node, refs);
} }
} }
@ -55,11 +55,11 @@ impl ReadStorage for MockStorage {
self.path.as_path() self.path.as_path()
} }
fn path_of(&self, rid: &Id) -> PathBuf { fn path_of(&self, rid: &RepoId) -> PathBuf {
self.path().join(rid.canonical()) self.path().join(rid.canonical())
} }
fn contains(&self, rid: &Id) -> Result<bool, RepositoryError> { fn contains(&self, rid: &RepoId) -> Result<bool, RepositoryError> {
Ok(self.inventory.contains_key(rid)) Ok(self.inventory.contains_key(rid))
} }
@ -67,7 +67,7 @@ impl ReadStorage for MockStorage {
Ok(self.inventory.keys().cloned().collect::<Vec<_>>()) Ok(self.inventory.keys().cloned().collect::<Vec<_>>())
} }
fn repository(&self, rid: Id) -> Result<Self::Repository, Error> { fn repository(&self, rid: RepoId) -> Result<Self::Repository, Error> {
let doc = self let doc = self
.inventory .inventory
.get(&rid) .get(&rid)
@ -83,7 +83,7 @@ impl ReadStorage for MockStorage {
impl WriteStorage for MockStorage { impl WriteStorage for MockStorage {
type RepositoryMut = MockRepository; type RepositoryMut = MockRepository;
fn repository_mut(&self, rid: Id) -> Result<Self::RepositoryMut, Error> { fn repository_mut(&self, rid: RepoId) -> Result<Self::RepositoryMut, Error> {
let doc = self.inventory.get(&rid).unwrap(); let doc = self.inventory.get(&rid).unwrap();
Ok(MockRepository { Ok(MockRepository {
id: rid, id: rid,
@ -92,24 +92,24 @@ impl WriteStorage for MockStorage {
}) })
} }
fn create(&self, _rid: Id) -> Result<Self::RepositoryMut, Error> { fn create(&self, _rid: RepoId) -> Result<Self::RepositoryMut, Error> {
todo!() todo!()
} }
fn clean(&self, _rid: Id) -> Result<Vec<RemoteId>, RepositoryError> { fn clean(&self, _rid: RepoId) -> Result<Vec<RemoteId>, RepositoryError> {
todo!() todo!()
} }
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct MockRepository { pub struct MockRepository {
id: Id, id: RepoId,
doc: DocAt, doc: DocAt,
remotes: HashMap<NodeId, refs::SignedRefsAt>, remotes: HashMap<NodeId, refs::SignedRefsAt>,
} }
impl MockRepository { impl MockRepository {
pub fn new(id: Id, doc: Doc<Verified>) -> Self { pub fn new(id: RepoId, doc: Doc<Verified>) -> Self {
let (blob, _) = doc.encode().unwrap(); let (blob, _) = doc.encode().unwrap();
Self { Self {
@ -157,7 +157,7 @@ impl ValidateRepository for MockRepository {
} }
impl ReadRepository for MockRepository { impl ReadRepository for MockRepository {
fn id(&self) -> Id { fn id(&self) -> RepoId {
self.id self.id
} }