lib: add repo_checkout_filter function for better ergonomics

This commit is contained in:
Felix Krull 2019-06-12 20:38:46 +02:00 committed by Colin Walters
parent 903bd86e52
commit e39f8d7461
3 changed files with 16 additions and 13 deletions

View File

@ -1,15 +1,13 @@
use crate::{RepoCheckoutMode, RepoCheckoutOverwriteMode, RepoDevInoCache, SePolicy};
use glib::translate::{Stash, ToGlib, ToGlibPtr};
use glib_sys::gpointer;
use libc::c_char;
use ostree_sys::OstreeRepoCheckoutAtOptions;
use std::path::{Path, PathBuf};
use {Repo, RepoCheckoutFilterResult};
use {RepoCheckoutMode, RepoCheckoutOverwriteMode};
use {RepoDevInoCache, SePolicy};
use std::path::PathBuf;
mod repo_checkout_filter;
pub use self::repo_checkout_filter::RepoCheckoutFilter;
pub use self::repo_checkout_filter::{repo_checkout_filter, RepoCheckoutFilter};
pub struct RepoCheckoutAtOptions {
pub mode: RepoCheckoutMode,
@ -91,6 +89,7 @@ impl<'a> ToGlibPtr<'a, *const OstreeRepoCheckoutAtOptions> for RepoCheckoutAtOpt
#[cfg(test)]
mod tests {
use super::*;
use crate::RepoCheckoutFilterResult;
use gio::{File, NONE_CANCELLABLE};
use glib_sys::{gpointer, GFALSE, GTRUE};
use ostree_sys::{
@ -141,9 +140,7 @@ mod tests {
force_copy_zerosized: true,
subpath: Some("sub/path".into()),
devino_to_csum_cache: Some(RepoDevInoCache::new()),
filter: Some(Box::new(|_repo, _path, _stat| {
RepoCheckoutFilterResult::Skip
})),
filter: repo_checkout_filter(|_repo, _path, _stat| RepoCheckoutFilterResult::Skip),
sepolicy: Some(SePolicy::new(&File::new_for_path("a/b"), NONE_CANCELLABLE).unwrap()),
sepolicy_prefix: Some("prefix".into()),
};

View File

@ -7,6 +7,14 @@ use std::path::{Path, PathBuf};
pub type RepoCheckoutFilter = Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
pub fn repo_checkout_filter<F>(closure: F) -> Option<RepoCheckoutFilter>
where
F: 'static,
F: Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult,
{
Some(Box::new(closure))
}
unsafe extern "C" fn filter_trampoline(
repo: *mut OstreeRepo,
path: *const c_char,

View File

@ -62,9 +62,7 @@ fn should_checkout_at_with_options() {
force_copy: true,
force_copy_zerosized: true,
devino_to_csum_cache: Some(RepoDevInoCache::new()),
filter: Some(Box::new(|_repo, _path, _stat| {
RepoCheckoutFilterResult::Allow
})),
filter: repo_checkout_filter(|_repo, _path, _stat| RepoCheckoutFilterResult::Allow),
..Default::default()
}),
dirfd.as_raw_fd(),
@ -88,13 +86,13 @@ fn should_checkout_at_with_filter() {
.repo
.checkout_at(
Some(&RepoCheckoutAtOptions {
filter: Some(Box::new(|_repo, path, _stat| {
filter: repo_checkout_filter(|_repo, path, _stat| {
if let Some("testfile") = path.file_name().map(|s| s.to_str().unwrap()) {
RepoCheckoutFilterResult::Skip
} else {
RepoCheckoutFilterResult::Allow
}
})),
}),
..Default::default()
}),
dirfd.as_raw_fd(),