use std::ffi::CString;
use std::ptr;
use crate::string_array::StringArray;
use crate::util::Binding;
use crate::{raw, Buf, ConfigLevel, Error, IntoCString};
pub unsafe fn set_search_path<P>(level: ConfigLevel, path: P) -> Result<(), Error>
where
P: IntoCString,
{
crate::init();
try_call!(raw::git_libgit2_opts(
raw::GIT_OPT_SET_SEARCH_PATH as libc::c_int,
level as libc::c_int,
path.into_c_string()?.as_ptr()
));
Ok(())
}
pub unsafe fn reset_search_path(level: ConfigLevel) -> Result<(), Error> {
crate::init();
try_call!(raw::git_libgit2_opts(
raw::GIT_OPT_SET_SEARCH_PATH as libc::c_int,
level as libc::c_int,
core::ptr::null::<u8>()
));
Ok(())
}
pub unsafe fn get_search_path(level: ConfigLevel) -> Result<CString, Error> {
crate::init();
let buf = Buf::new();
try_call!(raw::git_libgit2_opts(
raw::GIT_OPT_GET_SEARCH_PATH as libc::c_int,
level as libc::c_int,
buf.raw() as *const _
));
buf.into_c_string()
}
pub fn enable_caching(enabled: bool) {
crate::init();
let error = unsafe {
raw::git_libgit2_opts(
raw::GIT_OPT_ENABLE_CACHING as libc::c_int,
enabled as libc::c_int,
)
};
debug_assert!(error >= 0);
}
pub fn strict_object_creation(enabled: bool) {
crate::init();
let error = unsafe {
raw::git_libgit2_opts(
raw::GIT_OPT_ENABLE_STRICT_OBJECT_CREATION as libc::c_int,
enabled as libc::c_int,
)
};
debug_assert!(error >= 0);
}
pub fn strict_hash_verification(enabled: bool) {
crate::init();
let error = unsafe {
raw::git_libgit2_opts(
raw::GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION as libc::c_int,
enabled as libc::c_int,
)
};
debug_assert!(error >= 0);
}
pub unsafe fn get_extensions() -> Result<StringArray, Error> {
crate::init();
let mut extensions = raw::git_strarray {
strings: ptr::null_mut(),
count: 0,
};
try_call!(raw::git_libgit2_opts(
raw::GIT_OPT_GET_EXTENSIONS as libc::c_int,
&mut extensions
));
Ok(StringArray::from_raw(extensions))
}
pub unsafe fn set_extensions<E>(extensions: &[E]) -> Result<(), Error>
where
for<'x> &'x E: IntoCString,
{
crate::init();
let extensions = extensions
.iter()
.map(|e| e.into_c_string())
.collect::<Result<Vec<_>, _>>()?;
let extension_ptrs = extensions.iter().map(|e| e.as_ptr()).collect::<Vec<_>>();
try_call!(raw::git_libgit2_opts(
raw::GIT_OPT_SET_EXTENSIONS as libc::c_int,
extension_ptrs.as_ptr(),
extension_ptrs.len() as libc::size_t
));
Ok(())
}
pub unsafe fn set_verify_owner_validation(enabled: bool) -> Result<(), Error> {
crate::init();
let error = raw::git_libgit2_opts(
raw::GIT_OPT_SET_OWNER_VALIDATION as libc::c_int,
enabled as libc::c_int,
);
debug_assert!(error >= 0);
Ok(())
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn smoke() {
strict_hash_verification(false);
}
}