aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetter Rasmussen2016-01-28 22:20:16 +0100
committerPetter Rasmussen2016-01-28 22:20:16 +0100
commit1c5e8879a7e939f8799aca72f7c6d3b0b8c44144 (patch)
treead24192ad9479d6499f52c8c034f7e954507450c
parentfa5ed8b1c52f435067ec39959305ebc4e74ac609 (diff)
downloadgdrive-1c5e8879a7e939f8799aca72f7c6d3b0b8c44144.tar.bz2
Implement list changes
-rw-r--r--drive/changes.go103
-rw-r--r--gdrive.go41
-rw-r--r--handlers_drive.go13
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
+}
diff --git a/gdrive.go b/gdrive.go
index 2d25f3d..a675ca1 100644
--- a/gdrive.go
+++ b/gdrive.go
@@ -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{