1
0
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:
Harshavardhana
2015-04-20 17:58:47 -07:00
parent 6109b2a6ff
commit d7e4be17b0
4 changed files with 39 additions and 21 deletions

View File

@@ -124,16 +124,17 @@ func getFilesystemAbsURL(u *url.URL) (string, error) {
if err != nil { if err != nil {
return "", iodine.New(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: default:
absURLStr, err = filepath.Abs(filepath.Clean(u.String())) absURLStr, err = filepath.Abs(filepath.Clean(u.String()))
if err != nil { if err != nil {
return "", iodine.New(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 return absURLStr, nil
} }

View File

@@ -18,6 +18,7 @@ package main
import ( import (
"io" "io"
"runtime"
"strings" "strings"
"fmt" "fmt"
@@ -30,8 +31,18 @@ import (
const ( const (
pathSeparator = "/" 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 // 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) { func getSourceObjectURLMap(manager clientManager, sourceURL string) (sourceObjectURLMap map[string]string, err error) {
sourceClnt, err := manager.getNewClient(sourceURL, globalDebugFlag) sourceClnt, err := manager.getNewClient(sourceURL, globalDebugFlag)
@@ -44,7 +55,7 @@ func getSourceObjectURLMap(manager clientManager, sourceURL string) (sourceObjec
} }
sourceObjectURLMap = make(map[string]string) sourceObjectURLMap = make(map[string]string)
for _, object := range objects { for _, object := range objects {
sourceObjectURLMap[object.Name] = strings.TrimSuffix(sourceURL, pathSeparator) + pathSeparator + object.Name sourceObjectURLMap[object.Name] = getSourceURL(sourceURL, object.Name)
} }
return sourceObjectURLMap, nil return sourceObjectURLMap, nil
} }

View File

@@ -39,8 +39,8 @@ func (f *fsClient) Put(md5HexString string, size int64) (io.WriteCloser, error)
blockingWriter.Release(err) blockingWriter.Release(err)
return return
} }
objectDir, _ := filepath.Split(f.String()) objectDir, _ := filepath.Split(f.normalizedPath())
objectPath := f.String() objectPath := f.normalizedPath()
if err := os.MkdirAll(objectDir, 0700); err != nil { if err := os.MkdirAll(objectDir, 0700); err != nil {
err := iodine.New(err, nil) err := iodine.New(err, nil)
r.CloseWithError(err) r.CloseWithError(err)

View File

@@ -47,13 +47,14 @@ func GetNewClient(path string) client.Client {
// url2Object converts URL to bucketName and objectName // url2Object converts URL to bucketName and objectName
func (f *fsClient) url2Object() (bucketName, objectName string) { 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 // getObjectMetadata - wrapper function to get file stat
func (f *fsClient) getObjectMetadata() (os.FileInfo, error) { func (f *fsClient) getObjectMetadata() (os.FileInfo, error) {
bucket, object := f.url2Object() bucket, object := f.url2Object()
st, err := os.Stat(f.Path) st, err := os.Stat(f.normalizedPath())
if os.IsNotExist(err) { if os.IsNotExist(err) {
return nil, iodine.New(client.ObjectNotFound{Bucket: bucket, Object: object}, nil) 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 return st, nil
} }
func (f *fsClient) normalizedPath() string {
unescapedURL, _ := url.QueryUnescape(f.String())
return filepath.Clean(unescapedURL)
}
// Get - download an object from bucket // Get - download an object from bucket
func (f *fsClient) Get() (body io.ReadCloser, size int64, md5 string, err error) { func (f *fsClient) Get() (body io.ReadCloser, size int64, md5 string, err error) {
st, err := f.getObjectMetadata() st, err := f.getObjectMetadata()
if err != nil { if err != nil {
return nil, 0, "", iodine.New(err, nil) return nil, 0, "", iodine.New(err, nil)
} }
body, err = os.Open(f.Path) body, err = os.Open(f.normalizedPath())
if err != nil { if err != nil {
return nil, 0, "", iodine.New(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 { if err != nil {
return nil, 0, "", iodine.New(err, nil) return nil, 0, "", iodine.New(err, nil)
} }
body, err = os.Open(f.Path) body, err = os.Open(f.normalizedPath())
if err != nil { if err != nil {
return nil, 0, "", iodine.New(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 // listBuckets - get list of buckets
func (f *fsClient) listBuckets() ([]*client.Item, error) { func (f *fsClient) listBuckets() ([]*client.Item, error) {
buckets, err := ioutil.ReadDir(f.Path) buckets, err := ioutil.ReadDir(f.normalizedPath())
if err != nil { if err != nil {
return nil, iodine.New(err, nil) return nil, iodine.New(err, nil)
} }
@@ -153,16 +159,16 @@ func (f *fsClient) List() (items []*client.Item, err error) {
if fi.IsDir() { if fi.IsDir() {
return nil // not a fs skip return nil // not a fs skip
} }
// trim f.Path // trim f.String()
item := &client.Item{ 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(), Time: fi.ModTime(),
Size: fi.Size(), Size: fi.Size(),
} }
items = append(items, item) items = append(items, item)
return nil return nil
} }
err = filepath.Walk(f.Path, visitFS) err = filepath.Walk(f.normalizedPath(), visitFS)
if err != nil { if err != nil {
return nil, iodine.New(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 // PutBucket - create a new bucket
func (f *fsClient) PutBucket() error { func (f *fsClient) PutBucket() error {
err := os.MkdirAll(f.Path, 0700) err := os.MkdirAll(f.normalizedPath(), 0700)
if err != nil { if err != nil {
return iodine.New(err, nil) return iodine.New(err, nil)
} }
@@ -182,12 +188,12 @@ func (f *fsClient) PutBucket() error {
// Stat - // Stat -
func (f *fsClient) Stat() error { func (f *fsClient) Stat() error {
st, err := os.Stat(f.Path) st, err := os.Stat(f.normalizedPath())
if os.IsNotExist(err) { if os.IsNotExist(err) {
return iodine.New(client.BucketNotFound{Bucket: ""}, nil) return iodine.New(client.BucketNotFound{Bucket: f.normalizedPath()}, nil)
} }
if !st.IsDir() { if !st.IsDir() {
return iodine.New(client.InvalidBucketName{Bucket: ""}, nil) return iodine.New(client.InvalidBucketName{Bucket: f.normalizedPath()}, nil)
} }
return nil return nil
} }