Merge branch 'master' into lfshttp

This commit is contained in:
Preben Ingvaldsen 2018-09-14 11:41:19 -07:00
commit 162d42db76
3 changed files with 92 additions and 35 deletions

@ -81,7 +81,7 @@ func (c *sshAuthClient) Resolve(e Endpoint, method string) (sshAuthResponse, err
return res, nil
}
exe, args := sshGetLFSExeAndArgs(c.os, e, method)
exe, args := sshGetLFSExeAndArgs(c.os, c.git, e, method)
cmd := exec.Command(exe, args...)
// Save stdout and stderr in separate buffers
@ -124,8 +124,8 @@ func sshFormatArgs(cmd string, args []string, needShell bool) (string, []string)
return "sh", []string{"-c", joined}
}
func sshGetLFSExeAndArgs(osEnv config.Environment, e Endpoint, method string) (string, []string) {
exe, args, needShell := sshGetExeAndArgs(osEnv, e)
func sshGetLFSExeAndArgs(osEnv config.Environment, gitEnv config.Environment, e Endpoint, method string) (string, []string) {
exe, args, needShell := sshGetExeAndArgs(osEnv, gitEnv, e)
operation := endpointOperation(e, method)
args = append(args, fmt.Sprintf("git-lfs-authenticate %s %s", e.SshPath, operation))
exe, args = sshFormatArgs(exe, args, needShell)
@ -133,9 +133,22 @@ func sshGetLFSExeAndArgs(osEnv config.Environment, e Endpoint, method string) (s
return exe, args
}
// Parse command, and if it looks like a valid command, return the ssh binary
// name, the command to run, and whether we need a shell. If not, return
// existing as the ssh binary name.
func sshParseShellCommand(command string, existing string) (ssh string, cmd string, needShell bool) {
ssh = existing
if cmdArgs := tools.QuotedFields(command); len(cmdArgs) > 0 {
needShell = true
ssh = cmdArgs[0]
cmd = command
}
return
}
// Return the executable name for ssh on this machine and the base args
// Base args includes port settings, user/host, everything pre the command to execute
func sshGetExeAndArgs(osEnv config.Environment, e Endpoint) (exe string, baseargs []string, needShell bool) {
func sshGetExeAndArgs(osEnv config.Environment, gitEnv config.Environment, e Endpoint) (exe string, baseargs []string, needShell bool) {
var cmd string
isPlink := false
@ -143,15 +156,11 @@ func sshGetExeAndArgs(osEnv config.Environment, e Endpoint) (exe string, basearg
ssh, _ := osEnv.Get("GIT_SSH")
sshCmd, _ := osEnv.Get("GIT_SSH_COMMAND")
cmdArgs := tools.QuotedFields(sshCmd)
if len(cmdArgs) > 0 {
needShell = true
ssh = cmdArgs[0]
cmd = sshCmd
}
ssh, cmd, needShell = sshParseShellCommand(sshCmd, ssh)
if ssh == "" {
ssh = defaultSSHCmd
sshCmd, _ := gitEnv.Get("core.sshcommand")
ssh, cmd, needShell = sshParseShellCommand(sshCmd, defaultSSHCmd)
}
if cmd == "" {

@ -220,7 +220,7 @@ func TestSSHGetLFSExeAndArgs(t *testing.T) {
endpoint.SshUserAndHost = "user@foo.com"
endpoint.SshPath = "user/repo"
exe, args := sshGetLFSExeAndArgs(cli.OSEnv(), endpoint, "GET")
exe, args := sshGetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint, "GET")
assert.Equal(t, "ssh", exe)
assert.Equal(t, []string{
"--",
@ -228,7 +228,7 @@ func TestSSHGetLFSExeAndArgs(t *testing.T) {
"git-lfs-authenticate user/repo download",
}, args)
exe, args = sshGetLFSExeAndArgs(cli.OSEnv(), endpoint, "HEAD")
exe, args = sshGetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint, "HEAD")
assert.Equal(t, "ssh", exe)
assert.Equal(t, []string{
"--",
@ -237,7 +237,7 @@ func TestSSHGetLFSExeAndArgs(t *testing.T) {
}, args)
// this is going by endpoint.Operation, implicitly set by Endpoint() on L15.
exe, args = sshGetLFSExeAndArgs(cli.OSEnv(), endpoint, "POST")
exe, args = sshGetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint, "POST")
assert.Equal(t, "ssh", exe)
assert.Equal(t, []string{
"--",
@ -246,7 +246,7 @@ func TestSSHGetLFSExeAndArgs(t *testing.T) {
}, args)
endpoint.Operation = "upload"
exe, args = sshGetLFSExeAndArgs(cli.OSEnv(), endpoint, "POST")
exe, args = sshGetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint, "POST")
assert.Equal(t, "ssh", exe)
assert.Equal(t, []string{
"--",
@ -265,7 +265,7 @@ func TestSSHGetExeAndArgsSsh(t *testing.T) {
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "ssh", exe)
assert.Equal(t, []string{"--", "user@foo.com"}, args)
}
@ -281,7 +281,7 @@ func TestSSHGetExeAndArgsSshCustomPort(t *testing.T) {
endpoint.SshUserAndHost = "user@foo.com"
endpoint.SshPort = "8888"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "ssh", exe)
assert.Equal(t, []string{"-p", "8888", "--", "user@foo.com"}, args)
}
@ -298,7 +298,7 @@ func TestSSHGetExeAndArgsPlink(t *testing.T) {
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, plink, exe)
assert.Equal(t, []string{"user@foo.com"}, args)
}
@ -316,7 +316,7 @@ func TestSSHGetExeAndArgsPlinkCustomPort(t *testing.T) {
endpoint.SshUserAndHost = "user@foo.com"
endpoint.SshPort = "8888"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, plink, exe)
assert.Equal(t, []string{"-P", "8888", "user@foo.com"}, args)
}
@ -333,7 +333,7 @@ func TestSSHGetExeAndArgsTortoisePlink(t *testing.T) {
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, plink, exe)
assert.Equal(t, []string{"-batch", "user@foo.com"}, args)
}
@ -351,7 +351,7 @@ func TestSSHGetExeAndArgsTortoisePlinkCustomPort(t *testing.T) {
endpoint.SshUserAndHost = "user@foo.com"
endpoint.SshPort = "8888"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, plink, exe)
assert.Equal(t, []string{"-batch", "-P", "8888", "user@foo.com"}, args)
}
@ -366,7 +366,7 @@ func TestSSHGetExeAndArgsSshCommandPrecedence(t *testing.T) {
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", "sshcmd user@foo.com"}, args)
}
@ -380,7 +380,7 @@ func TestSSHGetExeAndArgsSshCommandArgs(t *testing.T) {
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", "sshcmd --args 1 user@foo.com"}, args)
}
@ -394,7 +394,7 @@ func TestSSHGetExeAndArgsSshCommandArgsWithMixedQuotes(t *testing.T) {
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", "sshcmd foo 'bar \"baz\"' user@foo.com"}, args)
}
@ -409,11 +409,55 @@ func TestSSHGetExeAndArgsSshCommandCustomPort(t *testing.T) {
endpoint.SshUserAndHost = "user@foo.com"
endpoint.SshPort = "8888"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", "sshcmd -p 8888 user@foo.com"}, args)
}
func TestSSHGetExeAndArgsCoreSshCommand(t *testing.T) {
cli, err := NewClient(NewContext(nil, map[string]string{
"GIT_SSH_COMMAND": "sshcmd --args 2",
}, map[string]string{
"core.sshcommand": "sshcmd --args 1",
}))
require.Nil(t, err)
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", "sshcmd --args 2 user@foo.com"}, args)
}
func TestSSHGetExeAndArgsCoreSshCommandArgsWithMixedQuotes(t *testing.T) {
cli, err := NewClient(NewContext(nil, nil, map[string]string{
"core.sshcommand": "sshcmd foo 'bar \"baz\"'",
}))
require.Nil(t, err)
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", "sshcmd foo 'bar \"baz\"' user@foo.com"}, args)
}
func TestSSHGetExeAndArgsConfigVersusEnv(t *testing.T) {
cli, err := NewClient(NewContext(nil, nil, map[string]string{
"core.sshcommand": "sshcmd --args 1",
}))
require.Nil(t, err)
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", "sshcmd --args 1 user@foo.com"}, args)
}
func TestSSHGetLFSExeAndArgsWithCustomSSH(t *testing.T) {
cli, err := NewClient(NewContext(nil, map[string]string{
"GIT_SSH": "not-ssh",
@ -429,7 +473,7 @@ func TestSSHGetLFSExeAndArgsWithCustomSSH(t *testing.T) {
assert.Equal(t, "git@host.com", e.SshUserAndHost)
assert.Equal(t, "repo", e.SshPath)
exe, args := sshGetLFSExeAndArgs(cli.OSEnv(), e, "GET")
exe, args := sshGetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), e, "GET")
assert.Equal(t, "not-ssh", exe)
assert.Equal(t, []string{"-p", "12345", "git@host.com", "git-lfs-authenticate repo download"}, args)
}
@ -447,7 +491,7 @@ func TestSSHGetLFSExeAndArgsInvalidOptionsAsHost(t *testing.T) {
assert.Equal(t, "-oProxyCommand=gnome-calculator", e.SshUserAndHost)
assert.Equal(t, "repo", e.SshPath)
exe, args := sshGetLFSExeAndArgs(cli.OSEnv(), e, "GET")
exe, args := sshGetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), e, "GET")
assert.Equal(t, "ssh", exe)
assert.Equal(t, []string{"--", "-oProxyCommand=gnome-calculator", "git-lfs-authenticate repo download"}, args)
}
@ -467,7 +511,7 @@ func TestSSHGetLFSExeAndArgsInvalidOptionsAsHostWithCustomSSH(t *testing.T) {
assert.Equal(t, "--oProxyCommand=gnome-calculator", e.SshUserAndHost)
assert.Equal(t, "repo", e.SshPath)
exe, args := sshGetLFSExeAndArgs(cli.OSEnv(), e, "GET")
exe, args := sshGetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), e, "GET")
assert.Equal(t, "not-ssh", exe)
assert.Equal(t, []string{"oProxyCommand=gnome-calculator", "git-lfs-authenticate repo download"}, args)
}
@ -485,7 +529,7 @@ func TestSSHGetExeAndArgsInvalidOptionsAsHost(t *testing.T) {
assert.Equal(t, "-oProxyCommand=gnome-calculator", e.SshUserAndHost)
assert.Equal(t, "", e.SshPath)
exe, args, needShell := sshGetExeAndArgs(cli.OSEnv(), e)
exe, args, needShell := sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), e)
assert.Equal(t, "ssh", exe)
assert.Equal(t, []string{"--", "-oProxyCommand=gnome-calculator"}, args)
assert.Equal(t, false, needShell)
@ -504,7 +548,7 @@ func TestSSHGetExeAndArgsInvalidOptionsAsPath(t *testing.T) {
assert.Equal(t, "git@git-host.com", e.SshUserAndHost)
assert.Equal(t, "-oProxyCommand=gnome-calculator", e.SshPath)
exe, args, needShell := sshGetExeAndArgs(cli.OSEnv(), e)
exe, args, needShell := sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), e)
assert.Equal(t, "ssh", exe)
assert.Equal(t, []string{"--", "git@git-host.com"}, args)
assert.Equal(t, false, needShell)
@ -543,7 +587,7 @@ func TestSSHGetExeAndArgsPlinkCommand(t *testing.T) {
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", plink + " user@foo.com"}, args)
}
@ -560,7 +604,7 @@ func TestSSHGetExeAndArgsPlinkCommandCustomPort(t *testing.T) {
endpoint.SshUserAndHost = "user@foo.com"
endpoint.SshPort = "8888"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", plink + " -P 8888 user@foo.com"}, args)
}
@ -576,7 +620,7 @@ func TestSSHGetExeAndArgsTortoisePlinkCommand(t *testing.T) {
endpoint := Endpoint{Operation: "download"}
endpoint.SshUserAndHost = "user@foo.com"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", plink + " -batch user@foo.com"}, args)
}
@ -593,7 +637,7 @@ func TestSSHGetExeAndArgsTortoisePlinkCommandCustomPort(t *testing.T) {
endpoint.SshUserAndHost = "user@foo.com"
endpoint.SshPort = "8888"
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), endpoint))
exe, args := sshFormatArgs(sshGetExeAndArgs(cli.OSEnv(), cli.GitEnv(), endpoint))
assert.Equal(t, "sh", exe)
assert.Equal(t, []string{"-c", plink + " -batch -P 8888 user@foo.com"}, args)
}

@ -117,7 +117,11 @@ func performDownload(apiClient *lfsapi.Client, oid string, size int64, a *action
res, err := apiClient.DoWithAuth("origin", req)
if err != nil {
sendTransferError(oid, res.StatusCode, err.Error(), writer, errWriter)
statusCode := 6
if res != nil {
statusCode = res.StatusCode
}
sendTransferError(oid, statusCode, err.Error(), writer, errWriter)
return
}
defer res.Body.Close()