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

View File

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