Skip to content

Commit 634c285

Browse files
committed
Move libgit2 settings into libgit2.c
1 parent 1ec4702 commit 634c285

File tree

3 files changed

+331
-331
lines changed

3 files changed

+331
-331
lines changed

src/libgit2.c

Lines changed: 318 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,63 @@
55
* a Linking Exception. For full terms see the included COPYING file.
66
*/
77

8-
#include "runtime.h"
8+
#include "libgit2.h"
99

10+
#include <git2.h>
1011
#include "alloc.h"
11-
#include "threadstate.h"
12-
#include "hash.h"
13-
#include "sysdir.h"
12+
#include "cache.h"
13+
#include "common.h"
1414
#include "filter.h"
15-
#include "settings.h"
16-
#include "mwindow.h"
15+
#include "hash.h"
16+
#include "index.h"
1717
#include "merge_driver.h"
1818
#include "pool.h"
19+
#include "mwindow.h"
20+
#include "object.h"
21+
#include "odb.h"
22+
#include "refs.h"
23+
#include "runtime.h"
24+
#include "sysdir.h"
25+
#include "thread-utils.h"
26+
#include "threadstate.h"
27+
#include "git2/global.h"
1928
#include "streams/registry.h"
2029
#include "streams/mbedtls.h"
2130
#include "streams/openssl.h"
22-
#include "thread-utils.h"
23-
#include "git2/global.h"
31+
#include "transports/smart.h"
32+
#include "transports/http.h"
2433
#include "transports/ssh.h"
2534
#include "win32/w32_stack.h"
2635

36+
#ifdef GIT_OPENSSL
37+
# include <openssl/err.h>
38+
#endif
39+
40+
#ifdef GIT_MBEDTLS
41+
# include <mbedtls/error.h>
42+
#endif
43+
44+
/* Declarations for tuneable settings */
45+
extern size_t git_mwindow__window_size;
46+
extern size_t git_mwindow__mapped_limit;
47+
extern size_t git_mwindow__file_limit;
48+
extern size_t git_indexer__max_objects;
49+
extern bool git_disable_pack_keep_file_checks;
50+
51+
char *git__user_agent;
52+
char *git__ssl_ciphers;
53+
54+
static void libgit2_settings_global_shutdown(void)
55+
{
56+
git__free(git__user_agent);
57+
git__free(git__ssl_ciphers);
58+
}
59+
60+
static int git_libgit2_settings_global_init(void)
61+
{
62+
return git_runtime_shutdown_register(libgit2_settings_global_shutdown);
63+
}
64+
2765
int git_libgit2_init(void)
2866
{
2967
static git_runtime_init_fn init_fns[] = {
@@ -40,7 +78,7 @@ int git_libgit2_init(void)
4078
git_mbedtls_stream_global_init,
4179
git_mwindow_global_init,
4280
git_pool_global_init,
43-
git_settings_global_init
81+
git_libgit2_settings_global_init
4482
};
4583

4684
return git_runtime_init(init_fns, ARRAY_SIZE(init_fns));
@@ -50,3 +88,274 @@ int git_libgit2_shutdown(void)
5088
{
5189
return git_runtime_shutdown();
5290
}
91+
92+
int git_libgit2_version(int *major, int *minor, int *rev)
93+
{
94+
*major = LIBGIT2_VER_MAJOR;
95+
*minor = LIBGIT2_VER_MINOR;
96+
*rev = LIBGIT2_VER_REVISION;
97+
98+
return 0;
99+
}
100+
101+
int git_libgit2_features(void)
102+
{
103+
return 0
104+
#ifdef GIT_THREADS
105+
| GIT_FEATURE_THREADS
106+
#endif
107+
#ifdef GIT_HTTPS
108+
| GIT_FEATURE_HTTPS
109+
#endif
110+
#if defined(GIT_SSH)
111+
| GIT_FEATURE_SSH
112+
#endif
113+
#if defined(GIT_USE_NSEC)
114+
| GIT_FEATURE_NSEC
115+
#endif
116+
;
117+
}
118+
119+
static int config_level_to_sysdir(int config_level)
120+
{
121+
int val = -1;
122+
123+
switch (config_level) {
124+
case GIT_CONFIG_LEVEL_SYSTEM:
125+
val = GIT_SYSDIR_SYSTEM;
126+
break;
127+
case GIT_CONFIG_LEVEL_XDG:
128+
val = GIT_SYSDIR_XDG;
129+
break;
130+
case GIT_CONFIG_LEVEL_GLOBAL:
131+
val = GIT_SYSDIR_GLOBAL;
132+
break;
133+
case GIT_CONFIG_LEVEL_PROGRAMDATA:
134+
val = GIT_SYSDIR_PROGRAMDATA;
135+
break;
136+
default:
137+
git_error_set(
138+
GIT_ERROR_INVALID, "invalid config path selector %d", config_level);
139+
}
140+
141+
return val;
142+
}
143+
144+
const char *git_libgit2__user_agent(void)
145+
{
146+
return git__user_agent;
147+
}
148+
149+
const char *git_libgit2__ssl_ciphers(void)
150+
{
151+
return git__ssl_ciphers;
152+
}
153+
154+
int git_libgit2_opts(int key, ...)
155+
{
156+
int error = 0;
157+
va_list ap;
158+
159+
va_start(ap, key);
160+
161+
switch (key) {
162+
case GIT_OPT_SET_MWINDOW_SIZE:
163+
git_mwindow__window_size = va_arg(ap, size_t);
164+
break;
165+
166+
case GIT_OPT_GET_MWINDOW_SIZE:
167+
*(va_arg(ap, size_t *)) = git_mwindow__window_size;
168+
break;
169+
170+
case GIT_OPT_SET_MWINDOW_MAPPED_LIMIT:
171+
git_mwindow__mapped_limit = va_arg(ap, size_t);
172+
break;
173+
174+
case GIT_OPT_GET_MWINDOW_MAPPED_LIMIT:
175+
*(va_arg(ap, size_t *)) = git_mwindow__mapped_limit;
176+
break;
177+
178+
case GIT_OPT_SET_MWINDOW_FILE_LIMIT:
179+
git_mwindow__file_limit = va_arg(ap, size_t);
180+
break;
181+
182+
case GIT_OPT_GET_MWINDOW_FILE_LIMIT:
183+
*(va_arg(ap, size_t *)) = git_mwindow__file_limit;
184+
break;
185+
186+
case GIT_OPT_GET_SEARCH_PATH:
187+
if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0) {
188+
git_buf *out = va_arg(ap, git_buf *);
189+
const git_buf *tmp;
190+
191+
git_buf_sanitize(out);
192+
if ((error = git_sysdir_get(&tmp, error)) < 0)
193+
break;
194+
195+
error = git_buf_sets(out, tmp->ptr);
196+
}
197+
break;
198+
199+
case GIT_OPT_SET_SEARCH_PATH:
200+
if ((error = config_level_to_sysdir(va_arg(ap, int))) >= 0)
201+
error = git_sysdir_set(error, va_arg(ap, const char *));
202+
break;
203+
204+
case GIT_OPT_SET_CACHE_OBJECT_LIMIT:
205+
{
206+
git_object_t type = (git_object_t)va_arg(ap, int);
207+
size_t size = va_arg(ap, size_t);
208+
error = git_cache_set_max_object_size(type, size);
209+
break;
210+
}
211+
212+
case GIT_OPT_SET_CACHE_MAX_SIZE:
213+
git_cache__max_storage = va_arg(ap, ssize_t);
214+
break;
215+
216+
case GIT_OPT_ENABLE_CACHING:
217+
git_cache__enabled = (va_arg(ap, int) != 0);
218+
break;
219+
220+
case GIT_OPT_GET_CACHED_MEMORY:
221+
*(va_arg(ap, ssize_t *)) = git_cache__current_storage.val;
222+
*(va_arg(ap, ssize_t *)) = git_cache__max_storage;
223+
break;
224+
225+
case GIT_OPT_GET_TEMPLATE_PATH:
226+
{
227+
git_buf *out = va_arg(ap, git_buf *);
228+
const git_buf *tmp;
229+
230+
git_buf_sanitize(out);
231+
if ((error = git_sysdir_get(&tmp, GIT_SYSDIR_TEMPLATE)) < 0)
232+
break;
233+
234+
error = git_buf_sets(out, tmp->ptr);
235+
}
236+
break;
237+
238+
case GIT_OPT_SET_TEMPLATE_PATH:
239+
error = git_sysdir_set(GIT_SYSDIR_TEMPLATE, va_arg(ap, const char *));
240+
break;
241+
242+
case GIT_OPT_SET_SSL_CERT_LOCATIONS:
243+
#ifdef GIT_OPENSSL
244+
{
245+
const char *file = va_arg(ap, const char *);
246+
const char *path = va_arg(ap, const char *);
247+
error = git_openssl__set_cert_location(file, path);
248+
}
249+
#elif defined(GIT_MBEDTLS)
250+
{
251+
const char *file = va_arg(ap, const char *);
252+
const char *path = va_arg(ap, const char *);
253+
if (file)
254+
error = git_mbedtls__set_cert_location(file, 0);
255+
if (error && path)
256+
error = git_mbedtls__set_cert_location(path, 1);
257+
}
258+
#else
259+
git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support certificate locations");
260+
error = -1;
261+
#endif
262+
break;
263+
case GIT_OPT_SET_USER_AGENT:
264+
git__free(git__user_agent);
265+
git__user_agent = git__strdup(va_arg(ap, const char *));
266+
if (!git__user_agent) {
267+
git_error_set_oom();
268+
error = -1;
269+
}
270+
271+
break;
272+
273+
case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION:
274+
git_object__strict_input_validation = (va_arg(ap, int) != 0);
275+
break;
276+
277+
case GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION:
278+
git_reference__enable_symbolic_ref_target_validation = (va_arg(ap, int) != 0);
279+
break;
280+
281+
case GIT_OPT_SET_SSL_CIPHERS:
282+
#if (GIT_OPENSSL || GIT_MBEDTLS)
283+
{
284+
git__free(git__ssl_ciphers);
285+
git__ssl_ciphers = git__strdup(va_arg(ap, const char *));
286+
if (!git__ssl_ciphers) {
287+
git_error_set_oom();
288+
error = -1;
289+
}
290+
}
291+
#else
292+
git_error_set(GIT_ERROR_SSL, "TLS backend doesn't support custom ciphers");
293+
error = -1;
294+
#endif
295+
break;
296+
297+
case GIT_OPT_GET_USER_AGENT:
298+
{
299+
git_buf *out = va_arg(ap, git_buf *);
300+
git_buf_sanitize(out);
301+
error = git_buf_sets(out, git__user_agent);
302+
}
303+
break;
304+
305+
case GIT_OPT_ENABLE_OFS_DELTA:
306+
git_smart__ofs_delta_enabled = (va_arg(ap, int) != 0);
307+
break;
308+
309+
case GIT_OPT_ENABLE_FSYNC_GITDIR:
310+
git_repository__fsync_gitdir = (va_arg(ap, int) != 0);
311+
break;
312+
313+
case GIT_OPT_GET_WINDOWS_SHAREMODE:
314+
#ifdef GIT_WIN32
315+
*(va_arg(ap, unsigned long *)) = git_win32__createfile_sharemode;
316+
#endif
317+
break;
318+
319+
case GIT_OPT_SET_WINDOWS_SHAREMODE:
320+
#ifdef GIT_WIN32
321+
git_win32__createfile_sharemode = va_arg(ap, unsigned long);
322+
#endif
323+
break;
324+
325+
case GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION:
326+
git_odb__strict_hash_verification = (va_arg(ap, int) != 0);
327+
break;
328+
329+
case GIT_OPT_SET_ALLOCATOR:
330+
error = git_allocator_setup(va_arg(ap, git_allocator *));
331+
break;
332+
333+
case GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY:
334+
git_index__enforce_unsaved_safety = (va_arg(ap, int) != 0);
335+
break;
336+
337+
case GIT_OPT_SET_PACK_MAX_OBJECTS:
338+
git_indexer__max_objects = va_arg(ap, size_t);
339+
break;
340+
341+
case GIT_OPT_GET_PACK_MAX_OBJECTS:
342+
*(va_arg(ap, size_t *)) = git_indexer__max_objects;
343+
break;
344+
345+
case GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS:
346+
git_disable_pack_keep_file_checks = (va_arg(ap, int) != 0);
347+
break;
348+
349+
case GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE:
350+
git_http__expect_continue = (va_arg(ap, int) != 0);
351+
break;
352+
353+
default:
354+
git_error_set(GIT_ERROR_INVALID, "invalid option key");
355+
error = -1;
356+
}
357+
358+
va_end(ap);
359+
360+
return error;
361+
}

src/libgit2.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
* Copyright (C) the libgit2 contributors. All rights reserved.
3+
*
4+
* This file is part of libgit2, distributed under the GNU GPL v2 with
5+
* a Linking Exception. For full terms see the included COPYING file.
6+
*/
7+
#ifndef INCLUDE_libgit2_h__
8+
#define INCLUDE_libgit2_h__
9+
10+
extern const char *git_libgit2__user_agent(void);
11+
extern const char *git_libgit2__ssl_ciphers(void);
12+
13+
#endif

0 commit comments

Comments
 (0)