in cmd/yesiscan/main.go [77:209]
func Main(c *cli.Context, program string, debug bool, logf func(format string, v ...interface{})) error {
userCacheDir, err := os.UserCacheDir()
if err != nil {
return err
}
if err := os.MkdirAll(userCacheDir, interfaces.Umask); err != nil {
return err
}
prefix := filepath.Join(userCacheDir, program)
if err := os.MkdirAll(prefix, interfaces.Umask); err != nil {
return err
}
safePrefixAbsDir, err := safepath.ParseIntoAbsDir(prefix)
if err != nil {
return err
}
logf("prefix: %s", safePrefixAbsDir)
// TODO: add more --flags to specify which parser/backends to use...
inputStrings := []string{}
for i := 0; i < c.NArg(); i++ {
s := c.Args().Get(i)
if s == "-" { // stdin
var err error
s, err = stdinAsString(logf)
if err != nil {
return err
}
}
inputStrings = append(inputStrings, s)
}
if c.NArg() == 0 { // if we didn't get any args, assume stdin
s, err := stdinAsString(logf)
if err != nil {
return err
}
inputStrings = append(inputStrings, s)
}
iterators := []interfaces.Iterator{}
for _, s := range inputStrings {
trivialURIParser := &parser.TrivialURIParser{
Debug: debug,
Logf: func(format string, v ...interface{}) {
logf(format, v...)
},
Prefix: safePrefixAbsDir,
Input: s,
}
logf("input: %s", s)
ixs, err := trivialURIParser.Parse() // parser returns iterators
if err != nil {
return errwrap.Wrapf(err, "parser failed")
}
iterators = append(iterators, ixs...)
}
backends := []interfaces.Backend{}
backendWeights := make(map[interfaces.Backend]float64)
if !c.Bool("no-backend-licenseclassifier") {
licenseClassifierBackend := &backend.LicenseClassifier{
Debug: debug,
Logf: func(format string, v ...interface{}) {
logf("backend: "+format, v...)
},
IncludeHeaders: false,
UseDefaultConfidence: false,
// useful for testing before we add file name filtering
//SkipZeroResults: true,
}
backends = append(backends, licenseClassifierBackend)
backendWeights[licenseClassifierBackend] = 1.0 // TODO: adjust as needed
}
if !c.Bool("no-backend-spdx") {
spdxBackend := &backend.SPDXClassifier{
Debug: debug,
Logf: func(format string, v ...interface{}) {
logf("backend: "+format, v...)
},
}
backends = append(backends, spdxBackend)
backendWeights[spdxBackend] = 2.0 // TODO: adjust as needed
}
//if !c.Bool("no-backend-example") {
// exampleBackend := &backend.ExampleClassifier{
// Debug: debug,
// Logf: func(format string, v ...interface{}) {
// logf("backend: "+format, v...)
// },
// }
// backends = append(backends, exampleBackend)
// backendWeights[exampleBackend] = 99.0 // TODO: adjust as needed
//}
core := &lib.Core{
Debug: debug,
Logf: func(format string, v ...interface{}) {
logf("core: "+format, v...)
},
Backends: backends,
Iterators: iterators, // TODO: should this be passed into Run instead?
ShutdownOnError: false, // set to true for "perfect" scanning.
}
if err := core.Init(); err != nil {
return errwrap.Wrapf(err, "could not initialize core")
}
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
results, err := core.Run(ctx)
if err != nil {
return errwrap.Wrapf(err, "core run failed")
}
str, err := lib.SimpleResults(results, backendWeights)
if err != nil {
return err
}
logf("Results...\n%s", str)
return nil
}