mirror of
https://github.com/minio/mc.git
synced 2025-11-13 12:22:45 +03:00
Windows fixes for Get(), GetObjectMetadata() and List()
This commit is contained in:
@@ -124,16 +124,17 @@ func getFilesystemAbsURL(u *url.URL) (string, error) {
|
||||
if err != nil {
|
||||
return "", iodine.New(err, nil)
|
||||
}
|
||||
case filepath.IsAbs(u.String()):
|
||||
absURLStr, err = filepath.Abs(filepath.Clean(u.String()))
|
||||
if err != nil {
|
||||
return "", iodine.New(err, nil)
|
||||
}
|
||||
default:
|
||||
absURLStr, err = filepath.Abs(filepath.Clean(u.String()))
|
||||
if err != nil {
|
||||
return "", iodine.New(err, nil)
|
||||
}
|
||||
// url parse converts "\" on windows as "%5c" unescape it
|
||||
unescapedAbsURL, err := url.QueryUnescape(absURLStr)
|
||||
if err != nil {
|
||||
return "", iodine.New(err, nil)
|
||||
}
|
||||
absURLStr = unescapedAbsURL
|
||||
}
|
||||
return absURLStr, nil
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package main
|
||||
|
||||
import (
|
||||
"io"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"fmt"
|
||||
@@ -30,8 +31,18 @@ import (
|
||||
|
||||
const (
|
||||
pathSeparator = "/"
|
||||
pathSeparatorWindows = "\\"
|
||||
)
|
||||
|
||||
func getSourceURL(sourceURL, objectName string) string {
|
||||
if client.GetURLType(sourceURL) == client.URLFilesystem {
|
||||
if runtime.GOOS == "windows" {
|
||||
return strings.TrimSuffix(sourceURL, pathSeparator) + pathSeparatorWindows + objectName
|
||||
}
|
||||
}
|
||||
return strings.TrimSuffix(sourceURL, pathSeparator) + pathSeparator + objectName
|
||||
}
|
||||
|
||||
// getSourceObjectURLMap - get list of all source object and its URLs in a map
|
||||
func getSourceObjectURLMap(manager clientManager, sourceURL string) (sourceObjectURLMap map[string]string, err error) {
|
||||
sourceClnt, err := manager.getNewClient(sourceURL, globalDebugFlag)
|
||||
@@ -44,7 +55,7 @@ func getSourceObjectURLMap(manager clientManager, sourceURL string) (sourceObjec
|
||||
}
|
||||
sourceObjectURLMap = make(map[string]string)
|
||||
for _, object := range objects {
|
||||
sourceObjectURLMap[object.Name] = strings.TrimSuffix(sourceURL, pathSeparator) + pathSeparator + object.Name
|
||||
sourceObjectURLMap[object.Name] = getSourceURL(sourceURL, object.Name)
|
||||
}
|
||||
return sourceObjectURLMap, nil
|
||||
}
|
||||
|
||||
@@ -39,8 +39,8 @@ func (f *fsClient) Put(md5HexString string, size int64) (io.WriteCloser, error)
|
||||
blockingWriter.Release(err)
|
||||
return
|
||||
}
|
||||
objectDir, _ := filepath.Split(f.String())
|
||||
objectPath := f.String()
|
||||
objectDir, _ := filepath.Split(f.normalizedPath())
|
||||
objectPath := f.normalizedPath()
|
||||
if err := os.MkdirAll(objectDir, 0700); err != nil {
|
||||
err := iodine.New(err, nil)
|
||||
r.CloseWithError(err)
|
||||
|
||||
@@ -47,13 +47,14 @@ func GetNewClient(path string) client.Client {
|
||||
|
||||
// url2Object converts URL to bucketName and objectName
|
||||
func (f *fsClient) url2Object() (bucketName, objectName string) {
|
||||
return filepath.Split(f.Path)
|
||||
unescapedURL, _ := url.QueryUnescape(f.String())
|
||||
return filepath.Split(unescapedURL)
|
||||
}
|
||||
|
||||
// getObjectMetadata - wrapper function to get file stat
|
||||
func (f *fsClient) getObjectMetadata() (os.FileInfo, error) {
|
||||
bucket, object := f.url2Object()
|
||||
st, err := os.Stat(f.Path)
|
||||
st, err := os.Stat(f.normalizedPath())
|
||||
if os.IsNotExist(err) {
|
||||
return nil, iodine.New(client.ObjectNotFound{Bucket: bucket, Object: object}, nil)
|
||||
}
|
||||
@@ -66,13 +67,18 @@ func (f *fsClient) getObjectMetadata() (os.FileInfo, error) {
|
||||
return st, nil
|
||||
}
|
||||
|
||||
func (f *fsClient) normalizedPath() string {
|
||||
unescapedURL, _ := url.QueryUnescape(f.String())
|
||||
return filepath.Clean(unescapedURL)
|
||||
}
|
||||
|
||||
// Get - download an object from bucket
|
||||
func (f *fsClient) Get() (body io.ReadCloser, size int64, md5 string, err error) {
|
||||
st, err := f.getObjectMetadata()
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
body, err = os.Open(f.Path)
|
||||
body, err = os.Open(f.normalizedPath())
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
@@ -90,7 +96,7 @@ func (f *fsClient) GetPartial(offset, length int64) (body io.ReadCloser, size in
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
body, err = os.Open(f.Path)
|
||||
body, err = os.Open(f.normalizedPath())
|
||||
if err != nil {
|
||||
return nil, 0, "", iodine.New(err, nil)
|
||||
}
|
||||
@@ -121,7 +127,7 @@ func (f *fsClient) GetObjectMetadata() (item *client.Item, reterr error) {
|
||||
|
||||
// listBuckets - get list of buckets
|
||||
func (f *fsClient) listBuckets() ([]*client.Item, error) {
|
||||
buckets, err := ioutil.ReadDir(f.Path)
|
||||
buckets, err := ioutil.ReadDir(f.normalizedPath())
|
||||
if err != nil {
|
||||
return nil, iodine.New(err, nil)
|
||||
}
|
||||
@@ -153,16 +159,16 @@ func (f *fsClient) List() (items []*client.Item, err error) {
|
||||
if fi.IsDir() {
|
||||
return nil // not a fs skip
|
||||
}
|
||||
// trim f.Path
|
||||
// trim f.String()
|
||||
item := &client.Item{
|
||||
Name: strings.TrimPrefix(fp, f.Path+string(filepath.Separator)),
|
||||
Name: strings.TrimPrefix(filepath.Clean(fp), f.normalizedPath()+string(filepath.Separator)),
|
||||
Time: fi.ModTime(),
|
||||
Size: fi.Size(),
|
||||
}
|
||||
items = append(items, item)
|
||||
return nil
|
||||
}
|
||||
err = filepath.Walk(f.Path, visitFS)
|
||||
err = filepath.Walk(f.normalizedPath(), visitFS)
|
||||
if err != nil {
|
||||
return nil, iodine.New(err, nil)
|
||||
}
|
||||
@@ -173,7 +179,7 @@ func (f *fsClient) List() (items []*client.Item, err error) {
|
||||
|
||||
// PutBucket - create a new bucket
|
||||
func (f *fsClient) PutBucket() error {
|
||||
err := os.MkdirAll(f.Path, 0700)
|
||||
err := os.MkdirAll(f.normalizedPath(), 0700)
|
||||
if err != nil {
|
||||
return iodine.New(err, nil)
|
||||
}
|
||||
@@ -182,12 +188,12 @@ func (f *fsClient) PutBucket() error {
|
||||
|
||||
// Stat -
|
||||
func (f *fsClient) Stat() error {
|
||||
st, err := os.Stat(f.Path)
|
||||
st, err := os.Stat(f.normalizedPath())
|
||||
if os.IsNotExist(err) {
|
||||
return iodine.New(client.BucketNotFound{Bucket: ""}, nil)
|
||||
return iodine.New(client.BucketNotFound{Bucket: f.normalizedPath()}, nil)
|
||||
}
|
||||
if !st.IsDir() {
|
||||
return iodine.New(client.InvalidBucketName{Bucket: ""}, nil)
|
||||
return iodine.New(client.InvalidBucketName{Bucket: f.normalizedPath()}, nil)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user