From: Josh Steadmon <steadmon@google.com>
To: git@vger.kernel.org
Cc: calvinwan@google.com, emrass@google.com, gitster@pobox.com,
mh@glandium.org, sandals@crustytoothpaste.net, ps@pks.im,
sunshine@sunshineco.com, phillip.wood123@gmail.com,
allred.sean@gmail.com, rsbecker@nexbridge.com
Subject: [PATCH v5 0/5] Introduce libgit-rs, a Rust wrapper around libgit.a
Date: Tue, 15 Oct 2024 15:50:52 -0700 [thread overview]
Message-ID: <cover.1729032373.git.steadmon@google.com> (raw)
In-Reply-To: <cover.1723054623.git.steadmon@google.com>
A quick note: normally I'd wait longer for more feedback before sending
out a new reroll, but due to some firefighting at $DAYJOB, I will not
have time to focus on this series for the next several weeks, possibly
up to a month. I wanted to get V5 out before then, but please understand
that I will not be able to address new feedback for a while.
This series provides two small Rust wrapper libraries around parts of
Git: "libgit-sys", which exposes a few functions from libgit.a, and
"libgit", which provides a more Rust-friendly interface to some of those
functions. In addition to included unit tests, at $DAYJOB we have tested
building JJ[1] with our library and used it to replace some of the
libgit2-rs uses.
[1] https://github.com/martinvonz/jj
Please find V1 cover letter here:
https://lore.kernel.org/git/cover.1723054623.git.steadmon@google.com/
Known NEEDSWORK:
* Investigate alternative methods of managing symbol visibility &
renaming.
* Figure out symbol versioning
Changes in V5:
* When building with INCLUDE_LIBGIT_RS defined, add
"-fvisibility=hidden" to CFLAGS. This allows us to manage symbol
visibility in libgitpub.a without causing `make all` to rebuild from
scratch due to changing CFLAGS.
* Avoid using c_int in the higher-level Rust API.
* Remove libgitpub.a and intermediate files with `make clean`.
Changes in V4:
* Drop V3 patch #3, which added wrappers around repository
initialization and config access. These are not well-libified, and
they are not necessary for JJ's proof-of-concept use case, so let's
avoid exporting them for now.
* Set a minimum supported Rust version of 1.63. Autodetect whether our
Rust version has c_int and c_char types; if not, define them
ourselves.
* When building libgitpub.a via build.rs, set DEVELOPER=1 to catch
additional errors at build time.
* In build.rs, use the make_cmd crate to portable select the correct
invocation of GNU Make.
* Follow naming standards for _alloc() and _free() functions.
* Use String instead of CString in higher-level API.
* Move libgit_configset_alloc() and libgit_configset_free() out of
upstream Git, to the libgitpub shim library.
* In libgitpub, initialize libgit_config_set structs in the _alloc()
function rather than with a separate _init() function.
* Remove unnecessary comments in libgit-sys showing where the wrapped
functions were originally defined.
* Fix clippy lint: don't reborrow configfile path references.
* Various typo fixes and `cargo fmt` fixes.
Changes in V3:
* Renamed cgit-rs to libgit-rs and cgit-sys to libgit-sys
* Makefile cleanup, particularly adding config.mak options that
developers can set to run Rust builds and tests by default (Patch 6)
* Provide testdata configs for unit tests
* ConfigSet API now uses &Path instead of &str -- more ergonomic for
Rust users to pass in and errors out if the path string isn't UTF-8
* Fixed unresolved dependency on libz in Cargo.toml
Calvin Wan (2):
libgit: add higher-level libgit crate
Makefile: add option to build and test libgit-rs and libgit-rs-sys
Josh Steadmon (3):
common-main: split init and exit code into new files
libgit-sys: introduce Rust wrapper for libgit.a
libgit-sys: also export some config_set functions
.gitignore | 2 +
Makefile | 44 +++++++++
common-exit.c | 26 +++++
common-init.c | 63 ++++++++++++
common-init.h | 6 ++
common-main.c | 83 +---------------
contrib/libgit-rs/Cargo.lock | 77 +++++++++++++++
contrib/libgit-rs/Cargo.toml | 15 +++
contrib/libgit-rs/build.rs | 4 +
contrib/libgit-rs/libgit-sys/Cargo.lock | 69 ++++++++++++++
contrib/libgit-rs/libgit-sys/Cargo.toml | 17 ++++
contrib/libgit-rs/libgit-sys/README.md | 15 +++
contrib/libgit-rs/libgit-sys/build.rs | 35 +++++++
.../libgit-sys/public_symbol_export.c | 50 ++++++++++
.../libgit-sys/public_symbol_export.h | 18 ++++
contrib/libgit-rs/libgit-sys/src/lib.rs | 79 +++++++++++++++
contrib/libgit-rs/src/lib.rs | 95 +++++++++++++++++++
contrib/libgit-rs/testdata/config1 | 2 +
contrib/libgit-rs/testdata/config2 | 2 +
contrib/libgit-rs/testdata/config3 | 2 +
t/Makefile | 16 ++++
21 files changed, 639 insertions(+), 81 deletions(-)
create mode 100644 common-exit.c
create mode 100644 common-init.c
create mode 100644 common-init.h
create mode 100644 contrib/libgit-rs/Cargo.lock
create mode 100644 contrib/libgit-rs/Cargo.toml
create mode 100644 contrib/libgit-rs/build.rs
create mode 100644 contrib/libgit-rs/libgit-sys/Cargo.lock
create mode 100644 contrib/libgit-rs/libgit-sys/Cargo.toml
create mode 100644 contrib/libgit-rs/libgit-sys/README.md
create mode 100644 contrib/libgit-rs/libgit-sys/build.rs
create mode 100644 contrib/libgit-rs/libgit-sys/public_symbol_export.c
create mode 100644 contrib/libgit-rs/libgit-sys/public_symbol_export.h
create mode 100644 contrib/libgit-rs/libgit-sys/src/lib.rs
create mode 100644 contrib/libgit-rs/src/lib.rs
create mode 100644 contrib/libgit-rs/testdata/config1
create mode 100644 contrib/libgit-rs/testdata/config2
create mode 100644 contrib/libgit-rs/testdata/config3
Range-diff against v4:
4: 2ed503216f ! 1: 1ae14207f6 Makefile: add option to build and test libgit-rs and libgit-rs-sys
@@
## Metadata ##
-Author: Calvin Wan <calvinwan@google.com>
+Author: Josh Steadmon <steadmon@google.com>
## Commit message ##
- Makefile: add option to build and test libgit-rs and libgit-rs-sys
+ common-main: split init and exit code into new files
- Add libgitrs, libgitrs-sys, libgitrs-test, and libgitrs-sys-test targets
- to their respective Makefiles so they can be built and tested without
- having to run cargo build/test.
+ Currently, object files in libgit.a reference common_exit(), which is
+ contained in common-main.o. However, common-main.o also includes main(),
+ which references cmd_main() in git.o, which in turn depends on all the
+ builtin/*.o objects.
- Add environment variable, INCLUDE_LIBGIT_RS, that when set,
- automatically builds and tests libgit-rs and libgit-rs-sys when `make
- all` is ran.
+ We would like to allow external users to link libgit.a without needing
+ to include so many extra objects. Enable this by splitting common_exit()
+ and check_bug_if_BUG() into a new file common-exit.c, and add
+ common-exit.o to LIB_OBJS so that these are included in libgit.a.
- Signed-off-by: Calvin Wan <calvinwan@google.com>
+ This split has previously been proposed ([1], [2]) to support fuzz tests
+ and unit tests by avoiding conflicting definitions for main(). However,
+ both of those issues were resolved by other methods of avoiding symbol
+ conflicts. Now we are trying to make libgit.a more self-contained, so
+ hopefully we can revisit this approach.
+
+ Additionally, move the initialization code out of main() into a new
+ init_git() function in its own file. Include this in libgit.a as well,
+ so that external users can share our setup code without calling our
+ main().
+
+ [1] https://lore.kernel.org/git/Yp+wjCPhqieTku3X@google.com/
+ [2] https://lore.kernel.org/git/20230517-unit-tests-v2-v2-1-21b5b60f4b32@google.com/
+
+ Signed-off-by: Josh Steadmon <steadmon@google.com>
## Makefile ##
-@@ Makefile: build-unit-tests: $(UNIT_TEST_PROGS)
- unit-tests: $(UNIT_TEST_PROGS) t/helper/test-tool$X
- $(MAKE) -C t/ unit-tests
+@@ Makefile: LIB_OBJS += combine-diff.o
+ LIB_OBJS += commit-graph.o
+ LIB_OBJS += commit-reach.o
+ LIB_OBJS += commit.o
++LIB_OBJS += common-exit.o
++LIB_OBJS += common-init.o
+ LIB_OBJS += compat/nonblock.o
+ LIB_OBJS += compat/obstack.o
+ LIB_OBJS += compat/terminal.o
+
+ ## common-exit.c (new) ##
+@@
++#include "git-compat-util.h"
++#include "trace2.h"
++
++static void check_bug_if_BUG(void)
++{
++ if (!bug_called_must_BUG)
++ return;
++ BUG("on exit(): had bug() call(s) in this process without explicit BUG_if_bug()");
++}
++
++/* We wrap exit() to call common_exit() in git-compat-util.h */
++int common_exit(const char *file, int line, int code)
++{
++ /*
++ * For non-POSIX systems: Take the lowest 8 bits of the "code"
++ * to e.g. turn -1 into 255. On a POSIX system this is
++ * redundant, see exit(3) and wait(2), but as it doesn't harm
++ * anything there we don't need to guard this with an "ifdef".
++ */
++ code &= 0xff;
++
++ check_bug_if_BUG();
++ trace2_cmd_exit_fl(file, line, code);
++
++ return code;
++}
+
+ ## common-init.c (new) ##
+@@
++#define USE_THE_REPOSITORY_VARIABLE
++
++#include "git-compat-util.h"
++#include "common-init.h"
++#include "exec-cmd.h"
++#include "gettext.h"
++#include "attr.h"
++#include "repository.h"
++#include "setup.h"
++#include "strbuf.h"
++#include "trace2.h"
++
++/*
++ * Many parts of Git have subprograms communicate via pipe, expect the
++ * upstream of a pipe to die with SIGPIPE when the downstream of a
++ * pipe does not need to read all that is written. Some third-party
++ * programs that ignore or block SIGPIPE for their own reason forget
++ * to restore SIGPIPE handling to the default before spawning Git and
++ * break this carefully orchestrated machinery.
++ *
++ * Restore the way SIGPIPE is handled to default, which is what we
++ * expect.
++ */
++static void restore_sigpipe_to_default(void)
++{
++ sigset_t unblock;
++
++ sigemptyset(&unblock);
++ sigaddset(&unblock, SIGPIPE);
++ sigprocmask(SIG_UNBLOCK, &unblock, NULL);
++ signal(SIGPIPE, SIG_DFL);
++}
++
++void init_git(const char **argv)
++{
++ struct strbuf tmp = STRBUF_INIT;
++
++ trace2_initialize_clock();
++
++ /*
++ * Always open file descriptors 0/1/2 to avoid clobbering files
++ * in die(). It also avoids messing up when the pipes are dup'ed
++ * onto stdin/stdout/stderr in the child processes we spawn.
++ */
++ sanitize_stdfds();
++ restore_sigpipe_to_default();
++
++ git_resolve_executable_dir(argv[0]);
++
++ setlocale(LC_CTYPE, "");
++ git_setup_gettext();
++
++ initialize_repository(the_repository);
++
++ attr_start();
++
++ trace2_initialize();
++ trace2_cmd_start(argv);
++ trace2_collect_process_info(TRACE2_PROCESS_INFO_STARTUP);
++
++ if (!strbuf_getcwd(&tmp))
++ tmp_original_cwd = strbuf_detach(&tmp, NULL);
++}
+
+ ## common-init.h (new) ##
+@@
++#ifndef COMMON_INIT_H
++#define COMMON_INIT_H
++
++void init_git(const char **argv);
++
++#endif /* COMMON_INIT_H */
+
+ ## common-main.c ##
+@@
+-#define USE_THE_REPOSITORY_VARIABLE
+-
+ #include "git-compat-util.h"
+-#include "exec-cmd.h"
+-#include "gettext.h"
+-#include "attr.h"
+-#include "repository.h"
+-#include "setup.h"
+-#include "strbuf.h"
+-#include "trace2.h"
+-
+-/*
+- * Many parts of Git have subprograms communicate via pipe, expect the
+- * upstream of a pipe to die with SIGPIPE when the downstream of a
+- * pipe does not need to read all that is written. Some third-party
+- * programs that ignore or block SIGPIPE for their own reason forget
+- * to restore SIGPIPE handling to the default before spawning Git and
+- * break this carefully orchestrated machinery.
+- *
+- * Restore the way SIGPIPE is handled to default, which is what we
+- * expect.
+- */
+-static void restore_sigpipe_to_default(void)
+-{
+- sigset_t unblock;
+-
+- sigemptyset(&unblock);
+- sigaddset(&unblock, SIGPIPE);
+- sigprocmask(SIG_UNBLOCK, &unblock, NULL);
+- signal(SIGPIPE, SIG_DFL);
+-}
++#include "common-init.h"
-+.PHONY: libgitrs-sys
-+libgitrs-sys:
-+ $(QUIET)(\
-+ cd contrib/libgit-rs/libgit-sys && \
-+ cargo build \
-+ )
-+.PHONY: libgitrs
-+libgitrs:
-+ $(QUIET)(\
-+ cd contrib/libgit-rs && \
-+ cargo build \
-+ )
-+ifdef INCLUDE_LIBGIT_RS
-+all:: libgitrs
-+endif
-+
- contrib/libgit-rs/libgit-sys/partial_symbol_export.o: contrib/libgit-rs/libgit-sys/public_symbol_export.o libgit.a reftable/libreftable.a xdiff/lib.a
- $(LD) -r $^ -o $@
+ int main(int argc, const char **argv)
+ {
+ int result;
+- struct strbuf tmp = STRBUF_INIT;
+-
+- trace2_initialize_clock();
+-
+- /*
+- * Always open file descriptors 0/1/2 to avoid clobbering files
+- * in die(). It also avoids messing up when the pipes are dup'ed
+- * onto stdin/stdout/stderr in the child processes we spawn.
+- */
+- sanitize_stdfds();
+- restore_sigpipe_to_default();
+-
+- git_resolve_executable_dir(argv[0]);
+-
+- setlocale(LC_CTYPE, "");
+- git_setup_gettext();
+-
+- initialize_repository(the_repository);
+-
+- attr_start();
+-
+- trace2_initialize();
+- trace2_cmd_start(argv);
+- trace2_collect_process_info(TRACE2_PROCESS_INFO_STARTUP);
+-
+- if (!strbuf_getcwd(&tmp))
+- tmp_original_cwd = strbuf_detach(&tmp, NULL);
-
- ## t/Makefile ##
-@@ t/Makefile: perf:
++ init_git(argv);
+ result = cmd_main(argc, argv);
- .PHONY: pre-clean $(T) aggregate-results clean valgrind perf \
- check-chainlint clean-chainlint test-chainlint $(UNIT_TESTS)
-+
-+.PHONY: libgitrs-sys-test
-+libgitrs-sys-test:
-+ $(QUIET)(\
-+ cd ../contrib/libgit-rs/libgit-sys && \
-+ cargo test \
-+ )
-+.PHONY: libgitrs-test
-+libgitrs-test:
-+ $(QUIET)(\
-+ cd ../contrib/libgit-rs && \
-+ cargo test \
-+ )
-+ifdef INCLUDE_LIBGIT_RS
-+all:: libgitrs-sys-test libgitrs-test
-+endif
+ /* Not exit(3), but a wrapper calling our common_exit() */
+ exit(result);
+ }
+-
+-static void check_bug_if_BUG(void)
+-{
+- if (!bug_called_must_BUG)
+- return;
+- BUG("on exit(): had bug() call(s) in this process without explicit BUG_if_bug()");
+-}
+-
+-/* We wrap exit() to call common_exit() in git-compat-util.h */
+-int common_exit(const char *file, int line, int code)
+-{
+- /*
+- * For non-POSIX systems: Take the lowest 8 bits of the "code"
+- * to e.g. turn -1 into 255. On a POSIX system this is
+- * redundant, see exit(3) and wait(2), but as it doesn't harm
+- * anything there we don't need to guard this with an "ifdef".
+- */
+- code &= 0xff;
+-
+- check_bug_if_BUG();
+- trace2_cmd_exit_fl(file, line, code);
+-
+- return code;
+-}
1: ed925d6a33 ! 2: 1ed010c378 libgit-sys: introduce Rust wrapper for libgit.a
@@ Makefile: clean: profile-clean coverage-clean cocciclean
$(MAKE) -C Documentation/ clean
$(RM) Documentation/GIT-EXCLUDED-PROGRAMS
+ $(RM) -r contrib/libgit-rs/libgit-sys/target
++ $(RM) -r contrib/libgit-rs/libgit-sys/partial_symbol_export.o
++ $(RM) -r contrib/libgit-rs/libgit-sys/hidden_symbol_export.o
++ $(RM) -r contrib/libgit-rs/libgit-sys/libgitpub.a
ifndef NO_PERL
$(RM) -r perl/build/
endif
2: 8eeab7b418 = 3: 00762b57d0 libgit-sys: also export some config_set functions
3: 29599e9c7b ! 4: 4e5360931b libgit: add higher-level libgit crate
@@ Metadata
## Commit message ##
libgit: add higher-level libgit crate
- Wrap `struct config_set` and a few of its associated functions in
- libgit-sys. Also introduce a higher-level "libgit" crate which provides
- a more Rust-friendly interface to config_set structs.
+ The C functions exported by libgit-sys do not provide an idiomatic Rust
+ interface. To make it easier to use these functions via Rust, add a
+ higher-level "libgit" crate, that wraps the lower-level configset API
+ with an interface that is more Rust-y.
+
+ This combination of $X and $X-sys crates is a common pattern for FFI in
+ Rust, as documented in "The Cargo Book" [1].
+
+ [1] https://doc.rust-lang.org/cargo/reference/build-scripts.html#-sys-packages
Co-authored-by: Josh Steadmon <steadmon@google.com>
Signed-off-by: Josh Steadmon <steadmon@google.com>
@@ Makefile: clean: profile-clean coverage-clean cocciclean
$(RM) Documentation/GIT-EXCLUDED-PROGRAMS
- $(RM) -r contrib/libgit-rs/libgit-sys/target
+ $(RM) -r contrib/libgit-rs/target contrib/libgit-rs/libgit-sys/target
- ifndef NO_PERL
- $(RM) -r perl/build/
- endif
+ $(RM) -r contrib/libgit-rs/libgit-sys/partial_symbol_export.o
+ $(RM) -r contrib/libgit-rs/libgit-sys/hidden_symbol_export.o
+ $(RM) -r contrib/libgit-rs/libgit-sys/libgitpub.a
## contrib/libgit-rs/Cargo.lock (new) ##
@@
@@ contrib/libgit-rs/src/lib.rs (new)
+ }
+ }
+
-+ pub fn get_int(&mut self, key: &str) -> Option<c_int> {
++ pub fn get_int(&mut self, key: &str) -> Option<i32> {
+ let key = CString::new(key).expect("Couldn't convert to CString");
+ let mut val: c_int = 0;
+ unsafe {
@@ contrib/libgit-rs/src/lib.rs (new)
+ }
+ }
+
-+ Some(val)
++ Some(val.into())
+ }
+
+ pub fn get_string(&mut self, key: &str) -> Option<String> {
-: ---------- > 5: 15ce989de8 Makefile: add option to build and test libgit-rs and libgit-rs-sys
base-commit: 557ae147e6cdc9db121269b058c757ac5092f9c9
--
2.47.0.rc1.288.g06298d1525-goog
next prev parent reply other threads:[~2024-10-15 22:51 UTC|newest]
Thread overview: 217+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-07 18:21 [RFC PATCH 0/6] [RFC] Introduce cgit-rs, a Rust wrapper around libgit.a Josh Steadmon
2024-08-07 18:21 ` [RFC PATCH 1/6] common-main: split common_exit() into a new file Josh Steadmon
2024-08-07 21:21 ` Junio C Hamano
2024-08-07 22:54 ` Josh Steadmon
2024-08-07 18:21 ` [RFC PATCH 2/6] repository: add initialize_repo wrapper without pointer Josh Steadmon
2024-08-07 22:52 ` Mike Hommey
2024-08-07 23:23 ` Josh Steadmon
2024-08-07 23:29 ` Mike Hommey
2024-08-08 17:50 ` Josh Steadmon
2024-08-07 18:21 ` [RFC PATCH 3/6] contrib/cgit-rs: introduce Rust wrapper for libgit.a Josh Steadmon
2024-08-07 21:21 ` brian m. carlson
2024-08-07 21:40 ` rsbecker
2024-08-07 23:07 ` Josh Steadmon
2024-08-07 23:51 ` rsbecker
2024-08-08 17:13 ` Josh Steadmon
2024-08-08 18:43 ` rsbecker
2024-08-08 19:57 ` Junio C Hamano
2024-08-08 20:14 ` rsbecker
2024-08-12 2:00 ` rsbecker
2024-08-07 23:05 ` Josh Steadmon
2024-08-07 23:55 ` brian m. carlson
2024-08-08 2:21 ` Junio C Hamano
2024-08-08 17:15 ` Josh Steadmon
2024-08-08 18:22 ` Josh Steadmon
2024-08-08 20:18 ` Kyle Lippincott
2024-08-08 20:43 ` Josh Steadmon
2024-08-07 22:47 ` Mike Hommey
2024-08-07 23:29 ` Josh Steadmon
2024-08-08 0:17 ` Mike Hommey
2024-08-08 17:23 ` Josh Steadmon
2024-08-07 18:21 ` [RFC PATCH 4/6] contrib/cgit-rs: add repo initialization and config access Josh Steadmon
2024-08-07 21:26 ` brian m. carlson
2024-08-07 23:14 ` Josh Steadmon
2024-08-08 0:04 ` brian m. carlson
2024-08-07 18:21 ` [RFC PATCH 5/6] config: add git_configset_alloc Josh Steadmon
2024-08-07 18:21 ` [RFC PATCH 6/6] contrib/cgit-rs: add a subset of configset wrappers Josh Steadmon
2024-08-07 21:40 ` brian m. carlson
2024-08-07 21:53 ` Junio C Hamano
2024-08-08 21:44 ` Josh Steadmon
2024-09-04 17:30 ` Calvin Wan
2024-09-04 17:49 ` brian m. carlson
2024-09-06 19:37 ` Calvin Wan
2024-09-07 14:53 ` brian m. carlson
2024-09-04 18:33 ` Junio C Hamano
2024-09-04 19:03 ` brian m. carlson
2024-09-04 21:08 ` Junio C Hamano
2024-09-04 21:29 ` Josh Steadmon
2024-08-07 22:03 ` [RFC PATCH 0/6] [RFC] Introduce cgit-rs, a Rust wrapper around libgit.a brian m. carlson
2024-08-07 23:19 ` Josh Steadmon
2024-08-08 1:33 ` brian m. carlson
2024-08-09 22:16 ` Josh Steadmon
2024-08-08 11:51 ` Jason A. Donenfeld
2024-08-08 13:59 ` Dragan Simic
2024-08-08 15:38 ` rsbecker
2024-08-08 15:47 ` Dragan Simic
2024-08-08 17:20 ` Junio C Hamano
2024-08-09 19:22 ` Junio C Hamano
2024-08-09 19:29 ` Junio C Hamano
2024-08-09 22:27 ` Josh Steadmon
2024-08-09 20:54 ` Junio C Hamano
2024-08-09 22:26 ` Junio C Hamano
2024-08-09 22:28 ` Josh Steadmon
2024-08-09 22:32 ` Junio C Hamano
2024-08-09 22:41 ` [PATCH v2 0/5] " Josh Steadmon
2024-08-09 22:41 ` [PATCH v2 1/5] common-main: split init and exit code into new files Josh Steadmon
2024-08-09 22:41 ` [PATCH v2 2/5] cgit-sys: introduce Rust wrapper for libgit.a Josh Steadmon
2024-08-09 22:41 ` [PATCH v2 3/5] cgit-sys: add repo initialization and config access Josh Steadmon
2024-08-09 22:41 ` [PATCH v2 4/5] config: add git_configset_alloc() and git_configset_clear_and_free() Josh Steadmon
2024-08-12 9:10 ` Phillip Wood
2024-08-12 21:39 ` Josh Steadmon
2024-08-12 21:55 ` Kyle Lippincott
2024-08-13 9:51 ` phillip.wood123
2024-08-13 15:16 ` Junio C Hamano
2024-08-13 9:48 ` phillip.wood123
2024-10-02 22:12 ` Josh Steadmon
2024-08-16 11:24 ` Patrick Steinhardt
2024-10-02 22:17 ` Josh Steadmon
2024-08-09 22:41 ` [PATCH v2 5/5] cgit: add higher-level cgit crate Josh Steadmon
2024-08-12 9:26 ` Phillip Wood
2024-08-21 18:46 ` Calvin Wan
2024-08-21 19:23 ` Kyle Lippincott
2024-08-22 13:24 ` Phillip Wood
2024-08-22 9:12 ` Phillip Wood
2024-10-02 22:31 ` Josh Steadmon
2024-08-09 23:36 ` [PATCH v2 0/5] Introduce cgit-rs, a Rust wrapper around libgit.a Junio C Hamano
2024-08-10 13:15 ` Jason A. Donenfeld
2024-08-11 17:26 ` Dragan Simic
2024-08-11 23:03 ` Eric Sunshine
2024-08-11 23:23 ` Dragan Simic
2024-08-11 23:33 ` Eric Sunshine
2024-08-11 23:37 ` Dragan Simic
2024-08-12 8:15 ` Junio C Hamano
2024-08-12 9:03 ` Eric Sunshine
2024-08-12 18:11 ` Junio C Hamano
2024-08-12 21:32 ` Josh Steadmon
2024-08-16 11:39 ` Patrick Steinhardt
2024-08-16 21:38 ` brian m. carlson
2024-08-17 0:15 ` Eric Sunshine
2024-08-18 1:37 ` Junio C Hamano
2024-08-12 22:14 ` brian m. carlson
2024-08-12 18:08 ` Dragan Simic
2024-08-12 21:24 ` Josh Steadmon
2024-08-12 21:37 ` Junio C Hamano
2024-08-12 22:02 ` Junio C Hamano
2024-09-06 22:18 ` [PATCH v3 0/6] Introduce libgit-rs, " Calvin Wan
2024-09-06 22:21 ` [PATCH v3 1/6] common-main: split init and exit code into new files Calvin Wan
2024-09-06 22:21 ` [PATCH v3 2/6] libgit-sys: introduce Rust wrapper for libgit.a Calvin Wan
2024-09-06 22:39 ` Eric Sunshine
2024-09-06 23:04 ` Mike Hommey
2024-09-08 21:32 ` Junio C Hamano
2024-09-18 21:14 ` Josh Steadmon
2024-09-10 19:04 ` Calvin Wan
2024-09-18 21:14 ` Josh Steadmon
2024-09-06 22:21 ` [PATCH v3 3/6] libgit-sys: add repo initialization and config access Calvin Wan
2024-09-06 22:53 ` Eric Sunshine
2024-09-18 21:33 ` Josh Steadmon
2024-09-06 23:45 ` Junio C Hamano
2024-09-18 21:33 ` Josh Steadmon
2024-09-10 6:42 ` Patrick Steinhardt
2024-10-07 21:21 ` Josh Steadmon
2024-10-08 20:59 ` Josh Steadmon
2024-09-06 22:21 ` [PATCH v3 4/6] config: add git_configset_alloc() and git_configset_clear_and_free() Calvin Wan
2024-09-06 23:24 ` Eric Sunshine
2024-09-10 6:41 ` Patrick Steinhardt
2024-09-10 8:50 ` Phillip Wood
2024-09-10 14:44 ` Junio C Hamano
2024-09-10 19:26 ` Calvin Wan
2024-10-02 22:45 ` Josh Steadmon
2024-09-06 22:21 ` [PATCH v3 5/6] libgit: add higher-level libgit crate Calvin Wan
2024-09-07 0:09 ` Junio C Hamano
2024-09-09 20:47 ` Junio C Hamano
2024-09-10 19:04 ` Calvin Wan
2024-09-10 19:14 ` Junio C Hamano
2024-09-17 22:29 ` Josh Steadmon
2024-09-18 16:34 ` Junio C Hamano
2024-10-07 23:31 ` Josh Steadmon
2024-09-17 21:37 ` Josh Steadmon
2024-09-06 22:21 ` [PATCH v3 6/6] Makefile: add option to build and test libgit-rs and libgit-rs-sys Calvin Wan
2024-09-07 15:15 ` Sean Allred
2024-09-08 21:33 ` Junio C Hamano
2024-09-10 19:12 ` Calvin Wan
2024-09-13 19:01 ` brian m. carlson
2024-10-07 21:23 ` Josh Steadmon
2024-10-02 22:49 ` Josh Steadmon
2024-10-08 23:19 ` [PATCH v4 0/5] Introduce libgit-rs, a Rust wrapper around libgit.a Josh Steadmon
2024-10-08 23:19 ` [PATCH v4 1/5] common-main: split init and exit code into new files Josh Steadmon
2024-10-08 23:19 ` [PATCH v4 2/5] libgit-sys: introduce Rust wrapper for libgit.a Josh Steadmon
2024-10-08 23:19 ` [PATCH v4 3/5] libgit-sys: also export some config_set functions Josh Steadmon
2024-10-08 23:19 ` [PATCH v4 4/5] libgit: add higher-level libgit crate Josh Steadmon
2024-10-09 6:18 ` Eric Sunshine
2024-10-09 21:21 ` Josh Steadmon
2024-10-09 22:25 ` Josh Steadmon
2024-10-08 23:19 ` [PATCH v4 5/5] Makefile: add option to build and test libgit-rs and libgit-rs-sys Josh Steadmon
2024-10-08 23:45 ` Junio C Hamano
2024-10-09 0:12 ` rsbecker
2024-10-14 20:19 ` Josh Steadmon
2024-10-09 0:01 ` Junio C Hamano
2024-10-09 21:53 ` Josh Steadmon
2024-10-10 0:52 ` Junio C Hamano
2024-10-14 20:13 ` Josh Steadmon
2024-10-09 0:10 ` Junio C Hamano
2024-10-09 22:24 ` Josh Steadmon
2024-10-15 22:50 ` Josh Steadmon [this message]
2024-10-15 22:50 ` [PATCH v5 1/5] common-main: split init and exit code into new files Josh Steadmon
2024-10-15 22:50 ` [PATCH v5 2/5] libgit-sys: introduce Rust wrapper for libgit.a Josh Steadmon
2024-10-15 22:50 ` [PATCH v5 3/5] libgit-sys: also export some config_set functions Josh Steadmon
2024-10-15 22:50 ` [PATCH v5 4/5] libgit: add higher-level libgit crate Josh Steadmon
2024-10-15 22:50 ` [PATCH v5 5/5] Makefile: add option to build and test libgit-rs and libgit-rs-sys Josh Steadmon
2024-12-03 5:36 ` [PATCH v5 0/5] Introduce libgit-rs, a Rust wrapper around libgit.a Junio C Hamano
2025-01-15 20:05 ` [PATCH v6 " Josh Steadmon
2025-01-15 20:05 ` [PATCH v6 1/5] common-main: split init and exit code into new files Josh Steadmon
2025-01-15 22:40 ` Junio C Hamano
2025-01-16 2:46 ` Junio C Hamano
2025-01-16 21:02 ` Junio C Hamano
2025-01-17 9:44 ` Patrick Steinhardt
2025-01-21 23:21 ` Josh Steadmon
2025-01-15 20:05 ` [PATCH v6 2/5] libgit-sys: introduce Rust wrapper for libgit.a Josh Steadmon
2025-01-15 23:13 ` Junio C Hamano
2025-01-22 0:03 ` Josh Steadmon
2025-01-27 23:18 ` Josh Steadmon
2025-01-15 20:05 ` [PATCH v6 3/5] libgit-sys: also export some config_set functions Josh Steadmon
2025-01-15 20:05 ` [PATCH v6 4/5] libgit: add higher-level libgit crate Josh Steadmon
2025-01-21 0:00 ` brian m. carlson
2025-01-22 0:01 ` Josh Steadmon
2025-01-15 20:05 ` [PATCH v6 5/5] Makefile: add option to build and test libgit-rs and libgit-rs-sys Josh Steadmon
2025-01-15 22:31 ` [PATCH v6 0/5] Introduce libgit-rs, a Rust wrapper around libgit.a Junio C Hamano
2025-01-21 0:05 ` brian m. carlson
2025-01-21 1:17 ` Junio C Hamano
2025-01-28 0:19 ` [PATCH v7 0/4] " Josh Steadmon
2025-01-28 0:19 ` [PATCH v7 1/4] common-main: split init and exit code into new files Josh Steadmon
2025-01-28 0:19 ` [PATCH v7 2/4] libgit-sys: introduce Rust wrapper for libgit.a Josh Steadmon
2025-01-28 15:08 ` Phillip Wood
2025-01-28 20:26 ` Josh Steadmon
2025-01-28 20:44 ` Junio C Hamano
2025-01-28 0:19 ` [PATCH v7 3/4] libgit-sys: also export some config_set functions Josh Steadmon
2025-01-28 15:08 ` Phillip Wood
2025-01-28 20:47 ` Josh Steadmon
2025-01-28 0:19 ` [PATCH v7 4/4] libgit: add higher-level libgit crate Josh Steadmon
2025-01-28 4:56 ` Junio C Hamano
2025-01-28 20:50 ` Josh Steadmon
2025-01-28 21:17 ` Junio C Hamano
2025-01-28 22:01 ` [PATCH v8 0/4] Introduce libgit-rs, a Rust wrapper around libgit.a Josh Steadmon
2025-01-28 22:01 ` [PATCH v8 1/4] common-main: split init and exit code into new files Josh Steadmon
2025-01-28 22:01 ` [PATCH v8 2/4] libgit-sys: introduce Rust wrapper for libgit.a Josh Steadmon
2025-01-28 22:43 ` Junio C Hamano
2025-01-29 21:40 ` Josh Steadmon
2025-01-28 22:01 ` [PATCH v8 3/4] libgit-sys: also export some config_set functions Josh Steadmon
2025-01-28 22:01 ` [PATCH v8 4/4] libgit: add higher-level libgit crate Josh Steadmon
2025-01-29 15:24 ` [PATCH v8 0/4] Introduce libgit-rs, a Rust wrapper around libgit.a Phillip Wood
2025-01-29 21:42 ` Josh Steadmon
2025-01-29 21:50 ` [PATCH v9 " Josh Steadmon
2025-01-29 21:50 ` [PATCH v9 1/4] common-main: split init and exit code into new files Josh Steadmon
2025-01-29 21:50 ` [PATCH v9 2/4] libgit-sys: introduce Rust wrapper for libgit.a Josh Steadmon
2025-01-29 21:50 ` [PATCH v9 3/4] libgit-sys: also export some config_set functions Josh Steadmon
2025-01-29 21:50 ` [PATCH v9 4/4] libgit: add higher-level libgit crate Josh Steadmon
2025-01-30 10:49 ` [PATCH v9 0/4] Introduce libgit-rs, a Rust wrapper around libgit.a phillip.wood123
2025-01-30 19:32 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cover.1729032373.git.steadmon@google.com \
--to=steadmon@google.com \
--cc=allred.sean@gmail.com \
--cc=calvinwan@google.com \
--cc=emrass@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mh@glandium.org \
--cc=phillip.wood123@gmail.com \
--cc=ps@pks.im \
--cc=rsbecker@nexbridge.com \
--cc=sandals@crustytoothpaste.net \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.