func sortedOutput(o *graph.Output) *graph.Output { sort.Sort(graph.Defs(o.Defs)) sort.Sort(graph.Refs(o.Refs)) sort.Sort(graph.Docs(o.Docs)) sort.Sort(ann.Anns(o.Anns)) return o }
func brokenRefsOnly(refs []*graph.Ref, s interface{}) ([]*graph.Ref, error) { uniqRefDefs := map[graph.DefKey][]*graph.Ref{} loggedDefRepos := map[string]struct{}{} for _, ref := range refs { if ref.Repo != ref.DefRepo { if _, logged := loggedDefRepos[ref.DefRepo]; !logged { // TODO(sqs): need to skip these because we don't know the // "DefCommitID" in the def's repo, and ByDefKey requires // the key to have a CommitID. log.Printf("WARNING: Can't check resolution of cross-repo ref (ref.Repo=%q != ref.DefRepo=%q) - cross-repo ref checking is not yet implemented. (This log message will not be repeated.)", ref.Repo, ref.DefRepo) loggedDefRepos[ref.DefRepo] = struct{}{} } continue } def := ref.DefKey() def.CommitID = ref.CommitID uniqRefDefs[def] = append(uniqRefDefs[def], ref) } var ( brokenRefs []*graph.Ref brokenRefMu sync.Mutex par = parallel.NewRun(runtime.GOMAXPROCS(0)) ) for def_, refs_ := range uniqRefDefs { def, refs := def_, refs_ par.Do(func() error { defs, err := s.(store.RepoStore).Defs(store.ByDefKey(def)) if err != nil { return err } if len(defs) == 0 { brokenRefMu.Lock() brokenRefs = append(brokenRefs, refs...) brokenRefMu.Unlock() } return nil }) } err := par.Wait() sort.Sort(graph.Refs(brokenRefs)) return brokenRefs, err }