From 116f0dea868626d2676ef0873da0556e26ba2ee8 Mon Sep 17 00:00:00 2001 From: Felix Krull Date: Sun, 30 Sep 2018 15:18:09 +0200 Subject: [PATCH] Try implementing traverse_commit by hand --- rust-bindings/rust/libostree/src/repo.rs | 49 +++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/rust-bindings/rust/libostree/src/repo.rs b/rust-bindings/rust/libostree/src/repo.rs index add41b23..8ace774a 100644 --- a/rust-bindings/rust/libostree/src/repo.rs +++ b/rust-bindings/rust/libostree/src/repo.rs @@ -1,15 +1,62 @@ use auto::Repo; - +use ffi; use gio; use glib; +use glib::Error; use glib::IsA; +use glib::translate::*; +use glib_ffi; +use std::collections::HashSet; +use std::ptr; + + +unsafe extern "C" fn read_variant_table(_key: glib_ffi::gpointer, value: glib_ffi::gpointer, hash_set: glib_ffi::gpointer) { + let value: glib::Variant = from_glib_none(value as *const glib_ffi::GVariant); + let set: &mut HashSet = &mut *(hash_set as *mut HashSet); + set.insert(value); +} + + +unsafe fn from_glib_container_variant_set(ptr: *mut glib_ffi::GHashTable) -> HashSet { + let mut set = HashSet::new(); + glib_ffi::g_hash_table_foreach(ptr, Some(read_variant_table), &mut set as *mut HashSet as *mut _); + glib_ffi::g_hash_table_unref(ptr); + set +} + pub trait RepoExtManual { fn new_for_str(path: &str) -> Repo; + fn traverse_commit_manual<'a, P: Into>>( + &self, + commit_checksum: &str, + maxdepth: i32, + cancellable: P) -> Result, Error>; } impl + IsA + Clone + 'static> RepoExtManual for O { fn new_for_str(path: &str) -> Repo { Repo::new(&gio::File::new_for_path(path)) } + + fn traverse_commit_manual<'a, P: Into>>( + &self, + commit_checksum: &str, + maxdepth: i32, + cancellable: P, + ) -> Result, Error> { + unsafe { + let mut error = ptr::null_mut(); + let mut hashtable = ptr::null_mut(); + let _ = ffi::ostree_repo_traverse_commit( + self.to_glib_none().0, + commit_checksum.to_glib_none().0, + maxdepth, + &mut hashtable, + cancellable.into().to_glib_none().0, + &mut error, + ); + if error.is_null() { Ok(from_glib_container_variant_set(hashtable)) } else { Err(from_glib_full(error)) } + } + } }