mirror of
https://github.com/minio/mc.git
synced 2025-12-07 08:22:15 +03:00
Add flag to allow delete marker replication (#3395)
This commit is contained in:
committed by
GitHub
parent
63ce578c46
commit
786a53672b
@@ -265,7 +265,7 @@ var completeCmds = map[string]complete.Predictor{
|
|||||||
"/encrypt/clear": s3Complete{deepLevel: 2},
|
"/encrypt/clear": s3Complete{deepLevel: 2},
|
||||||
|
|
||||||
"/replicate/add": s3Complete{deepLevel: 2},
|
"/replicate/add": s3Complete{deepLevel: 2},
|
||||||
"/replicate/set": s3Complete{deepLevel: 2},
|
"/replicate/edit": s3Complete{deepLevel: 2},
|
||||||
"/replicate/ls": s3Complete{deepLevel: 2},
|
"/replicate/ls": s3Complete{deepLevel: 2},
|
||||||
"/replicate/rm": s3Complete{deepLevel: 2},
|
"/replicate/rm": s3Complete{deepLevel: 2},
|
||||||
"/replicate/export": s3Complete{deepLevel: 2},
|
"/replicate/export": s3Complete{deepLevel: 2},
|
||||||
|
|||||||
@@ -18,7 +18,9 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
"github.com/minio/cli"
|
"github.com/minio/cli"
|
||||||
@@ -57,6 +59,10 @@ var replicateAddFlags = []cli.Flag{
|
|||||||
Name: "remote-bucket",
|
Name: "remote-bucket",
|
||||||
Usage: "remote bucket, should be a unique value for the configuration",
|
Usage: "remote bucket, should be a unique value for the configuration",
|
||||||
},
|
},
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "replicate",
|
||||||
|
Usage: "comma separated list to enable replication of delete markers, and/or deletion of versioned objects.Valid options are \"delete-marker\", \"delete\" and \"\"",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var replicateAddCmd = cli.Command{
|
var replicateAddCmd = cli.Command{
|
||||||
@@ -75,12 +81,15 @@ FLAGS:
|
|||||||
{{range .VisibleFlags}}{{.}}
|
{{range .VisibleFlags}}{{.}}
|
||||||
{{end}}
|
{{end}}
|
||||||
EXAMPLES:
|
EXAMPLES:
|
||||||
1. Add replication configuration rule on bucket "mybucket" for alias "myminio".
|
1. Add replication configuration rule on bucket "mybucket" for alias "myminio" to replicate
|
||||||
|
all objects with tags key1=value1, key2=value2 to destbucket, including delete markers and
|
||||||
|
versioned deletes.
|
||||||
{{.Prompt}} {{.HelpName}} myminio/mybucket/prefix --tags "key1=value1&key2=value2" \
|
{{.Prompt}} {{.HelpName}} myminio/mybucket/prefix --tags "key1=value1&key2=value2" \
|
||||||
--storage-class "STANDARD" \
|
--storage-class "STANDARD" \
|
||||||
--arn 'arn:minio:replication::c5be6b16-769d-432a-9ef1-4567081f3566:destbucket' \
|
--arn 'arn:minio:replication::c5be6b16-769d-432a-9ef1-4567081f3566:destbucket' \
|
||||||
--priority 1 \
|
--priority 1 \
|
||||||
--remote-bucket "destbucket"
|
--remote-bucket "destbucket"
|
||||||
|
--replicate "delete,delete-marker"
|
||||||
|
|
||||||
2. Add replication configuration rule with Disabled status on bucket "mybucket" for alias "myminio".
|
2. Add replication configuration rule with Disabled status on bucket "mybucket" for alias "myminio".
|
||||||
{{.Prompt}} {{.HelpName}} myminio/mybucket/prefix --tags "key1=value1&key2=value2" \
|
{{.Prompt}} {{.HelpName}} myminio/mybucket/prefix --tags "key1=value1&key2=value2" \
|
||||||
@@ -105,6 +114,11 @@ type replicateAddMessage struct {
|
|||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
enableStatus = "enable"
|
||||||
|
disableStatus = "disable"
|
||||||
|
)
|
||||||
|
|
||||||
func (l replicateAddMessage) JSON() string {
|
func (l replicateAddMessage) JSON() string {
|
||||||
l.Status = "success"
|
l.Status = "success"
|
||||||
jsonMessageBytes, e := json.MarshalIndent(l, "", " ")
|
jsonMessageBytes, e := json.MarshalIndent(l, "", " ")
|
||||||
@@ -135,19 +149,37 @@ func mainReplicateAdd(cliCtx *cli.Context) error {
|
|||||||
fatalIf(err, "Unable to initialize connection.")
|
fatalIf(err, "Unable to initialize connection.")
|
||||||
rcfg, err := client.GetReplication(ctx)
|
rcfg, err := client.GetReplication(ctx)
|
||||||
fatalIf(err.Trace(args...), "Unable to get replication configuration")
|
fatalIf(err.Trace(args...), "Unable to get replication configuration")
|
||||||
ruleStatus := "enable"
|
ruleStatus := enableStatus
|
||||||
if cliCtx.Bool("disable") {
|
if cliCtx.Bool(disableStatus) {
|
||||||
ruleStatus = "disable"
|
ruleStatus = disableStatus
|
||||||
}
|
}
|
||||||
|
dmReplicateStatus := disableStatus
|
||||||
|
deleteReplicationStatus := disableStatus
|
||||||
|
if cliCtx.IsSet("replicate") {
|
||||||
|
replSlice := strings.Split(cliCtx.String("replicate"), ",")
|
||||||
|
for _, opt := range replSlice {
|
||||||
|
switch strings.TrimSpace(strings.ToLower(opt)) {
|
||||||
|
case "delete-marker":
|
||||||
|
dmReplicateStatus = enableStatus
|
||||||
|
case "delete":
|
||||||
|
deleteReplicationStatus = enableStatus
|
||||||
|
default:
|
||||||
|
fatalIf(probe.NewError(fmt.Errorf("invalid value for --replicate flag %s", cliCtx.String("replicate"))), "--replicate flag takes one or more comma separated string with values \"delete, delete-marker\" or \"\" to disable delete marker replication")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
opts := replication.Options{
|
opts := replication.Options{
|
||||||
TagString: cliCtx.String("tags"),
|
TagString: cliCtx.String("tags"),
|
||||||
RoleArn: cliCtx.String("arn"),
|
RoleArn: cliCtx.String("arn"),
|
||||||
StorageClass: cliCtx.String("storage-class"),
|
StorageClass: cliCtx.String("storage-class"),
|
||||||
Priority: strconv.Itoa(cliCtx.Int("priority")),
|
Priority: strconv.Itoa(cliCtx.Int("priority")),
|
||||||
RuleStatus: ruleStatus,
|
RuleStatus: ruleStatus,
|
||||||
ID: cliCtx.String("id"),
|
ID: cliCtx.String("id"),
|
||||||
DestBucket: cliCtx.String("remote-bucket"),
|
DestBucket: cliCtx.String("remote-bucket"),
|
||||||
Op: replication.AddOption,
|
Op: replication.AddOption,
|
||||||
|
ReplicateDeleteMarkers: dmReplicateStatus,
|
||||||
|
ReplicateDeletes: deleteReplicationStatus,
|
||||||
}
|
}
|
||||||
fatalIf(client.SetReplication(ctx, &rcfg, opts), "Could not add replication rule")
|
fatalIf(client.SetReplication(ctx, &rcfg, opts), "Could not add replication rule")
|
||||||
printMsg(replicateAddMessage{
|
printMsg(replicateAddMessage{
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -29,7 +30,7 @@ import (
|
|||||||
"github.com/minio/minio/pkg/console"
|
"github.com/minio/minio/pkg/console"
|
||||||
)
|
)
|
||||||
|
|
||||||
var replicateSetFlags = []cli.Flag{
|
var replicateEditFlags = []cli.Flag{
|
||||||
cli.StringFlag{
|
cli.StringFlag{
|
||||||
Name: "id",
|
Name: "id",
|
||||||
Usage: "id for the rule, should be a unique value",
|
Usage: "id for the rule, should be a unique value",
|
||||||
@@ -54,14 +55,18 @@ var replicateSetFlags = []cli.Flag{
|
|||||||
Name: "remote-bucket",
|
Name: "remote-bucket",
|
||||||
Usage: "destination bucket, should be a unique value for the configuration",
|
Usage: "destination bucket, should be a unique value for the configuration",
|
||||||
},
|
},
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "replicate",
|
||||||
|
Usage: "comma separated list to enable replication of delete markers, and/or deletion of versioned objects.Valid options are \"delete-marker\", \"delete\" and \"\"",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var replicateSetCmd = cli.Command{
|
var replicateEditCmd = cli.Command{
|
||||||
Name: "set",
|
Name: "edit",
|
||||||
Usage: "modify an existing server side replication configuration rule",
|
Usage: "modify an existing server side replication configuration rule",
|
||||||
Action: mainReplicateSet,
|
Action: mainReplicateEdit,
|
||||||
Before: setGlobalsFromContext,
|
Before: setGlobalsFromContext,
|
||||||
Flags: append(globalFlags, replicateSetFlags...),
|
Flags: append(globalFlags, replicateEditFlags...),
|
||||||
CustomHelpTemplate: `NAME:
|
CustomHelpTemplate: `NAME:
|
||||||
{{.HelpName}} - {{.Usage}}
|
{{.HelpName}} - {{.Usage}}
|
||||||
|
|
||||||
@@ -83,44 +88,51 @@ EXAMPLES:
|
|||||||
--storage-class "STANDARD" --priority 2
|
--storage-class "STANDARD" --priority 2
|
||||||
4. Clear tags for replication configuration rule with ID "kMYD.491" on a target myminio/bucket.
|
4. Clear tags for replication configuration rule with ID "kMYD.491" on a target myminio/bucket.
|
||||||
{{.Prompt}} {{.HelpName}} myminio/mybucket --id "kMYD.491" --tags ""
|
{{.Prompt}} {{.HelpName}} myminio/mybucket --id "kMYD.491" --tags ""
|
||||||
|
|
||||||
|
5. Enable delete marker replication on a replication configuration rule with ID "kxYD.491" on a target myminio/bucket.
|
||||||
|
{{.Prompt}} {{.HelpName}} myminio/mybucket --id "kxYD.491" --replicate "delete-marker"
|
||||||
|
|
||||||
|
6. Disable delete marker and versioned delete replication on a replication configuration rule with ID "kxYD.491" on a target myminio/bucket.
|
||||||
|
{{.Prompt}} {{.HelpName}} myminio/mybucket --id "kxYD.491" --replicate ""
|
||||||
|
|
||||||
`,
|
`,
|
||||||
}
|
}
|
||||||
|
|
||||||
// checkReplicateSetSyntax - validate all the passed arguments
|
// checkReplicateEditSyntax - validate all the passed arguments
|
||||||
func checkReplicateSetSyntax(ctx *cli.Context) {
|
func checkReplicateEditSyntax(ctx *cli.Context) {
|
||||||
if len(ctx.Args()) != 1 {
|
if len(ctx.Args()) != 1 {
|
||||||
cli.ShowCommandHelpAndExit(ctx, "set", 1) // last argument is exit code
|
cli.ShowCommandHelpAndExit(ctx, "edit", 1) // last argument is exit code
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type replicateSetMessage struct {
|
type replicateEditMessage struct {
|
||||||
Op string `json:"op"`
|
Op string `json:"op"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l replicateSetMessage) JSON() string {
|
func (l replicateEditMessage) JSON() string {
|
||||||
l.Status = "success"
|
l.Status = "success"
|
||||||
jsonMessageBytes, e := json.MarshalIndent(l, "", " ")
|
jsonMessageBytes, e := json.MarshalIndent(l, "", " ")
|
||||||
fatalIf(probe.NewError(e), "Unable to marshal into JSON.")
|
fatalIf(probe.NewError(e), "Unable to marshal into JSON.")
|
||||||
return string(jsonMessageBytes)
|
return string(jsonMessageBytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l replicateSetMessage) String() string {
|
func (l replicateEditMessage) String() string {
|
||||||
if l.ID != "" {
|
if l.ID != "" {
|
||||||
return console.Colorize("replicateSetMessage", "Replication configuration rule with ID `"+l.ID+"` applied to "+l.URL+".")
|
return console.Colorize("replicateEditMessage", "Replication configuration rule with ID `"+l.ID+"` applied to "+l.URL+".")
|
||||||
}
|
}
|
||||||
return console.Colorize("replicateSetMessage", "Replication configuration rule applied to "+l.URL+" successfully.")
|
return console.Colorize("replicateEditMessage", "Replication configuration rule applied to "+l.URL+" successfully.")
|
||||||
}
|
}
|
||||||
|
|
||||||
func mainReplicateSet(cliCtx *cli.Context) error {
|
func mainReplicateEdit(cliCtx *cli.Context) error {
|
||||||
ctx, cancelReplicateSet := context.WithCancel(globalContext)
|
ctx, cancelReplicateEdit := context.WithCancel(globalContext)
|
||||||
defer cancelReplicateSet()
|
defer cancelReplicateEdit()
|
||||||
|
|
||||||
console.SetColor("replicateSetMessage", color.New(color.FgGreen))
|
console.SetColor("replicateEditMessage", color.New(color.FgGreen))
|
||||||
|
|
||||||
checkReplicateSetSyntax(cliCtx)
|
checkReplicateEditSyntax(cliCtx)
|
||||||
|
|
||||||
// Get the alias parameter from cli
|
// Get the alias parameter from cli
|
||||||
args := cliCtx.Args()
|
args := cliCtx.Args()
|
||||||
@@ -141,6 +153,24 @@ func mainReplicateSet(cliCtx *cli.Context) error {
|
|||||||
fatalIf(err.Trace(args...), "--state can be either `enable` or `disable`")
|
fatalIf(err.Trace(args...), "--state can be either `enable` or `disable`")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var vDeleteReplicate, dmReplicate string
|
||||||
|
if cliCtx.IsSet("replicate") {
|
||||||
|
replSlice := strings.Split(cliCtx.String("replicate"), ",")
|
||||||
|
vDeleteReplicate = disableStatus
|
||||||
|
dmReplicate = disableStatus
|
||||||
|
for _, opt := range replSlice {
|
||||||
|
switch strings.TrimSpace(strings.ToLower(opt)) {
|
||||||
|
case "delete-marker":
|
||||||
|
dmReplicate = enableStatus
|
||||||
|
case "delete":
|
||||||
|
vDeleteReplicate = enableStatus
|
||||||
|
default:
|
||||||
|
if opt != "" {
|
||||||
|
fatalIf(probe.NewError(fmt.Errorf("invalid value for --replicate flag %s", cliCtx.String("replicate"))), "--replicate flag takes one or more comma separated string with values \"delete, delete-marker\"")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
opts := replication.Options{
|
opts := replication.Options{
|
||||||
TagString: cliCtx.String("tags"),
|
TagString: cliCtx.String("tags"),
|
||||||
RoleArn: cliCtx.String("arn"),
|
RoleArn: cliCtx.String("arn"),
|
||||||
@@ -155,9 +185,12 @@ func mainReplicateSet(cliCtx *cli.Context) error {
|
|||||||
if cliCtx.IsSet("priority") {
|
if cliCtx.IsSet("priority") {
|
||||||
opts.Priority = strconv.Itoa(cliCtx.Int("priority"))
|
opts.Priority = strconv.Itoa(cliCtx.Int("priority"))
|
||||||
}
|
}
|
||||||
|
if cliCtx.IsSet("replicate") {
|
||||||
|
opts.ReplicateDeletes = vDeleteReplicate
|
||||||
|
opts.ReplicateDeleteMarkers = dmReplicate
|
||||||
|
}
|
||||||
fatalIf(client.SetReplication(ctx, &rcfg, opts), "Could not modify replication rule")
|
fatalIf(client.SetReplication(ctx, &rcfg, opts), "Could not modify replication rule")
|
||||||
printMsg(replicateSetMessage{
|
printMsg(replicateEditMessage{
|
||||||
Op: "set",
|
Op: "set",
|
||||||
URL: aliasedURL,
|
URL: aliasedURL,
|
||||||
ID: opts.ID,
|
ID: opts.ID,
|
||||||
@@ -20,7 +20,7 @@ import "github.com/minio/cli"
|
|||||||
|
|
||||||
var replicateSubcommands = []cli.Command{
|
var replicateSubcommands = []cli.Command{
|
||||||
replicateAddCmd,
|
replicateAddCmd,
|
||||||
replicateSetCmd,
|
replicateEditCmd,
|
||||||
replicateListCmd,
|
replicateListCmd,
|
||||||
replicateExportCmd,
|
replicateExportCmd,
|
||||||
replicateImportCmd,
|
replicateImportCmd,
|
||||||
|
|||||||
@@ -1665,7 +1665,7 @@ USAGE:
|
|||||||
|
|
||||||
COMMANDS:
|
COMMANDS:
|
||||||
add add a server side replication configuration rule
|
add add a server side replication configuration rule
|
||||||
set modify an existing server side replication cofiguration rule
|
edit modify an existing server side replication cofiguration rule
|
||||||
ls list server side replication configuration rules
|
ls list server side replication configuration rules
|
||||||
export export server side replication configuration
|
export export server side replication configuration
|
||||||
import import server side replication configuration in JSON format
|
import import server side replication configuration in JSON format
|
||||||
@@ -1675,34 +1675,46 @@ FLAGS:
|
|||||||
--help, -h show help
|
--help, -h show help
|
||||||
```
|
```
|
||||||
|
|
||||||
*Example: Add replication configuration rule on `mybucket` on alias `myminio`*
|
*Example: Add replication configuration rule on `mybucket` on alias `myminio`.Enable delete marker replication and replication of versioned deletes for the configuration*
|
||||||
|
|
||||||
```
|
```
|
||||||
mc replicate add myminio/mybucket/prefix --tags "key1=value1&key2=value2" --storage-class "STANDARD" --arn 'arn:minio:replication:us-east-1:c5be6b16-769d-432a-9ef1-4567081f3566:destbucket' --priority 1 --remote-bucket destbucket
|
mc replicate add myminio/mybucket/prefix --tags "key1=value1&key2=value2" --storage-class "STANDARD" --arn 'arn:minio:replication:us-east-1:c5be6b16-769d-432a-9ef1-4567081f3566:destbucket' --priority 1 --remote-bucket destbucket --replicate "delete-marker,delete"
|
||||||
Replication configuration rule applied to myminio/mybucket/prefix.
|
Replication configuration rule applied to myminio/mybucket/prefix.
|
||||||
```
|
```
|
||||||
|
|
||||||
*Example: Disable replication configuration rule with rule Id "bsibgh8t874dnjst8hkg" on bucket "mybucket" with prefix "prefix" for alias `myminio`*
|
*Example: Disable replication configuration rule with rule Id "bsibgh8t874dnjst8hkg" on bucket "mybucket" with prefix "prefix" for alias `myminio`*
|
||||||
|
|
||||||
```
|
```
|
||||||
mc replicate set myminio/mybucket/prefix --id "bsibgh8t874dnjst8hkg" --state disable
|
mc replicate edit myminio/mybucket/prefix --id "bsibgh8t874dnjst8hkg" --state disable
|
||||||
Replication configuration rule with ID `bsibgh8t874dnjst8hkg` applied to myminio/mybucket/prefix.
|
Replication configuration rule with ID `bsibgh8t874dnjst8hkg` applied to myminio/mybucket/prefix.
|
||||||
```
|
```
|
||||||
|
|
||||||
*Example: Change priority of rule with rule ID "bsibgh8t874dnjst8hkg" on bucket "mybucket" for alias `myminio`.*
|
*Example: Change priority of rule with rule ID "bsibgh8t874dnjst8hkg" on bucket "mybucket" for alias `myminio`.*
|
||||||
|
|
||||||
```
|
```
|
||||||
mc replicate set myminio/mybucket/prefix --id "bsibgh8t874dnjst8hkg" --priority 3
|
mc replicate edit myminio/mybucket/prefix --id "bsibgh8t874dnjst8hkg" --priority 3
|
||||||
Replication configuration rule with ID `bsibgh8t874dnjst8hkg` applied to myminio/mybucket/prefix.
|
Replication configuration rule with ID `bsibgh8t874dnjst8hkg` applied to myminio/mybucket/prefix.
|
||||||
```
|
```
|
||||||
|
|
||||||
*Example: Clear tags on rule ID "bsibgh8t874dnjst8hkg" for target myminio/bucket which has a replication configuration rule with prefix "prefix"*
|
*Example: Clear tags on rule ID "bsibgh8t874dnjst8hkg" for target myminio/bucket which has a replication configuration rule with prefix "prefix"*
|
||||||
|
|
||||||
```
|
```
|
||||||
mc replicate set myminio/mybucket/prefix --id "bsibgh8t874dnjst8hkg" --tags ""
|
mc replicate edit myminio/mybucket/prefix --id "bsibgh8t874dnjst8hkg" --tags ""
|
||||||
Replication configuration rule with ID `bsibgh8t874dnjst8hkg` applied to myminio/mybucket/prefix successfully.
|
Replication configuration rule with ID `bsibgh8t874dnjst8hkg` applied to myminio/mybucket/prefix successfully.
|
||||||
```
|
```
|
||||||
|
|
||||||
|
*Example: Enable delete marker replication and versioned delete replication on rule ID "bsibgh8t874dnjst8hkg" for target myminio/bucket which has a replication configuration rule with prefix "prefix"
|
||||||
|
|
||||||
|
```
|
||||||
|
mc replicate edit myminio/mybucket/prefix --id "bsibgh8t874dnjst8hkg" --replicate "delete,delete-marker"
|
||||||
|
Replication configuration rule with ID `bsibgh8t874dnjst8hkg` applied to myminio/mybucket/prefix successfully.
|
||||||
|
```
|
||||||
|
*Example: Disable delete marker and versioned delete replication on rule ID "bsibgh8t874dnjst8hkg" for target myminio/bucket which has a replication configuration rule with prefix "prefix"
|
||||||
|
|
||||||
|
```
|
||||||
|
mc replicate edit myminio/mybucket/prefix --id "bsibgh8t874dnjst8hkg" --replicate ""
|
||||||
|
Replication configuration rule with ID `bsibgh8t874dnjst8hkg` applied to myminio/mybucket/prefix successfully.
|
||||||
|
```
|
||||||
*Example: List replication configuration rules set on `mybucket` on alias `myminio`*
|
*Example: List replication configuration rules set on `mybucket` on alias `myminio`*
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
8
go.mod
8
go.mod
@@ -3,10 +3,10 @@ module github.com/minio/mc
|
|||||||
go 1.14
|
go 1.14
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/cheggaaa/pb v1.0.28
|
github.com/cheggaaa/pb v1.0.29
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible
|
||||||
github.com/dustin/go-humanize v1.0.0
|
github.com/dustin/go-humanize v1.0.0
|
||||||
github.com/fatih/color v1.7.0
|
github.com/fatih/color v1.9.0
|
||||||
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf
|
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf
|
||||||
github.com/klauspost/compress v1.10.3
|
github.com/klauspost/compress v1.10.3
|
||||||
github.com/mattn/go-colorable v0.1.7 // indirect
|
github.com/mattn/go-colorable v0.1.7 // indirect
|
||||||
@@ -19,17 +19,19 @@ require (
|
|||||||
github.com/minio/sha256-simd v0.1.1
|
github.com/minio/sha256-simd v0.1.1
|
||||||
github.com/mitchellh/go-homedir v1.1.0
|
github.com/mitchellh/go-homedir v1.1.0
|
||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
|
||||||
|
github.com/philhofer/fwd v1.1.0 // indirect
|
||||||
github.com/pkg/profile v1.3.0
|
github.com/pkg/profile v1.3.0
|
||||||
github.com/pkg/xattr v0.4.1
|
github.com/pkg/xattr v0.4.1
|
||||||
github.com/posener/complete v1.2.3
|
github.com/posener/complete v1.2.3
|
||||||
github.com/rjeczalik/notify v0.9.2
|
github.com/rjeczalik/notify v0.9.2
|
||||||
github.com/rs/xid v1.2.1
|
github.com/rs/xid v1.2.1
|
||||||
|
github.com/tinylib/msgp v1.1.3 // indirect
|
||||||
|
github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee
|
golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee
|
||||||
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb
|
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb
|
||||||
golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb // indirect
|
golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb // indirect
|
||||||
golang.org/x/text v0.3.3
|
golang.org/x/text v0.3.3
|
||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.28 // indirect
|
|
||||||
gopkg.in/h2non/filetype.v1 v1.0.5
|
gopkg.in/h2non/filetype.v1 v1.0.5
|
||||||
gopkg.in/yaml.v2 v2.2.8
|
gopkg.in/yaml.v2 v2.2.8
|
||||||
)
|
)
|
||||||
|
|||||||
15
go.sum
15
go.sum
@@ -54,6 +54,8 @@ github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+
|
|||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/cheggaaa/pb v1.0.28 h1:kWGpdAcSp3MxMU9CCHOwz/8V0kCHN4+9yQm2MzWuI98=
|
github.com/cheggaaa/pb v1.0.28 h1:kWGpdAcSp3MxMU9CCHOwz/8V0kCHN4+9yQm2MzWuI98=
|
||||||
github.com/cheggaaa/pb v1.0.28/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
|
github.com/cheggaaa/pb v1.0.28/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
|
||||||
|
github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo=
|
||||||
|
github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30=
|
||||||
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
||||||
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
|
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
@@ -98,6 +100,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
|
|||||||
github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE=
|
github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE=
|
||||||
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
|
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
|
||||||
|
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
|
||||||
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
|
||||||
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
|
||||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
|
||||||
@@ -282,9 +286,11 @@ github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/
|
|||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
|
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
|
||||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
||||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
|
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
|
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
|
||||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||||
@@ -357,6 +363,8 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T
|
|||||||
github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
|
github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
|
||||||
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
|
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
|
||||||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||||
|
github.com/philhofer/fwd v1.1.0 h1:PAdZw9+/BCf4gc/kA2L/PbGPkFe72Kl2GLZXTG8HpU8=
|
||||||
|
github.com/philhofer/fwd v1.1.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
|
||||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
|
||||||
github.com/pierrec/lz4 v2.4.0+incompatible h1:06usnXXDNcPvCHDkmPpkidf4jTc52UKld7UPfqKatY4=
|
github.com/pierrec/lz4 v2.4.0+incompatible h1:06usnXXDNcPvCHDkmPpkidf4jTc52UKld7UPfqKatY4=
|
||||||
@@ -443,8 +451,12 @@ github.com/tidwall/sjson v1.0.4 h1:UcdIRXff12Lpnu3OLtZvnc03g4vH2suXDXhBwBqmzYg=
|
|||||||
github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y=
|
github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y=
|
||||||
github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
|
github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
|
||||||
github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||||
|
github.com/tinylib/msgp v1.1.3 h1:3giwAkmtaEDLSV0MdO1lDLuPgklgPzmk8H9+So2BVfA=
|
||||||
|
github.com/tinylib/msgp v1.1.3/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
|
github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31 h1:OXcKh35JaYsGMRzpvFkLv/MEyPuL49CThT1pZ8aSml4=
|
||||||
|
github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q=
|
||||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc=
|
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc=
|
||||||
@@ -553,6 +565,7 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -631,8 +644,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
|
|||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk=
|
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/h2non/filetype.v1 v1.0.5 h1:CC1jjJjoEhNVbMhXYalmGBhOBK2V70Q1N850wt/98/Y=
|
gopkg.in/h2non/filetype.v1 v1.0.5 h1:CC1jjJjoEhNVbMhXYalmGBhOBK2V70Q1N850wt/98/Y=
|
||||||
gopkg.in/h2non/filetype.v1 v1.0.5/go.mod h1:M0yem4rwSX5lLVrkEuRRp2/NinFMD5vgJ4DlAhZcfNo=
|
gopkg.in/h2non/filetype.v1 v1.0.5/go.mod h1:M0yem4rwSX5lLVrkEuRRp2/NinFMD5vgJ4DlAhZcfNo=
|
||||||
|
|||||||
Reference in New Issue
Block a user