124 lines
2.8 KiB
Go
124 lines
2.8 KiB
Go
package cmdline
|
|
|
|
/*
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/inhies/go-bytesize"
|
|
"github.com/spf13/cobra"
|
|
"gitlink.org.cn/cloudream/common/consts/errorcode"
|
|
"gitlink.org.cn/cloudream/common/pkgs/mq"
|
|
cdssdk "gitlink.org.cn/cloudream/jcs-pub/client/types"
|
|
)
|
|
|
|
func init() {
|
|
var stgID int64
|
|
cmd := &cobra.Command{
|
|
Use: "put [local] [remote]",
|
|
Short: "Upload files to CDS",
|
|
Args: func(cmd *cobra.Command, args []string) error {
|
|
if err := cobra.ExactArgs(2)(cmd, args); err != nil {
|
|
return err
|
|
}
|
|
|
|
remote := args[1]
|
|
comps := strings.Split(strings.Trim(remote, cdssdk.ObjectPathSeparator), cdssdk.ObjectPathSeparator)
|
|
if len(comps) != 2 {
|
|
return fmt.Errorf("invalid remote path: %s, which must be in format of <bucket>/<package>", remote)
|
|
}
|
|
|
|
return nil
|
|
},
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
cmdCtx := GetCmdCtx(cmd)
|
|
|
|
local := args[0]
|
|
remote := args[1]
|
|
comps := strings.Split(strings.Trim(remote, cdssdk.ObjectPathSeparator), cdssdk.ObjectPathSeparator)
|
|
|
|
startTime := time.Now()
|
|
|
|
bkt, err := cmdCtx.Cmdline.Svc.BucketSvc().GetBucketByName(comps[0])
|
|
if err != nil {
|
|
fmt.Printf("getting bucket: %v\n", err)
|
|
return
|
|
}
|
|
|
|
pkg, err := cmdCtx.Cmdline.Svc.PackageSvc().GetByFullName(comps[0], comps[1])
|
|
if err != nil {
|
|
if codeMsg, ok := err.(*mq.CodeMessageError); ok && codeMsg.Code == errorcode.DataNotFound {
|
|
pkg2, err := cmdCtx.Cmdline.Svc.PackageSvc().Create(bkt.BucketID, comps[1])
|
|
if err != nil {
|
|
fmt.Printf("creating package: %v\n", err)
|
|
return
|
|
}
|
|
pkg = &pkg2
|
|
|
|
} else {
|
|
fmt.Printf("getting package: %v\n", err)
|
|
return
|
|
}
|
|
}
|
|
var spaceAff cdssdk.UserSpaceID
|
|
if stgID != 0 {
|
|
spaceAff = cdssdk.UserSpaceID(stgID)
|
|
}
|
|
|
|
up, err := cmdCtx.Cmdline.Svc.Uploader.BeginUpdate(pkg.PackageID, spaceAff, nil, nil)
|
|
if err != nil {
|
|
fmt.Printf("begin updating package: %v\n", err)
|
|
return
|
|
}
|
|
defer up.Abort()
|
|
|
|
var fileCount int
|
|
var totalSize int64
|
|
err = filepath.WalkDir(local, func(fname string, fi os.DirEntry, err error) error {
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
if fi.IsDir() {
|
|
return nil
|
|
}
|
|
|
|
fileCount++
|
|
|
|
info, err := fi.Info()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
totalSize += info.Size()
|
|
|
|
file, err := os.Open(fname)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
return up.Upload(fname, file)
|
|
})
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return
|
|
}
|
|
|
|
_, err = up.Commit()
|
|
if err != nil {
|
|
fmt.Printf("committing package: %v\n", err)
|
|
return
|
|
}
|
|
|
|
fmt.Printf("Put %v files (%v) to %s in %v.\n", fileCount, bytesize.ByteSize(totalSize), remote, time.Since(startTime))
|
|
},
|
|
}
|
|
cmd.Flags().Int64VarP(&stgID, "storage", "s", 0, "storage affinity")
|
|
|
|
RootCmd.AddCommand(cmd)
|
|
}
|
|
*/
|