9c46a38281
When using the pure SSH-based protocol, we can get much higher speeds by multiplexing multiple connections on the same SSH connection. If we're using OpenSSH, let's enable the ControlMaster option unless lfs.ssh.automultiplex is set to false, and multiplex these shell operations over one connection. We prefer XDG_RUNTIME_DIR because it's guaranteed to be private and we can share many connections over one socket, but if that's not set, let's default to creating a new temporary directory for the socket. On Windows, where the native SSH client doesn't support ControlMaster, we should fall back to using multiple connections since we use ControlMaster=auto. Note that the option exists because users may already be using SSH multiplexing and we would want to provide a way for them to disable this, in addition to the case where users have an old or broken OpenSSH which cannot support this option. We pass the connection object into each worker and adjust our transfer code to pass it into each function we invoke. We also make sure to properly terminate each connection at the end by reducing our connection count to 0, which closes the extra (i.e., all) connections. Co-authored-by: Chris Darroch <chrisd8088@github.com>
547 lines
17 KiB
Go
547 lines
17 KiB
Go
package ssh_test
|
|
|
|
import (
|
|
"net/url"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/git-lfs/git-lfs/lfshttp"
|
|
"github.com/git-lfs/git-lfs/ssh"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestSSHGetLFSExeAndArgs(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(nil)
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Path = "user/repo"
|
|
|
|
exe, args := ssh.GetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, "git-lfs-authenticate", "download", false)
|
|
assert.Equal(t, "ssh", exe)
|
|
assert.Equal(t, []string{
|
|
"--",
|
|
"user@foo.com",
|
|
"git-lfs-authenticate user/repo download",
|
|
}, args)
|
|
|
|
exe, args = ssh.GetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, "git-lfs-authenticate", "upload", false)
|
|
assert.Equal(t, "ssh", exe)
|
|
assert.Equal(t, []string{
|
|
"--",
|
|
"user@foo.com",
|
|
"git-lfs-authenticate user/repo upload",
|
|
}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsSsh(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": "",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "ssh", exe)
|
|
assert.Equal(t, []string{"--", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsSshCustomPort(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": "",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "ssh", exe)
|
|
assert.Equal(t, []string{"-p", "8888", "--", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsPlink(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "plink.exe")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsPlinkCustomPort(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "plink")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"-P", "8888", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsPlinkCustomPortExplicitEnvironment(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "ssh")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
"GIT_SSH_VARIANT": "plink",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"-P", "8888", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsPlinkCustomPortExplicitEnvironmentPutty(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "ssh")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
"GIT_SSH_VARIANT": "putty",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"-P", "8888", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsPlinkCustomPortExplicitEnvironmentSsh(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "ssh")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
"GIT_SSH_VARIANT": "ssh",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"-p", "8888", "--", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsTortoisePlink(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "tortoiseplink.exe")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"-batch", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsTortoisePlinkCustomPort(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "tortoiseplink")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"-batch", "-P", "8888", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsTortoisePlinkCustomPortExplicitEnvironment(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "ssh")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
"GIT_SSH_VARIANT": "tortoiseplink",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"-batch", "-P", "8888", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsTortoisePlinkCustomPortExplicitConfig(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "ssh")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
"GIT_SSH_VARIANT": "tortoiseplink",
|
|
}, map[string]string{
|
|
"ssh.variant": "tortoiseplink",
|
|
}))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"-batch", "-P", "8888", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsTortoisePlinkCustomPortExplicitConfigOverride(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "ssh")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "",
|
|
"GIT_SSH": plink,
|
|
}, map[string]string{
|
|
"ssh.variant": "putty",
|
|
}))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, plink, exe)
|
|
assert.Equal(t, []string{"-P", "8888", "user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsSshCommandPrecedence(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "sshcmd",
|
|
"GIT_SSH": "bad",
|
|
"GIT_SSH_VARIANT": "simple",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", "sshcmd user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsSshCommandArgs(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "sshcmd --args 1",
|
|
"GIT_SSH_VARIANT": "simple",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", "sshcmd --args 1 user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsSshCommandArgsWithMixedQuotes(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "sshcmd foo 'bar \"baz\"'",
|
|
"GIT_SSH_VARIANT": "simple",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", "sshcmd foo 'bar \"baz\"' user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsSshCommandCustomPort(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "sshcmd",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", "sshcmd -p 8888 -- user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsCoreSshCommand(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": "sshcmd --args 2",
|
|
}, map[string]string{
|
|
"core.sshcommand": "sshcmd --args 1",
|
|
}))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", "sshcmd --args 2 -- user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsCoreSshCommandArgsWithMixedQuotes(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, nil, map[string]string{
|
|
"core.sshcommand": "sshcmd foo 'bar \"baz\"'",
|
|
}))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
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 := lfshttp.NewClient(lfshttp.NewContext(nil, nil, map[string]string{
|
|
"core.sshcommand": "sshcmd --args 1",
|
|
}))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", "sshcmd --args 1 -- user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsPlinkCommand(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "plink.exe")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": plink,
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", plink + " user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsPlinkCommandCustomPort(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "plink")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": plink,
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", plink + " -P 8888 user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsTortoisePlinkCommand(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "tortoiseplink.exe")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": plink,
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", plink + " -batch user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsTortoisePlinkCommandCustomPort(t *testing.T) {
|
|
plink := filepath.Join("Users", "joebloggs", "bin", "tortoiseplink")
|
|
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH_COMMAND": plink,
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
meta := ssh.SSHMetadata{}
|
|
meta.UserAndHost = "user@foo.com"
|
|
meta.Port = "8888"
|
|
|
|
exe, args := ssh.FormatArgs(ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &meta, false))
|
|
assert.Equal(t, "sh", exe)
|
|
assert.Equal(t, []string{"-c", plink + " -batch -P 8888 user@foo.com"}, args)
|
|
}
|
|
|
|
func TestSSHGetLFSExeAndArgsWithCustomSSH(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH": "not-ssh",
|
|
"GIT_SSH_VARIANT": "simple",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
u, err := url.Parse("ssh://git@host.com:12345/repo")
|
|
require.Nil(t, err)
|
|
|
|
e := lfshttp.EndpointFromSshUrl(u)
|
|
t.Logf("ENDPOINT: %+v", e)
|
|
assert.Equal(t, "12345", e.SSHMetadata.Port)
|
|
assert.Equal(t, "git@host.com", e.SSHMetadata.UserAndHost)
|
|
assert.Equal(t, "repo", e.SSHMetadata.Path)
|
|
|
|
exe, args := ssh.GetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), &e.SSHMetadata, "git-lfs-authenticate", "download", false)
|
|
assert.Equal(t, "not-ssh", exe)
|
|
assert.Equal(t, []string{"-p", "12345", "git@host.com", "git-lfs-authenticate repo download"}, args)
|
|
}
|
|
|
|
func TestSSHGetLFSExeAndArgsInvalidOptionsAsHost(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(nil)
|
|
require.Nil(t, err)
|
|
|
|
u, err := url.Parse("ssh://-oProxyCommand=gnome-calculator/repo")
|
|
require.Nil(t, err)
|
|
assert.Equal(t, "-oProxyCommand=gnome-calculator", u.Host)
|
|
|
|
e := lfshttp.EndpointFromSshUrl(u)
|
|
t.Logf("ENDPOINT: %+v", e)
|
|
assert.Equal(t, "-oProxyCommand=gnome-calculator", e.SSHMetadata.UserAndHost)
|
|
assert.Equal(t, "repo", e.SSHMetadata.Path)
|
|
|
|
exe, args := ssh.GetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), &e.SSHMetadata, "git-lfs-authenticate", "download", false)
|
|
assert.Equal(t, "ssh", exe)
|
|
assert.Equal(t, []string{"--", "-oProxyCommand=gnome-calculator", "git-lfs-authenticate repo download"}, args)
|
|
}
|
|
|
|
func TestSSHGetLFSExeAndArgsInvalidOptionsAsHostWithCustomSSH(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(lfshttp.NewContext(nil, map[string]string{
|
|
"GIT_SSH": "not-ssh",
|
|
"GIT_SSH_VARIANT": "simple",
|
|
}, nil))
|
|
require.Nil(t, err)
|
|
|
|
u, err := url.Parse("ssh://--oProxyCommand=gnome-calculator/repo")
|
|
require.Nil(t, err)
|
|
assert.Equal(t, "--oProxyCommand=gnome-calculator", u.Host)
|
|
|
|
e := lfshttp.EndpointFromSshUrl(u)
|
|
t.Logf("ENDPOINT: %+v", e)
|
|
assert.Equal(t, "--oProxyCommand=gnome-calculator", e.SSHMetadata.UserAndHost)
|
|
assert.Equal(t, "repo", e.SSHMetadata.Path)
|
|
|
|
exe, args := ssh.GetLFSExeAndArgs(cli.OSEnv(), cli.GitEnv(), &e.SSHMetadata, "git-lfs-authenticate", "download", false)
|
|
assert.Equal(t, "not-ssh", exe)
|
|
assert.Equal(t, []string{"oProxyCommand=gnome-calculator", "git-lfs-authenticate repo download"}, args)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsInvalidOptionsAsHost(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(nil)
|
|
require.Nil(t, err)
|
|
|
|
u, err := url.Parse("ssh://-oProxyCommand=gnome-calculator")
|
|
require.Nil(t, err)
|
|
assert.Equal(t, "-oProxyCommand=gnome-calculator", u.Host)
|
|
|
|
e := lfshttp.EndpointFromSshUrl(u)
|
|
t.Logf("ENDPOINT: %+v", e)
|
|
assert.Equal(t, "-oProxyCommand=gnome-calculator", e.SSHMetadata.UserAndHost)
|
|
assert.Equal(t, "", e.SSHMetadata.Path)
|
|
|
|
exe, args, needShell := ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &e.SSHMetadata, false)
|
|
assert.Equal(t, "ssh", exe)
|
|
assert.Equal(t, []string{"--", "-oProxyCommand=gnome-calculator"}, args)
|
|
assert.Equal(t, false, needShell)
|
|
}
|
|
|
|
func TestSSHGetExeAndArgsInvalidOptionsAsPath(t *testing.T) {
|
|
cli, err := lfshttp.NewClient(nil)
|
|
require.Nil(t, err)
|
|
|
|
u, err := url.Parse("ssh://git@git-host.com/-oProxyCommand=gnome-calculator")
|
|
require.Nil(t, err)
|
|
assert.Equal(t, "git-host.com", u.Host)
|
|
|
|
e := lfshttp.EndpointFromSshUrl(u)
|
|
t.Logf("ENDPOINT: %+v", e)
|
|
assert.Equal(t, "git@git-host.com", e.SSHMetadata.UserAndHost)
|
|
assert.Equal(t, "-oProxyCommand=gnome-calculator", e.SSHMetadata.Path)
|
|
|
|
exe, args, needShell := ssh.GetExeAndArgs(cli.OSEnv(), cli.GitEnv(), &e.SSHMetadata, false)
|
|
assert.Equal(t, "ssh", exe)
|
|
assert.Equal(t, []string{"--", "git@git-host.com"}, args)
|
|
assert.Equal(t, false, needShell)
|
|
}
|
|
|
|
func TestParseBareSSHUrl(t *testing.T) {
|
|
e := lfshttp.EndpointFromBareSshUrl("git@git-host.com:repo.git")
|
|
t.Logf("endpoint: %+v", e)
|
|
assert.Equal(t, "git@git-host.com", e.SSHMetadata.UserAndHost)
|
|
assert.Equal(t, "repo.git", e.SSHMetadata.Path)
|
|
|
|
e = lfshttp.EndpointFromBareSshUrl("git@git-host.com/should-be-a-colon.git")
|
|
t.Logf("endpoint: %+v", e)
|
|
assert.Equal(t, "", e.SSHMetadata.UserAndHost)
|
|
assert.Equal(t, "", e.SSHMetadata.Path)
|
|
|
|
e = lfshttp.EndpointFromBareSshUrl("-oProxyCommand=gnome-calculator")
|
|
t.Logf("endpoint: %+v", e)
|
|
assert.Equal(t, "", e.SSHMetadata.UserAndHost)
|
|
assert.Equal(t, "", e.SSHMetadata.Path)
|
|
|
|
e = lfshttp.EndpointFromBareSshUrl("git@git-host.com:-oProxyCommand=gnome-calculator")
|
|
t.Logf("endpoint: %+v", e)
|
|
assert.Equal(t, "git@git-host.com", e.SSHMetadata.UserAndHost)
|
|
assert.Equal(t, "-oProxyCommand=gnome-calculator", e.SSHMetadata.Path)
|
|
}
|