libgit-sys: also export some config_set functions

In preparation for implementing a higher-level Rust API for accessing Git configs, export some of the upstream configset API via libgitpub and libgit-sys. Since this will be exercised as part of the higher-level API in the next commit, no tests have been added for libgit-sys. While we're at it, add git_configset_alloc() and git_configset_free() functions in libgitpub so that callers can manage config_set structs on the heap. This also allows non-C external consumers to treat config_sets as opaque structs. Co-authored-by: Calvin Wan <calvinwan@google.com> Signed-off-by: Calvin Wan <calvinwan@google.com> Signed-off-by: Josh Steadmon <steadmon@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Josh Steadmon committed Jan 29, 2025 at 13:50 UTC d76eb0dcccb19d2f85924a4be177ae76126bf5d3
3 files changed +76 -1
contrib/libgit-sys/public_symbol_export.c
+36
@@ -5,11 +5,47 @@
5 */
6
7 #include "git-compat-util.h"
8 +#include "config.h"
9 #include "contrib/libgit-sys/public_symbol_export.h"
10 #include "version.h"
11
12 #pragma GCC visibility push(default)
13
14 +struct libgit_config_set {
15 + struct config_set cs;
16 +};
17 +
18 +struct libgit_config_set *libgit_configset_alloc(void)
19 +{
20 + struct libgit_config_set *cs =
21 + xmalloc(sizeof(struct libgit_config_set));
22 + git_configset_init(&cs->cs);
23 + return cs;
24 +}
25 +
26 +void libgit_configset_free(struct libgit_config_set *cs)
27 +{
28 + git_configset_clear(&cs->cs);
29 + free(cs);
30 +}
31 +
32 +int libgit_configset_add_file(struct libgit_config_set *cs, const char *filename)
33 +{
34 + return git_configset_add_file(&cs->cs, filename);
35 +}
36 +
37 +int libgit_configset_get_int(struct libgit_config_set *cs, const char *key,
38 + int *dest)
39 +{
40 + return git_configset_get_int(&cs->cs, key, dest);
41 +}
42 +
43 +int libgit_configset_get_string(struct libgit_config_set *cs, const char *key,
44 + char **dest)
45 +{
46 + return git_configset_get_string(&cs->cs, key, dest);
47 +}
48 +
49 const char *libgit_user_agent(void)
50 {
51 return git_user_agent();
contrib/libgit-sys/public_symbol_export.h
+10
@@ -1,6 +1,16 @@
1 #ifndef PUBLIC_SYMBOL_EXPORT_H
2 #define PUBLIC_SYMBOL_EXPORT_H
3
4 +struct libgit_config_set *libgit_configset_alloc(void);
5 +
6 +void libgit_configset_free(struct libgit_config_set *cs);
7 +
8 +int libgit_configset_add_file(struct libgit_config_set *cs, const char *filename);
9 +
10 +int libgit_configset_get_int(struct libgit_config_set *cs, const char *key, int *dest);
11 +
12 +int libgit_configset_get_string(struct libgit_config_set *cs, const char *key, char **dest);
13 +
14 const char *libgit_user_agent(void);
15
16 const char *libgit_user_agent_sanitized(void);
contrib/libgit-sys/src/lib.rs
+30 -1
@@ -1,15 +1,44 @@
1 #[cfg(has_std__ffi__c_char)]
2 -use std::ffi::c_char;
2 +use std::ffi::{c_char, c_int};
3
4 #[cfg(not(has_std__ffi__c_char))]
5 #[allow(non_camel_case_types)]
6 pub type c_char = i8;
7
8 +#[cfg(not(has_std__ffi__c_char))]
9 +#[allow(non_camel_case_types)]
10 +pub type c_int = i32;
11 +
12 extern crate libz_sys;
13
14 +#[allow(non_camel_case_types)]
15 +#[repr(C)]
16 +pub struct libgit_config_set {
17 + _data: [u8; 0],
18 + _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
19 +}
20 +
21 extern "C" {
22 pub fn libgit_user_agent() -> *const c_char;
23 pub fn libgit_user_agent_sanitized() -> *const c_char;
24 +
25 + pub fn libgit_configset_alloc() -> *mut libgit_config_set;
26 + pub fn libgit_configset_free(cs: *mut libgit_config_set);
27 +
28 + pub fn libgit_configset_add_file(cs: *mut libgit_config_set, filename: *const c_char) -> c_int;
29 +
30 + pub fn libgit_configset_get_int(
31 + cs: *mut libgit_config_set,
32 + key: *const c_char,
33 + int: *mut c_int,
34 + ) -> c_int;
35 +
36 + pub fn libgit_configset_get_string(
37 + cs: *mut libgit_config_set,
38 + key: *const c_char,
39 + dest: *mut *mut c_char,
40 + ) -> c_int;
41 +
42 }
43
44 #[cfg(test)]