diff options
Diffstat (limited to 'drive/changes.go')
| -rw-r--r-- | drive/changes.go | 103 |
1 files changed, 103 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 +} |
