From 6830a044d74a397f1ecd21adbe7c975c33d42ed4 Mon Sep 17 00:00:00 2001 From: Alexis Sellier Date: Thu, 1 Sep 2022 20:58:44 +0200 Subject: [PATCH] node: Fix repository layout Signed-off-by: Alexis Sellier --- node/src/git.rs | 2 +- node/src/storage.rs | 1 - node/src/storage/git.rs | 30 ++++++++++++------------------ node/src/test/fixtures.rs | 33 +++++++++++++++++++++++++-------- node/src/test/storage.rs | 7 ------- 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/node/src/git.rs b/node/src/git.rs index 508b8a0b..30f2878f 100644 --- a/node/src/git.rs +++ b/node/src/git.rs @@ -54,7 +54,7 @@ pub fn list_remotes(url: &Url) -> Result, ListRefsError> { pub fn parse_ref(s: &str) -> Result<(T, format::RefString), RefError> { let input = format::RefStr::try_from_str(s)?; let suffix = input - .strip_prefix(format::refname!("refs/namespaces")) + .strip_prefix(format::refname!("refs/remotes")) .ok_or_else(|| RefError::InvalidName(input.to_owned()))?; let mut components = suffix.components(); diff --git a/node/src/storage.rs b/node/src/storage.rs index af196b42..cdc8887b 100644 --- a/node/src/storage.rs +++ b/node/src/storage.rs @@ -136,7 +136,6 @@ pub trait ReadRepository { pub trait WriteRepository: ReadRepository { fn fetch(&mut self, url: &Url) -> Result<(), git2::Error>; - fn namespace(&mut self, user: &UserId) -> Result<&mut git2::Repository, git2::Error>; } impl ReadStorage for T diff --git a/node/src/storage/git.rs b/node/src/storage/git.rs index f3e24f7d..915cb4d2 100644 --- a/node/src/storage/git.rs +++ b/node/src/storage/git.rs @@ -20,9 +20,9 @@ use super::{ }; pub static RADICLE_ID_REF: Lazy = - Lazy::new(|| refspec::pattern!("refs/heads/radicle/id")); -pub static NAMESPACES_GLOB: Lazy = - Lazy::new(|| refspec::pattern!("refs/namespaces/*")); + Lazy::new(|| refspec::pattern!("heads/radicle/id")); +pub static REMOTES_GLOB: Lazy = + Lazy::new(|| refspec::pattern!("refs/remotes/*")); pub struct Storage { path: PathBuf, @@ -103,7 +103,7 @@ impl Storage { } pub struct Repository { - backend: git2::Repository, + pub(crate) backend: git2::Repository, } impl Repository { @@ -128,7 +128,7 @@ impl Repository { } pub fn find_reference(&self, remote: &UserId, name: &str) -> Result { - let name = format!("refs/namespaces/{}/{}", remote, name); + let name = format!("refs/remotes/{}/{}", remote, name); let target = self .backend .find_reference(&name)? @@ -163,7 +163,7 @@ impl ReadRepository for Repository { } fn remotes(&self) -> Result, Error> { - let refs = self.backend.references_glob(NAMESPACES_GLOB.as_str())?; + let refs = self.backend.references_glob(REMOTES_GLOB.as_str())?; let mut remotes = HashMap::default(); for r in refs { @@ -189,30 +189,24 @@ impl WriteRepository for Repository { // // Repository layout should look like this: // - // /refs/namespaces/ + // /refs/remotes/ // /heads // /master // /tags // ... // let url = url.to_string(); - let refs: &[&str] = &["refs/namespaces/*:refs/namespaces/*"]; + let refs: &[&str] = &["refs/remotes/*:refs/remotes/*"]; let mut remote = self.backend.remote_anonymous(&url)?; let mut opts = git2::FetchOptions::default(); + // TODO: Make sure we verify before pruning, as pruning may get us into + // a state we can't roll back. + opts.prune(git2::FetchPrune::On); remote.fetch(refs, Some(&mut opts), None)?; Ok(()) } - - fn namespace(&mut self, user: &UserId) -> Result<&mut git2::Repository, git2::Error> { - let path = self.backend.path(); - - self.backend = git2::Repository::open_bare(path)?; - self.backend.set_namespace(&user.to_string())?; - - Ok(&mut self.backend) - } } impl From for Repository { @@ -257,7 +251,7 @@ mod tests { let inventory = alice.inventory().unwrap(); let proj = inventory.first().unwrap(); let remotes = alice.repository(proj).unwrap().remotes().unwrap(); - let refname = "refs/heads/master"; + let refname = "heads/master"; // Have Bob fetch Alice's refs. bob.repository(proj) diff --git a/node/src/test/fixtures.rs b/node/src/test/fixtures.rs index dbf1049d..a9601a43 100644 --- a/node/src/test/fixtures.rs +++ b/node/src/test/fixtures.rs @@ -3,7 +3,7 @@ use std::path::Path; use crate::git; use crate::identity::{ProjId, UserId}; use crate::storage::git::Storage; -use crate::storage::{WriteRepository, WriteStorage}; +use crate::storage::WriteStorage; use crate::test::arbitrary; use crate::test::crypto::MockSigner; @@ -17,23 +17,40 @@ pub fn storage>(path: P) -> Storage { for proj in proj_ids.iter() { log::debug!("creating {}...", proj); - let mut repo = storage.repository(proj).unwrap(); + let repo = storage.repository(proj).unwrap(); for user in user_ids.iter() { - let repo = repo.namespace(user).unwrap(); + let repo = &repo.backend; let sig = git2::Signature::now(&user.to_string(), "anonymous@radicle.xyz").unwrap(); let head = git::initial_commit(repo, &sig).unwrap(); - log::debug!("{}: creating {}...", proj, repo.namespace().unwrap()); + log::debug!("{}: creating {}...", proj, user); - repo.reference("refs/rad/root", head.id(), false, "test") - .unwrap(); + repo.reference( + &format!("refs/remotes/{user}/heads/radicle/id"), + head.id(), + false, + "test", + ) + .unwrap(); let head = git::commit(repo, &head, "Second commit", &user.to_string()).unwrap(); - repo.branch("master", &head, false).unwrap(); + repo.reference( + &format!("refs/remotes/{user}/heads/master"), + head.id(), + false, + "test", + ) + .unwrap(); let head = git::commit(repo, &head, "Third commit", &user.to_string()).unwrap(); - repo.branch("patch/3", &head, false).unwrap(); + repo.reference( + &format!("refs/remotes/{user}/heads/patch/3"), + head.id(), + false, + "test", + ) + .unwrap(); } } storage diff --git a/node/src/test/storage.rs b/node/src/test/storage.rs index ae5b51c9..9920865a 100644 --- a/node/src/test/storage.rs +++ b/node/src/test/storage.rs @@ -82,11 +82,4 @@ impl WriteRepository for MockRepository { fn fetch(&mut self, _url: &Url) -> Result<(), git2::Error> { Ok(()) } - - fn namespace( - &mut self, - _user: &crate::identity::UserId, - ) -> Result<&mut git2::Repository, git2::Error> { - todo!() - } }