Various fixes to COBs

* Use the existing conventions for passing a signer to functions.
* Allow replacing git refs when updating cobs.
* Fix the parsing of a cob id.

Signed-off-by: Alexis Sellier <alexis@radicle.xyz>
This commit is contained in:
Alexis Sellier 2022-11-13 17:41:43 +01:00
parent 80401f89ae
commit 08811b4b87
No known key found for this signature in database
7 changed files with 44 additions and 27 deletions

View File

@ -48,19 +48,19 @@ impl<Author> Create<Author> {
///
/// The `args` are the metadata for this [`CollaborativeObject`]. See
/// [`Create`] for further information.
pub fn create<S, Signer, Author, Resource>(
pub fn create<S, G, Author, Resource>(
storage: &S,
signer: Signer,
signer: &G,
resource: &Resource,
identifier: &S::Identifier,
args: Create<Author>,
) -> Result<CollaborativeObject, error::Create>
where
S: Store,
G: crypto::Signer,
Author: Identity,
Author::Identifier: Clone + PartialEq,
Resource: Identity,
Signer: crypto::Signer,
{
let Create {
author,
@ -81,7 +81,7 @@ where
};
let init_change = storage
.create(content, resource.content_id(), &signer, args.create_spec())
.create(content, resource.content_id(), signer, args.create_spec())
.map_err(error::Create::from)?;
let history = History::new_from_root(

View File

@ -42,19 +42,19 @@ pub struct Update<Author> {
///
/// The `args` are the metadata for this [`CollaborativeObject`]
/// udpate. See [`Update`] for further information.
pub fn update<S, Signer, Resource, Author>(
pub fn update<S, G, Resource, Author>(
storage: &S,
signer: Signer,
signer: &G,
resource: &Resource,
identifier: &S::Identifier,
args: Update<Author>,
) -> Result<CollaborativeObject, error::Update>
where
S: Store,
G: crypto::Signer,
Author: Identity,
Author::Identifier: Clone + PartialEq,
Resource: Identity,
Signer: crypto::Signer,
{
let Update {
author,
@ -86,7 +86,7 @@ where
let change = storage.create(
content,
resource.content_id(),
&signer,
signer,
change::Create {
tips: object.tips().iter().cloned().collect(),
contents: changes.clone(),

View File

@ -22,7 +22,7 @@ fn roundtrip() {
let typename = "xyz.rad.issue".parse::<TypeName>().unwrap();
let cob = create(
&storage,
signer,
&signer,
&proj,
&proj.identifier(),
Create {
@ -54,7 +54,7 @@ fn list_cobs() {
let typename = "xyz.rad.issue".parse::<TypeName>().unwrap();
let issue_1 = create(
&storage,
signer.clone(),
&signer,
&proj,
&proj.identifier(),
Create {
@ -68,7 +68,7 @@ fn list_cobs() {
let issue_2 = create(
&storage,
signer,
&signer,
&proj,
&proj.identifier(),
Create {
@ -103,7 +103,7 @@ fn update_cob() {
let typename = "xyz.rad.issue".parse::<TypeName>().unwrap();
let cob = create(
&storage,
signer.clone(),
&signer,
&proj,
&proj.identifier(),
Create {
@ -121,7 +121,7 @@ fn update_cob() {
let updated = update(
&storage,
signer,
&signer,
&proj,
&proj.identifier(),
Update {
@ -161,7 +161,7 @@ fn traverse_cobs() {
let typename = "xyz.rad.issue".parse::<TypeName>().unwrap();
let cob = create(
&storage,
terry_signer,
&terry_signer,
&terry_proj,
&terry_proj.identifier(),
Create {
@ -183,7 +183,7 @@ fn traverse_cobs() {
let updated = update(
&storage,
neil_signer,
&neil_signer,
&neil_proj,
&neil_proj.identifier(),
Update {

View File

@ -5,8 +5,11 @@ pub use cob::{
use radicle_cob as cob;
use radicle_git_ext::Oid;
pub use radicle_cob::*;
use crate::{
identity::{project::Identity, Did},
node::NodeId,
storage::git::Repository,
};
@ -21,6 +24,20 @@ pub struct Author {
did: Did,
}
impl From<Did> for Author {
fn from(did: Did) -> Self {
Self { did }
}
}
impl From<NodeId> for Author {
fn from(node_id: NodeId) -> Self {
Self {
did: Did::from(node_id),
}
}
}
impl identity::Identity for Author {
type Identifier = String;
@ -47,14 +64,14 @@ impl identity::Identity for Author {
///
/// The `args` are the metadata for this [`CollaborativeObject`]
/// udpate. See [`Update`] for further information.
pub fn create<S>(
pub fn create<G>(
repository: &Repository,
signer: S,
signer: &G,
project: &Identity<Oid>,
args: Create<Author>,
) -> Result<CollaborativeObject, error::Create>
where
S: crypto::Signer,
G: crypto::Signer,
{
let namespace = *signer.public_key();
cob::create(repository, signer, project, &namespace, args)
@ -103,14 +120,14 @@ pub fn list(
///
/// The `args` are the metadata for this [`CollaborativeObject`]
/// udpate. See [`Update`] for further information.
pub fn update<S>(
pub fn update<G>(
repository: &Repository,
signer: S,
signer: &G,
project: &Identity<Oid>,
args: Update<Author>,
) -> Result<CollaborativeObject, error::Update>
where
S: crypto::Signer,
G: crypto::Signer,
{
let namespace = *signer.public_key();
cob::update(repository, signer, project, &namespace, args)

View File

@ -151,9 +151,9 @@ pub mod refs {
let (_refs, _cobs, typename, mut object_id) = cob.non_empty_components();
let object_id = object_id
.next()
.and_then(|oid| oid.parse::<cob::ObjectId>().ok())?;
.and_then(|oid| oid.parse::<git2::Oid>().ok())?;
let typename = typename.parse::<cob::TypeName>().ok()?;
Some((typename, object_id))
Some((typename, object_id.into()))
}
}

View File

@ -25,9 +25,9 @@ pub use storage::git::Storage;
pub mod prelude {
use super::*;
pub use crypto::{Signer, Verified};
pub use identity::{Doc, Id};
pub use crypto::{PublicKey, Signer, Verified};
pub use identity::{Did, Doc, Id};
pub use node::NodeId;
pub use profile::Profile;
pub use storage::BranchName;
pub use storage::{BranchName, ReadRepository, ReadStorage, WriteRepository, WriteStorage};
}

View File

@ -771,7 +771,7 @@ impl cob::object::Storage for Repository {
self.backend.reference(
git::refs::storage::cob(identifier, typename, object_id).as_str(),
(*change.id()).into(),
false,
true,
&format!(
"Updating collaborative object '{}/{}' with new change {}",
typename,