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 {
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user