Skip to content

Commit ca6ad69

Browse files
committed
Merge branch 'js/libgit-rust' into seen
An rust binding to libgit.a functions has been introduced. * 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 73342db + 76f1fea commit ca6ad69

File tree

21 files changed

+626
-81
lines changed

21 files changed

+626
-81
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,3 +249,5 @@ Release/
249249
/git.VC.db
250250
*.dSYM
251251
/contrib/buildsystems/out
252+
/contrib/libgit-rs/target
253+
/contrib/libgit-rs/libgit-sys/target

Makefile

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,8 @@ CURL_CONFIG = curl-config
661661
GCOV = gcov
662662
STRIP = strip
663663
SPATCH = spatch
664+
LD = ld
665+
OBJCOPY = objcopy
664666

665667
export TCL_PATH TCLTK_PATH
666668

@@ -986,6 +988,8 @@ LIB_OBJS += combine-diff.o
986988
LIB_OBJS += commit-graph.o
987989
LIB_OBJS += commit-reach.o
988990
LIB_OBJS += commit.o
991+
LIB_OBJS += common-exit.o
992+
LIB_OBJS += common-init.o
989993
LIB_OBJS += compat/nonblock.o
990994
LIB_OBJS += compat/obstack.o
991995
LIB_OBJS += compat/terminal.o
@@ -2756,6 +2760,7 @@ OBJECTS += $(REFTABLE_OBJS) $(REFTABLE_TEST_OBJS)
27562760
OBJECTS += $(UNIT_TEST_OBJS)
27572761
OBJECTS += $(CLAR_TEST_OBJS)
27582762
OBJECTS += $(patsubst %,$(UNIT_TEST_DIR)/%.o,$(UNIT_TEST_PROGRAMS))
2763+
OBJECTS += contrib/libgit-rs/libgit-sys/public_symbol_export.o
27592764

27602765
ifndef NO_CURL
27612766
OBJECTS += http.o http-walker.o remote-curl.o
@@ -3762,6 +3767,7 @@ clean: profile-clean coverage-clean cocciclean
37623767
$(RM) $(htmldocs).tar.gz $(manpages).tar.gz
37633768
$(MAKE) -C Documentation/ clean
37643769
$(RM) Documentation/GIT-EXCLUDED-PROGRAMS
3770+
$(RM) -r contrib/libgit-rs/target contrib/libgit-rs/libgit-sys/target
37653771
ifndef NO_PERL
37663772
$(RM) -r perl/build/
37673773
endif
@@ -3925,3 +3931,28 @@ $(CLAR_TEST_PROG): $(UNIT_TEST_DIR)/clar.suite $(CLAR_TEST_OBJS) $(GITLIBS) GIT-
39253931
build-unit-tests: $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG)
39263932
unit-tests: $(UNIT_TEST_PROGS) $(CLAR_TEST_PROG) t/helper/test-tool$X
39273933
$(MAKE) -C t/ unit-tests
3934+
3935+
.PHONY: libgitrs-sys
3936+
libgitrs-sys:
3937+
$(QUIET)(\
3938+
cd contrib/libgit-rs/libgit-sys && \
3939+
cargo build \
3940+
)
3941+
.PHONY: libgitrs
3942+
libgitrs:
3943+
$(QUIET)(\
3944+
cd contrib/libgit-rs && \
3945+
cargo build \
3946+
)
3947+
ifdef INCLUDE_LIBGIT_RS
3948+
all:: libgitrs
3949+
endif
3950+
3951+
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
3952+
$(LD) -r $^ -o $@
3953+
3954+
contrib/libgit-rs/libgit-sys/hidden_symbol_export.o: contrib/libgit-rs/libgit-sys/partial_symbol_export.o
3955+
$(OBJCOPY) --localize-hidden $^ $@
3956+
3957+
contrib/libgit-rs/libgit-sys/libgitpub.a: contrib/libgit-rs/libgit-sys/hidden_symbol_export.o
3958+
$(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/build.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
pub fn main() {
2+
let ac = autocfg::new();
3+
ac.emit_has_path("std::ffi::c_char");
4+
}

0 commit comments

Comments
 (0)