func (ft *SftpTask) uploadDiffFiles(client *sftp.Client, ctx *builder.Context) error { return ctx.Diff.Walk(func(name string, entry *builder.DiffEntry) error { rel, _ := filepath.Rel(ctx.DstDir, name) rel = filepath.ToSlash(rel) if entry.Behavior == builder.DIFF_REMOVE { log15.Debug("Deploy.Sftp.Delete", "file", rel) return client.Remove(path.Join(ft.opt.Directory, rel)) } target := path.Join(ft.opt.Directory, rel) if entry.Behavior == builder.DIFF_KEEP { if fi, _ := client.Stat(target); fi != nil { // entry file should be older than uploaded file if entry.Time.Sub(fi.ModTime()).Seconds() < 0 { return nil } } } dirs := getDirs(path.Dir(rel)) for i := len(dirs) - 1; i >= 0; i-- { client.Mkdir(path.Join(ft.opt.Directory, dirs[i])) } // upload file f, err := os.Open(name) if err != nil { return err } defer f.Close() f2, err := client.Create(target) if err != nil { return err } defer f2.Close() if _, err = io.Copy(f2, f); err != nil { return err } log15.Debug("Deploy.Sftp.Stor", "file", rel) return nil }) }