Skip to content

Commit 92cec57

Browse files
committed
Vendor the fixed get_server_dir, but compare its output to that of the upstream Pkg.PlatformEngines.get_server_dir, and print a warning if the two values differ
1 parent 4049aee commit 92cec57

File tree

3 files changed

+47
-46
lines changed

3 files changed

+47
-46
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Interactive browser-based authentication to private Julia Pkg servers.
77
#### Step 1: Make sure that PkgAuthentication.jl is installed in the default global Julia package environment (`v1.x`)
88

99
```julia
10-
julia> delete!(ENV, "JULIA_PKG_SERVER")
10+
julia> delete!(ENV, "JULIA_PKG_SERVER");
1111

1212
julia> import Pkg
1313

src/PkgAuthentication.jl

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ function authenticate(;
9999

100100
_assert_pkg_server_env_var_is_set()
101101

102-
server = get_pkg_server()::String
102+
server = pkg_server()
103103
server = rstrip(server, '/')
104104
server = string(server, "/", auth_suffix)
105105

@@ -347,20 +347,6 @@ end
347347

348348
## utils
349349

350-
@static if Base.VERSION >= v"1.4-"
351-
# Note that we add `::Union{String, Nothing}` to force conversion from `SubString` to `String`
352-
get_pkg_server()::Union{String, Nothing} = Pkg.pkg_server()
353-
else
354-
# This function does not exist in Julia 1.3
355-
# Note that we add `::Union{String, Nothing}` to force conversion from `SubString` to `String`
356-
function get_pkg_server()::Union{String, Nothing}
357-
server = get(ENV, "JULIA_PKG_SERVER", "https://pkg.julialang.org")
358-
isempty(server) && return nothing
359-
startswith(server, r"\w+://") || (server = "https://$server")
360-
return rstrip(server, '/')
361-
end
362-
end
363-
364350
is_new_auth_mechanism() =
365351
isdefined(Pkg, :PlatformEngines) &&
366352
isdefined(Pkg.PlatformEngines, :get_server_dir) &&
@@ -373,16 +359,58 @@ is_token_valid(toml) =
373359
(get(toml, "expires_at", nothing) isa Union{Integer, AbstractFloat} ||
374360
get(toml, "expires", nothing) isa Union{Integer, AbstractFloat})
375361

362+
@static if Base.VERSION >= v"1.4-"
363+
const pkg_server = Pkg.pkg_server
364+
else
365+
# This function does not exist in Julia 1.3
366+
function pkg_server()
367+
server = get(ENV, "JULIA_PKG_SERVER", "https://pkg.julialang.org")
368+
isempty(server) && return nothing
369+
startswith(server, r"\w+://") || (server = "https://$server")
370+
return rstrip(server, '/')
371+
end
372+
end
373+
374+
function _get_server_dir(
375+
url::AbstractString,
376+
server::Union{AbstractString, Nothing},
377+
)
378+
server === nothing && return
379+
url == server || startswith(url, "$server/") || return
380+
m = match(r"^\w+://([^\\/]+)(?:$|/)", server)
381+
if m === nothing
382+
@warn "malformed Pkg server value" server
383+
return
384+
end
385+
isempty(Base.DEPOT_PATH) && return
386+
invalid_filename_chars = [':', '/', '<', '>', '"', '/', '\\', '|', '?', '*']
387+
dir = join(replace(c -> c in invalid_filename_chars ? '_' : c, collect(String(only(m.captures)))))
388+
return joinpath(Pkg.depots1(), "servers", dir)
389+
end
390+
function get_server_dir(
391+
url::AbstractString,
392+
server::Union{AbstractString, Nothing} = pkg_server(),
393+
)
394+
server_dir_pkgauth = _get_server_dir(url, server)
395+
server_dir_pkg = Pkg.PlatformEngines.get_server_dir(url, server)
396+
if server_dir_pkgauth != server_dir_pkg
397+
msg = "The PkgAuthentication server directory is not equal to the Pkg server directory." *
398+
"Unexpected behavior may occur."
399+
@warn msg server_dir_pkgauth server_dir_pkg
400+
end
401+
return server_dir_pkgauth
402+
end
403+
376404
function token_path(url::AbstractString)
377405
@static if is_new_auth_mechanism()
378-
server_dir = Pkg.PlatformEngines.get_server_dir(url)
406+
server_dir = get_server_dir(url)
379407
if server_dir !== nothing
380408
return joinpath(server_dir, "auth.toml")
381409
end
382410
end
383411
# older auth mechanism uses a different token location
384412
default = joinpath(Pkg.depots1(), "token.toml")
385-
get(ENV, "JULIA_PKG_TOKEN_PATH", default)
413+
return get(ENV, "JULIA_PKG_TOKEN_PATH", default)
386414
end
387415

388416
const OPEN_BROWSER_HOOK = Ref{Union{Base.Callable, Nothing}}(nothing)
@@ -482,7 +510,7 @@ function install(; maxcount::Integer = 3)
482510
throw(ArgumentError("`maxcount` must be greater than or equal to one"))
483511
end
484512
_assert_pkg_server_env_var_is_set()
485-
server = get_pkg_server()
513+
server = String(pkg_server())
486514
auth_handler = generate_auth_handler(maxcount)
487515
@static if PkgAuthentication.is_new_auth_mechanism()
488516
Pkg.PlatformEngines.register_auth_error_handler(server, auth_handler)

test/runtests.jl

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,6 @@ import Pkg
66

77
include("util.jl")
88

9-
@static if Base.VERSION < v"1.4-"
10-
@eval Pkg function pkg_server()::Union{String, Nothing}
11-
server = get(ENV, "JULIA_PKG_SERVER", "https://pkg.julialang.org")
12-
isempty(server) && return nothing
13-
startswith(server, r"\w+://") || (server = "https://$server")
14-
return rstrip(server, '/')
15-
end
16-
end
17-
@static if Base.VERSION < v"1.10-" # TODO: change this to "1.9-"
18-
@eval Pkg.PlatformEngines function get_server_dir(
19-
url :: AbstractString,
20-
server :: Union{AbstractString, Nothing} = pkg_server(),
21-
)
22-
server === nothing && return
23-
url == server || startswith(url, "$server/") || return
24-
m = match(r"^\w+://([^\\/]+)(?:$|/)", server)
25-
if m === nothing
26-
@warn "malformed Pkg server value" server
27-
return
28-
end
29-
isempty(Base.DEPOT_PATH) && return
30-
invalid_filename_chars = [':', '/', '<', '>', '"', '/', '\\', '|', '?', '*']
31-
dir = join(replace(c -> c in invalid_filename_chars ? '_' : c, collect(String(m.captures[1]))))
32-
return joinpath(depots1(), "servers", dir)
33-
end
34-
end
35-
369
@testset "PkgAuthentication" begin
3710
with_temp_depot() do
3811
include("tests.jl")

0 commit comments

Comments
 (0)