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)]