From 521542bbe1bd7a681293c900c208ce42877cb4bf Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Sat, 29 Mar 2014 15:44:42 +0000 Subject: [PATCH] added large file support --- remote/remote_test.go | 3 ++- remote/ssh.go | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/remote/remote_test.go b/remote/remote_test.go index 9c8b91738..d7c55400c 100644 --- a/remote/remote_test.go +++ b/remote/remote_test.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "os" + "strings" "testing" . "github.com/smartystreets/goconvey/convey" ) @@ -18,7 +19,7 @@ func TestRemote(t *testing.T) { err = ssh.Launch("sleep 10 && date", "background") So(err, ShouldEqual, nil) content, _ := ssh.Run("date", false) - ssh.CopyTo([]byte(content), "uploadfile") + ssh.CopyTo(strings.NewReader(content), "uploadfile") results, _ := ssh.CopyFrom("uploadfile") ok := bytes.Equal([]byte(content), results) So(ok, ShouldEqual, true) diff --git a/remote/ssh.go b/remote/ssh.go index cbb70b251..a0a14444a 100644 --- a/remote/ssh.go +++ b/remote/ssh.go @@ -85,7 +85,7 @@ func (self *SSH) Run(command string, sudo bool) (string, error) { return b.String(), nil } -func (self *SSH) CopyTo(content []byte, dest_name string) error { +func (self *SSH) CopyTo(content io.Reader, dest_name string) error { session, err := self.client.NewSession() defer session.Close() @@ -93,7 +93,25 @@ func (self *SSH) CopyTo(content []byte, dest_name string) error { go func() { w, _ := session.StdinPipe() defer w.Close() - w.Write(content) + // w.Write(content) + + buf := make([]byte, 4096) + for { + // read a chunk + n, err := content.Read(buf) + if err != nil && err != io.EOF { + panic(err) + } + if n == 0 { + break + } + + // write a chunk + if _, err := w.Write(buf[:n]); err != nil { + panic(err) + } + } + }() err = session.Run(fmt.Sprintf("/bin/cat >%s", dest_name)) return err