Browse Source

lib/ignore: Don't create empty ".stignore" files (fixes #6190) (#6197)

This will:

1. prevent creation of a new .stignore if there are no ignore patterns
2. delete an existing .stignore if all ignore patterns are removed
Marcus Legendre 5 years ago
parent
commit
b3fd9a8d53
2 changed files with 43 additions and 0 deletions
  1. 8 0
      lib/ignore/ignore.go
  2. 35 0
      lib/model/model_test.go

+ 8 - 0
lib/ignore/ignore.go

@@ -545,6 +545,14 @@ func parseIgnoreFile(fs fs.Filesystem, fd io.Reader, currentFile string, cd Chan
 
 // WriteIgnores is a convenience function to avoid code duplication
 func WriteIgnores(filesystem fs.Filesystem, path string, content []string) error {
+	if len(content) == 0 {
+		err := filesystem.Remove(path)
+		if fs.IsNotExist(err) {
+			return nil
+		}
+		return err
+	}
+
 	fd, err := osutil.CreateAtomicFilesystem(filesystem, path)
 	if err != nil {
 		return err

+ 35 - 0
lib/model/model_test.go

@@ -1514,6 +1514,41 @@ func TestIgnores(t *testing.T) {
 	changeIgnores(t, m, []string{})
 }
 
+func TestEmptyIgnores(t *testing.T) {
+	testOs := &fatalOs{t}
+
+	// Assure a clean start state
+	testOs.RemoveAll(filepath.Join("testdata", config.DefaultMarkerName))
+	testOs.MkdirAll(filepath.Join("testdata", config.DefaultMarkerName), 0644)
+
+	m := setupModel(defaultCfgWrapper)
+	defer cleanupModel(m)
+
+	m.removeFolder(defaultFolderConfig)
+	m.addFolder(defaultFolderConfig)
+
+	if err := m.SetIgnores("default", []string{}); err != nil {
+		t.Error(err)
+	}
+	if _, err := os.Stat("testdata/.stignore"); err == nil {
+		t.Error(".stignore was created despite being empty")
+	}
+
+	if err := m.SetIgnores("default", []string{".*", "quux"}); err != nil {
+		t.Error(err)
+	}
+	if _, err := os.Stat("testdata/.stignore"); os.IsNotExist(err) {
+		t.Error(".stignore does not exist")
+	}
+
+	if err := m.SetIgnores("default", []string{}); err != nil {
+		t.Error(err)
+	}
+	if _, err := os.Stat("testdata/.stignore"); err == nil {
+		t.Error(".stignore should have been deleted because it is empty")
+	}
+}
+
 func waitForState(t *testing.T, m *model, folder, status string) {
 	t.Helper()
 	timeout := time.Now().Add(2 * time.Second)