diff options
| -rw-r--r-- | drive/files.go | 10 | ||||
| -rw-r--r-- | drive/print.go | 69 | ||||
| -rw-r--r-- | drive/types.go | 20 | ||||
| -rw-r--r-- | gdrive.go | 2 | ||||
| -rw-r--r-- | handlers.go | 10 |
5 files changed, 110 insertions, 1 deletions
diff --git a/drive/files.go b/drive/files.go index 138202a..f1a4b97 100644 --- a/drive/files.go +++ b/drive/files.go @@ -103,6 +103,16 @@ func (self *Drive) Upload(args UploadFileArgs) { //} } +func (self *Drive) Info(args FileInfoArgs) { + f, err := self.service.Files.Get(args.Id).Fields("id", "name", "size", "createdTime", "modifiedTime", "md5Checksum", "mimeType", "parents", "shared", "description").Do() + errorF(err, "Failed to get file: %s", err) + + PrintFileInfo(PrintFileInfoArgs{ + File: f, + SizeInBytes: args.SizeInBytes, + }) +} + //func newFile(args UploadFileArgs) *drive.File { // //} diff --git a/drive/print.go b/drive/print.go new file mode 100644 index 0000000..5473690 --- /dev/null +++ b/drive/print.go @@ -0,0 +1,69 @@ +package drive + +import ( + "fmt" + "strings" + "strconv" + "time" +) + + +func PrintFileInfo(args PrintFileInfoArgs) { + f := args.File + + items := []kv{ + kv{"Id", f.Id}, + kv{"Name", f.Name}, + kv{"Description", f.Description}, + kv{"Mime", f.MimeType}, + kv{"Size", formatSize(f.Size, args.SizeInBytes)}, + kv{"Created", formatDatetime(f.CreatedTime)}, + kv{"Modified", formatDatetime(f.ModifiedTime)}, + kv{"Md5sum", f.Md5Checksum}, + kv{"Shared", formatBool(f.Shared)}, + kv{"Parents", formatList(f.Parents)}, + } + + for _, item := range items { + if item.value() != "" { + fmt.Printf("%s: %s\n", item.key(), item.value()) + } + } +} + + +func formatList(a []string) string { + return strings.Join(a, ", ") +} + +func formatSize(bytes int64, forceBytes bool) string { + if forceBytes { + return fmt.Sprintf("%v B", bytes) + } + + units := []string{"B", "KB", "MB", "GB", "TB", "PB"} + + var i int + value := float64(bytes) + + for value > 1000 { + value /= 1000 + i++ + } + return fmt.Sprintf("%.1f %s", value, units[i]) +} + +func formatBool(b bool) string { + return strings.Title(strconv.FormatBool(b)) +} + +func formatDatetime(iso string) string { + t, err := time.Parse(time.RFC3339, iso) + if err != nil { + return iso + } + local := t.Local() + year, month, day := local.Date() + hour, min, sec := local.Clock() + return fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec) +} diff --git a/drive/types.go b/drive/types.go index 6c1bd14..ecf92a1 100644 --- a/drive/types.go +++ b/drive/types.go @@ -45,3 +45,23 @@ type UploadFileArgs struct { Stdin bool Share bool } + +type FileInfoArgs struct { + Id string + SizeInBytes bool +} + +type PrintFileInfoArgs struct { + File *drive.File + SizeInBytes bool +} + +type kv [2]string + +func (self kv) key() string { + return self[0] +} + +func (self kv) value() string { + return self[1] +} @@ -142,7 +142,7 @@ func main() { &cli.Handler{ Pattern: "[global options] info [options] <id>", Description: "Show file info", - Callback: handler, + Callback: infoHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ diff --git a/handlers.go b/handlers.go index 426f089..f681a2d 100644 --- a/handlers.go +++ b/handlers.go @@ -47,6 +47,16 @@ func uploadHandler(ctx cli.Context) { }) } +func infoHandler(ctx cli.Context) { + args := ctx.Args() + gdrive := newDrive() + + gdrive.Info(drive.FileInfoArgs{ + Id: args.String("id"), + SizeInBytes: args.Bool("sizeInBytes"), + }) +} + func deleteHandler(ctx cli.Context) { fmt.Println("Deleting...") } |
