Browse Source

Handle and indicate duplicate repo ID:s (fixes #153)

Jakob Borg 11 years ago
parent
commit
dcd7d278aa
6 changed files with 39 additions and 7 deletions
  1. 0 0
      auto/gui.files.go
  2. 12 7
      cmd/syncthing/config.go
  3. 7 0
      cmd/syncthing/gui.go
  4. 11 0
      cmd/syncthing/main.go
  5. 8 0
      gui/app.js
  6. 1 0
      gui/index.html

File diff suppressed because it is too large
+ 0 - 0
auto/gui.files.go


+ 12 - 7
cmd/syncthing/config.go

@@ -25,6 +25,7 @@ type RepositoryConfiguration struct {
 	Directory string              `xml:"directory,attr"`
 	Nodes     []NodeConfiguration `xml:"node"`
 	ReadOnly  bool                `xml:"ro,attr"`
+	Invalid   string              `xml:"-"` // Set at runtime when there is an error, not saved
 	nodeIDs   []string
 }
 
@@ -171,17 +172,21 @@ func readConfigXML(rd io.Reader, myID string) (Configuration, error) {
 	cfg.Options.ListenAddress = uniqueStrings(cfg.Options.ListenAddress)
 
 	// Check for missing or duplicate repository ID:s
-	var seenRepos = map[string]bool{}
+	var seenRepos = map[string]*RepositoryConfiguration{}
 	for i := range cfg.Repositories {
-		if cfg.Repositories[i].ID == "" {
-			cfg.Repositories[i].ID = "default"
+		repo := &cfg.Repositories[i]
+
+		if repo.ID == "" {
+			repo.ID = "default"
 		}
 
-		id := cfg.Repositories[i].ID
-		if seenRepos[id] {
-			panic("duplicate repository ID " + id)
+		if seen, ok := seenRepos[repo.ID]; ok {
+			seen.Invalid = "duplicate repository ID"
+			repo.Invalid = "duplicate repository ID"
+			warnf("Multiple repositories with ID %q; disabling", repo.ID)
+		} else {
+			seenRepos[repo.ID] = repo
 		}
-		seenRepos[id] = true
 	}
 
 	// Upgrade to v2 configuration if appropriate

+ 7 - 0
cmd/syncthing/gui.go

@@ -84,6 +84,13 @@ func restGetModel(m *Model, w http.ResponseWriter, r *http.Request) {
 	var repo = qs.Get("repo")
 	var res = make(map[string]interface{})
 
+	for _, cr := range cfg.Repositories {
+		if cr.ID == repo {
+			res["invalid"] = cr.Invalid
+			break
+		}
+	}
+
 	globalFiles, globalDeleted, globalBytes := m.GlobalSize(repo)
 	res["globalFiles"], res["globalDeleted"], res["globalBytes"] = globalFiles, globalDeleted, globalBytes
 

+ 11 - 0
cmd/syncthing/main.go

@@ -222,6 +222,9 @@ func main() {
 	m := NewModel(cfg.Options.MaxChangeKbps * 1000)
 
 	for _, repo := range cfg.Repositories {
+		if repo.Invalid != "" {
+			continue
+		}
 		dir := expandTilde(repo.Directory)
 		m.AddRepo(repo.ID, dir, repo.Nodes)
 	}
@@ -260,6 +263,10 @@ func main() {
 	m.LoadIndexes(confDir)
 
 	for _, repo := range cfg.Repositories {
+		if repo.Invalid != "" {
+			continue
+		}
+
 		dir := expandTilde(repo.Directory)
 
 		// Safety check. If the cached index contains files but the repository
@@ -295,6 +302,10 @@ func main() {
 	go listenConnect(myID, m, tlsCfg)
 
 	for _, repo := range cfg.Repositories {
+		if repo.Invalid != "" {
+			continue
+		}
+
 		// Routine to pull blocks from other nodes to synchronize the local
 		// repository. Does not run when we are in read only (publish only) mode.
 		if repo.ReadOnly {

+ 8 - 0
gui/app.js

@@ -121,6 +121,10 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
             return 'Unknown';
         }
 
+        if ($scope.model[repo].invalid !== '') {
+            return 'Stopped';
+        }
+
         var state = '' + $scope.model[repo].state;
         state = state[0].toUpperCase() + state.substr(1);
 
@@ -136,6 +140,10 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
             return 'text-info';
         }
 
+        if ($scope.model[repo].invalid !== '') {
+            return 'text-warning';
+        }
+
         var state = '' + $scope.model[repo].state;
         if (state == 'idle') {
             return 'text-success';

+ 1 - 0
gui/index.html

@@ -134,6 +134,7 @@
             <ul class="list-unstyled" ng-repeat="repo in repos">
               <li>
                 <span class="text-monospace">{{repo.Directory}}</span>
+                <span ng-if="repo.Invalid" class="label label-danger">Invalid: {{repo.Invalid}}</span>
                 <ul class="list-no-bullet">
                   <li>
                     <div class="li-column" title="Repository ID">

Some files were not shown because too many files changed in this diff