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::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()),
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue