mirror of
https://github.com/rclone/rclone.git
synced 2024-11-23 02:01:25 +08:00
bisync: check for syntax errors in path args - fixes #7511
Before this change, certain shell quoting / escaping errors (particularly on Windows) were not detected by Bisync, possibly resulting in incorrect expansion and confusing errors. In particular, Windows paths with a single trailing backslash followed by a quote would be interpreted as an escaped quote -- resulting in the quote and subsequent flags being erroneously considered part of the path. After this change, Bisync specifically checks for a few of the most common patterns, and if detected, exits with a more helpful error message before doing any damage.
This commit is contained in:
parent
e71b252b65
commit
d031cc138d
|
@ -9,6 +9,7 @@ import (
|
|||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
gosync "sync"
|
||||
"time"
|
||||
|
@ -101,6 +102,11 @@ func Bisync(ctx context.Context, fs1, fs2 fs.Fs, optArg *Options) (err error) {
|
|||
b.newListing2 = b.listing2 + "-new"
|
||||
b.aliases = bilib.AliasMap{}
|
||||
|
||||
err = b.checkSyntax()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Handle lock file
|
||||
err = b.setLockFile()
|
||||
if err != nil {
|
||||
|
@ -723,6 +729,29 @@ func (b *bisyncRun) overlappingPathsCheck(fctx context.Context, fs1, fs2 fs.Fs)
|
|||
return nil
|
||||
}
|
||||
|
||||
func (b *bisyncRun) checkSyntax() error {
|
||||
// check for odd number of quotes in path, usually indicating an escaping issue
|
||||
path1 := bilib.FsPath(b.fs1)
|
||||
path2 := bilib.FsPath(b.fs2)
|
||||
if strings.Count(path1, `"`)%2 != 0 || strings.Count(path2, `"`)%2 != 0 {
|
||||
return fmt.Errorf(Color(terminal.RedFg, `detected an odd number of quotes in your path(s). This is usually a mistake indicating incorrect escaping.
|
||||
Please check your command and try again. Note that on Windows, quoted paths must not have a trailing slash, or it will be interpreted as escaping the quote. path1: %v path2: %v`), path1, path2)
|
||||
}
|
||||
// check for other syntax issues
|
||||
_, err = os.Stat(b.basePath)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "syntax is incorrect") {
|
||||
return fmt.Errorf(Color(terminal.RedFg, `syntax error detected in your path(s). Please check your command and try again.
|
||||
Note that on Windows, quoted paths must not have a trailing slash, or it will be interpreted as escaping the quote. path1: %v path2: %v error: %v`), path1, path2, err)
|
||||
}
|
||||
}
|
||||
if runtime.GOOS == "windows" && (strings.Contains(path1, " --") || strings.Contains(path2, " --")) {
|
||||
return fmt.Errorf(Color(terminal.RedFg, `detected possible flags in your path(s). This is usually a mistake indicating incorrect escaping or quoting (possibly closing quote is missing?).
|
||||
Please check your command and try again. Note that on Windows, quoted paths must not have a trailing slash, or it will be interpreted as escaping the quote. path1: %v path2: %v`), path1, path2)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *bisyncRun) debug(nametocheck, msgiftrue string) {
|
||||
if b.DebugName != "" && b.DebugName == nametocheck {
|
||||
fs.Infof(Color(terminal.MagentaBg, "DEBUGNAME "+b.DebugName), Color(terminal.MagentaBg, msgiftrue))
|
||||
|
|
Loading…
Reference in New Issue
Block a user