| 105 | } |
| 106 | |
| 107 | func ls(cmd *cobra.Command, args []string) (err error) { |
| 108 | |
| 109 | path := "" |
| 110 | if len(args) > 0 { |
| 111 | if path, err = validatePath(args[0]); err != nil { |
| 112 | return err |
| 113 | } |
| 114 | } |
| 115 | |
| 116 | arg := files.NewListFolderArg(path) |
| 117 | arg.Recursive = lsRecursive(cmd) |
| 118 | arg.IncludeDeleted, _ = cmd.Flags().GetBool("include-deleted") |
| 119 | onlyDeleted, _ := cmd.Flags().GetBool("only-deleted") |
| 120 | arg.IncludeDeleted = arg.IncludeDeleted || onlyDeleted |
| 121 | opts, err := parseListOptions(cmd) |
| 122 | if err != nil { |
| 123 | return err |
| 124 | } |
| 125 | if opts.limit > 0 { |
| 126 | if opts.limit > maxListFolderLimit { |
| 127 | return invalidArgumentsErrorWithDetails("`ls --limit` is too large", flagErrorDetails("limit")) |
| 128 | } |
| 129 | arg.Limit = uint32(opts.limit) |
| 130 | } |
| 131 | |
| 132 | dbx := filesNewFunc(config) |
| 133 | |
| 134 | var entries []files.IsMetadata |
| 135 | if path != "" { |
| 136 | var metaRes files.IsMetadata |
| 137 | metaRes, err = getFileMetadata(dbx, path) |
| 138 | if err != nil { |
| 139 | return err |
| 140 | } |
| 141 | |
| 142 | switch f := metaRes.(type) { |
| 143 | case *files.FileMetadata: |
| 144 | if !onlyDeleted { |
| 145 | entries = []files.IsMetadata{f} |
| 146 | return renderLsOutput(cmd, path, arg, onlyDeleted, opts, entries) |
| 147 | } |
| 148 | } |
| 149 | } |
| 150 | |
| 151 | res, err := dbx.ListFolderContext(currentContext(), arg) |
| 152 | |
| 153 | if err != nil { |
| 154 | if !isListFolderNotFolderError(err) { |
| 155 | return err |
| 156 | } |
| 157 | // Don't treat a "not_folder" error as fatal; recover by sending a |
| 158 | // get_metadata request for the same path and using that response instead. |
| 159 | var metaRes files.IsMetadata |
| 160 | metaRes, _ = getFileMetadata(dbx, path) |
| 161 | entries = []files.IsMetadata{metaRes} |
| 162 | entries, err = finalizeLsEntries(dbx, entries, onlyDeleted, opts) |
| 163 | } else { |
| 164 | entries, err = collectAndPrepareLsEntries(dbx, res, opts.limit, onlyDeleted, opts) |