114 строки
1.8 KiB
Go
114 строки
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
func get(args []string) {
|
|
if len(args) == 0 || len(args) > 2 {
|
|
printHelp()
|
|
}
|
|
|
|
sources, nn, err := normalizePaths(args[0:1])
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
|
|
source := sources[0]
|
|
var dest string
|
|
if len(args) == 2 {
|
|
dest = args[1]
|
|
} else {
|
|
cwd, err := os.Getwd()
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
|
|
_, name := path.Split(source)
|
|
dest = filepath.Join(cwd, name)
|
|
}
|
|
|
|
client, err := getClient(nn)
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
|
|
err = walk(client, source, func(p string, fi os.FileInfo) {
|
|
fullDest := filepath.Join(dest, strings.TrimPrefix(p, source))
|
|
|
|
if fi.IsDir() {
|
|
err = os.Mkdir(fullDest, 0755)
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
} else {
|
|
err = client.CopyToLocal(p, fullDest)
|
|
if pathErr, ok := err.(*os.PathError); ok {
|
|
fatal(pathErr)
|
|
} else if err != nil {
|
|
fatal(err)
|
|
}
|
|
}
|
|
})
|
|
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
}
|
|
|
|
func getmerge(args []string, addNewlines bool) {
|
|
if len(args) != 2 {
|
|
printHelp()
|
|
}
|
|
|
|
dest := args[1]
|
|
sources, nn, err := normalizePaths(args[0:1])
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
|
|
client, err := getClient(nn)
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
|
|
local, err := os.Create(dest)
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
|
|
source := sources[0]
|
|
children, err := client.ReadDir(source)
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
|
|
readers := make([]io.Reader, 0, len(children))
|
|
for _, child := range children {
|
|
if child.IsDir() {
|
|
continue
|
|
}
|
|
|
|
childPath := path.Join(source, child.Name())
|
|
file, err := client.Open(childPath)
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
|
|
readers = append(readers, file)
|
|
if addNewlines {
|
|
readers = append(readers, bytes.NewBufferString("\n"))
|
|
}
|
|
}
|
|
|
|
_, err = io.Copy(local, io.MultiReader(readers...))
|
|
if err != nil {
|
|
fatal(err)
|
|
}
|
|
}
|