diff options
| author | Petter Rasmussen | 2016-01-28 22:20:16 +0100 | 
|---|---|---|
| committer | Petter Rasmussen | 2016-01-28 22:20:16 +0100 | 
| commit | 1c5e8879a7e939f8799aca72f7c6d3b0b8c44144 (patch) | |
| tree | ad24192ad9479d6499f52c8c034f7e954507450c | |
| parent | fa5ed8b1c52f435067ec39959305ebc4e74ac609 (diff) | |
| download | gdrive-1c5e8879a7e939f8799aca72f7c6d3b0b8c44144.tar.bz2 | |
Implement list changes
| -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{ | 
