@@ -51,11 +51,14 @@ extern int git_socket_stream__connect_timeout;
5151extern int git_socket_stream__timeout ;
5252
5353char * git__user_agent ;
54+ char * git__user_agent_product ;
5455char * git__ssl_ciphers ;
5556
5657static void settings_global_shutdown (void )
5758{
5859 git__free (git__user_agent );
60+ git__free (git__user_agent_product );
61+
5962 git__free (git__ssl_ciphers );
6063 git_repository__free_extensions ();
6164}
@@ -89,9 +92,16 @@ static int config_level_to_sysdir(int *out, int config_level)
8992 return -1 ;
9093}
9194
95+ const char * git_settings__user_agent_product (void )
96+ {
97+ return git__user_agent_product ? git__user_agent_product :
98+ "git/2.0" ;
99+ }
100+
92101const char * git_settings__user_agent (void )
93102{
94- return git__user_agent ;
103+ return git__user_agent ? git__user_agent :
104+ "libgit2 " LIBGIT2_VERSION ;
95105}
96106
97107int git_libgit2_opts (int key , ...)
@@ -211,14 +221,65 @@ int git_libgit2_opts(int key, ...)
211221 error = -1 ;
212222#endif
213223 break ;
224+
214225 case GIT_OPT_SET_USER_AGENT :
215- git__free (git__user_agent );
216- git__user_agent = git__strdup (va_arg (ap , const char * ));
217- if (!git__user_agent ) {
218- git_error_set_oom ();
219- error = -1 ;
226+ {
227+ const char * new_agent = va_arg (ap , const char * );
228+
229+ git__free (git__user_agent );
230+
231+ if (new_agent ) {
232+ git__user_agent = git__strdup (new_agent );
233+
234+ if (!git__user_agent )
235+ error = -1 ;
236+ } else {
237+ git__user_agent = NULL ;
238+ }
239+ }
240+ break ;
241+
242+ case GIT_OPT_GET_USER_AGENT :
243+ {
244+ git_buf * out = va_arg (ap , git_buf * );
245+ git_str str = GIT_STR_INIT ;
246+
247+ if ((error = git_buf_tostr (& str , out )) < 0 ||
248+ (error = git_str_puts (& str , git_settings__user_agent ())) < 0 )
249+ break ;
250+
251+ error = git_buf_fromstr (out , & str );
252+ }
253+ break ;
254+
255+ case GIT_OPT_SET_USER_AGENT_PRODUCT :
256+ {
257+ const char * new_agent = va_arg (ap , const char * );
258+
259+ git__free (git__user_agent_product );
260+
261+ if (new_agent ) {
262+ git__user_agent_product = git__strdup (new_agent );
263+
264+ if (!git__user_agent_product )
265+ error = -1 ;
266+ } else {
267+ git__user_agent_product = NULL ;
268+ }
220269 }
270+ break ;
271+
272+ case GIT_OPT_GET_USER_AGENT_PRODUCT :
273+ {
274+ git_buf * out = va_arg (ap , git_buf * );
275+ git_str str = GIT_STR_INIT ;
221276
277+ if ((error = git_buf_tostr (& str , out )) < 0 ||
278+ (error = git_str_puts (& str , git_settings__user_agent_product ())) < 0 )
279+ break ;
280+
281+ error = git_buf_fromstr (out , & str );
282+ }
222283 break ;
223284
224285 case GIT_OPT_ENABLE_STRICT_OBJECT_CREATION :
@@ -245,19 +306,6 @@ int git_libgit2_opts(int key, ...)
245306#endif
246307 break ;
247308
248- case GIT_OPT_GET_USER_AGENT :
249- {
250- git_buf * out = va_arg (ap , git_buf * );
251- git_str str = GIT_STR_INIT ;
252-
253- if ((error = git_buf_tostr (& str , out )) < 0 ||
254- (error = git_str_puts (& str , git__user_agent )) < 0 )
255- break ;
256-
257- error = git_buf_fromstr (out , & str );
258- }
259- break ;
260-
261309 case GIT_OPT_ENABLE_OFS_DELTA :
262310 git_smart__ofs_delta_enabled = (va_arg (ap , int ) != 0 );
263311 break ;
0 commit comments