فهرست منبع

lib: Introduce fs.IsParent (fixes #5324) (#5326)

Simon Frei 7 سال پیش
والد
کامیت
2f9840ddae
6فایلهای تغییر یافته به همراه19 افزوده شده و 11 حذف شده
  1. 1 2
      lib/fs/filesystem.go
  2. 12 0
      lib/fs/util.go
  3. 1 1
      lib/ignore/ignore.go
  4. 3 6
      lib/model/folder.go
  5. 1 1
      lib/model/model.go
  6. 1 1
      lib/scanner/walk.go

+ 1 - 2
lib/fs/filesystem.go

@@ -199,12 +199,11 @@ func NewFilesystem(fsType FilesystemType, uri string) Filesystem {
 func IsInternal(file string) bool {
 	// fs cannot import config, so we hard code .stfolder here (config.DefaultMarkerName)
 	internals := []string{".stfolder", ".stignore", ".stversions"}
-	pathSep := string(PathSeparator)
 	for _, internal := range internals {
 		if file == internal {
 			return true
 		}
-		if strings.HasPrefix(file, internal+pathSep) {
+		if IsParent(file, internal) {
 			return true
 		}
 	}

+ 12 - 0
lib/fs/util.go

@@ -77,3 +77,15 @@ func WindowsInvalidFilename(name string) bool {
 	// The path must not contain any disallowed characters
 	return strings.ContainsAny(name, windowsDisallowedCharacters)
 }
+
+func IsParent(path, parent string) bool {
+	if len(parent) == 0 {
+		// The empty string is the parent of everything except the empty
+		// string. (Avoids panic in the next step.)
+		return len(path) > 0
+	}
+	if parent[len(parent)-1] != PathSeparator {
+		parent += string(PathSeparator)
+	}
+	return strings.HasPrefix(path, parent)
+}

+ 1 - 1
lib/ignore/ignore.go

@@ -336,7 +336,7 @@ func loadParseIncludeFile(filesystem fs.Filesystem, file string, cd ChangeDetect
 	if filesystem.Type() == fs.FilesystemTypeBasic {
 		uri := filesystem.URI()
 		joined := filepath.Join(uri, file)
-		if !strings.HasPrefix(joined, uri) {
+		if !fs.IsParent(joined, uri) {
 			filesystem = fs.NewFilesystem(filesystem.Type(), filepath.Dir(joined))
 			file = filepath.Base(joined)
 		}

+ 3 - 6
lib/model/folder.go

@@ -13,7 +13,6 @@ import (
 	"math/rand"
 	"path/filepath"
 	"sort"
-	"strings"
 	"sync/atomic"
 	"time"
 
@@ -411,7 +410,6 @@ func (f *folder) scanSubdirs(subDirs []string) error {
 	// ignored files.
 	var toIgnore []db.FileInfoTruncated
 	ignoredParent := ""
-	pathSep := string(fs.PathSeparator)
 	for _, sub := range subDirs {
 		var iterError error
 
@@ -423,7 +421,7 @@ func (f *folder) scanSubdirs(subDirs []string) error {
 				return false
 			}
 
-			if ignoredParent != "" && !strings.HasPrefix(file.Name, ignoredParent+pathSep) {
+			if ignoredParent != "" && !fs.IsParent(file.Name, ignoredParent) {
 				for _, file := range toIgnore {
 					l.Debugln("marking file as ignored", file)
 					nf := file.ConvertToIgnoredFileInfo(f.model.id.Short())
@@ -698,11 +696,10 @@ func (f *folder) clearScanErrors(subDirs []string) {
 		return
 	}
 	filtered := f.scanErrors[:0]
-	pathSep := string(fs.PathSeparator)
 outer:
 	for _, fe := range f.scanErrors {
 		for _, sub := range subDirs {
-			if strings.HasPrefix(fe.Path, sub+pathSep) {
+			if fe.Path == sub || fs.IsParent(fe.Path, sub) {
 				continue outer
 			}
 		}
@@ -735,7 +732,7 @@ func unifySubs(dirs []string, exists func(dir string) bool) []string {
 			dirs = append(dirs[:i], dirs[i+1:]...)
 			continue
 		}
-		if dir == prev || strings.HasPrefix(dir, prev+string(fs.PathSeparator)) {
+		if dir == prev || fs.IsParent(dir, prev) {
 			dirs = append(dirs[:i], dirs[i+1:]...)
 			continue
 		}

+ 1 - 1
lib/model/model.go

@@ -288,7 +288,7 @@ func (m *Model) warnAboutOverwritingProtectedFiles(folder string) {
 	var filesAtRisk []string
 	for _, protectedFilePath := range m.protectedFiles {
 		// check if file is synced in this folder
-		if !strings.HasPrefix(protectedFilePath, folderLocation) {
+		if protectedFilePath != folderLocation && !fs.IsParent(protectedFilePath, folderLocation) {
 			continue
 		}
 

+ 1 - 1
lib/scanner/walk.go

@@ -250,7 +250,7 @@ func (w *walker) walkAndHashFiles(ctx context.Context, toHashChan chan<- protoco
 				return skip
 			}
 			// If the parent wasn't ignored already, set this path as the "highest" ignored parent
-			if info.IsDir() && (ignoredParent == "" || !strings.HasPrefix(path, ignoredParent+string(fs.PathSeparator))) {
+			if info.IsDir() && (ignoredParent == "" || !fs.IsParent(path, ignoredParent)) {
 				ignoredParent = path
 			}
 			return nil