-
Notifications
You must be signed in to change notification settings - Fork 249
/
Copy pathmb.go
122 lines (102 loc) · 2.42 KB
/
mb.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package command
import (
"context"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/urfave/cli/v2"
"github.com/peak/s5cmd/v2/log"
"github.com/peak/s5cmd/v2/log/stat"
"github.com/peak/s5cmd/v2/storage"
"github.com/peak/s5cmd/v2/storage/url"
)
var makeBucketHelpTemplate = `Name:
{{.HelpName}} - {{.Usage}}
Usage:
{{.HelpName}} s3://bucketname
Options:
{{range .VisibleFlags}}{{.}}
{{end}}
Examples:
1. Create a new S3 bucket
> s5cmd {{.HelpName}} s3://bucketname
`
func NewMakeBucketCommand() *cli.Command {
cmd := &cli.Command{
Name: "mb",
HelpName: "mb",
Usage: "make bucket",
CustomHelpTemplate: makeBucketHelpTemplate,
Before: func(c *cli.Context) error {
err := validateMBCommand(c)
if err != nil {
printError(commandFromContext(c), c.Command.Name, err)
}
return err
},
Action: func(c *cli.Context) (err error) {
defer stat.Collect(c.Command.FullName(), &err)()
return MakeBucket{
src: c.Args().First(),
op: c.Command.Name,
fullCommand: commandFromContext(c),
storageOpts: NewStorageOpts(c),
}.Run(c.Context)
},
}
cmd.BashComplete = func(ctx *cli.Context) {
arg := parseArgumentToComplete(ctx)
if strings.HasPrefix(arg, "-") {
cli.DefaultCompleteWithFlags(cmd)(ctx)
} else {
shell := filepath.Base(os.Getenv("SHELL"))
constantCompleteWithDefault(shell, arg, "s3://")
}
}
return cmd
}
// MakeBucket holds bucket creation operation flags and states.
type MakeBucket struct {
src string
op string
fullCommand string
storageOpts storage.Options
}
// Run creates a bucket.
func (b MakeBucket) Run(ctx context.Context) error {
bucket, err := url.New(b.src)
if err != nil {
printError(b.fullCommand, b.op, err)
return err
}
client, err := storage.NewRemoteClient(ctx, &url.URL{}, b.storageOpts)
if err != nil {
printError(b.fullCommand, b.op, err)
return err
}
if err := client.MakeBucket(ctx, bucket.Bucket); err != nil {
printError(b.fullCommand, b.op, err)
return err
}
msg := log.InfoMessage{
Operation: b.op,
Source: bucket,
}
log.Info(msg)
return nil
}
func validateMBCommand(c *cli.Context) error {
if c.Args().Len() != 1 {
return fmt.Errorf("expected only 1 argument")
}
src := c.Args().First()
bucket, err := url.New(src)
if err != nil {
return err
}
if !bucket.IsBucket() {
return fmt.Errorf("invalid s3 bucket")
}
return nil
}