From: Calvin Wan <calvinwan@xxxxxxxxxx> Co-authored-by: Josh Steadmon <steadmon@xxxxxxxxxx> Signed-off-by: Calvin Wan <calvinwan@xxxxxxxxxx> Signed-off-by: Josh Steadmon <steadmon@xxxxxxxxxx> --- contrib/cgit-rs/public_symbol_export.c | 27 ++++++++++++++++++++++++++ contrib/cgit-rs/public_symbol_export.h | 8 ++++++++ contrib/cgit-rs/src/lib.rs | 13 ++++++++++++- contrib/cgit-rs/src/main.rs | 23 +++++++++++++++++++++- 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/contrib/cgit-rs/public_symbol_export.c b/contrib/cgit-rs/public_symbol_export.c index 3d1cd6cc4f..ab3401ac40 100644 --- a/contrib/cgit-rs/public_symbol_export.c +++ b/contrib/cgit-rs/public_symbol_export.c @@ -2,11 +2,35 @@ // original symbols can be hidden. Renaming these with a "libgit_" prefix also // avoid conflicts with other libraries such as libgit2. +#include "git-compat-util.h" #include "contrib/cgit-rs/public_symbol_export.h" +#include "attr.h" +#include "config.h" +#include "setup.h" #include "version.h" #pragma GCC visibility push(default) +const char *libgit_setup_git_directory(void) +{ + return setup_git_directory(); +} + +int libgit_config_get_int(const char *key, int *dest) +{ + return git_config_get_int(key, dest); +} + +void libgit_initialize_the_repository(void) +{ + initialize_the_repository(); +} + +int libgit_parse_maybe_bool(const char *val) +{ + return git_parse_maybe_bool(val); +} + const char *libgit_user_agent(void) { return git_user_agent(); @@ -17,4 +41,7 @@ const char *libgit_user_agent_sanitized(void) return git_user_agent_sanitized(); } +const char *libgit_attr__true = git_attr__true; +const char *libgit_attr__false = git_attr__false; + #pragma GCC visibility pop diff --git a/contrib/cgit-rs/public_symbol_export.h b/contrib/cgit-rs/public_symbol_export.h index a3372f93fa..97e8e871ba 100644 --- a/contrib/cgit-rs/public_symbol_export.h +++ b/contrib/cgit-rs/public_symbol_export.h @@ -1,6 +1,14 @@ #ifndef PUBLIC_SYMBOL_EXPORT_H #define PUBLIC_SYMBOL_EXPORT_H +const char *libgit_setup_git_directory(void); + +int libgit_config_get_int(const char *key, int *dest); + +void libgit_initialize_the_repository(void); + +int libgit_parse_maybe_bool(const char *val); + const char *libgit_user_agent(void); const char *libgit_user_agent_sanitized(void); diff --git a/contrib/cgit-rs/src/lib.rs b/contrib/cgit-rs/src/lib.rs index dc46e7ff42..df350e758f 100644 --- a/contrib/cgit-rs/src/lib.rs +++ b/contrib/cgit-rs/src/lib.rs @@ -1,6 +1,17 @@ -use libc::c_char; +use libc::{c_char, c_int}; extern "C" { + pub fn libgit_setup_git_directory() -> *const c_char; + + // From config.c + pub fn libgit_config_get_int(key: *const c_char, dest: *mut c_int) ->c_int; + + // From repository.c + pub fn libgit_initialize_the_repository(); + + // From parse.c + pub fn libgit_parse_maybe_bool(val: *const c_char) -> c_int; + // From version.c pub fn libgit_user_agent() -> *const c_char; pub fn libgit_user_agent_sanitized() -> *const c_char; diff --git a/contrib/cgit-rs/src/main.rs b/contrib/cgit-rs/src/main.rs index 1794e3f43e..c5f8644fca 100644 --- a/contrib/cgit-rs/src/main.rs +++ b/contrib/cgit-rs/src/main.rs @@ -1,4 +1,4 @@ -use std::ffi::CStr; +use std::ffi::{CStr, CString}; fn main() { println!("Let's print some strings provided by Git"); @@ -7,4 +7,25 @@ fn main() { println!("git_user_agent() = {:?}", c_str); println!("git_user_agent_sanitized() = {:?}", unsafe { CStr::from_ptr(cgit::libgit_user_agent_sanitized()) }); + + println!("\nNow try passing args"); + let test_arg = CString::new("test_arg").unwrap(); + println!("git_parse_maybe_bool(...) = {:?}", + unsafe { cgit::libgit_parse_maybe_bool(test_arg.as_ptr()) }); + + println!("\nCan we get an int out of our config??"); + unsafe { + cgit::libgit_initialize_the_repository(); + cgit::libgit_setup_git_directory(); + let mut val: libc::c_int = 0; + let key = CString::new("trace2.eventNesting").unwrap(); + cgit::libgit_config_get_int( + key.as_ptr(), + &mut val as *mut i32 + ); + println!( + "git_config_get_int(\"trace2.eventNesting\") -> {:?}", + val + ); + }; } -- 2.46.0.rc2.264.g509ed76dc8-goog