aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drive/files.go10
-rw-r--r--drive/print.go69
-rw-r--r--drive/types.go20
-rw-r--r--gdrive.go2
-rw-r--r--handlers.go10
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]
+}
diff --git a/gdrive.go b/gdrive.go
index cf1c6ca..e623aa8 100644
--- a/gdrive.go
+++ b/gdrive.go
@@ -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...")
}