On 2024.08.08 08:29, Mike Hommey wrote: > On Wed, Aug 07, 2024 at 04:23:05PM -0700, Josh Steadmon wrote: > > On 2024.08.08 07:52, Mike Hommey wrote: > > > On Wed, Aug 07, 2024 at 11:21:27AM -0700, Josh Steadmon wrote: > > > > Non-C external consumers of libgit.a have to redefine the `repository` > > > > object in their own language if they want to call > > > > initialize_repository() to ensure memory for the object is allocated > > > > correctly. This is not ideal for external consumers that have no need > > > > for the entire `the_repository` object but need to call other functions > > > > from an initialized repository. Therefore, add a friendly > > > > initialize_repository() wrapper without a `the_repository` pointer. > > > > > > Technically speaking, you don't really need this. > > > > > > You can define `repository` as an opaque type in Rust: > > > ``` > > > #[allow(non_camel_case_types)] > > > #[repr(C)] > > > pub struct repository([u8; 0]); > > > ``` > > > > > > And define `the_repository` as an extern symbol: > > > ``` > > > extern "C" { > > > pub static mut the_repository: *mut repository; > > > } > > > ``` > > > > > > Mike > > > > I've actually already done a refactor for V2 that will avoid using this > > patch entirely, but thank you for the pointer. We do something similar > > to opaquely wrap configset pointers in a later patch (we use an empty > > enum there, I'm not sure whether that approach or a zero-size array is > > preferred). > > An empty enum is a never type, I wouldn't recommend using it as an opaque > wrapper. It will likely lead to the compiler doing bad things. > https://rust-lang.github.io/never-type-initiative/RFC.html > > `#[repr(C)]` and `[u8; 0]` are recommended by the nomicon. > https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs > > (the PhantomPinned wasn't there last time I saw that page) > > Mike Fixed in V2 (for ConfigSet). Thanks!