diff options
| -rw-r--r-- | drive/changes.go | 103 | ||||
| -rw-r--r-- | gdrive.go | 41 | ||||
| -rw-r--r-- | handlers_drive.go | 13 |
3 files changed, 157 insertions, 0 deletions
diff --git a/drive/changes.go b/drive/changes.go new file mode 100644 index 0000000..1d9a89d --- /dev/null +++ b/drive/changes.go @@ -0,0 +1,103 @@ +package drive + +import ( + "fmt" + "io" + "text/tabwriter" + "google.golang.org/api/drive/v3" +) + +type ListChangesArgs struct { + Out io.Writer + PageToken string + MaxChanges int64 + Now bool + NameWidth int64 + SkipHeader bool +} + +func (self *Drive) ListChanges(args ListChangesArgs) error { + if args.Now { + pageToken, err := self.GetChangesStartPageToken() + if err != nil { + return err + } + + fmt.Fprintf(args.Out, "Page token: %s\n", pageToken) + return nil + } + + changeList, err := self.service.Changes.List(args.PageToken).PageSize(args.MaxChanges).RestrictToMyDrive(true).Fields("newStartPageToken", "nextPageToken", "changes(fileId,removed,time,file(id,name,md5Checksum,mimeType,createdTime,modifiedTime))").Do() + if err != nil { + return fmt.Errorf("Failed listing changes: %s", err) + } + + PrintChanges(PrintChangesArgs{ + Out: args.Out, + ChangeList: changeList, + NameWidth: int(args.NameWidth), + SkipHeader: args.SkipHeader, + }) + + return nil +} + +func (self *Drive) GetChangesStartPageToken() (string, error) { + res, err := self.service.Changes.GetStartPageToken().Do() + if err != nil { + return "", fmt.Errorf("Failed getting start page token: %s", err) + } + + return res.StartPageToken, nil +} + +type PrintChangesArgs struct { + Out io.Writer + ChangeList *drive.ChangeList + NameWidth int + SkipHeader bool +} + +func PrintChanges(args PrintChangesArgs) { + w := new(tabwriter.Writer) + w.Init(args.Out, 0, 0, 3, ' ', 0) + + if !args.SkipHeader { + fmt.Fprintln(w, "Id\tName\tAction\tTime") + } + + for _, c := range args.ChangeList.Changes { + var name string + var action string + + if c.Removed { + action = "remove" + } else { + name = c.File.Name + action = "update" + } + + fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", + c.FileId, + truncateString(name, args.NameWidth), + action, + formatDatetime(c.Time), + ) + } + + if len(args.ChangeList.Changes) > 0 { + w.Flush() + pageToken, hasMore := nextChangesPageToken(args.ChangeList) + fmt.Fprintf(args.Out, "\nToken: %s, more: %t\n", pageToken, hasMore) + } else { + fmt.Fprintln(args.Out, "No changes") + } +} + +func nextChangesPageToken(cl *drive.ChangeList) (string, bool) { + if cl.NextPageToken != "" { + return cl.NextPageToken, true + } + + return cl.NewStartPageToken, false +} @@ -10,6 +10,7 @@ const Name = "gdrive" const Version = "2.0.0" const DefaultMaxFiles = 30 +const DefaultMaxChanges = 100 const DefaultNameWidth = 40 const DefaultUploadChunkSize = 8 * 1024 * 1024 const DefaultQuery = "trashed = false and 'me' in owners" @@ -75,6 +76,46 @@ func main() { }, }, &cli.Handler{ + Pattern: "[global] list changes [options]", + Description: "List file changes", + Callback: listChangesHandler, + Flags: cli.Flags{ + "global": globalFlags, + "options": []cli.Flag{ + cli.IntFlag{ + Name: "maxChanges", + Patterns: []string{"-m", "--max"}, + Description: fmt.Sprintf("Max changes to list, default: %d", DefaultMaxChanges), + DefaultValue: DefaultMaxChanges, + }, + cli.StringFlag{ + Name: "pageToken", + Patterns: []string{"--since"}, + Description: fmt.Sprintf("Page token to start listing changes from"), + DefaultValue: "1", + }, + cli.BoolFlag{ + Name: "now", + Patterns: []string{"--now"}, + Description: fmt.Sprintf("Get latest page token"), + OmitValue: true, + }, + 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.Handler{ Pattern: "[global] list revisions [options] <id>", Description: "List file revisions", Callback: listRevisionsHandler, diff --git a/handlers_drive.go b/handlers_drive.go index f17338b..297b9f4 100644 --- a/handlers_drive.go +++ b/handlers_drive.go @@ -29,6 +29,19 @@ func listHandler(ctx cli.Context) { checkErr(err) } +func listChangesHandler(ctx cli.Context) { + args := ctx.Args() + err := newDrive(args).ListChanges(drive.ListChangesArgs{ + Out: os.Stdout, + PageToken: args.String("pageToken"), + MaxChanges: args.Int64("maxChanges"), + Now: args.Bool("now"), + NameWidth: args.Int64("nameWidth"), + SkipHeader: args.Bool("skipHeader"), + }) + checkErr(err) +} + func downloadHandler(ctx cli.Context) { args := ctx.Args() err := newDrive(args).Download(drive.DownloadArgs{ |
