Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ Text output is the default. JSON output is available through the global `--outpu

```sh
$ dbxcli <command> --output=json
$ dbxcli mkdir --output=json /new-folder
$ dbxcli rm --output=json /old-file.txt
$ dbxcli restore --output=json /Reports/old.pdf 015f...
```
Expand Down
107 changes: 101 additions & 6 deletions cmd/mkdir.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,23 @@ package cmd

import (
"errors"
"fmt"
"strings"

"github.com/dropbox/dropbox-sdk-go-unofficial/v6/dropbox/files"
"github.com/spf13/cobra"
)

type mkdirInput struct {
Path string `json:"path"`
Parents bool `json:"parents"`
}

type mkdirResult struct {
Input mkdirInput `json:"input"`
Result jsonMetadata `json:"result"`
}

func mkdir(cmd *cobra.Command, args []string) (err error) {
if len(args) != 1 {
return errors.New("`mkdir` requires a `directory` argument")
Expand All @@ -36,15 +47,98 @@ func mkdir(cmd *cobra.Command, args []string) (err error) {

parents, _ := cmd.Flags().GetBool("parents")

dbx := files.New(config)
if _, err = dbx.CreateFolderV2(arg); err != nil {
if parents && isConflictError(err) {
return nil
dbx := filesNewFunc(config)
created, err := dbx.CreateFolderV2(arg)
var metadata *files.FolderMetadata
if err != nil {
if !parents {
return err
}
return

conflictTag, ok := createFolderConflictTag(err)
switch {
case ok && conflictTag == files.WriteConflictErrorFolder:
if commandOutputFormat(cmd) == "text" {
return nil
}
metadata, err = existingFolderMetadata(dbx, dst)
if err != nil {
return err
}
case ok && (conflictTag == files.WriteConflictErrorFile || conflictTag == files.WriteConflictErrorFileAncestor):
return fmt.Errorf("path exists and is not a folder: %s", dst)
case ok:
return err
case isConflictError(err):
if commandOutputFormat(cmd) == "text" {
return nil
}
metadata, err = existingFolderMetadata(dbx, dst)
if err != nil {
return err
}
default:
return err
}
} else {
if created == nil || created.Metadata == nil {
return errors.New("create folder returned no metadata")
}
metadata = created.Metadata
}

return
result := newMkdirResult(dst, parents, metadata)
return commandOutput(cmd).Render(nil, result)
}

func existingFolderMetadata(dbx files.Client, dst string) (*files.FolderMetadata, error) {
metadata, err := dbx.GetMetadata(files.NewGetMetadataArg(dst))
if err != nil {
return nil, err
}
folder, ok := metadata.(*files.FolderMetadata)
if !ok || folder == nil {
return nil, fmt.Errorf("path exists and is not a folder: %s", dst)
}
return folder, nil
}

func newMkdirResult(path string, parents bool, metadata *files.FolderMetadata) mkdirResult {
result := jsonMetadataFromDropbox(metadata)
result.PathDisplay = metadataDisplayPath(path, result.PathDisplay)

return mkdirResult{
Input: mkdirInput{
Path: path,
Parents: parents,
},
Result: result,
}
}

func createFolderConflictTag(err error) (string, bool) {
var apiErrPtr *files.CreateFolderV2APIError
if errors.As(err, &apiErrPtr) && apiErrPtr != nil {
return createFolderEndpointConflictTag(apiErrPtr.EndpointError)
}

var apiErr files.CreateFolderV2APIError
if errors.As(err, &apiErr) {
return createFolderEndpointConflictTag(apiErr.EndpointError)
}

return "", false
}

func createFolderEndpointConflictTag(endpointErr *files.CreateFolderError) (string, bool) {
if endpointErr == nil ||
endpointErr.Tag != files.CreateFolderErrorPath ||
endpointErr.Path == nil ||
endpointErr.Path.Tag != files.WriteErrorConflict ||
endpointErr.Path.Conflict == nil {
return "", false
}
return endpointErr.Path.Conflict.Tag, true
}

func isConflictError(err error) bool {
Expand All @@ -61,4 +155,5 @@ var mkdirCmd = &cobra.Command{
func init() {
RootCmd.AddCommand(mkdirCmd)
mkdirCmd.Flags().BoolP("parents", "p", false, "No error if existing, create parent directories as needed")
enableStructuredOutput(mkdirCmd)
}
Loading