From e39f8d7461c672f5ddc5dfd030dd9d6bbe805ba6 Mon Sep 17 00:00:00 2001 From: Felix Krull Date: Wed, 12 Jun 2019 20:38:46 +0200 Subject: [PATCH] lib: add repo_checkout_filter function for better ergonomics --- rust-bindings/rust/src/repo_checkout_at_options.rs | 13 +++++-------- .../repo_checkout_filter.rs | 8 ++++++++ rust-bindings/rust/tests/repo/checkout_at.rs | 8 +++----- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/rust-bindings/rust/src/repo_checkout_at_options.rs b/rust-bindings/rust/src/repo_checkout_at_options.rs index 954a19fd..4d345d22 100644 --- a/rust-bindings/rust/src/repo_checkout_at_options.rs +++ b/rust-bindings/rust/src/repo_checkout_at_options.rs @@ -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()), }; diff --git a/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs b/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs index e74016ad..c4caac4b 100644 --- a/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs +++ b/rust-bindings/rust/src/repo_checkout_at_options/repo_checkout_filter.rs @@ -7,6 +7,14 @@ use std::path::{Path, PathBuf}; pub type RepoCheckoutFilter = Box RepoCheckoutFilterResult>; +pub fn repo_checkout_filter(closure: F) -> Option +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, diff --git a/rust-bindings/rust/tests/repo/checkout_at.rs b/rust-bindings/rust/tests/repo/checkout_at.rs index 27e4c97c..f0476f09 100644 --- a/rust-bindings/rust/tests/repo/checkout_at.rs +++ b/rust-bindings/rust/tests/repo/checkout_at.rs @@ -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(),