rclone/lib/cacheroot/cacheroot.go
Maxwell Calman b015012d8b Add resume feature
Added an interface and machinery for resuming failed uploads.
Implemented this interface in the local backend.
Later on it can be implemented by any supporting backend.

Fixes 
2021-11-17 20:33:22 +03:00

50 lines
1.8 KiB
Go

package cacheroot
import (
"fmt"
"os"
"path/filepath"
"runtime"
"strings"
"github.com/pkg/errors"
"github.com/rclone/rclone/lib/encoder"
"github.com/rclone/rclone/lib/file"
)
// CreateCacheRoot will derive and make a subsystem cache path.
//
// Returned root OS path is an absolute path with UNC prefix,
// OS-specific path separators, and encoded with OS-specific encoder.
//
// Additionally it is returned as a standard path without UNC prefix,
// with slash path separators, and standard (internal) encoding.
//
// Care is taken when creating OS paths so that the ':' separator
// following a drive letter is not encoded, e.g. into unicode fullwidth colon.
//
// parentOSPath should contain an absolute local path in OS encoding.
//
// Note: instead of fs.Fs it takes name and root as plain strings
// to prevent import loops due to dependency on the fs package.
func CreateCacheRoot(parentOSPath, fsName, fsRoot, cacheName string) (rootOSPath, standardPath string, err error) {
// Get a relative cache path representing the remote.
relativeDir := fsRoot
if runtime.GOOS == "windows" && strings.HasPrefix(relativeDir, `//?/`) {
// Trim off the leading "//" to make the result
// valid for appending to another path.
relativeDir = relativeDir[2:]
}
relativeDir = fsName + "/" + relativeDir
// Derive and make the cache root directory
relativeOSPath := filepath.FromSlash(encoder.OS.FromStandardPath(relativeDir))
rootOSPath = file.UNCPath(filepath.Join(parentOSPath, cacheName, relativeOSPath))
if err = os.MkdirAll(rootOSPath, 0700); err != nil {
return "", "", errors.Wrapf(err, "failed to create %s cache directory", cacheName)
}
parentStdPath := encoder.OS.ToStandardPath(filepath.ToSlash(parentOSPath))
standardPath = fmt.Sprintf("%s/%s/%s", parentStdPath, cacheName, relativeDir)
return rootOSPath, standardPath, nil
}