This keeps git operations working even when PATH is modified, e.g. `brew
update` will work even though Homebrew runs the command explicitly
without `/usr/local/bin` in PATH.
Additionally, this inserts a blank value for `credential.*.helper` to
instruct git to ignore previously configured credential helpers, i.e.
those that might have been set up in system configuration files. We do
this because otherwise, git will store the credential obtained from gh
in every other credential helper in the chain, which we want to avoid.
Before:
git config --global credential.https://github.com.helper '!gh auth git-credential'
After:
git config --global credential.https://github.com.helper ''
git config --global --add credential.https://github.com.helper '!/path/to/gh auth git-credential'
94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
package shared
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/cli/cli/internal/run"
|
|
)
|
|
|
|
func TestGitCredentialSetup_configureExisting(t *testing.T) {
|
|
cs, restoreRun := run.Stub()
|
|
defer restoreRun(t)
|
|
cs.Register(`git credential reject`, 0, "")
|
|
cs.Register(`git credential approve`, 0, "")
|
|
|
|
f := GitCredentialFlow{
|
|
Executable: "gh",
|
|
helper: "osxkeychain",
|
|
}
|
|
|
|
if err := f.gitCredentialSetup("example.com", "monalisa", "PASSWD"); err != nil {
|
|
t.Errorf("GitCredentialSetup() error = %v", err)
|
|
}
|
|
}
|
|
|
|
func TestGitCredentialSetup_setOurs(t *testing.T) {
|
|
cs, restoreRun := run.Stub()
|
|
defer restoreRun(t)
|
|
cs.Register(`git config --global credential\.`, 0, "", func(args []string) {
|
|
if key := args[len(args)-2]; key != "credential.https://example.com.helper" {
|
|
t.Errorf("git config key was %q", key)
|
|
}
|
|
if val := args[len(args)-1]; val != "" {
|
|
t.Errorf("global credential helper configured to %q", val)
|
|
}
|
|
})
|
|
cs.Register(`git config --global --add credential\.`, 0, "", func(args []string) {
|
|
if key := args[len(args)-2]; key != "credential.https://example.com.helper" {
|
|
t.Errorf("git config key was %q", key)
|
|
}
|
|
if val := args[len(args)-1]; val != "!/path/to/gh auth git-credential" {
|
|
t.Errorf("global credential helper configured to %q", val)
|
|
}
|
|
})
|
|
|
|
f := GitCredentialFlow{
|
|
Executable: "/path/to/gh",
|
|
helper: "",
|
|
}
|
|
|
|
if err := f.gitCredentialSetup("example.com", "monalisa", "PASSWD"); err != nil {
|
|
t.Errorf("GitCredentialSetup() error = %v", err)
|
|
}
|
|
}
|
|
|
|
func Test_isOurCredentialHelper(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
arg string
|
|
want bool
|
|
}{
|
|
{
|
|
name: "blank",
|
|
arg: "",
|
|
want: false,
|
|
},
|
|
{
|
|
name: "invalid",
|
|
arg: "!",
|
|
want: false,
|
|
},
|
|
{
|
|
name: "osxkeychain",
|
|
arg: "osxkeychain",
|
|
want: false,
|
|
},
|
|
{
|
|
name: "looks like gh but isn't",
|
|
arg: "gh auth",
|
|
want: false,
|
|
},
|
|
{
|
|
name: "ours",
|
|
arg: "!/path/to/gh auth",
|
|
want: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := isOurCredentialHelper(tt.arg); got != tt.want {
|
|
t.Errorf("isOurCredentialHelper() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|