Skip to content

Commit 8829413

Browse files
committed
Merge branch 'js/libgit-rust' into seen
* js/libgit-rust: Makefile: add option to build and test libgit-rs and libgit-rs-sys libgit: add higher-level libgit crate libgit-sys: also export some config_set functions libgit-sys: introduce Rust wrapper for libgit.a common-main: split init and exit code into new files
2 parents 6293018 + c557398 commit 8829413

22 files changed

+642
-81
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,3 +251,5 @@ Release/
251251
/git.VC.db
252252
*.dSYM
253253
/contrib/buildsystems/out
254+
/contrib/libgit-rs/target
255+
/contrib/libgit-sys/target

Makefile

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,9 @@ include shared.mak
417417
# Define LINK_FUZZ_PROGRAMS if you want `make all` to also build the fuzz test
418418
# programs in oss-fuzz/.
419419
#
420+
# Define INCLUDE_LIBGIT_RS if you want `make all` and `make test` to build and
421+
# test the Rust crates in contrib/libgit-rs/ and contrib/libgit-rs/libgit-sys/.
422+
#
420423
# === Optional library: libintl ===
421424
#
422425
# Define NO_GETTEXT if you don't want Git output to be translated.
@@ -658,6 +661,8 @@ CURL_CONFIG = curl-config
658661
GCOV = gcov
659662
STRIP = strip
660663
SPATCH = spatch
664+
LD = ld
665+
OBJCOPY = objcopy
661666

662667
export TCL_PATH TCLTK_PATH
663668

@@ -984,6 +989,8 @@ LIB_OBJS += combine-diff.o
984989
LIB_OBJS += commit-graph.o
985990
LIB_OBJS += commit-reach.o
986991
LIB_OBJS += commit.o
992+
LIB_OBJS += common-exit.o
993+
LIB_OBJS += common-init.o
987994
LIB_OBJS += compat/nonblock.o
988995
LIB_OBJS += compat/obstack.o
989996
LIB_OBJS += compat/terminal.o
@@ -2254,6 +2261,13 @@ ifdef WITH_BREAKING_CHANGES
22542261
BASIC_CFLAGS += -DWITH_BREAKING_CHANGES
22552262
endif
22562263

2264+
ifdef INCLUDE_LIBGIT_RS
2265+
# Enable symbol hiding in contrib/libgit-rs/libgit-sys/libgitpub.a
2266+
# without making us rebuild the whole tree every time we run a Rust
2267+
# build.
2268+
BASIC_CFLAGS += -fvisibility=hidden
2269+
endif
2270+
22572271
ifeq ($(TCLTK_PATH),)
22582272
NO_TCLTK = NoThanks
22592273
endif
@@ -2749,6 +2763,7 @@ OBJECTS += $(REFTABLE_OBJS) $(REFTABLE_TEST_OBJS)
27492763
OBJECTS += $(UNIT_TEST_OBJS)
27502764
OBJECTS += $(CLAR_TEST_OBJS)
27512765
OBJECTS += $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(UNIT_TEST_PROGRAMS))
2766+
OBJECTS += contrib/libgit-sys/public_symbol_export.o
27522767

27532768
ifndef NO_CURL
27542769
OBJECTS += http.o http-walker.o remote-curl.o
@@ -3745,6 +3760,10 @@ clean: profile-clean coverage-clean cocciclean
37453760
$(RM) $(htmldocs).tar.gz $(manpages).tar.gz
37463761
$(MAKE) -C Documentation/ clean
37473762
$(RM) Documentation/GIT-EXCLUDED-PROGRAMS
3763+
$(RM) -r contrib/libgit-rs/target contrib/libgit-sys/target
3764+
$(RM) -r contrib/libgit-sys/partial_symbol_export.o
3765+
$(RM) -r contrib/libgit-sys/hidden_symbol_export.o
3766+
$(RM) -r contrib/libgit-sys/libgitpub.a
37483767
ifndef NO_PERL
37493768
$(RM) -r perl/build/
37503769
endif
@@ -3906,3 +3925,28 @@ $(CLAR_TEST_PROG): $(UNIT_TEST_DIR)/clar.suite $(CLAR_TEST_OBJS) $(GITLIBS) GIT-
39063925
build-unit-tests: $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG)
39073926
unit-tests: $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG) t/helper/test-tool$X
39083927
$(MAKE) -C t/ unit-tests
3928+
3929+
.PHONY: libgit-sys
3930+
libgit-sys:
3931+
$(QUIET)(\
3932+
cd contrib/libgit-sys && \
3933+
cargo build \
3934+
)
3935+
.PHONY: libgit-rs
3936+
libgit-rs:
3937+
$(QUIET)(\
3938+
cd contrib/libgit-rs && \
3939+
cargo build \
3940+
)
3941+
ifdef INCLUDE_LIBGIT_RS
3942+
all:: libgit-rs
3943+
endif
3944+
3945+
contrib/libgit-sys/partial_symbol_export.o: contrib/libgit-sys/public_symbol_export.o libgit.a reftable/libreftable.a xdiff/lib.a
3946+
$(LD) -r $^ -o $@
3947+
3948+
contrib/libgit-sys/hidden_symbol_export.o: contrib/libgit-sys/partial_symbol_export.o
3949+
$(OBJCOPY) --localize-hidden $^ $@
3950+
3951+
contrib/libgit-sys/libgitpub.a: contrib/libgit-sys/hidden_symbol_export.o
3952+
$(AR) $(ARFLAGS) $@ $^

common-exit.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "git-compat-util.h"
2+
#include "trace2.h"
3+
4+
static void check_bug_if_BUG(void)
5+
{
6+
if (!bug_called_must_BUG)
7+
return;
8+
BUG("on exit(): had bug() call(s) in this process without explicit BUG_if_bug()");
9+
}
10+
11+
/* We wrap exit() to call common_exit() in git-compat-util.h */
12+
int common_exit(const char *file, int line, int code)
13+
{
14+
/*
15+
* For non-POSIX systems: Take the lowest 8 bits of the "code"
16+
* to e.g. turn -1 into 255. On a POSIX system this is
17+
* redundant, see exit(3) and wait(2), but as it doesn't harm
18+
* anything there we don't need to guard this with an "ifdef".
19+
*/
20+
code &= 0xff;
21+
22+
check_bug_if_BUG();
23+
trace2_cmd_exit_fl(file, line, code);
24+
25+
return code;
26+
}

common-init.c

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#define USE_THE_REPOSITORY_VARIABLE
2+
3+
#include "git-compat-util.h"
4+
#include "common-init.h"
5+
#include "exec-cmd.h"
6+
#include "gettext.h"
7+
#include "attr.h"
8+
#include "repository.h"
9+
#include "setup.h"
10+
#include "strbuf.h"
11+
#include "trace2.h"
12+
13+
/*
14+
* Many parts of Git have subprograms communicate via pipe, expect the
15+
* upstream of a pipe to die with SIGPIPE when the downstream of a
16+
* pipe does not need to read all that is written. Some third-party
17+
* programs that ignore or block SIGPIPE for their own reason forget
18+
* to restore SIGPIPE handling to the default before spawning Git and
19+
* break this carefully orchestrated machinery.
20+
*
21+
* Restore the way SIGPIPE is handled to default, which is what we
22+
* expect.
23+
*/
24+
static void restore_sigpipe_to_default(void)
25+
{
26+
sigset_t unblock;
27+
28+
sigemptyset(&unblock);
29+
sigaddset(&unblock, SIGPIPE);
30+
sigprocmask(SIG_UNBLOCK, &unblock, NULL);
31+
signal(SIGPIPE, SIG_DFL);
32+
}
33+
34+
void init_git(const char **argv)
35+
{
36+
struct strbuf tmp = STRBUF_INIT;
37+
38+
trace2_initialize_clock();
39+
40+
/*
41+
* Always open file descriptors 0/1/2 to avoid clobbering files
42+
* in die(). It also avoids messing up when the pipes are dup'ed
43+
* onto stdin/stdout/stderr in the child processes we spawn.
44+
*/
45+
sanitize_stdfds();
46+
restore_sigpipe_to_default();
47+
48+
git_resolve_executable_dir(argv[0]);
49+
50+
setlocale(LC_CTYPE, "");
51+
git_setup_gettext();
52+
53+
initialize_repository(the_repository);
54+
55+
attr_start();
56+
57+
trace2_initialize();
58+
trace2_cmd_start(argv);
59+
trace2_collect_process_info(TRACE2_PROCESS_INFO_STARTUP);
60+
61+
if (!strbuf_getcwd(&tmp))
62+
tmp_original_cwd = strbuf_detach(&tmp, NULL);
63+
}

common-init.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#ifndef COMMON_INIT_H
2+
#define COMMON_INIT_H
3+
4+
void init_git(const char **argv);
5+
6+
#endif /* COMMON_INIT_H */

common-main.c

Lines changed: 2 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,13 @@
1-
#define USE_THE_REPOSITORY_VARIABLE
2-
31
#include "git-compat-util.h"
4-
#include "exec-cmd.h"
5-
#include "gettext.h"
6-
#include "attr.h"
7-
#include "repository.h"
8-
#include "setup.h"
9-
#include "strbuf.h"
10-
#include "trace2.h"
11-
12-
/*
13-
* Many parts of Git have subprograms communicate via pipe, expect the
14-
* upstream of a pipe to die with SIGPIPE when the downstream of a
15-
* pipe does not need to read all that is written. Some third-party
16-
* programs that ignore or block SIGPIPE for their own reason forget
17-
* to restore SIGPIPE handling to the default before spawning Git and
18-
* break this carefully orchestrated machinery.
19-
*
20-
* Restore the way SIGPIPE is handled to default, which is what we
21-
* expect.
22-
*/
23-
static void restore_sigpipe_to_default(void)
24-
{
25-
sigset_t unblock;
26-
27-
sigemptyset(&unblock);
28-
sigaddset(&unblock, SIGPIPE);
29-
sigprocmask(SIG_UNBLOCK, &unblock, NULL);
30-
signal(SIGPIPE, SIG_DFL);
31-
}
2+
#include "common-init.h"
323

334
int main(int argc, const char **argv)
345
{
356
int result;
36-
struct strbuf tmp = STRBUF_INIT;
37-
38-
trace2_initialize_clock();
39-
40-
/*
41-
* Always open file descriptors 0/1/2 to avoid clobbering files
42-
* in die(). It also avoids messing up when the pipes are dup'ed
43-
* onto stdin/stdout/stderr in the child processes we spawn.
44-
*/
45-
sanitize_stdfds();
46-
restore_sigpipe_to_default();
47-
48-
git_resolve_executable_dir(argv[0]);
49-
50-
setlocale(LC_CTYPE, "");
51-
git_setup_gettext();
52-
53-
initialize_repository(the_repository);
54-
55-
attr_start();
56-
57-
trace2_initialize();
58-
trace2_cmd_start(argv);
59-
trace2_collect_process_info(TRACE2_PROCESS_INFO_STARTUP);
60-
61-
if (!strbuf_getcwd(&tmp))
62-
tmp_original_cwd = strbuf_detach(&tmp, NULL);
637

8+
init_git(argv);
649
result = cmd_main(argc, argv);
6510

6611
/* Not exit(3), but a wrapper calling our common_exit() */
6712
exit(result);
6813
}
69-
70-
static void check_bug_if_BUG(void)
71-
{
72-
if (!bug_called_must_BUG)
73-
return;
74-
BUG("on exit(): had bug() call(s) in this process without explicit BUG_if_bug()");
75-
}
76-
77-
/* We wrap exit() to call common_exit() in git-compat-util.h */
78-
int common_exit(const char *file, int line, int code)
79-
{
80-
/*
81-
* For non-POSIX systems: Take the lowest 8 bits of the "code"
82-
* to e.g. turn -1 into 255. On a POSIX system this is
83-
* redundant, see exit(3) and wait(2), but as it doesn't harm
84-
* anything there we don't need to guard this with an "ifdef".
85-
*/
86-
code &= 0xff;
87-
88-
check_bug_if_BUG();
89-
trace2_cmd_exit_fl(file, line, code);
90-
91-
return code;
92-
}

contrib/libgit-rs/Cargo.lock

Lines changed: 77 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contrib/libgit-rs/Cargo.toml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[package]
2+
name = "libgit"
3+
version = "0.1.0"
4+
edition = "2021"
5+
build = "build.rs"
6+
rust-version = "1.63"
7+
8+
[lib]
9+
path = "src/lib.rs"
10+
11+
[dependencies]
12+
libgit-sys = { version = "0.1.0", path = "../libgit-sys" }
13+
14+
[build-dependencies]
15+
autocfg = "1.4.0"

contrib/libgit-rs/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# libgit-rs
2+
3+
Proof-of-concept Git bindings for Rust.
4+
5+
```toml
6+
[dependencies]
7+
libgit = "0.1.0"
8+
```
9+
10+
## Rust version requirements
11+
12+
libgit-rs should support Rust versions at least as old as the version included
13+
in Debian stable (currently 1.63).

0 commit comments

Comments
 (0)