diff options
| -rw-r--r-- | drive/revision_list.go | 62 | ||||
| -rw-r--r-- | gdrive.go | 28 | ||||
| -rw-r--r-- | handlers.go | 12 | 
3 files changed, 102 insertions, 0 deletions
| diff --git a/drive/revision_list.go b/drive/revision_list.go new file mode 100644 index 0000000..941fbca --- /dev/null +++ b/drive/revision_list.go @@ -0,0 +1,62 @@ +package drive + +import ( +    "fmt" +    "io" +    "text/tabwriter" +    "google.golang.org/api/drive/v3" +) + +type ListRevisionsArgs struct { +    Out io.Writer +    Id string +    NameWidth int64 +    SkipHeader bool +    SizeInBytes bool +} + +func (self *Drive) ListRevisions(args ListRevisionsArgs) (err error) { +    revList, err := self.service.Revisions.List(args.Id).Fields("revisions(id,keepForever,size,modifiedTime,originalFilename)").Do() +    if err != nil { +        return fmt.Errorf("Failed listing revisions: %s", err) +    } + +    PrintRevisionList(PrintRevisionListArgs{ +        Out: args.Out, +        Revisions: revList.Revisions, +        NameWidth: int(args.NameWidth), +        SkipHeader: args.SkipHeader, +        SizeInBytes: args.SizeInBytes, +    }) + +    return +} + +type PrintRevisionListArgs struct { +    Out io.Writer +    Revisions []*drive.Revision +    NameWidth int +    SkipHeader bool +    SizeInBytes bool +} + +func PrintRevisionList(args PrintRevisionListArgs) { +    w := new(tabwriter.Writer) +    w.Init(args.Out, 0, 0, 3, ' ', 0) + +    if !args.SkipHeader { +        fmt.Fprintln(w, "Id\tName\tSize\tModified\tKeepForever") +    } + +    for _, rev := range args.Revisions { +        fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\n", +            rev.Id, +            truncateString(rev.OriginalFilename, args.NameWidth), +            formatSize(rev.Size, args.SizeInBytes), +            formatDatetime(rev.ModifiedTime), +            formatBool(rev.KeepForever), +        ) +    } + +    w.Flush() +} @@ -69,6 +69,34 @@ func main() {              },          },          &cli.Handler{ +            Pattern: "[global options] list revisions [options] <id>", +            Description: "List file revisions", +            Callback: listRevisionsHandler, +            Flags: cli.Flags{ +                "global options": globalFlags, +                "options": []cli.Flag{ +                    cli.IntFlag{ +                        Name: "nameWidth", +                        Patterns: []string{"--name-width"}, +                        Description: fmt.Sprintf("Width of name column, default: %d, minimum: 9, use 0 for full width", DefaultNameWidth), +                        DefaultValue: DefaultNameWidth, +                    }, +                    cli.BoolFlag{ +                        Name: "skipHeader", +                        Patterns: []string{"--no-header"}, +                        Description: "Dont print the header", +                        OmitValue: true, +                    }, +                    cli.BoolFlag{ +                        Name: "sizeInBytes", +                        Patterns: []string{"--bytes"}, +                        Description: "Size in bytes", +                        OmitValue: true, +                    }, +                }, +            }, +        }, +        &cli.Handler{              Pattern: "[global options] download [options] <id>",              Description: "Download file or directory",              Callback: downloadHandler, diff --git a/handlers.go b/handlers.go index 31a1887..5e681ab 100644 --- a/handlers.go +++ b/handlers.go @@ -76,6 +76,18 @@ func exportHandler(ctx cli.Context) {      checkErr(err)  } +func listRevisionsHandler(ctx cli.Context) { +    args := ctx.Args() +    err := newDrive(args).ListRevisions(drive.ListRevisionsArgs{ +        Out: os.Stdout, +        Id: args.String("id"), +        NameWidth: args.Int64("nameWidth"), +        SizeInBytes: args.Bool("sizeInBytes"), +        SkipHeader: args.Bool("skipHeader"), +    }) +    checkErr(err) +} +  func mkdirHandler(ctx cli.Context) {      args := ctx.Args()      err := newDrive(args).Mkdir(drive.MkdirArgs{ | 
