lib: add repo_checkout_filter function for better ergonomics
This commit is contained in:
parent
903bd86e52
commit
e39f8d7461
|
|
@ -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()),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
Loading…
Reference in New Issue