package main import ( "fmt" "os" "./cli" ) const Name = "gdrive" const Version = "2.0.0" const DefaultMaxFiles = 30 const DefaultNameWidth = 40 const DefaultQuery = "trashed = false and 'me' in owners" const DefaultShareRole = "reader" const DefaultShareType = "anyone" var DefaultConfigDir = GetDefaultConfigDir() func main() { globalFlags := []cli.Flag{ cli.StringFlag{ Name: "configDir", Patterns: []string{"-c", "--config"}, Description: fmt.Sprintf("Application path, default: %s", DefaultConfigDir), DefaultValue: DefaultConfigDir, }, } handlers := []*cli.Handler{ &cli.Handler{ Pattern: "[global options] list [options]", Description: "List files", Callback: listHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ cli.IntFlag{ Name: "maxFiles", Patterns: []string{"-m", "--max"}, Description: fmt.Sprintf("Max files to list, default: %d", DefaultMaxFiles), DefaultValue: DefaultMaxFiles, }, cli.StringFlag{ Name: "query", Patterns: []string{"-q", "--query"}, Description: fmt.Sprintf(`Default query: "%s". See https://developers.google.com/drive/search-parameters`, DefaultQuery), DefaultValue: DefaultQuery, }, 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] list revisions [options] ", 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] ", Description: "Download file or directory", Callback: downloadHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ cli.BoolFlag{ Name: "force", Patterns: []string{"-f", "--force"}, Description: "Overwrite existing file", OmitValue: true, }, cli.BoolFlag{ Name: "noProgress", Patterns: []string{"--no-progress"}, Description: "Hide progress", OmitValue: true, }, cli.BoolFlag{ Name: "stdout", Patterns: []string{"--stdout"}, Description: "Write file content to stdout", OmitValue: true, }, }, }, }, &cli.Handler{ Pattern: "[global options] upload [options] ", Description: "Upload file or directory", Callback: uploadHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ cli.BoolFlag{ Name: "recursive", Patterns: []string{"-r", "--recursive"}, Description: "Upload directory recursively", OmitValue: true, }, cli.StringSliceFlag{ Name: "parent", Patterns: []string{"-p", "--parent"}, Description: "Parent id, used to upload file to a specific directory, can be specified multiple times to give many parents", }, cli.StringFlag{ Name: "name", Patterns: []string{"--name"}, Description: "Filename", }, cli.BoolFlag{ Name: "noProgress", Patterns: []string{"--no-progress"}, Description: "Hide progress", OmitValue: true, }, cli.BoolFlag{ Name: "stdin", Patterns: []string{"--stdin"}, Description: "Use stdin as file content", OmitValue: true, }, cli.StringFlag{ Name: "mime", Patterns: []string{"--mime"}, Description: "Force mime type", }, cli.BoolFlag{ Name: "share", Patterns: []string{"--share"}, Description: "Share file", OmitValue: true, }, }, }, }, &cli.Handler{ Pattern: "[global options] info [options] ", Description: "Show file info", Callback: infoHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ cli.BoolFlag{ Name: "sizeInBytes", Patterns: []string{"--bytes"}, Description: "Show size in bytes", OmitValue: true, }, }, }, }, &cli.Handler{ Pattern: "[global options] export [options] ", Description: "Export a google document", Callback: exportHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ cli.BoolFlag{ Name: "force", Patterns: []string{"-f", "--force"}, Description: "Overwrite existing file", OmitValue: true, }, cli.StringFlag{ Name: "mime", Patterns: []string{"--mime"}, Description: "Mime type of exported file", }, cli.BoolFlag{ Name: "printMimes", Patterns: []string{"--print-mimes"}, Description: "Print available mime types for given file", OmitValue: true, }, }, }, }, &cli.Handler{ Pattern: "[global options] mkdir [options] ", Description: "Create directory", Callback: mkdirHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ cli.StringSliceFlag{ Name: "parent", Patterns: []string{"-p", "--parent"}, Description: "Parent id of created directory, can be specified multiple times to give many parents", }, cli.BoolFlag{ Name: "share", Patterns: []string{"--share"}, Description: "Share created directory", OmitValue: true, }, }, }, }, &cli.Handler{ Pattern: "[global options] share [options] ", Description: "Share file or directory", Callback: shareHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ cli.BoolFlag{ Name: "discoverable", Patterns: []string{"--discoverable"}, Description: "Make file discoverable by search engines", OmitValue: true, }, cli.StringFlag{ Name: "role", Patterns: []string{"--role"}, Description: fmt.Sprintf("Share role. Default: %s", DefaultShareRole), DefaultValue: DefaultShareRole, }, cli.StringFlag{ Name: "type", Patterns: []string{"--type"}, Description: fmt.Sprintf("Share type. Default: %s", DefaultShareType), DefaultValue: DefaultShareType, }, cli.StringFlag{ Name: "email", Patterns: []string{"--email"}, Description: "The email address of the user or group to share the file with. Requires 'user' or 'group' as type", }, cli.BoolFlag{ Name: "revoke", Patterns: []string{"--revoke"}, Description: "Delete all sharing permissions", OmitValue: true, }, }, }, }, &cli.Handler{ Pattern: "[global options] url [options] ", Description: "Get url to file or directory", Callback: urlHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ cli.BoolFlag{ Name: "download", Patterns: []string{"--download"}, Description: "Download url", OmitValue: true, }, }, }, }, &cli.Handler{ Pattern: "[global options] delete ", Description: "Delete file or directory", Callback: deleteHandler, Flags: cli.Flags{ "global options": globalFlags, }, }, &cli.Handler{ Pattern: "[global options] about [options]", Description: "Google drive metadata, quota usage, import/export formats", Callback: aboutHandler, Flags: cli.Flags{ "global options": globalFlags, "options": []cli.Flag{ cli.BoolFlag{ Name: "sizeInBytes", Patterns: []string{"--bytes"}, Description: "Show size in bytes", OmitValue: true, }, cli.BoolFlag{ Name: "exportFormats", Patterns: []string{"--export"}, Description: "Show supported export formats", OmitValue: true, }, cli.BoolFlag{ Name: "importFormats", Patterns: []string{"--import"}, Description: "Show supported import formats", OmitValue: true, }, }, }, }, &cli.Handler{ Pattern: "version", Description: "Print application version", Callback: printVersion, }, &cli.Handler{ Pattern: "help", Description: "Print help", Callback: printHelp, }, &cli.Handler{ Pattern: "help ", Description: "Print command help", Callback: printCommandHelp, }, &cli.Handler{ Pattern: "help ", Description: "Print subcommand help", Callback: printSubCommandHelp, }, } cli.SetHandlers(handlers) if ok := cli.Handle(os.Args[1:]); !ok { ExitF("No valid arguments given, use '%s help' to see available commands", Name) } }