Skip to content

Commit 18a28a4

Browse files
committed
feat(nuget): Implement nuget analyzer
1 parent 724d8fb commit 18a28a4

File tree

13 files changed

+474
-508
lines changed

13 files changed

+474
-508
lines changed

Makefile

-2
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,9 @@ docker-base: ./docker/base/Dockerfile
3535
docker-test-base: docker-base ./docker/test-base/Dockerfile
3636
sudo docker build -t quay.io/fossa/fossa-cli-test-base -f ./docker/test-base/Dockerfile .
3737

38-
.PHONY: docker
3938
docker: docker-base ./docker/cli/Dockerfile
4039
sudo docker build -t quay.io/fossa/fossa-cli -f ./docker/cli/Dockerfile .
4140

42-
.PHONY: docker-test
4341
docker-test: docker-test-base ./docker/test/Dockerfile
4442
sudo docker build -t quay.io/fossa/fossa-cli-test -f ./docker/test/Dockerfile .
4543

analyzers/analyzer.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/fossas/fossa-cli/analyzers/gradle"
1010
"github.com/fossas/fossa-cli/analyzers/maven"
1111
"github.com/fossas/fossa-cli/analyzers/nodejs"
12+
"github.com/fossas/fossa-cli/analyzers/nuget"
1213
"github.com/fossas/fossa-cli/analyzers/php"
1314
"github.com/fossas/fossa-cli/analyzers/python"
1415
"github.com/fossas/fossa-cli/analyzers/ruby"
@@ -60,15 +61,13 @@ func New(key pkg.Type, options map[string]interface{}) (Analyzer, error) {
6061
case pkg.NodeJS:
6162
return nodejs.New(options)
6263
case pkg.NuGet:
63-
return nil, ErrAnalyzerNotImplemented
64+
return nuget.New(options)
6465
case pkg.Python:
6566
return python.New(options)
6667
case pkg.Ruby:
6768
return ruby.New(options)
6869
case pkg.Scala:
6970
return nil, ErrAnalyzerNotImplemented
70-
case pkg.VendoredArchives:
71-
return nil, ErrAnalyzerNotImplemented
7271
}
7372
return nil, ErrUnknownPackageType
7473
}

analyzers/maven/maven.go

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ func (a *Analyzer) Discover(dir string) ([]module.Module, error) {
108108
// subproject.
109109
return filepath.SkipDir
110110
}
111+
111112
return nil
112113
})
113114

analyzers/nuget/analyze.go

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package nuget
2+
3+
import (
4+
"path/filepath"
5+
6+
"github.com/fossas/fossa-cli/buildtools/dotnet"
7+
"github.com/fossas/fossa-cli/files"
8+
"github.com/fossas/fossa-cli/log"
9+
"github.com/fossas/fossa-cli/module"
10+
"github.com/fossas/fossa-cli/pkg"
11+
)
12+
13+
func (a *Analyzer) Analyze(m module.Module) (module.Module, error) {
14+
log.Logger.Debugf("%#v", m)
15+
// Parse lockfile.
16+
lockfile, err := dotnet.ReadLockfile(filepath.Join(Dir(m), "obj", "project.assets.json"))
17+
if err != nil {
18+
return m, err
19+
}
20+
21+
// Compute project graph.
22+
projects := make(map[string]dotnet.Manifest)
23+
err = Projects(projects, m.BuildTarget)
24+
if err != nil {
25+
return m, err
26+
}
27+
root := projects[m.BuildTarget]
28+
id := pkg.ID{
29+
Type: pkg.NuGet,
30+
Name: root.Name(),
31+
Revision: root.Version(),
32+
Location: m.BuildTarget,
33+
}
34+
35+
// Compute package graph.
36+
deps := make(map[pkg.ID]pkg.Package)
37+
Packages(projects, lockfile, deps, m.BuildTarget)
38+
39+
m.Imports = deps[id].Imports
40+
delete(deps, id)
41+
m.Deps = deps
42+
43+
return m, nil
44+
}
45+
46+
func Projects(projects map[string]dotnet.Manifest, projectFile string) error {
47+
// Break out of cycles.
48+
if _, ok := projects[projectFile]; ok {
49+
return nil
50+
}
51+
52+
// Read manifest.
53+
var manifest dotnet.Manifest
54+
err := files.ReadXML(&manifest, projectFile)
55+
if err != nil {
56+
return err
57+
}
58+
projects[projectFile] = manifest
59+
60+
// Get all project references and recurse.
61+
for _, reference := range manifest.Projects() {
62+
err = Projects(projects, filepath.Join(filepath.Dir(projectFile), dotnet.Path(reference.Include)))
63+
if err != nil {
64+
return err
65+
}
66+
}
67+
68+
return nil
69+
}
70+
71+
func Packages(projects map[string]dotnet.Manifest, lockfile dotnet.Lockfile, deps map[pkg.ID]pkg.Package, dep string) pkg.ID {
72+
log.Logger.Debugf("%#v", dep)
73+
if project, ok := projects[dotnet.Path(dep)]; ok {
74+
log.Logger.Debugf("%#v", project)
75+
name := project.Name()
76+
version := project.Version()
77+
78+
id := pkg.ID{
79+
Type: pkg.NuGet,
80+
Name: name,
81+
Revision: version,
82+
Location: dep,
83+
}
84+
85+
var imports []pkg.Import
86+
for _, ref := range project.Packages() {
87+
imports = append(imports, pkg.Import{
88+
Target: ref.Include + "@" + ref.Version,
89+
Resolved: Packages(projects, lockfile, deps, ref.Include),
90+
})
91+
}
92+
for _, ref := range project.Projects() {
93+
imports = append(imports, pkg.Import{
94+
Target: ref.Include + "@" + ref.Version,
95+
Resolved: Packages(projects, lockfile, deps, filepath.Join(filepath.Dir(dep), dotnet.Path(ref.Include))),
96+
})
97+
}
98+
99+
deps[id] = pkg.Package{
100+
ID: id,
101+
Imports: imports,
102+
}
103+
104+
return id
105+
} else {
106+
name := dep
107+
version := lockfile.Resolve(name)
108+
109+
id := pkg.ID{
110+
Type: pkg.NuGet,
111+
Name: name,
112+
Revision: version,
113+
}
114+
115+
var imports []pkg.Import
116+
for p, version := range lockfile.Imports(dep) {
117+
imports = append(imports, pkg.Import{
118+
Target: p + "@" + version,
119+
Resolved: Packages(projects, lockfile, deps, p),
120+
})
121+
}
122+
123+
deps[id] = pkg.Package{
124+
ID: id,
125+
Imports: imports,
126+
}
127+
128+
return id
129+
}
130+
}

0 commit comments

Comments
 (0)