diff --git a/rust-bindings/rust/conf/ostree.toml b/rust-bindings/rust/conf/ostree.toml index 2cc3591a..e59b27fe 100644 --- a/rust-bindings/rust/conf/ostree.toml +++ b/rust-bindings/rust/conf/ostree.toml @@ -135,11 +135,6 @@ status = "generate" name = "write_content_async" ignore = true - [[object.function]] - # these fail because of issues with zero-terminated arrays - pattern = "find_remotes_async|pull_from_remotes_async" - ignore = true - [[object.function]] # this is deprecated and supposedly unsafe for GI name = "checkout_tree_at" diff --git a/rust-bindings/rust/src/auto/repo.rs b/rust-bindings/rust/src/auto/repo.rs index 9d96a25c..b174ffc0 100644 --- a/rust-bindings/rust/src/auto/repo.rs +++ b/rust-bindings/rust/src/auto/repo.rs @@ -20,6 +20,8 @@ use RepoCommitModifier; use RepoCommitState; use RepoFile; #[cfg(any(feature = "v2018_6", feature = "dox"))] +use RepoFinder; +#[cfg(any(feature = "v2018_6", feature = "dox"))] use RepoFinderResult; use RepoMode; use RepoPruneFlags; @@ -29,7 +31,12 @@ use RepoRemoteChange; use RepoResolveRevExtFlags; use RepoTransactionStats; use StaticDeltaGenerateOpt; +#[cfg(feature = "futures")] +#[cfg(any(feature = "v2018_6", feature = "dox"))] +use futures::future; use gio; +#[cfg(any(feature = "v2018_6", feature = "dox"))] +use gio_sys; use glib; use glib::GString; use glib::StaticType; @@ -169,6 +176,50 @@ impl Repo { // unsafe { TODO: call ostree_sys:ostree_repo_export_tree_to_archive() } //} + #[cfg(any(feature = "v2018_6", feature = "dox"))] + pub fn find_remotes_async, Q: IsA, R: FnOnce(Result, Error>) + Send + 'static>(&self, refs: &[&CollectionRef], options: Option<&glib::Variant>, finders: &[RepoFinder], progress: Option<&P>, cancellable: Option<&Q>, callback: R) { + let user_data: Box = Box::new(callback); + unsafe extern "C" fn find_remotes_async_trampoline, Error>) + Send + 'static>(_source_object: *mut gobject_sys::GObject, res: *mut gio_sys::GAsyncResult, user_data: glib_sys::gpointer) { + let mut error = ptr::null_mut(); + let ret = ostree_sys::ostree_repo_find_remotes_finish(_source_object as *mut _, res, &mut error); + let result = if error.is_null() { Ok(FromGlibPtrContainer::from_glib_full(ret)) } else { Err(from_glib_full(error)) }; + let callback: Box = Box::from_raw(user_data as *mut _); + callback(result); + } + let callback = find_remotes_async_trampoline::; + unsafe { + ostree_sys::ostree_repo_find_remotes_async(self.to_glib_none().0, refs.to_glib_none().0, options.to_glib_none().0, finders.to_glib_none().0, progress.map(|p| p.as_ref()).to_glib_none().0, cancellable.map(|p| p.as_ref()).to_glib_none().0, Some(callback), Box::into_raw(user_data) as *mut _); + } + } + + #[cfg(feature = "futures")] + #[cfg(any(feature = "v2018_6", feature = "dox"))] + pub fn find_remotes_async_future + Clone + 'static>(&self, refs: &[&CollectionRef], options: Option<&glib::Variant>, finders: &[RepoFinder], progress: Option<&P>) -> Box_, Error>> + std::marker::Unpin> { + use gio::GioFuture; + use fragile::Fragile; + + let refs = refs.clone(); + let options = options.map(ToOwned::to_owned); + let finders = finders.clone(); + let progress = progress.map(ToOwned::to_owned); + GioFuture::new(self, move |obj, send| { + let cancellable = gio::Cancellable::new(); + let send = Fragile::new(send); + obj.find_remotes_async( + &refs, + options.as_ref().map(::std::borrow::Borrow::borrow), + &finders, + progress.as_ref().map(::std::borrow::Borrow::borrow), + Some(&cancellable), + move |res| { + let _ = send.into_inner().send(res); + }, + ); + + cancellable + }) + } + #[cfg(any(feature = "v2017_15", feature = "dox"))] pub fn fsck_object>(&self, objtype: ObjectType, sha256: &str, cancellable: Option<&P>) -> Result<(), Error> { unsafe { @@ -479,6 +530,48 @@ impl Repo { } } + #[cfg(any(feature = "v2018_6", feature = "dox"))] + pub fn pull_from_remotes_async, Q: IsA, R: FnOnce(Result<(), Error>) + Send + 'static>(&self, results: &[&RepoFinderResult], options: Option<&glib::Variant>, progress: Option<&P>, cancellable: Option<&Q>, callback: R) { + let user_data: Box = Box::new(callback); + unsafe extern "C" fn pull_from_remotes_async_trampoline) + Send + 'static>(_source_object: *mut gobject_sys::GObject, res: *mut gio_sys::GAsyncResult, user_data: glib_sys::gpointer) { + let mut error = ptr::null_mut(); + let _ = ostree_sys::ostree_repo_pull_from_remotes_finish(_source_object as *mut _, res, &mut error); + let result = if error.is_null() { Ok(()) } else { Err(from_glib_full(error)) }; + let callback: Box = Box::from_raw(user_data as *mut _); + callback(result); + } + let callback = pull_from_remotes_async_trampoline::; + unsafe { + ostree_sys::ostree_repo_pull_from_remotes_async(self.to_glib_none().0, results.to_glib_none().0, options.to_glib_none().0, progress.map(|p| p.as_ref()).to_glib_none().0, cancellable.map(|p| p.as_ref()).to_glib_none().0, Some(callback), Box::into_raw(user_data) as *mut _); + } + } + + #[cfg(feature = "futures")] + #[cfg(any(feature = "v2018_6", feature = "dox"))] + pub fn pull_from_remotes_async_future + Clone + 'static>(&self, results: &[&RepoFinderResult], options: Option<&glib::Variant>, progress: Option<&P>) -> Box_> + std::marker::Unpin> { + use gio::GioFuture; + use fragile::Fragile; + + let results = results.clone(); + let options = options.map(ToOwned::to_owned); + let progress = progress.map(ToOwned::to_owned); + GioFuture::new(self, move |obj, send| { + let cancellable = gio::Cancellable::new(); + let send = Fragile::new(send); + obj.pull_from_remotes_async( + &results, + options.as_ref().map(::std::borrow::Borrow::borrow), + progress.as_ref().map(::std::borrow::Borrow::borrow), + Some(&cancellable), + move |res| { + let _ = send.into_inner().send(res); + }, + ); + + cancellable + }) + } + pub fn pull_one_dir, Q: IsA>(&self, remote_name: &str, dir_to_pull: &str, refs_to_fetch: &[&str], flags: RepoPullFlags, progress: Option<&P>, cancellable: Option<&Q>) -> Result<(), Error> { unsafe { let mut error = ptr::null_mut();