Merge remote-tracking branch 'origin/pr/721'
* origin/pr/721: Add tests for model.GetIgnores model.SetIgnores Expose ignores in the UI Add comments directive to ignores Expose ignores rest endpoints Expose ignores from model
This commit is contained in:
@@ -5,10 +5,12 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -22,6 +24,7 @@ import (
|
||||
"github.com/syncthing/syncthing/files"
|
||||
"github.com/syncthing/syncthing/ignore"
|
||||
"github.com/syncthing/syncthing/lamport"
|
||||
"github.com/syncthing/syncthing/osutil"
|
||||
"github.com/syncthing/syncthing/protocol"
|
||||
"github.com/syncthing/syncthing/scanner"
|
||||
"github.com/syncthing/syncthing/stats"
|
||||
@@ -579,6 +582,78 @@ func (m *Model) ConnectedTo(nodeID protocol.NodeID) bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
func (m *Model) GetIgnores(repo string) ([]string, error) {
|
||||
var lines []string
|
||||
|
||||
cfg, ok := m.repoCfgs[repo]
|
||||
if !ok {
|
||||
return lines, fmt.Errorf("Repo %s does not exist", repo)
|
||||
}
|
||||
|
||||
m.rmut.Lock()
|
||||
defer m.rmut.Unlock()
|
||||
|
||||
fd, err := os.Open(filepath.Join(cfg.Directory, ".stignore"))
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return lines, nil
|
||||
}
|
||||
l.Warnln("Loading .stignore:", err)
|
||||
return lines, err
|
||||
}
|
||||
defer fd.Close()
|
||||
|
||||
scanner := bufio.NewScanner(fd)
|
||||
for scanner.Scan() {
|
||||
lines = append(lines, strings.TrimSpace(scanner.Text()))
|
||||
}
|
||||
|
||||
return lines, nil
|
||||
}
|
||||
|
||||
func (m *Model) SetIgnores(repo string, content []string) error {
|
||||
cfg, ok := m.repoCfgs[repo]
|
||||
if !ok {
|
||||
return fmt.Errorf("Repo %s does not exist", repo)
|
||||
}
|
||||
|
||||
fd, err := ioutil.TempFile("", "stignore-"+repo)
|
||||
if err != nil {
|
||||
l.Warnln("Saving .stignore:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
writer := bufio.NewWriter(fd)
|
||||
for _, line := range content {
|
||||
fmt.Fprintln(writer, line)
|
||||
}
|
||||
|
||||
err = writer.Flush()
|
||||
if err != nil {
|
||||
l.Warnln("Saving .stignore:", err)
|
||||
fd.Close()
|
||||
return err
|
||||
}
|
||||
|
||||
err = fd.Close()
|
||||
if err != nil {
|
||||
l.Warnln("Saving .stignore:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
file := filepath.Join(cfg.Directory, ".stignore")
|
||||
m.rmut.Lock()
|
||||
os.Remove(file)
|
||||
err = osutil.Rename(fd.Name(), file)
|
||||
m.rmut.Unlock()
|
||||
if err != nil {
|
||||
l.Warnln("Saving .stignore:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
return m.ScanRepo(repo)
|
||||
}
|
||||
|
||||
// AddConnection adds a new peer connection to the model. An initial index will
|
||||
// be sent to the connected peer, thereafter index updates whenever the local
|
||||
// repository changes.
|
||||
|
||||
@@ -369,3 +369,89 @@ func TestClusterConfig(t *testing.T) {
|
||||
t.Errorf("Incorrect node ID %x != %x", id, node2)
|
||||
}
|
||||
}
|
||||
|
||||
func TestIgnores(t *testing.T) {
|
||||
arrEqual := func(a, b []string) bool {
|
||||
if len(a) != len(b) {
|
||||
return false
|
||||
}
|
||||
|
||||
for i := range a {
|
||||
if a[i] != b[i] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
db, _ := leveldb.Open(storage.NewMemStorage(), nil)
|
||||
m := NewModel("/tmp", nil, "node", "syncthing", "dev", db)
|
||||
m.AddRepo(config.RepositoryConfiguration{ID: "default", Directory: "testdata"})
|
||||
|
||||
expected := []string{
|
||||
".*",
|
||||
"quux",
|
||||
}
|
||||
|
||||
ignores, err := m.GetIgnores("default")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if !arrEqual(ignores, expected) {
|
||||
t.Errorf("Incorrect ignores: %v != %v", ignores, expected)
|
||||
}
|
||||
|
||||
ignores = append(ignores, "pox")
|
||||
|
||||
err = m.SetIgnores("default", ignores)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
ignores2, err := m.GetIgnores("default")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if arrEqual(expected, ignores2) {
|
||||
t.Errorf("Incorrect ignores: %v == %v", ignores2, expected)
|
||||
}
|
||||
|
||||
if !arrEqual(ignores, ignores2) {
|
||||
t.Errorf("Incorrect ignores: %v != %v", ignores2, ignores)
|
||||
}
|
||||
|
||||
err = m.SetIgnores("default", expected)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
ignores, err = m.GetIgnores("default")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if !arrEqual(ignores, expected) {
|
||||
t.Errorf("Incorrect ignores: %v != %v", ignores, expected)
|
||||
}
|
||||
|
||||
ignores, err = m.GetIgnores("doesnotexist")
|
||||
if err == nil {
|
||||
t.Error("No error")
|
||||
}
|
||||
|
||||
err = m.SetIgnores("doesnotexist", expected)
|
||||
if err == nil {
|
||||
t.Error("No error")
|
||||
}
|
||||
|
||||
m.AddRepo(config.RepositoryConfiguration{ID: "fresh", Directory: "XXX"})
|
||||
ignores, err = m.GetIgnores("fresh")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if len(ignores) > 0 {
|
||||
t.Errorf("Expected no ignores, got: %v", ignores)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user