diff --git a/command.go b/command.go index f7cdc6c..c6c792d 100644 --- a/command.go +++ b/command.go @@ -5,7 +5,7 @@ func rmcmd(os, target string) string { case "windows": return "DEL /F /S " + target case "unix": - return "rm -rf " + target + return "rm -rf '" + target + "'" } return "" } @@ -15,7 +15,7 @@ func mkdircmd(os, target string) string { case "windows": return "if not exist " + target + " mkdir " + target case "unix": - return "mkdir -p " + target + return "mkdir -p '" + target + "'" } return "" diff --git a/plugin.go b/plugin.go index 9cd1d09..7adc610 100644 --- a/plugin.go +++ b/plugin.go @@ -234,7 +234,7 @@ func (p *Plugin) buildUnTarArgs(target string) []string { args = append(args, "-C", - target, + "'"+target+"'", ) return args diff --git a/plugin_test.go b/plugin_test.go index e57e58f..35eeb94 100644 --- a/plugin_test.go +++ b/plugin_test.go @@ -577,11 +577,6 @@ func TestRemoveDestFile(t *testing.T) { systemType = "windows" } - _, _, _, err = ssh.Run("uname", plugin.Config.CommandTimeout) - if err == nil { - systemType = "unix" - } - // ssh io timeout err = plugin.removeDestFile(systemType, ssh) assert.Error(t, err) @@ -622,7 +617,7 @@ func TestPlugin_buildUnTarArgs(t *testing.T) { args: args{ target: "foo", }, - want: []string{"tar", "-zxf", "foo.tar.gz", "-C", "foo"}, + want: []string{"tar", "-zxf", "foo.tar.gz", "-C", "'foo'"}, }, { name: "strip components", @@ -638,7 +633,7 @@ func TestPlugin_buildUnTarArgs(t *testing.T) { args: args{ target: "foo", }, - want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "-C", "foo"}, + want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "-C", "'foo'"}, }, { name: "overwrite", @@ -654,7 +649,7 @@ func TestPlugin_buildUnTarArgs(t *testing.T) { args: args{ target: "foo", }, - want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "-C", "foo"}, + want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "-C", "'foo'"}, }, { name: "unlink first", @@ -670,7 +665,23 @@ func TestPlugin_buildUnTarArgs(t *testing.T) { args: args{ target: "foo", }, - want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "--unlink-first", "-C", "foo"}, + want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "--unlink-first", "-C", "'foo'"}, + }, + { + name: "output folder path with space", + fields: fields{ + Config: Config{ + TarExec: "tar", + StripComponents: 2, + Overwrite: true, + UnlinkFirst: true, + }, + DestFile: "foo.tar.gz", + }, + args: args{ + target: "foo bar", + }, + want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "--unlink-first", "-C", "'foo bar'"}, }, } for _, tt := range tests { @@ -758,3 +769,42 @@ func TestPlugin_buildTarArgs(t *testing.T) { }) } } + +func TestTargetFolderWithSpaces(t *testing.T) { + if os.Getenv("SSH_AUTH_SOCK") != "" { + if err := exec.Command("eval", "`ssh-agent -k`").Run(); err != nil { + t.Fatalf("exec: %v", err) + } + } + + u, err := user.Lookup("drone-scp") + if err != nil { + t.Fatalf("Lookup: %v", err) + } + + plugin := Plugin{ + Config: Config{ + Host: []string{"localhost"}, + Username: "drone-scp", + Port: "22", + KeyPath: "tests/.ssh/id_rsa", + Source: []string{"tests/global/*"}, + StripComponents: 2, + Target: []string{filepath.Join(u.HomeDir, "123 456 789")}, + CommandTimeout: 60 * time.Second, + TarExec: "tar", + }, + } + + err = plugin.Exec() + assert.Nil(t, err) + + // check file exist + if _, err := os.Stat(filepath.Join(u.HomeDir, "123 456 789", "c.txt")); os.IsNotExist(err) { + t.Fatalf("SCP-error: %v", err) + } + + if _, err := os.Stat(filepath.Join(u.HomeDir, "123 456 789", "d.txt")); os.IsNotExist(err) { + t.Fatalf("SCP-error: %v", err) + } +}