local: fix mkdir error when trying to copy files to the root of a drive on windows

This was causing errors which looked like this when copying a file to
the root of a drive:

    mkdir \\?: The filename, directory name, or volume label syntax is incorrect.

This was caused by an incorrect path splitting routine which was
removing \ of the end of UNC paths when it shouldn't have been.  Fixed
by using the standard library `filepath.Dir` instead.
This commit is contained in:
Nick Craig-Wood 2018-08-31 21:10:36 +01:00
parent 7d74686698
commit d49ba652e2

View File

@ -151,7 +151,7 @@ func NewFs(name, root string, m configmap.Mapper) (fs.Fs, error) {
} }
if err == nil && fi.Mode().IsRegular() { if err == nil && fi.Mode().IsRegular() {
// It is a file, so use the parent as the root // It is a file, so use the parent as the root
f.root, _ = getDirFile(f.root) f.root = filepath.Dir(f.root)
// return an error with an fs which points to the parent // return an error with an fs which points to the parent
return f, fs.ErrorIsFile return f, fs.ErrorIsFile
} }
@ -565,7 +565,7 @@ func (f *Fs) DirMove(src fs.Fs, srcRemote, dstRemote string) error {
} }
// Create parent of destination // Create parent of destination
dstParentPath, _ := getDirFile(dstPath) dstParentPath := filepath.Dir(dstPath)
err = os.MkdirAll(dstParentPath, 0777) err = os.MkdirAll(dstParentPath, 0777)
if err != nil { if err != nil {
return err return err
@ -784,7 +784,7 @@ func (o *Object) Open(options ...fs.OpenOption) (in io.ReadCloser, err error) {
// mkdirAll makes all the directories needed to store the object // mkdirAll makes all the directories needed to store the object
func (o *Object) mkdirAll() error { func (o *Object) mkdirAll() error {
dir, _ := getDirFile(o.path) dir := filepath.Dir(o.path)
return os.MkdirAll(dir, 0777) return os.MkdirAll(dir, 0777)
} }
@ -872,17 +872,6 @@ func (o *Object) Remove() error {
return remove(o.path) return remove(o.path)
} }
// Return the directory and file from an OS path. Assumes
// os.PathSeparator is used.
func getDirFile(s string) (string, string) {
i := strings.LastIndex(s, string(os.PathSeparator))
dir, file := s[:i], s[i+1:]
if dir == "" {
dir = string(os.PathSeparator)
}
return dir, file
}
// cleanPathFragment cleans an OS path fragment which is part of a // cleanPathFragment cleans an OS path fragment which is part of a
// bigger path and not necessarily absolute // bigger path and not necessarily absolute
func cleanPathFragment(s string) string { func cleanPathFragment(s string) string {