1
0
mirror of https://github.com/minio/mc.git synced 2025-11-10 13:42:32 +03:00

Add options to preserve filesystem attributes (#2938)

This commit is contained in:
Ashish Kumar Sinha
2019-10-30 13:05:25 +05:30
committed by kannappanr
parent 810978720f
commit 42898064f2
30 changed files with 537 additions and 56 deletions

View File

@@ -18,6 +18,7 @@ package cmd
import (
"fmt"
"runtime"
"github.com/minio/cli"
"github.com/minio/mc/pkg/console"
@@ -40,7 +41,7 @@ func checkCopySyntax(ctx *cli.Context, encKeyDB map[string][]prefixSSEPair) {
// Verify if source(s) exists.
for _, srcURL := range srcURLs {
_, _, err := url2Stat(srcURL, false, encKeyDB)
_, _, err := url2Stat(srcURL, false, false, encKeyDB)
if err != nil {
console.Fatalf("Unable to validate source %s\n", srcURL)
}
@@ -72,6 +73,11 @@ func checkCopySyntax(ctx *cli.Context, encKeyDB map[string][]prefixSSEPair) {
default:
fatalIf(errInvalidArgument().Trace(), "Unable to guess the type of copy operation.")
}
// Preserve functionality not supported for windows
if ctx.Bool("preserve") && runtime.GOOS == "windows" {
fatalIf(errInvalidArgument().Trace(), "Permissions are not preserved on windows platform.")
}
}
// checkCopySyntaxTypeA verifies if the source and target are valid file arguments.
@@ -81,7 +87,7 @@ func checkCopySyntaxTypeA(srcURLs []string, tgtURL string, keys map[string][]pre
fatalIf(errInvalidArgument().Trace(), "Invalid number of source arguments.")
}
srcURL := srcURLs[0]
_, srcContent, err := url2Stat(srcURL, false, keys)
_, srcContent, err := url2Stat(srcURL, false, false, keys)
fatalIf(err.Trace(srcURL), "Unable to stat source `"+srcURL+"`.")
if !srcContent.Type.IsRegular() {
@@ -96,7 +102,7 @@ func checkCopySyntaxTypeB(srcURLs []string, tgtURL string, keys map[string][]pre
fatalIf(errInvalidArgument().Trace(), "Invalid number of source arguments.")
}
srcURL := srcURLs[0]
_, srcContent, err := url2Stat(srcURL, false, keys)
_, srcContent, err := url2Stat(srcURL, false, false, keys)
fatalIf(err.Trace(srcURL), "Unable to stat source `"+srcURL+"`.")
if !srcContent.Type.IsRegular() {
@@ -104,7 +110,7 @@ func checkCopySyntaxTypeB(srcURLs []string, tgtURL string, keys map[string][]pre
}
// Check target.
if _, tgtContent, err := url2Stat(tgtURL, false, keys); err == nil {
if _, tgtContent, err := url2Stat(tgtURL, false, false, keys); err == nil {
if !tgtContent.Type.IsDir() {
fatalIf(errInvalidArgument().Trace(tgtURL), "Target `"+tgtURL+"` is not a folder.")
}
@@ -119,14 +125,14 @@ func checkCopySyntaxTypeC(srcURLs []string, tgtURL string, isRecursive bool, key
}
// Check target.
if _, tgtContent, err := url2Stat(tgtURL, false, keys); err == nil {
if _, tgtContent, err := url2Stat(tgtURL, false, false, keys); err == nil {
if !tgtContent.Type.IsDir() {
fatalIf(errInvalidArgument().Trace(tgtURL), "Target `"+tgtURL+"` is not a folder.")
}
}
for _, srcURL := range srcURLs {
c, srcContent, err := url2Stat(srcURL, false, keys)
c, srcContent, err := url2Stat(srcURL, false, false, keys)
// incomplete uploads are not necessary for copy operation, no need to verify for them.
isIncomplete := false
if err != nil {
@@ -156,7 +162,7 @@ func checkCopySyntaxTypeC(srcURLs []string, tgtURL string, isRecursive bool, key
func checkCopySyntaxTypeD(srcURLs []string, tgtURL string, keys map[string][]prefixSSEPair) {
// Source can be anything: file, dir, dir...
// Check target if it is a dir
if _, tgtContent, err := url2Stat(tgtURL, false, keys); err == nil {
if _, tgtContent, err := url2Stat(tgtURL, false, false, keys); err == nil {
if !tgtContent.Type.IsDir() {
fatalIf(errInvalidArgument().Trace(tgtURL), "Target `"+tgtURL+"` is not a folder.")
}