lib: split out RepoCheckoutFilter

This commit is contained in:
Felix Krull 2019-06-12 20:10:11 +02:00 committed by Colin Walters
parent 6776c819f1
commit 94b524b21f
2 changed files with 29 additions and 19 deletions

View File

@ -1,4 +1,5 @@
use glib::translate::{FromGlibPtrNone, Stash, ToGlib, ToGlibPtr};
use self::repo_checkout_filter::filter_trampoline;
use glib::translate::{Stash, ToGlib, ToGlibPtr};
use glib_sys::gpointer;
use libc::c_char;
use ostree_sys::{OstreeRepo, OstreeRepoCheckoutAtOptions, OstreeRepoCheckoutFilterResult};
@ -7,8 +8,9 @@ use {Repo, RepoCheckoutFilterResult};
use {RepoCheckoutMode, RepoCheckoutOverwriteMode};
use {RepoDevInoCache, SePolicy};
pub type RepoCheckoutFilter =
Option<Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>>;
mod repo_checkout_filter;
pub use self::repo_checkout_filter::RepoCheckoutFilter;
pub struct RepoCheckoutAtOptions {
pub mode: RepoCheckoutMode,
@ -22,7 +24,6 @@ pub struct RepoCheckoutAtOptions {
pub force_copy_zerosized: bool,
pub subpath: Option<PathBuf>,
pub devino_to_csum_cache: Option<RepoDevInoCache>,
// TODO: might be interesting to turn this into a type parameter
pub filter: RepoCheckoutFilter,
pub sepolicy: Option<SePolicy>,
pub sepolicy_prefix: Option<String>,
@ -51,21 +52,6 @@ impl Default for RepoCheckoutAtOptions {
type StringStash<'a, T> = Stash<'a, *const c_char, Option<T>>;
unsafe extern "C" fn filter_trampoline(
repo: *mut OstreeRepo,
path: *const c_char,
stat: *mut libc::stat,
user_data: gpointer,
) -> OstreeRepoCheckoutFilterResult {
// TODO: handle unwinding
let closure =
user_data as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
let repo = FromGlibPtrNone::from_glib_none(repo);
let path: PathBuf = FromGlibPtrNone::from_glib_none(path);
let result = (*closure)(&repo, &path, &*stat);
result.to_glib()
}
impl<'a> ToGlibPtr<'a, *const OstreeRepoCheckoutAtOptions> for RepoCheckoutAtOptions {
type Storage = (
Box<OstreeRepoCheckoutAtOptions>,

View File

@ -0,0 +1,24 @@
use crate::{Repo, RepoCheckoutFilterResult};
use glib::translate::{FromGlibPtrNone, ToGlib};
use glib_sys::gpointer;
use libc::c_char;
use ostree_sys::{OstreeRepo, OstreeRepoCheckoutFilterResult};
use std::path::{Path, PathBuf};
pub type RepoCheckoutFilter =
Option<Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>>;
pub(super) unsafe extern "C" fn filter_trampoline(
repo: *mut OstreeRepo,
path: *const c_char,
stat: *mut libc::stat,
user_data: gpointer,
) -> OstreeRepoCheckoutFilterResult {
// TODO: handle unwinding
let closure =
user_data as *const Box<dyn Fn(&Repo, &Path, &libc::stat) -> RepoCheckoutFilterResult>;
let repo = FromGlibPtrNone::from_glib_none(repo);
let path: PathBuf = FromGlibPtrNone::from_glib_none(path);
let result = (*closure)(&repo, &path, &*stat);
result.to_glib()
}