package repl /* import ( "fmt" "io" "os" "path/filepath" "strconv" "strings" "time" "github.com/inhies/go-bytesize" "github.com/spf13/cobra" "gitlink.org.cn/cloudream/jcs-pub/client/internal/config" cdssdk "gitlink.org.cn/cloudream/jcs-pub/client/types" "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/iterator" ) func init() { var usePkgID bool cmd := &cobra.Command{ Use: "getp", Short: "Download whole package by package id or path", Args: cobra.ExactArgs(2), Run: func(cmd *cobra.Command, args []string) { cmdCtx := GetCmdCtx(cmd) if usePkgID { id, err := strconv.ParseInt(args[0], 10, 64) if err != nil { fmt.Printf("Invalid package id: %s\n", args[0]) return } getpByID(cmdCtx, cdssdk.PackageID(id), args[1]) } else { getpByPath(cmdCtx, args[0], args[1]) } }, } cmd.Flags().BoolVarP(&usePkgID, "id", "i", false, "Download with package id instead of path") RootCmd.AddCommand(cmd) } func getpByPath(cmdCtx *CommandContext, path string, output string) { comps := strings.Split(strings.Trim(path, cdssdk.ObjectPathSeparator), cdssdk.ObjectPathSeparator) if len(comps) != 2 { fmt.Printf("Package path must be in format of /") return } pkg, err := cmdCtx.Cmdline.Svc.PackageSvc().GetByFullName(comps[0], comps[1]) if err != nil { fmt.Println(err) return } getpByID(cmdCtx, pkg.PackageID, output) } func getpByID(cmdCtx *CommandContext, id cdssdk.PackageID, output string) { startTime := time.Now() objIter, err := cmdCtx.Cmdline.Svc.PackageSvc().DownloadPackage(id) if err != nil { fmt.Println(err) return } err = os.MkdirAll(output, os.ModePerm) if err != nil { fmt.Printf("Create output directory %s failed, err: %v", output, err) return } defer objIter.Close() madeDirs := make(map[string]bool) fileCount := 0 totalSize := int64(0) for { objInfo, err := objIter.MoveNext() if err == iterator.ErrNoMoreItem { break } if err != nil { fmt.Println(err) return } err = func() error { defer objInfo.File.Close() fileCount++ totalSize += objInfo.Object.Size fullPath := filepath.Join(output, objInfo.Object.Path) dirPath := filepath.Dir(fullPath) if !madeDirs[dirPath] { if err := os.MkdirAll(dirPath, 0755); err != nil { return fmt.Errorf("creating object dir: %w", err) } madeDirs[dirPath] = true } outputFile, err := os.Create(fullPath) if err != nil { return fmt.Errorf("creating object file: %w", err) } defer outputFile.Close() _, err = io.Copy(outputFile, objInfo.File) if err != nil { return fmt.Errorf("copy object data to local file failed, err: %w", err) } if config.Cfg().UserSpaceID > 0 { cmdCtx.Cmdline.Svc.AccessStat.AddAccessCounter(objInfo.Object.ObjectID, id, config.Cfg().UserSpaceID, 1) } return nil }() if err != nil { fmt.Println(err) return } } fmt.Printf("Get %v files (%v) to %s in %v.\n", fileCount, bytesize.ByteSize(totalSize), output, time.Since(startTime)) } */