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+
2765int 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+ }
0 commit comments