func TestExampleOrgConfigIsValid(t *testing.T) { var cfg Config if err := cfg.LoadFromFile(filepath.Join(rootDir(), "config-organization-example.json")); err != nil { t.Fatalf("Unable to parse %s: %s", "config-organization-example.json", err) } if len(cfg.Repos) == 0 { t.Fatal("config has no repos") } // Ensure that each of the declared vcs's are legit for _, repo := range cfg.Repos { _, err := vcs.New(repo.Vcs, repo.VcsConfig()) if err != nil { t.Fatal(err) } } }
// Creates a new Searcher that is capable of re-claiming an existing index directory // from a set of existing manifests. func newSearcher( dbpath, name string, repo *config.Repo, refs *foundRefs, lim limiter) (*Searcher, error) { vcsDir := filepath.Join(dbpath, vcsDirFor(repo)) log.Printf("Searcher started for %s", name) wd, err := vcs.New(repo.Vcs, repo.VcsConfig()) if err != nil { return nil, err } opt := &index.IndexOptions{ ExcludeDotFiles: repo.ExcludeDotFiles, SpecialFiles: wd.SpecialFiles(), } rev, err := wd.PullOrClone(vcsDir, repo.Url) if err != nil { return nil, err } var idxDir string ref := refs.find(repo.Url, rev) if ref == nil { idxDir = nextIndexDir(dbpath) } else { idxDir = ref.Dir() refs.claim(ref) } idx, err := buildAndOpenIndex( opt, dbpath, vcsDir, idxDir, repo.Url, rev) if err != nil { return nil, err } s := &Searcher{ idx: idx, updateCh: make(chan time.Time, 1), Repo: repo, doneCh: make(chan empty), shutdownCh: make(chan empty, 1), } go func() { // each searcher's poller is held until begin is called. <-s.updateCh // if all forms of updating are turned off, we're done here. if !repo.PollUpdatesEnabled() && !repo.PushUpdatesEnabled() { s.completeShutdown() return } var delay time.Duration if repo.PollUpdatesEnabled() { delay = time.Duration(repo.MsBetweenPolls) * time.Millisecond } for { // Wait for a signal to proceed s.waitForUpdate(delay) if s.shutdownRequested { s.completeShutdown() return } // attempt to update and reindex this searcher newRev, ok := updateAndReindex(s, dbpath, vcsDir, name, rev, wd, opt, lim) if !ok { continue } rev = newRev // This is just a good time to GC since we know there will be a // whole set of dead posting lists on the heap. Ensuring these // go away quickly helps to prevent the heap from expanding // uncessarily. runtime.GC() reportOnMemory() } }() return s, nil }