(ctx context.Context, parent *model.File, files []*model.File, call model.ResCallback)
| 24 | } |
| 25 | |
| 26 | func (sca Sca) Sca(ctx context.Context, parent *model.File, files []*model.File, call model.ResCallback) { |
| 27 | |
| 28 | path2dir := func(relpath string) string { return path.Dir(strings.ReplaceAll(relpath, `\`, `/`)) } |
| 29 | |
| 30 | // 记录存在lock文件的目录 |
| 31 | lockSet := map[string]bool{} |
| 32 | for _, file := range files { |
| 33 | if filter.PythonPipfileLock(file.Relpath()) { |
| 34 | lockSet[path2dir(file.Relpath())] = true |
| 35 | } |
| 36 | } |
| 37 | |
| 38 | // 记录使用pipenv解析过的目录 |
| 39 | pipSet := map[string]bool{} |
| 40 | // 尝试使用pipenv解析 |
| 41 | for _, file := range files { |
| 42 | if pipSet[path2dir(file.Relpath())] { |
| 43 | continue |
| 44 | } |
| 45 | if filter.PythonPipfile(file.Relpath()) || |
| 46 | filter.PythonRequirementsTxt(file.Relpath()) { |
| 47 | } else { |
| 48 | continue |
| 49 | } |
| 50 | root := ParsePythonWithEnv(ctx, file) |
| 51 | if root == nil { |
| 52 | continue |
| 53 | } |
| 54 | call(file, root) |
| 55 | pipSet[path2dir(file.Relpath())] = true |
| 56 | } |
| 57 | |
| 58 | // 静态解析 |
| 59 | for _, file := range files { |
| 60 | if pipSet[path2dir(file.Relpath())] { |
| 61 | continue |
| 62 | } |
| 63 | if filter.PythonPipfile(file.Relpath()) { |
| 64 | if !lockSet[path2dir(file.Relpath())] { |
| 65 | call(file, ParsePipfile(file)) |
| 66 | } |
| 67 | } else if filter.PythonPipfileLock(file.Relpath()) { |
| 68 | call(file, ParsePipfileLock(file)) |
| 69 | } else if filter.PythonRequirementsIn(file.Relpath()) { |
| 70 | call(file, ParseRequirementIn(file)) |
| 71 | } else if filter.PythonRequirementsTxt(file.Relpath()) { |
| 72 | call(file, ParseRequirementTxt(file)) |
| 73 | } else if filter.PythonSetup(file.Relpath()) { |
| 74 | call(file, ParseSetup(file)) |
| 75 | } |
| 76 | } |
| 77 | } |
nothing calls this directly
no test coverage detected