in tools/go-agent/cmd/injector.go [283:318]
func (i *projectInjector) alreadyContainsLibraryImport(dir string) (bool, error) {
readDir, err := os.ReadDir(dir)
if err != nil {
return false, fmt.Errorf("reding directory %s failure, %v", dir, err)
}
for _, f := range readDir {
if f.IsDir() {
continue
}
if !strings.HasSuffix(f.Name(), ".go") {
continue
}
file, err := os.ReadFile(filepath.Join(dir, f.Name()))
if err != nil {
return false, fmt.Errorf("read file %s failed, %v", f.Name(), err)
}
dstFile, err := decorator.ParseFile(nil, f.Name(), file, parser.ImportsOnly)
if err != nil {
return false, fmt.Errorf("parsing file %s failed, %v", f.Name(), err)
}
var existingImport = false
for _, decl := range dstFile.Decls {
if gen, ok := decl.(*dst.GenDecl); ok && gen != nil && gen.Tok == token.IMPORT &&
!existingImport && i.containsImport(gen) {
existingImport = true
}
}
if existingImport {
return true, nil
}
}
return false, nil
}