Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow for remote names other than origin. #2509

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 39 additions & 13 deletions src/utilities/utilities.jl
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,31 @@
"""
Stores the memoized results of [`getremote`](@ref).
"""
const GIT_REMOTE_CACHE = Dict{String,Union{Remotes.Remote,Nothing}}()
const GIT_REMOTENAME_CACHE = Dict{String,Union{String,Nothing}}()
RomeoV marked this conversation as resolved.
Show resolved Hide resolved
const GIT_REMOTEURL_CACHE = Dict{String,Union{Remotes.Remote,Nothing}}()

"""
$(TYPEDSIGNATURES)

Determines the GitHub remote of a directory by checking `remote.pushDefault` of the repository.
Defaults to `origin`.

The results for a given directory are memoized in [`GIT_REMOTENAME_CACHE`](@ref), since calling
`git` is expensive and it is often called on the same directory over and over again.
"""
function getremotename(dir::AbstractString)

Check warning on line 436 in src/utilities/utilities.jl

View check run for this annotation

Codecov / codecov/patch

src/utilities/utilities.jl#L436

Added line #L436 was not covered by tests
isdir(dir) || return nothing
return get!(GIT_REMOTENAME_CACHE, dir) do
try
remotename = readchomp(setenv(`$(git()) config --get remote.pushDefault`; dir=dir))
@assert !isempty(remotename)

Check warning on line 441 in src/utilities/utilities.jl

View check run for this annotation

Codecov / codecov/patch

src/utilities/utilities.jl#L441

Added line #L441 was not covered by tests
remotename
catch e
@warn "git config --get remote.pushDefault failed. Assuming remote `origin`." exception=(e, catch_backtrace())
"origin"
end
end
end

function parse_remote_url(remote::AbstractString)
# TODO: we only match for GitHub repositories automatically. Could we engineer a
Expand All @@ -435,24 +459,25 @@
"""
$(TYPEDSIGNATURES)

Determines the GitHub remote of a directory by checking `remote.origin.url` of the
repository. Returns a [`Remotes.GitHub`](@ref), or `nothing` is something has gone wrong
(e.g. it's run on a directory not in a Git repo, or `origin.url` points to a non-GitHub
remote).
Determines the GitHub remote of a directory by checking `remote.\$(remotename).url` of the
repository. `remotename` is determined by [`getremotename`](@ref). Returns a [`Remotes.GitHub`](@ref),
or `nothing` is something has gone wrong (e.g. it's run on a directory not in a Git repo, or the url
points to a non-GitHub remote).

The results for a given directory are memoized in [`GIT_REMOTE_CACHE`](@ref), since calling
The results for a given directory are memoized in [`GIT_REMOTEURL_CACHE`](@ref), since calling
`git` is expensive and it is often called on the same directory over and over again.
"""
function getremote(dir::AbstractString)
isdir(dir) || return nothing
return get!(GIT_REMOTE_CACHE, dir) do
remote = try
readchomp(setenv(`$(git()) config --get remote.origin.url`; dir=dir))
return get!(GIT_REMOTEURL_CACHE, dir) do
remotename = getremotename(dir)
remoteurl = try
readchomp(setenv(`$(git()) config --get remote.$(remotename).url`; dir=dir))
catch e
@debug "git config --get remote.origin.url failed" exception=(e, catch_backtrace())
@debug "git config --get remote.$(remotename).url failed" exception=(e, catch_backtrace())

Check warning on line 477 in src/utilities/utilities.jl

View check run for this annotation

Codecov / codecov/patch

src/utilities/utilities.jl#L477

Added line #L477 was not covered by tests
""
end
return parse_remote_url(remote)
return parse_remote_url(remoteurl)
end
end

Expand Down Expand Up @@ -616,7 +641,7 @@
`root` is the the directory where `git` gets run. `varname` is just informational and used
to construct the warning messages.
"""
function git_remote_head_branch(varname, root; remotename = "origin", fallback = "master")
function git_remote_head_branch(varname, root; fallback = "master")
gitcmd = git(nothrow = true)
if gitcmd === nothing
@warn """
Expand All @@ -628,8 +653,9 @@
end
# We need to do addenv() here to merge the new variables with the environment set by
# Git_jll and the git() function.
remotename = getremotename(root)
cmd = addenv(
setenv(`$gitcmd remote show $(remotename)`, dir=root),
setenv(`$gitcmd remote show $remotename`, dir=root),
"GIT_TERMINAL_PROMPT" => "0",
"GIT_SSH_COMMAND" => get(ENV, "GIT_SSH_COMMAND", "ssh -o \"BatchMode yes\""),
)
Expand Down
Loading