Skip to content

Commit

Permalink
[ref #152] all tests and impl for refname expansion
Browse files Browse the repository at this point in the history
  • Loading branch information
Byron committed Aug 9, 2021
1 parent 431dd86 commit 9cef2f2
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 9 deletions.
16 changes: 14 additions & 2 deletions git-ref/src/namespace.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
#![allow(missing_docs)]

use crate::PartialName;
use bstr::{BString, ByteSlice, ByteVec};
use std::convert::TryInto;

pub fn expand<'a, Name, E>(namespace: Name) -> Result<crate::mutable::FullName, expand::Error>
where
Name: TryInto<PartialName<'a>, Error = E>,
expand::Error: From<E>,
{
let _namespace = namespace.try_into()?;
todo!("impl")
let namespace = namespace.try_into()?.0;
let mut out = BString::default();
for component in namespace.split_str(b"/") {
out.push_str("refs/namespaces/");
out.push_str(component);
out.push_str(b"/");
}
out.pop();
debug_assert!(
git_validate::reference::name(out.as_ref()).is_ok(),
"we always produce valid ref names"
);
Ok(crate::mutable::FullName(out))
}

pub mod expand {
Expand Down
40 changes: 34 additions & 6 deletions git-ref/tests/namespace/mod.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,31 @@
mod expand {
od expand {
#[test]
fn each_component_expands_to_the_namespace_prefix_individually() {
assert_eq!(
git_ref::namespace::expand("foo/bar").unwrap().as_bstr(),
"refs/namespaces/foo/refs/namespaces/bar/"
"refs/namespaces/foo/refs/namespaces/bar"
)
}

#[test]
#[ignore]
fn only_backslashes_are_valid_component_separators() {}
fn backslashes_are_no_component_separators_and_invalid() {
assert!(matches!(
git_ref::namespace::expand("foo\\bar").expect_err("empty invalid"),
git_ref::namespace::expand::Error::RefnameValidation(git_validate::refname::Error::Tag(
git_validate::tag::name::Error::InvalidByte(byte)
))if byte == "\\"
));
}

#[test]
#[ignore]
fn trailing_slashes_do_nothing() {}
fn trailing_slashes_are_not_allowed() {
assert!(matches!(
git_ref::namespace::expand("foo/").expect_err("empty invalid"),
git_ref::namespace::expand::Error::RefnameValidation(git_validate::refname::Error::Tag(
git_validate::tag::name::Error::EndsWithSlash
))
));
}

#[test]
fn empty_namespaces_are_not_allowed() {
Expand All @@ -24,4 +36,20 @@ mod expand {
))
));
}
#[test]
fn bare_slashes_are_not_allowed() {
assert!(matches!(
git_ref::namespace::expand("/").expect_err("empty invalid"),
git_ref::namespace::expand::Error::RefnameValidation(git_validate::refname::Error::Tag(
git_validate::tag::name::Error::EndsWithSlash
))
));
}
#[test]
fn repeated_slashes_are_invalid() {
assert!(matches!(
git_ref::namespace::expand("foo//bar").expect_err("empty invalid"),
git_ref::namespace::expand::Error::RefnameValidation(git_validate::refname::Error::RepeatedSlash)
));
}
}
2 changes: 1 addition & 1 deletion git-validate/src/tag.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ pub fn name(bytes: &BStr) -> Result<&BStr, name::Error> {
for byte in bytes.iter() {
match byte {
b'\\' | b'^' | b':' | b'[' | b'?' | b' ' | b'~' | b'\0'..=b'\x1F' | b'\x7F' => {
return Err(name::Error::InvalidByte(bytes.into()))
return Err(name::Error::InvalidByte((&[*byte][..]).into()))
}
b'*' => return Err(name::Error::Asterisk),
b'.' if previous == b'.' => return Err(name::Error::DoubleDot),
Expand Down

0 comments on commit 9cef2f2

Please sign in to comment.