repo: Add `query_file` API
The underlying `ostree_repo_load_file()` API has the caller pass `NULL` for output arguments it doesn't want. This isn't sanely bindable in Rust - what the generator does is always request all values, but maps them all to `Option<T>`. The main cases are where a user wants either metadata, or both metadata and content. This API gives just metadata; it's a bit more efficient as we don't need to open the file, and doesn't require the caller to `unwrap()`.
This commit is contained in:
parent
1199ae9bbc
commit
887f5b09be
|
|
@ -269,6 +269,37 @@ impl Repo {
|
||||||
Ok(self.resolve_rev(refspec, false)?.unwrap())
|
Ok(self.resolve_rev(refspec, false)?.unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Query metadata for a content object.
|
||||||
|
///
|
||||||
|
/// This is similar to [`load_file`], but is more efficient if reading the file content is not needed.
|
||||||
|
pub fn query_file<P: IsA<gio::Cancellable>>(
|
||||||
|
&self,
|
||||||
|
checksum: &str,
|
||||||
|
cancellable: Option<&P>,
|
||||||
|
) -> Result<(gio::FileInfo, glib::Variant), glib::Error> {
|
||||||
|
unsafe {
|
||||||
|
let mut out_file_info = ptr::null_mut();
|
||||||
|
let mut out_xattrs = ptr::null_mut();
|
||||||
|
let mut error = ptr::null_mut();
|
||||||
|
let r = ffi::ostree_repo_load_file(
|
||||||
|
self.to_glib_none().0,
|
||||||
|
checksum.to_glib_none().0,
|
||||||
|
ptr::null_mut(),
|
||||||
|
&mut out_file_info,
|
||||||
|
&mut out_xattrs,
|
||||||
|
cancellable.map(|p| p.as_ref()).to_glib_none().0,
|
||||||
|
&mut error,
|
||||||
|
);
|
||||||
|
if error.is_null() {
|
||||||
|
debug_assert!(r != 0);
|
||||||
|
Ok((from_glib_full(out_file_info), from_glib_full(out_xattrs)))
|
||||||
|
} else {
|
||||||
|
debug_assert_eq!(r, 0);
|
||||||
|
Err(from_glib_full(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Write a content object from provided input.
|
/// Write a content object from provided input.
|
||||||
pub fn write_content<P: IsA<gio::InputStream>, Q: IsA<gio::Cancellable>>(
|
pub fn write_content<P: IsA<gio::InputStream>, Q: IsA<gio::Cancellable>>(
|
||||||
&self,
|
&self,
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,15 @@ fn repo_traverse_and_read() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
// Right now, the uid/gid are actually that of the test runner
|
// Right now, the uid/gid are actually that of the test runner
|
||||||
assert_eq!(dirmeta.mode, 0o40750);
|
assert_eq!(dirmeta.mode, 0o40750);
|
||||||
|
|
||||||
|
let (finfo, _xattrs) = test_repo
|
||||||
|
.repo
|
||||||
|
.query_file(
|
||||||
|
"89f84ca9854a80e85b583e46a115ba4985254437027bad34f0b113219323d3f8",
|
||||||
|
NONE_CANCELLABLE,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(finfo.size(), 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue