@@ -4,6 +4,9 @@ use crate::{
4
4
config:: { cache:: util:: ApplyLeniency , Cache } ,
5
5
repository,
6
6
} ;
7
+ use git_config:: File ;
8
+ use git_sec:: Permission ;
9
+ use std:: borrow:: Cow ;
7
10
8
11
/// Initialization
9
12
impl Cache {
@@ -55,82 +58,82 @@ impl Cache {
55
58
..util:: base_options ( lossy)
56
59
} ;
57
60
58
- let config =
59
- {
60
- let home_env = & home_env;
61
- let xdg_config_home_env = & xdg_config_home_env;
62
- let git_prefix = & git_prefix;
63
- let metas = [
64
- git_config:: source:: Kind :: GitInstallation ,
65
- git_config:: source:: Kind :: System ,
66
- git_config:: source:: Kind :: Global ,
67
- ]
68
- . iter ( )
69
- . flat_map ( |kind| kind. sources ( ) )
70
- . filter_map ( |source| {
71
- match source {
72
- git_config:: Source :: GitInstallation if !use_installation => return None ,
73
- git_config:: Source :: System if !use_system => return None ,
74
- git_config:: Source :: Git if !use_git => return None ,
75
- git_config:: Source :: User if !use_user => return None ,
76
- _ => { }
77
- }
78
- source
79
- . storage_location ( & mut |name| {
80
- match name {
81
- git_ if git_. starts_with ( "GIT_" ) => Some ( git_prefix) ,
82
- "XDG_CONFIG_HOME" => Some ( xdg_config_home_env) ,
83
- "HOME" => Some ( home_env) ,
84
- _ => None ,
85
- }
86
- . and_then ( |perm| std:: env:: var_os ( name) . and_then ( |val| perm. check_opt ( val) ) )
87
- } )
88
- . map ( |p| ( source, p. into_owned ( ) ) )
89
- } )
90
- . map ( |( source, path) | git_config:: file:: Metadata {
91
- path : Some ( path) ,
92
- source : * source,
93
- level : 0 ,
94
- trust : git_sec:: Trust :: Full ,
95
- } ) ;
96
-
97
- let err_on_nonexisting_paths = false ;
98
- let mut globals = git_config:: File :: from_paths_metadata_buf (
99
- metas,
100
- & mut buf,
101
- err_on_nonexisting_paths,
102
- git_config:: file:: init:: Options {
103
- includes : git_config:: file:: includes:: Options :: no_follow ( ) ,
104
- ..options
105
- } ,
106
- )
107
- . map_err ( |err| match err {
108
- git_config:: file:: init:: from_paths:: Error :: Init ( err) => Error :: from ( err) ,
109
- git_config:: file:: init:: from_paths:: Error :: Io ( err) => err. into ( ) ,
110
- } ) ?
111
- . unwrap_or_default ( ) ;
112
-
113
- globals. append ( git_dir_config) ;
114
- globals. resolve_includes ( options) ?;
115
- if use_env {
116
- globals. append ( git_config:: File :: from_env ( options) ?. unwrap_or_default ( ) ) ;
117
- }
118
- if !cli_config_overrides. is_empty ( ) {
119
- crate :: config:: overrides:: append ( & mut globals, cli_config_overrides, git_config:: Source :: Cli )
120
- . map_err ( |err| Error :: ConfigOverrides {
121
- err,
122
- source : git_config:: Source :: Cli ,
123
- } ) ?;
124
- }
125
- if !api_config_overrides. is_empty ( ) {
126
- crate :: config:: overrides:: append ( & mut globals, api_config_overrides, git_config:: Source :: Api )
127
- . map_err ( |err| Error :: ConfigOverrides {
128
- err,
129
- source : git_config:: Source :: Api ,
130
- } ) ?;
61
+ let config = {
62
+ let home_env = & home_env;
63
+ let xdg_config_home_env = & xdg_config_home_env;
64
+ let git_prefix = & git_prefix;
65
+ let metas = [
66
+ git_config:: source:: Kind :: GitInstallation ,
67
+ git_config:: source:: Kind :: System ,
68
+ git_config:: source:: Kind :: Global ,
69
+ ]
70
+ . iter ( )
71
+ . flat_map ( |kind| kind. sources ( ) )
72
+ . filter_map ( |source| {
73
+ match source {
74
+ git_config:: Source :: GitInstallation if !use_installation => return None ,
75
+ git_config:: Source :: System if !use_system => return None ,
76
+ git_config:: Source :: Git if !use_git => return None ,
77
+ git_config:: Source :: User if !use_user => return None ,
78
+ _ => { }
131
79
}
132
- globals
133
- } ;
80
+ source
81
+ . storage_location ( & mut |name| {
82
+ match name {
83
+ git_ if git_. starts_with ( "GIT_" ) => Some ( git_prefix) ,
84
+ "XDG_CONFIG_HOME" => Some ( xdg_config_home_env) ,
85
+ "HOME" => Some ( home_env) ,
86
+ _ => None ,
87
+ }
88
+ . and_then ( |perm| std:: env:: var_os ( name) . and_then ( |val| perm. check_opt ( val) ) )
89
+ } )
90
+ . map ( |p| ( source, p. into_owned ( ) ) )
91
+ } )
92
+ . map ( |( source, path) | git_config:: file:: Metadata {
93
+ path : Some ( path) ,
94
+ source : * source,
95
+ level : 0 ,
96
+ trust : git_sec:: Trust :: Full ,
97
+ } ) ;
98
+
99
+ let err_on_nonexisting_paths = false ;
100
+ let mut globals = git_config:: File :: from_paths_metadata_buf (
101
+ metas,
102
+ & mut buf,
103
+ err_on_nonexisting_paths,
104
+ git_config:: file:: init:: Options {
105
+ includes : git_config:: file:: includes:: Options :: no_follow ( ) ,
106
+ ..options
107
+ } ,
108
+ )
109
+ . map_err ( |err| match err {
110
+ git_config:: file:: init:: from_paths:: Error :: Init ( err) => Error :: from ( err) ,
111
+ git_config:: file:: init:: from_paths:: Error :: Io ( err) => err. into ( ) ,
112
+ } ) ?
113
+ . unwrap_or_default ( ) ;
114
+
115
+ globals. append ( git_dir_config) ;
116
+ globals. resolve_includes ( options) ?;
117
+ if use_env {
118
+ globals. append ( git_config:: File :: from_env ( options) ?. unwrap_or_default ( ) ) ;
119
+ }
120
+ if !cli_config_overrides. is_empty ( ) {
121
+ crate :: config:: overrides:: append ( & mut globals, cli_config_overrides, git_config:: Source :: Cli , |_| None )
122
+ . map_err ( |err| Error :: ConfigOverrides {
123
+ err,
124
+ source : git_config:: Source :: Cli ,
125
+ } ) ?;
126
+ }
127
+ if !api_config_overrides. is_empty ( ) {
128
+ crate :: config:: overrides:: append ( & mut globals, api_config_overrides, git_config:: Source :: Api , |_| None )
129
+ . map_err ( |err| Error :: ConfigOverrides {
130
+ err,
131
+ source : git_config:: Source :: Api ,
132
+ } ) ?;
133
+ }
134
+ apply_environment_overrides ( & mut globals, * git_prefix) ?;
135
+ globals
136
+ } ;
134
137
135
138
let hex_len = util:: parse_core_abbrev ( & config, object_hash) . with_leniency ( lenient_config) ?;
136
139
@@ -207,3 +210,60 @@ impl Cache {
207
210
Ok ( ( ) )
208
211
}
209
212
}
213
+
214
+ fn apply_environment_overrides ( config : & mut File < ' static > , git_prefix : Permission ) -> Result < ( ) , Error > {
215
+ fn var_as_bstring ( var : & str , perm : Permission ) -> Option < BString > {
216
+ perm. check_opt ( var)
217
+ . and_then ( std:: env:: var_os)
218
+ . and_then ( |val| git_path:: os_string_into_bstring ( val) . ok ( ) )
219
+ }
220
+
221
+ let mut env_override = git_config:: File :: new ( git_config:: file:: Metadata :: from ( git_config:: Source :: EnvOverride ) ) ;
222
+ {
223
+ let mut http = env_override
224
+ . new_section ( "http" , None )
225
+ . expect ( "statically known valid section name" ) ;
226
+ for ( var, key) in [
227
+ ( "GIT_HTTP_LOW_SPEED_LIMIT" , "lowSpeedLimit" ) ,
228
+ ( "GIT_HTTP_LOW_SPEED_TIME" , "lowSpeedTime" ) ,
229
+ ( "GIT_HTTP_USER_AGENT" , "userAgent" ) ,
230
+ ( "GIT_HTTP_PROXY_AUTHMETHOD" , "proxyAuthMethod" ) ,
231
+ ] {
232
+ if let Some ( value) = var_as_bstring ( var, git_prefix) {
233
+ http. push_with_comment (
234
+ key. try_into ( ) . expect ( "statically known to be valid" ) ,
235
+ Some ( value. as_ref ( ) ) ,
236
+ format ! ( "from {var}" ) . as_str ( ) ,
237
+ ) ;
238
+ }
239
+ }
240
+ if http. is_void ( ) {
241
+ env_override. remove_section ( "http" , None ) ; // TODO: use _by_id
242
+ }
243
+ }
244
+
245
+ {
246
+ let mut https = env_override
247
+ . new_section ( "gitoxide" , Some ( Cow :: Borrowed ( "https" . into ( ) ) ) )
248
+ . expect ( "statically known valid section name" ) ;
249
+
250
+ for ( var, key) in [ ( "HTTPS_PROXY" , "proxy" ) , ( "https_proxy" , "proxy" ) ] {
251
+ if let Some ( value) = var_as_bstring ( var, git_prefix) {
252
+ https. push_with_comment (
253
+ key. try_into ( ) . expect ( "statically known to be valid" ) ,
254
+ Some ( value. as_ref ( ) ) ,
255
+ format ! ( "from {var}" ) . as_str ( ) ,
256
+ ) ;
257
+ }
258
+ }
259
+
260
+ if https. is_void ( ) {
261
+ env_override. remove_section ( "gitoxide" , Some ( "https" . into ( ) ) ) ; // TODO: use _by_id
262
+ }
263
+ }
264
+
265
+ if !env_override. is_void ( ) {
266
+ config. append ( env_override) ;
267
+ }
268
+ Ok ( ( ) )
269
+ }
0 commit comments