mirror of
https://github.com/ostreedev/ostree.git
synced 2025-01-09 01:18:35 +03:00
repo: Metadata return values from load_file
are not nullable
The pattern this API uses in C is to allow the input parameters pointer targets to be `NULL`, and it doesn't return values in that case. A further complexity here is that the API will still return `NULL` for symbolic links. But Rust can't express this pattern as is, so we were always returning values but in `Option<T>` wrappers that the caller needed to unwrap for the metadata. (We really want an even more efficient API here that avoids the glib objects entirely, e.g. no reason not to pass directly back a type that lets Rust directly read from the fd for bare repos, but that can come later)
This commit is contained in:
parent
ee5b3c76c3
commit
be2075eef0
@ -168,6 +168,11 @@ concurrency = "send"
|
||||
name = "destination_path"
|
||||
string_type = "filename"
|
||||
|
||||
# Cases where we use nullable output parameters that shouldn't be `Option<T>`
|
||||
[[object.function]]
|
||||
pattern = "^(load_file)$"
|
||||
ignore = true
|
||||
|
||||
[[object]]
|
||||
name = "OSTree.RepoFinder"
|
||||
status = "generate"
|
||||
|
12
rust-bindings/src/auto/repo.rs
generated
12
rust-bindings/src/auto/repo.rs
generated
@ -486,18 +486,6 @@ impl Repo {
|
||||
}
|
||||
}
|
||||
|
||||
#[doc(alias = "ostree_repo_load_file")]
|
||||
pub fn load_file<P: IsA<gio::Cancellable>>(&self, checksum: &str, cancellable: Option<&P>) -> Result<(Option<gio::InputStream>, Option<gio::FileInfo>, Option<glib::Variant>), glib::Error> {
|
||||
unsafe {
|
||||
let mut out_input = ptr::null_mut();
|
||||
let mut out_file_info = ptr::null_mut();
|
||||
let mut out_xattrs = ptr::null_mut();
|
||||
let mut error = ptr::null_mut();
|
||||
let _ = ffi::ostree_repo_load_file(self.to_glib_none().0, checksum.to_glib_none().0, &mut out_input, &mut out_file_info, &mut out_xattrs, cancellable.map(|p| p.as_ref()).to_glib_none().0, &mut error);
|
||||
if error.is_null() { Ok((from_glib_full(out_input), from_glib_full(out_file_info), from_glib_full(out_xattrs))) } else { Err(from_glib_full(error)) }
|
||||
}
|
||||
}
|
||||
|
||||
#[doc(alias = "ostree_repo_load_object_stream")]
|
||||
pub fn load_object_stream<P: IsA<gio::Cancellable>>(&self, objtype: ObjectType, checksum: &str, cancellable: Option<&P>) -> Result<(gio::InputStream, u64), glib::Error> {
|
||||
unsafe {
|
||||
|
2
rust-bindings/src/auto/versions.txt
generated
2
rust-bindings/src/auto/versions.txt
generated
@ -1,2 +1,2 @@
|
||||
Generated by gir (https://github.com/gtk-rs/gir @ e8f82cf6)
|
||||
from gir-files (@ 21901c2d)
|
||||
from gir-files (@ ee5b3c76)
|
||||
|
@ -277,6 +277,39 @@ impl Repo {
|
||||
Ok(self.resolve_rev(refspec, false)?.unwrap())
|
||||
}
|
||||
|
||||
/// Load the contents (for regular files) and metadata for a content object.
|
||||
#[doc(alias = "ostree_repo_load_file")]
|
||||
pub fn load_file<P: IsA<gio::Cancellable>>(
|
||||
&self,
|
||||
checksum: &str,
|
||||
cancellable: Option<&P>,
|
||||
) -> Result<(Option<gio::InputStream>, gio::FileInfo, glib::Variant), glib::Error> {
|
||||
unsafe {
|
||||
let mut out_input = ptr::null_mut();
|
||||
let mut out_file_info = ptr::null_mut();
|
||||
let mut out_xattrs = ptr::null_mut();
|
||||
let mut error = ptr::null_mut();
|
||||
let _ = ffi::ostree_repo_load_file(
|
||||
self.to_glib_none().0,
|
||||
checksum.to_glib_none().0,
|
||||
&mut out_input,
|
||||
&mut out_file_info,
|
||||
&mut out_xattrs,
|
||||
cancellable.map(|p| p.as_ref()).to_glib_none().0,
|
||||
&mut error,
|
||||
);
|
||||
if error.is_null() {
|
||||
Ok((
|
||||
from_glib_full(out_input),
|
||||
from_glib_full(out_file_info),
|
||||
from_glib_full(out_xattrs),
|
||||
))
|
||||
} else {
|
||||
Err(from_glib_full(error))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Query metadata for a content object.
|
||||
///
|
||||
/// This is similar to [`load_file`], but is more efficient if reading the file content is not needed.
|
||||
|
@ -59,8 +59,8 @@ fn should_checksum_file_from_input() {
|
||||
.load_file(obj.checksum(), NONE_CANCELLABLE)
|
||||
.expect("load file");
|
||||
let result = checksum_file_from_input(
|
||||
file_info.as_ref().unwrap(),
|
||||
xattrs.as_ref(),
|
||||
&file_info,
|
||||
Some(&xattrs),
|
||||
stream.as_ref(),
|
||||
ObjectType::File,
|
||||
NONE_CANCELLABLE,
|
||||
|
Loading…
Reference in New Issue
Block a user