in tool/preprocess/match.go [517:560]
func (dp *DepProcessor) matchRules() error {
defer util.PhaseTimer("Match")()
// Run a dry build to get all dependencies needed for the project
// Match the dependencies with available rules and prepare them
// for the actual instrumentation
// Run dry build to the build blueprint
compileCmds, err := runDryBuild(dp.goBuildCmd)
if err != nil {
// Tell us more about what happened in the dry run
errLog, _ := util.ReadFile(util.GetLogPath(DryRunLog))
err = errc.Adhere(err, "reason", errLog)
return err
}
matcher := newRuleMatcher()
// If we are in vendor mode, we need to parse the vendor/modules.txt file
// to get the version of each module for future matching
if dp.vendorMode {
modules, err := parseVendorModules(dp.getGoModDir())
if err != nil {
return err
}
if config.GetConf().Verbose {
util.Log("Vendor modules: %v", modules)
}
matcher.moduleVersions = modules
}
// Find used instrumentation rule according to compile commands
ch := make(chan *resource.RuleBundle)
for _, cmd := range compileCmds {
go runMatch(matcher, cmd, ch)
}
cnt := 0
for cnt < len(compileCmds) {
bundle := <-ch
if bundle.IsValid() {
dp.bundles = append(dp.bundles, bundle)
}
cnt++
}
return nil
}