diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 9777ee3a..d84b626a 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -161,12 +161,14 @@ func main() { } else { infoln("No config file; starting with empty defaults") name, _ := os.Hostname() + defaultRepo := filepath.Join(getHomeDir(), "Sync") + ensureDir(defaultRepo, 0755) cfg, err = readConfigXML(nil, myID) cfg.Repositories = []RepositoryConfiguration{ { ID: "default", - Directory: filepath.Join(getHomeDir(), "Sync"), + Directory: defaultRepo, Nodes: []NodeConfiguration{{NodeID: myID}}, }, } @@ -219,10 +221,9 @@ func main() { m := NewModel(cfg.Options.MaxChangeKbps * 1000) - for i := range cfg.Repositories { - dir := expandTilde(cfg.Repositories[i].Directory) - ensureDir(dir, -1) - m.AddRepo(cfg.Repositories[i].ID, dir, cfg.Repositories[i].Nodes) + for _, repo := range cfg.Repositories { + dir := expandTilde(repo.Directory) + m.AddRepo(repo.ID, dir, repo.Nodes) } // GUI @@ -257,6 +258,25 @@ func main() { infoln("Populating repository index") m.LoadIndexes(confDir) + + for _, repo := range cfg.Repositories { + dir := expandTilde(repo.Directory) + + // Safety check. If the cached index contains files but the repository + // doesn't exist, we have a problem. We would assume that all files + // have been deleted which might not be the case, so abort instead. + + if files, _, _ := m.LocalSize(repo.ID); files > 0 { + if fi, err := os.Stat(dir); err != nil || !fi.IsDir() { + warnf("Configured repository %q has index but directory %q is missing; not starting.", repo.ID, repo.Directory) + fatalf("Ensure that directory is present or remove repository from configuration.") + } + } + + // Ensure that repository directories exist for newly configured repositories. + ensureDir(dir, -1) + } + m.ScanRepos() m.SaveIndexes(confDir)