diff --git a/libgit2-sys/lib.rs b/libgit2-sys/lib.rs index 16516197a3..9ab6c49d2d 100644 --- a/libgit2-sys/lib.rs +++ b/libgit2-sys/lib.rs @@ -2740,6 +2740,7 @@ extern "C" { force: c_int, ) -> c_int; pub fn git_branch_name(out: *mut *const c_char, branch: *const git_reference) -> c_int; + pub fn git_branch_name_is_valid(valid: *mut c_int, name: *const c_char) -> c_int; pub fn git_branch_remote_name( out: *mut git_buf, repo: *mut git_repository, diff --git a/src/branch.rs b/src/branch.rs index 276bc534ac..0e9c0239b2 100644 --- a/src/branch.rs +++ b/src/branch.rs @@ -28,6 +28,16 @@ impl<'repo> Branch<'repo> { Branch { inner: reference } } + /// Ensure the branch name is well-formed. + pub fn name_is_valid(name: &str) -> Result { + let name = CString::new(name)?; + let mut valid: libc::c_int = 0; + unsafe { + try_call!(raw::git_branch_name_is_valid(&mut valid, name.as_ptr())); + } + Ok(valid == 1) + } + /// Gain access to the reference that is this branch pub fn get(&self) -> &Reference<'repo> { &self.inner @@ -151,7 +161,7 @@ impl<'repo> Drop for Branches<'repo> { #[cfg(test)] mod tests { - use crate::BranchType; + use crate::{Branch, BranchType}; #[test] fn smoke() { @@ -175,4 +185,12 @@ mod tests { b1.delete().unwrap(); } + + #[test] + fn name_is_valid() { + assert!(Branch::name_is_valid("foo").unwrap()); + assert!(!Branch::name_is_valid("").unwrap()); + assert!(!Branch::name_is_valid("with spaces").unwrap()); + assert!(!Branch::name_is_valid("~tilde").unwrap()); + } }