Radish alpha
h
Radicle Heartwood Protocol & Stack
Radicle
Git (anonymous pull)
Log in to clone via SSH
radicle: Accept `<transport>::rad://` URL convention
✗ CI failure Yorgos Saslis committed 1 month ago
commit 6c4656b4f3755fff7ff9468629c0158333ce1736
parent 22b2871f64ecf34a22d32add0dd59a0c7c96ad10
1 failed (1 total) View logs
1 file changed +27 -1
modified crates/radicle/src/storage/git/transport/local/url.rs
@@ -18,7 +18,7 @@ pub enum UrlError {
    #[error("invalid url format: expected `rad://<repo>[/<namespace>]`")]
    InvalidFormat,
    /// Unsupported URL scheme.
-
    #[error("unsupported scheme: expected `rad://`")]
+
    #[error("unsupported scheme: expected `rad://` or `<transport>::rad://`")]
    UnsupportedScheme,
    /// Invalid repository identifier.
    #[error("repo: {0}")]
@@ -79,6 +79,11 @@ impl FromStr for Url {
    fn from_str(s: &str) -> Result<Self, Self::Err> {
        let rest = s
            .strip_prefix("rad://")
+
            .or_else(|| {
+
                s.rsplit_once("::rad://")
+
                    .filter(|(prefix, _)| !prefix.is_empty())
+
                    .map(|(_, rest)| rest)
+
            })
            .ok_or(UrlError::UnsupportedScheme)?;
        let components = rest.split('/').collect::<Vec<_>>();

@@ -123,6 +128,27 @@ mod test {
        assert_eq!(url.repo, repo);
        assert_eq!(url.namespace, Some(namespace));

+
        // <transport>::rad:// (gitremote-helpers(7) convention)
+
        let url = format!("age::rad://{}", repo.canonical());
+
        let url = Url::from_str(&url).unwrap();
+

+
        assert_eq!(url.repo, repo);
+
        assert_eq!(url.namespace, None);
+

+
        let url = format!("age::rad://{}/{namespace}", repo.canonical());
+
        let url = Url::from_str(&url).unwrap();
+

+
        assert_eq!(url.repo, repo);
+
        assert_eq!(url.namespace, Some(namespace));
+

+
        // Negative cases for <transport>::rad:// convention.
+
        assert!(format!("::rad://{}", repo.canonical()).parse::<Url>().is_err());
+
        assert!(
+
            format!("age::heartwood://{}", repo.canonical())
+
                .parse::<Url>()
+
                .is_err()
+
        );
+

        assert!(
            format!("heartwood://{}", repo.canonical())
                .parse::<Url>()