瀏覽代碼

lib/ignore, lib/scanner: Fix recursion to catch included paths (fixes #5009) (#5010)

Simon Frei 7 年之前
父節點
當前提交
8ff7ceeddc
共有 3 個文件被更改,包括 36 次插入3 次删除
  1. 1 1
      lib/ignore/ignore.go
  2. 33 0
      lib/ignore/ignore_test.go
  3. 2 2
      lib/scanner/walk.go

+ 1 - 1
lib/ignore/ignore.go

@@ -173,7 +173,7 @@ func (m *Matcher) parseLocked(r io.Reader, file string) error {
 
 	m.skipIgnoredDirs = true
 	for _, p := range patterns {
-		if p.result&resultInclude == resultInclude {
+		if !p.result.IsIgnored() {
 			m.skipIgnoredDirs = false
 			break
 		}

+ 33 - 0
lib/ignore/ignore_test.go

@@ -1020,3 +1020,36 @@ func TestIssue4901(t *testing.T) {
 		t.Fatalf("unexpected error: %s", err.Error())
 	}
 }
+
+// TestIssue5009 checks that ignored dirs are only skipped if there are no include patterns.
+// https://github.com/syncthing/syncthing/issues/5009 (rc-only bug)
+func TestIssue5009(t *testing.T) {
+	pats := New(fs.NewFilesystem(fs.FilesystemTypeBasic, "."), WithCache(true))
+
+	stignore := `
+	ign1
+	i*2
+	`
+	if err := pats.Parse(bytes.NewBufferString(stignore), ".stignore"); err != nil {
+		t.Fatal(err)
+	}
+	if !pats.skipIgnoredDirs {
+		t.Error("skipIgnoredDirs should be true without includes")
+	}
+
+	stignore = `
+	!iex2
+	!ign1/ex
+	ign1
+	i*2
+	!ign2
+	`
+
+	if err := pats.Parse(bytes.NewBufferString(stignore), ".stignore"); err != nil {
+		t.Fatal(err)
+	}
+
+	if pats.skipIgnoredDirs {
+		t.Error("skipIgnoredDirs should not be true with includes")
+	}
+}

+ 2 - 2
lib/scanner/walk.go

@@ -246,8 +246,8 @@ func (w *walker) walkAndHashFiles(ctx context.Context, fchan, dchan chan protoco
 		if w.Matcher.Match(path).IsIgnored() {
 			l.Debugln("ignored (patterns):", path)
 			// Only descend if matcher says so and the current file is not a symlink.
-			if w.Matcher.SkipIgnoredDirs() || (info.IsSymlink() && info.IsDir()) {
-				return fs.SkipDir
+			if w.Matcher.SkipIgnoredDirs() || info.IsSymlink() {
+				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))) {