@@ -22,9 +22,12 @@ julia> run(git(["clone", "https://github.com/JuliaRegistries/General"]))
22
22
to bypass the parsing of the command string.
23
23
"""
24
24
function git (; adjust_PATH:: Bool = true , adjust_LIBPATH:: Bool = true )
25
- git_cmd = @static if Sys. iswindows ()
26
- Git_jll. git (; adjust_PATH, adjust_LIBPATH):: Cmd
27
- else
25
+ git_cmd = Git_jll. git (; adjust_PATH, adjust_LIBPATH):: Cmd
26
+ env_mapping = Dict {String,String} (
27
+ " PATH" => _get_cmd_env (git_cmd, " PATH" ),
28
+ LIBPATH_env => _get_cmd_env (git_cmd, LIBPATH_env),
29
+ )
30
+ @static if ! Sys. iswindows ()
28
31
root = Git_jll. artifact_dir
29
32
30
33
libexec = joinpath (root, " libexec" )
@@ -36,7 +39,6 @@ function git(; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true)
36
39
37
40
ssl_cert = joinpath (dirname (Sys. BINDIR), " share" , " julia" , " cert.pem" )
38
41
39
- env_mapping = Dict {String,String} ()
40
42
env_mapping[" GIT_EXEC_PATH" ] = libexec_git_core
41
43
env_mapping[" GIT_SSL_CAINFO" ] = ssl_cert
42
44
env_mapping[" GIT_TEMPLATE_DIR" ] = share_git_core_templates
@@ -47,15 +49,12 @@ function git(; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true)
47
49
# more details.
48
50
env_mapping[" JLL_DYLD_FALLBACK_LIBRARY_PATH" ] = Git_jll. LIBPATH[]
49
51
end
50
-
51
- original_cmd = Git_jll. git (; adjust_PATH, adjust_LIBPATH):: Cmd
52
- addenv (original_cmd, env_mapping... ):: Cmd
53
52
end
54
53
55
54
# Use OpenSSH from the JLL: <https://github.com/JuliaVersionControl/Git.jl/issues/51>.
56
55
if ! Sys. iswindows () && OpenSSH_jll. is_available ()
57
- path = split (get (ENV , " PATH" , " " ), pathsep)
58
- libpath = split (get (ENV , LIBPATH_env, " " ), pathsep)
56
+ path = split (get (env_mapping , " PATH" , " " ), pathsep)
57
+ libpath = split (get (env_mapping , LIBPATH_env, " " ), pathsep)
59
58
60
59
path = vcat (dirname (OpenSSH_jll. ssh_path), path)
61
60
libpath = vcat (OpenSSH_jll. LIBPATH_list, libpath)
@@ -65,27 +64,36 @@ function git(; adjust_PATH::Bool = true, adjust_LIBPATH::Bool = true)
65
64
unique! (filter! (! isempty, path))
66
65
unique! (filter! (! isempty, libpath))
67
66
68
- git_cmd = addenv (git_cmd, " PATH" => join (path, pathsep), LIBPATH_env => join (libpath, pathsep))
67
+ env_mapping[" PATH" ] = join (path, pathsep)
68
+ env_mapping[LIBPATH_env] = join (libpath, pathsep)
69
69
end
70
70
71
71
# Add git-lfs
72
72
if Git_LFS_jll. is_available ()
73
- # Read path from git_cmd.env as it can be modified above
74
- idx = findfirst (startswith (" PATH=" ), git_cmd. env)
75
- path = if isnothing (idx)
76
- " "
77
- else
78
- # dropping the `PATH=` part
79
- git_cmd. env[idx][6 : end ]
80
- end
81
- path = vcat (dirname (Git_LFS_jll. git_lfs_path), path)
82
- git_cmd = addenv (git_cmd, " PATH" => join (path, pathsep)):: Cmd
73
+ env_mapping[" PATH" ] = string (
74
+ dirname (Git_LFS_jll. git_lfs_path),
75
+ pathsep,
76
+ get (env_mapping, " PATH" , " " )
77
+ )
83
78
end
84
- return git_cmd
79
+
80
+ return addenv (git_cmd, env_mapping... ):: Cmd
85
81
end
86
82
87
83
function git (args:: AbstractVector{<:AbstractString} ; kwargs... )
88
84
cmd = git (; kwargs... )
89
85
append! (cmd. exec, args)
90
86
return cmd
91
87
end
88
+
89
+ # The .env field of a Cmd object is an array of strings in the format
90
+ # `$(key)=$(value)` for each environment variable.
91
+ function _get_cmd_env (cmd:: Cmd , key:: AbstractString )
92
+ idx = findfirst (startswith (" $(key) =" ), cmd. env)
93
+ if isnothing (idx)
94
+ return " "
95
+ else
96
+ # dropping the `$(key)=` part
97
+ return cmd. env[idx][(ncodeunits (key)+ 2 ): end ]
98
+ end
99
+ end
0 commit comments