src: add CommitSizesEntry
This commit is contained in:
parent
3d8d5ce53e
commit
5b1bc50418
|
|
@ -14,6 +14,7 @@ generate = [
|
||||||
"OSTree.AsyncProgress",
|
"OSTree.AsyncProgress",
|
||||||
"OSTree.BootconfigParser",
|
"OSTree.BootconfigParser",
|
||||||
"OSTree.ChecksumFlags",
|
"OSTree.ChecksumFlags",
|
||||||
|
"OSTree.CommitSizesEntry",
|
||||||
"OSTree.Deployment",
|
"OSTree.Deployment",
|
||||||
"OSTree.DeploymentUnlockedState",
|
"OSTree.DeploymentUnlockedState",
|
||||||
"OSTree.DiffFlags",
|
"OSTree.DiffFlags",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
// This file was generated by gir (https://github.com/gtk-rs/gir)
|
||||||
|
// from gir-files (https://github.com/gtk-rs/gir-files)
|
||||||
|
// DO NOT EDIT
|
||||||
|
|
||||||
|
#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
||||||
|
use glib::translate::*;
|
||||||
|
use ostree_sys;
|
||||||
|
#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
||||||
|
use ObjectType;
|
||||||
|
|
||||||
|
glib_wrapper! {
|
||||||
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
|
pub struct CommitSizesEntry(Boxed<ostree_sys::OstreeCommitSizesEntry>);
|
||||||
|
|
||||||
|
match fn {
|
||||||
|
copy => |ptr| ostree_sys::ostree_commit_sizes_entry_copy(mut_override(ptr)),
|
||||||
|
free => |ptr| ostree_sys::ostree_commit_sizes_entry_free(ptr),
|
||||||
|
get_type => || ostree_sys::ostree_commit_sizes_entry_get_type(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CommitSizesEntry {
|
||||||
|
#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
||||||
|
pub fn new(checksum: &str, objtype: ObjectType, unpacked: u64, archived: u64) -> Option<CommitSizesEntry> {
|
||||||
|
unsafe {
|
||||||
|
from_glib_full(ostree_sys::ostree_commit_sizes_entry_new(checksum.to_glib_none().0, objtype.to_glib(), unpacked, archived))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,6 +10,8 @@ use glib::GString;
|
||||||
use ostree_sys;
|
use ostree_sys;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
||||||
|
use CommitSizesEntry;
|
||||||
use DiffFlags;
|
use DiffFlags;
|
||||||
use DiffItem;
|
use DiffItem;
|
||||||
use ObjectType;
|
use ObjectType;
|
||||||
|
|
@ -105,10 +107,15 @@ pub fn commit_get_content_checksum(commit_variant: &glib::Variant) -> Option<GSt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
||||||
//pub fn commit_get_object_sizes(commit_variant: &glib::Variant, out_sizes_entries: /*Ignored*/Vec<CommitSizesEntry>) -> Result<(), glib::Error> {
|
pub fn commit_get_object_sizes(commit_variant: &glib::Variant) -> Result<Vec<CommitSizesEntry>, glib::Error> {
|
||||||
// unsafe { TODO: call ostree_sys:ostree_commit_get_object_sizes() }
|
unsafe {
|
||||||
//}
|
let mut out_sizes_entries = ptr::null_mut();
|
||||||
|
let mut error = ptr::null_mut();
|
||||||
|
let _ = ostree_sys::ostree_commit_get_object_sizes(commit_variant.to_glib_none().0, &mut out_sizes_entries, &mut error);
|
||||||
|
if error.is_null() { Ok(FromGlibPtrContainer::from_glib_container(out_sizes_entries)) } else { Err(from_glib_full(error)) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn commit_get_parent(commit_variant: &glib::Variant) -> Option<GString> {
|
pub fn commit_get_parent(commit_variant: &glib::Variant) -> Option<GString> {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,11 @@ mod collection_ref;
|
||||||
#[cfg(any(feature = "v2018_6", feature = "dox"))]
|
#[cfg(any(feature = "v2018_6", feature = "dox"))]
|
||||||
pub use self::collection_ref::CollectionRef;
|
pub use self::collection_ref::CollectionRef;
|
||||||
|
|
||||||
|
#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
||||||
|
mod commit_sizes_entry;
|
||||||
|
#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
||||||
|
pub use self::commit_sizes_entry::CommitSizesEntry;
|
||||||
|
|
||||||
mod diff_item;
|
mod diff_item;
|
||||||
pub use self::diff_item::DiffItem;
|
pub use self::diff_item::DiffItem;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,2 @@
|
||||||
Generated by gir (https://github.com/gtk-rs/gir @ 2d1ffab1)
|
Generated by gir (https://github.com/gtk-rs/gir @ 2d1ffab1)
|
||||||
from gir-files (https://github.com/gtk-rs/gir-files @ eec42a9)
|
from gir-files (https://github.com/gtk-rs/gir-files @ ff904f0)
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
use glib::translate::{from_glib_full, FromGlibPtrFull};
|
use glib::{
|
||||||
use glib::GString;
|
translate::{from_glib_full, FromGlibPtrFull, FromGlibPtrNone},
|
||||||
|
GString,
|
||||||
|
};
|
||||||
use glib_sys::{g_free, g_malloc, g_malloc0, gpointer};
|
use glib_sys::{g_free, g_malloc, g_malloc0, gpointer};
|
||||||
use libc::c_char;
|
use libc::c_char;
|
||||||
use std::fmt;
|
use std::{fmt, ptr::copy_nonoverlapping};
|
||||||
use std::ptr::copy_nonoverlapping;
|
|
||||||
|
|
||||||
const BYTES_LEN: usize = ostree_sys::OSTREE_SHA256_DIGEST_LEN as usize;
|
const BYTES_LEN: usize = ostree_sys::OSTREE_SHA256_DIGEST_LEN as usize;
|
||||||
const HEX_LEN: usize = ostree_sys::OSTREE_SHA256_STRING_LEN as usize;
|
const HEX_LEN: usize = ostree_sys::OSTREE_SHA256_STRING_LEN as usize;
|
||||||
|
|
@ -16,6 +17,8 @@ pub struct Checksum {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Checksum {
|
impl Checksum {
|
||||||
|
pub const DIGEST_LEN: usize = BYTES_LEN;
|
||||||
|
|
||||||
/// Create a `Checksum` value, taking ownership of the given memory location.
|
/// Create a `Checksum` value, taking ownership of the given memory location.
|
||||||
///
|
///
|
||||||
/// # Safety
|
/// # Safety
|
||||||
|
|
@ -23,11 +26,20 @@ impl Checksum {
|
||||||
/// `g_free` (this is e.g. the case if the memory was allocated with `g_malloc`). The value
|
/// `g_free` (this is e.g. the case if the memory was allocated with `g_malloc`). The value
|
||||||
/// takes ownership of the memory, i.e. the memory is freed when the value is dropped. The
|
/// takes ownership of the memory, i.e. the memory is freed when the value is dropped. The
|
||||||
/// memory must not be freed by other code.
|
/// memory must not be freed by other code.
|
||||||
unsafe fn new(bytes: *mut [u8; BYTES_LEN]) -> Checksum {
|
unsafe fn new(bytes: *mut [u8; Self::DIGEST_LEN]) -> Checksum {
|
||||||
assert!(!bytes.is_null());
|
assert!(!bytes.is_null());
|
||||||
Checksum { bytes }
|
Checksum { bytes }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a `Checksum` from a byte array.
|
||||||
|
pub fn from_bytes(checksum: &[u8; Self::DIGEST_LEN]) -> Checksum {
|
||||||
|
let ptr = checksum as *const [u8; BYTES_LEN] as *mut [u8; BYTES_LEN];
|
||||||
|
unsafe {
|
||||||
|
// Safety: we know this byte array is long enough.
|
||||||
|
Checksum::from_glib_none(ptr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Create a `Checksum` from a hexadecimal SHA256 string.
|
/// Create a `Checksum` from a hexadecimal SHA256 string.
|
||||||
///
|
///
|
||||||
/// Unfortunately, the underlying libostree function has no way to report parsing errors. If the
|
/// Unfortunately, the underlying libostree function has no way to report parsing errors. If the
|
||||||
|
|
@ -93,12 +105,7 @@ impl Drop for Checksum {
|
||||||
|
|
||||||
impl Clone for Checksum {
|
impl Clone for Checksum {
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
unsafe {
|
unsafe { Checksum::from_glib_none(self.bytes) }
|
||||||
let cloned = g_malloc(BYTES_LEN) as *mut [u8; BYTES_LEN];
|
|
||||||
// copy one array of 32 elements
|
|
||||||
copy_nonoverlapping::<[u8; BYTES_LEN]>(self.bytes, cloned, 1);
|
|
||||||
Checksum::new(cloned)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -140,6 +147,15 @@ impl FromGlibPtrFull<*mut u8> for Checksum {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl FromGlibPtrNone<*mut [u8; BYTES_LEN]> for Checksum {
|
||||||
|
unsafe fn from_glib_none(ptr: *mut [u8; BYTES_LEN]) -> Self {
|
||||||
|
let cloned = g_malloc(BYTES_LEN) as *mut [u8; BYTES_LEN];
|
||||||
|
// copy one array of 32 elements
|
||||||
|
copy_nonoverlapping::<[u8; BYTES_LEN]>(ptr, cloned, 1);
|
||||||
|
Checksum::new(cloned)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
@ -156,6 +172,13 @@ mod tests {
|
||||||
assert_eq!(checksum.to_string(), "00".repeat(BYTES_LEN));
|
assert_eq!(checksum.to_string(), "00".repeat(BYTES_LEN));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_create_checksum_from_bytes_copy() {
|
||||||
|
let bytes = [0u8; BYTES_LEN];
|
||||||
|
let checksum = Checksum::from_bytes(&bytes);
|
||||||
|
assert_eq!(checksum.to_string(), "00".repeat(BYTES_LEN));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_parse_checksum_string_to_bytes() {
|
fn should_parse_checksum_string_to_bytes() {
|
||||||
let csum = Checksum::from_hex(CHECKSUM_STRING);
|
let csum = Checksum::from_hex(CHECKSUM_STRING);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
use crate::{auto::CommitSizesEntry, auto::ObjectType};
|
||||||
|
use glib::{
|
||||||
|
translate::{FromGlib, FromGlibPtrNone, ToGlibPtr},
|
||||||
|
GString,
|
||||||
|
};
|
||||||
|
|
||||||
|
impl CommitSizesEntry {
|
||||||
|
/// Object checksum as hex string.
|
||||||
|
pub fn checksum(&self) -> GString {
|
||||||
|
let underlying = self.to_glib_none();
|
||||||
|
unsafe { GString::from_glib_none((*underlying.0).checksum) }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The object type.
|
||||||
|
pub fn objtype(&self) -> ObjectType {
|
||||||
|
let underlying = self.to_glib_none();
|
||||||
|
unsafe { ObjectType::from_glib((*underlying.0).objtype) }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Unpacked object size.
|
||||||
|
pub fn unpacked(&self) -> u64 {
|
||||||
|
let underlying = self.to_glib_none();
|
||||||
|
unsafe { (*underlying.0).unpacked }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compressed object size.
|
||||||
|
pub fn archived(&self) -> u64 {
|
||||||
|
let underlying = self.to_glib_none();
|
||||||
|
unsafe { (*underlying.0).archived }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
const CHECKSUM_STRING: &str =
|
||||||
|
"bf875306783efdc5bcab37ea10b6ca4e9b6aea8b94580d0ca94af120565c0e8a";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_get_values_from_commit_sizes_entry() {
|
||||||
|
let entry = CommitSizesEntry::new(CHECKSUM_STRING, ObjectType::Commit, 15, 16).unwrap();
|
||||||
|
assert_eq!(entry.checksum(), CHECKSUM_STRING);
|
||||||
|
assert_eq!(entry.objtype(), ObjectType::Commit);
|
||||||
|
assert_eq!(entry.unpacked(), 15);
|
||||||
|
assert_eq!(entry.archived(), 16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -29,33 +29,30 @@ pub use crate::auto::*;
|
||||||
// handwritten code
|
// handwritten code
|
||||||
mod checksum;
|
mod checksum;
|
||||||
pub use crate::checksum::*;
|
pub use crate::checksum::*;
|
||||||
|
|
||||||
#[cfg(any(feature = "v2018_6", feature = "dox"))]
|
#[cfg(any(feature = "v2018_6", feature = "dox"))]
|
||||||
mod collection_ref;
|
mod collection_ref;
|
||||||
#[cfg(any(feature = "v2018_6", feature = "dox"))]
|
#[cfg(any(feature = "v2018_6", feature = "dox"))]
|
||||||
pub use crate::collection_ref::*;
|
pub use crate::collection_ref::*;
|
||||||
|
|
||||||
mod functions;
|
mod functions;
|
||||||
pub use crate::functions::*;
|
pub use crate::functions::*;
|
||||||
|
|
||||||
#[cfg(any(feature = "v2019_3", feature = "dox"))]
|
#[cfg(any(feature = "v2019_3", feature = "dox"))]
|
||||||
mod kernel_args;
|
mod kernel_args;
|
||||||
#[cfg(any(feature = "v2019_3", feature = "dox"))]
|
#[cfg(any(feature = "v2019_3", feature = "dox"))]
|
||||||
pub use crate::kernel_args::*;
|
pub use crate::kernel_args::*;
|
||||||
|
|
||||||
mod object_name;
|
mod object_name;
|
||||||
pub use crate::object_name::*;
|
pub use crate::object_name::*;
|
||||||
|
|
||||||
mod repo;
|
mod repo;
|
||||||
pub use crate::repo::*;
|
pub use crate::repo::*;
|
||||||
|
|
||||||
#[cfg(any(feature = "v2016_8", feature = "dox"))]
|
#[cfg(any(feature = "v2016_8", feature = "dox"))]
|
||||||
mod repo_checkout_at_options;
|
mod repo_checkout_at_options;
|
||||||
#[cfg(any(feature = "v2016_8", feature = "dox"))]
|
#[cfg(any(feature = "v2016_8", feature = "dox"))]
|
||||||
pub use crate::repo_checkout_at_options::*;
|
pub use crate::repo_checkout_at_options::*;
|
||||||
|
|
||||||
mod se_policy;
|
mod se_policy;
|
||||||
pub use crate::se_policy::*;
|
pub use crate::se_policy::*;
|
||||||
|
#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
||||||
|
mod commit_sizes_entry;
|
||||||
|
#[cfg(any(feature = "v2020_1", feature = "dox"))]
|
||||||
|
pub use crate::commit_sizes_entry::*;
|
||||||
|
|
||||||
// tests
|
// tests
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,2 @@
|
||||||
Generated by gir (https://github.com/gtk-rs/gir @ 2d1ffab1)
|
Generated by gir (https://github.com/gtk-rs/gir @ 2d1ffab1)
|
||||||
from gir-files (https://github.com/gtk-rs/gir-files @ eec42a9)
|
from gir-files (https://github.com/gtk-rs/gir-files @ ff904f0)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue