mirror of
https://seed.radicle.dev/rad:z6cFWeWpnZNHh9rUW8phgA3b5yGt.git
synced 2026-10-18 19:10:31 +08:00
ref-format: improve Qualified/NamespacedPattern API
Some elements of the `QaulifiedPattern` and `NamespacedPattern` API were missing: - `From` implementations - `Display` implementations - `Serialize` and `Deserialize` implementations - `qualified_pattern` macro This also requires bumping versions: - `git-ref-format`: 0.3.1 - `git-ref-core`: 0.3.1 - `git-ref-format-macro`: 0.3.1 - `radicle-git-ext`: 0.8.1 - `radicle-surf`: 0.22.1 Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com> X-Clacks-Overhead: GNU Terry Pratchett
This commit is contained in:
Generated
+5
-5
@@ -260,7 +260,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "git-ref-format"
|
name = "git-ref-format"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"git-ref-format-core",
|
"git-ref-format-core",
|
||||||
"git-ref-format-macro",
|
"git-ref-format-macro",
|
||||||
@@ -268,7 +268,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "git-ref-format-core"
|
name = "git-ref-format-core"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bstr",
|
"bstr",
|
||||||
"minicbor",
|
"minicbor",
|
||||||
@@ -279,7 +279,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "git-ref-format-macro"
|
name = "git-ref-format-macro"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"git-ref-format-core",
|
"git-ref-format-core",
|
||||||
"proc-macro-error",
|
"proc-macro-error",
|
||||||
@@ -641,7 +641,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "radicle-git-ext"
|
name = "radicle-git-ext"
|
||||||
version = "0.8.0"
|
version = "0.8.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"git-ref-format",
|
"git-ref-format",
|
||||||
"git2",
|
"git2",
|
||||||
@@ -671,7 +671,7 @@ version = "0.1.0"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "radicle-surf"
|
name = "radicle-surf"
|
||||||
version = "0.22.0"
|
version = "0.22.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "radicle-git-ext"
|
name = "radicle-git-ext"
|
||||||
version = "0.8.0"
|
version = "0.8.1"
|
||||||
authors = [
|
authors = [
|
||||||
"Alexis Sellier <alexis@radicle.xyz>",
|
"Alexis Sellier <alexis@radicle.xyz>",
|
||||||
"Kim Altintop <kim@eagain.st>",
|
"Kim Altintop <kim@eagain.st>",
|
||||||
@@ -31,7 +31,7 @@ default-features = false
|
|||||||
features = ["vendored-libgit2"]
|
features = ["vendored-libgit2"]
|
||||||
|
|
||||||
[dependencies.git-ref-format]
|
[dependencies.git-ref-format]
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
path = "./git-ref-format"
|
path = "./git-ref-format"
|
||||||
features = ["macro", "serde"]
|
features = ["macro", "serde"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "git-ref-format"
|
name = "git-ref-format"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
authors = [
|
authors = [
|
||||||
"Kim Altintop <kim@eagain.st>",
|
"Kim Altintop <kim@eagain.st>",
|
||||||
"Fintan Halpenny <fintan.halpenny@gmail.com>",
|
"Fintan Halpenny <fintan.halpenny@gmail.com>",
|
||||||
@@ -22,10 +22,10 @@ percent-encoding = ["git-ref-format-core/percent-encoding"]
|
|||||||
serde = ["git-ref-format-core/serde"]
|
serde = ["git-ref-format-core/serde"]
|
||||||
|
|
||||||
[dependencies.git-ref-format-core]
|
[dependencies.git-ref-format-core]
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
path = "./core"
|
path = "./core"
|
||||||
|
|
||||||
[dependencies.git-ref-format-macro]
|
[dependencies.git-ref-format-macro]
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
path = "./macro"
|
path = "./macro"
|
||||||
optional = true
|
optional = true
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "git-ref-format-core"
|
name = "git-ref-format-core"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
authors = ["Kim Altintop <kim@eagain.st>"]
|
authors = ["Kim Altintop <kim@eagain.st>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ use std::{
|
|||||||
|
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
use crate::{check, lit, RefStr, RefString};
|
use crate::{check, lit, Namespaced, Qualified, RefStr, RefString};
|
||||||
|
|
||||||
mod iter;
|
mod iter;
|
||||||
pub use iter::{component, Component, Components, Iter};
|
pub use iter::{component, Component, Components, Iter};
|
||||||
@@ -430,6 +430,20 @@ impl AsRef<Self> for QualifiedPattern<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Display for QualifiedPattern<'_> {
|
||||||
|
#[inline]
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
self.0.fmt(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> From<Qualified<'a>> for QualifiedPattern<'a> {
|
||||||
|
#[inline]
|
||||||
|
fn from(q: Qualified<'a>) -> Self {
|
||||||
|
Self(Cow::Owned(q.into_refstring().into()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> From<QualifiedPattern<'a>> for Cow<'a, PatternStr> {
|
impl<'a> From<QualifiedPattern<'a>> for Cow<'a, PatternStr> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from(q: QualifiedPattern<'a>) -> Self {
|
fn from(q: QualifiedPattern<'a>) -> Self {
|
||||||
@@ -534,6 +548,13 @@ impl Borrow<PatternStr> for NamespacedPattern<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a> From<Namespaced<'a>> for NamespacedPattern<'a> {
|
||||||
|
#[inline]
|
||||||
|
fn from(ns: Namespaced<'a>) -> Self {
|
||||||
|
NamespacedPattern(Cow::Owned(ns.to_ref_string().into()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> From<NamespacedPattern<'a>> for QualifiedPattern<'a> {
|
impl<'a> From<NamespacedPattern<'a>> for QualifiedPattern<'a> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn from(ns: NamespacedPattern<'a>) -> Self {
|
fn from(ns: NamespacedPattern<'a>) -> Self {
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
|
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
use ::serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
refspec::{PatternStr, PatternString},
|
refspec::{NamespacedPattern, PatternStr, PatternString, QualifiedPattern},
|
||||||
Namespaced, Qualified, RefStr, RefString,
|
Namespaced, Qualified, RefStr, RefString,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -145,3 +145,51 @@ impl Serialize for Namespaced<'_> {
|
|||||||
serializer.serialize_str(self.as_str())
|
serializer.serialize_str(self.as_str())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for QualifiedPattern<'_> {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
Deserialize::deserialize(deserializer).and_then(|s: String| {
|
||||||
|
let s = PatternString::try_from(s).map_err(de::Error::custom)?;
|
||||||
|
s.qualified()
|
||||||
|
.ok_or_else(|| de::Error::custom("not a qualified ref"))
|
||||||
|
.map(|q| q.into_owned())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serialize for QualifiedPattern<'_> {
|
||||||
|
#[inline]
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
serializer.serialize_str(self.as_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for NamespacedPattern<'_> {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
Deserialize::deserialize(deserializer).and_then(|s: String| {
|
||||||
|
let s = PatternString::try_from(s).map_err(de::Error::custom)?;
|
||||||
|
s.to_namespaced()
|
||||||
|
.ok_or_else(|| de::Error::custom("not a qualified ref"))
|
||||||
|
.map(|q| q.into_owned())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serialize for NamespacedPattern<'_> {
|
||||||
|
#[inline]
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
serializer.serialize_str(self.as_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "git-ref-format-macro"
|
name = "git-ref-format-macro"
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
authors = ["Kim Altintop <kim@eagain.st>"]
|
authors = ["Kim Altintop <kim@eagain.st>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
@@ -18,5 +18,5 @@ quote = "1"
|
|||||||
syn = "2"
|
syn = "2"
|
||||||
|
|
||||||
[dependencies.git-ref-format-core]
|
[dependencies.git-ref-format-core]
|
||||||
version = "0.3.0"
|
version = "0.3.1"
|
||||||
path = "../core"
|
path = "../core"
|
||||||
|
|||||||
@@ -166,3 +166,35 @@ pub fn pattern(input: TokenStream) -> TokenStream {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a [`git_ref_format_core::refspec::QualifiedPattern`] from a string
|
||||||
|
/// literal.
|
||||||
|
///
|
||||||
|
/// The string is validated at compile time, and an unsafe conversion is
|
||||||
|
/// emitted.
|
||||||
|
#[proc_macro_error]
|
||||||
|
#[proc_macro]
|
||||||
|
pub fn qualified_pattern(input: TokenStream) -> TokenStream {
|
||||||
|
let lit = parse_macro_input!(input as LitStr);
|
||||||
|
let val = lit.value();
|
||||||
|
|
||||||
|
let parsed: Result<&PatternStr, Error> = val.as_str().try_into();
|
||||||
|
match parsed {
|
||||||
|
Ok(safe) => {
|
||||||
|
let safe: &str = safe.as_str();
|
||||||
|
let expand = quote! {
|
||||||
|
unsafe {
|
||||||
|
use ::std::mem::transmute;
|
||||||
|
use ::radicle_git_ext::ref_format::refspec::QualifiedPattern;
|
||||||
|
|
||||||
|
transmute::<_, QualifiedPattern>(#safe.to_owned())
|
||||||
|
}
|
||||||
|
};
|
||||||
|
TokenStream::from(expand)
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(e) => {
|
||||||
|
abort!(lit.span(), "invalid refspec pattern literal: {}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -145,4 +145,7 @@ pub mod refspec {
|
|||||||
|
|
||||||
#[cfg(any(feature = "macro", feature = "git-ref-format-macro"))]
|
#[cfg(any(feature = "macro", feature = "git-ref-format-macro"))]
|
||||||
pub use git_ref_format_macro::pattern;
|
pub use git_ref_format_macro::pattern;
|
||||||
|
|
||||||
|
#[cfg(any(feature = "macro", feature = "git-ref-format-macro"))]
|
||||||
|
pub use git_ref_format_macro::qualified_pattern;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
name = "radicle-surf"
|
name = "radicle-surf"
|
||||||
description = "A code surfing library for Git repositories"
|
description = "A code surfing library for Git repositories"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
version = "0.22.0"
|
version = "0.22.1"
|
||||||
authors = ["The Radicle Team <dev@radicle.xyz>"]
|
authors = ["The Radicle Team <dev@radicle.xyz>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
homepage = "https://github.com/radicle-dev/radicle-git/blob/main/radicle-surf/README.md"
|
homepage = "https://github.com/radicle-dev/radicle-git/blob/main/radicle-surf/README.md"
|
||||||
@@ -41,7 +41,7 @@ default-features = false
|
|||||||
features = ["vendored-libgit2"]
|
features = ["vendored-libgit2"]
|
||||||
|
|
||||||
[dependencies.radicle-git-ext]
|
[dependencies.radicle-git-ext]
|
||||||
version = "0.8.0"
|
version = "0.8.1"
|
||||||
path = "../radicle-git-ext"
|
path = "../radicle-git-ext"
|
||||||
features = ["serde"]
|
features = ["serde"]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user