Skip to content

Commit 6fdeb83

Browse files
biswajit-patra-devProgHaj
authored andcommitted
Add review changes and resolve to use maven after creating pom.xml file
1 parent b90c182 commit 6fdeb83

File tree

8 files changed

+308
-52
lines changed

8 files changed

+308
-52
lines changed

internal/resolution/pm/maven/testdata/cmd_factory_mock.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package testdata
22

3-
import "os/exec"
3+
import (
4+
"os/exec"
5+
"runtime"
6+
)
47

58
type CmdFactoryMock struct {
69
Err error
@@ -12,5 +15,10 @@ func (f CmdFactoryMock) MakeDependencyTreeCmd(_ string) (*exec.Cmd, error) {
1215
if len(f.Arg) == 0 {
1316
f.Arg = `"MakeDependencyTreeCmd"`
1417
}
18+
19+
if runtime.GOOS == "windows" && f.Name == "echo" {
20+
return exec.Command("cmd", "/C", f.Name, f.Arg), nil
21+
}
22+
1523
return exec.Command(f.Name, f.Arg), f.Err
1624
}

internal/resolution/pm/sbt/README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ This approach allows SBT projects to leverage the existing Maven resolution logi
1818

1919
## Private Dependencies
2020

21-
Similar to Maven projects, SBT projects might use dependencies from repositories other than the default ones. The SBT `makePom` command will include these repository configurations in the generated POM file, and then the Maven resolution process will handle them as described in the Maven README.
21+
Similar to Maven projects, SBT projects might use dependencies from repositories other than the default ones. The
22+
SBT `makePom` command will include these repository configurations in the generated POM file, and then the Maven
23+
resolution process will handle them as described in the Maven README.
2224

2325
## Troubleshooting
2426

@@ -46,6 +48,7 @@ debricked resolve /path/to/scala/project
4648
```
4749

4850
This will:
51+
4952
1. Find all `build.sbt` files in the specified path
5053
2. Generate a POM file for each one
5154
3. Resolve dependencies using the Maven resolver

internal/resolution/pm/sbt/build_service.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88

99
type IBuildService interface {
1010
ParseBuildModules(path string) ([]string, error)
11+
FindPomFile(dir string) (string, error)
12+
RenamePomToXml(pomFile, destDir string) (string, error)
1113
}
1214

1315
type BuildService struct{}
@@ -31,7 +33,7 @@ func (b BuildService) ParseBuildModules(path string) ([]string, error) {
3133
return modules, nil
3234
}
3335

34-
func FindPomFile(dir string) (string, error) {
36+
func (b BuildService) FindPomFile(dir string) (string, error) {
3537
targetDir := filepath.Join(dir, "target")
3638

3739
scalaVersionDirs, err := filepath.Glob(filepath.Join(targetDir, "scala-*"))
@@ -49,7 +51,7 @@ func FindPomFile(dir string) (string, error) {
4951
return "", nil
5052
}
5153

52-
func RenamePomToXml(pomFile, destDir string) (string, error) {
54+
func (b BuildService) RenamePomToXml(pomFile, destDir string) (string, error) {
5355
content, err := os.ReadFile(pomFile)
5456
if err != nil {
5557
return "", err

internal/resolution/pm/sbt/build_service_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ func TestFindPomFile(t *testing.T) {
7474
t.Fatalf("Failed to create pom file: %v", err)
7575
}
7676

77-
foundPom, err := FindPomFile(tempDir)
77+
b := BuildService{}
78+
foundPom, err := b.FindPomFile(tempDir)
7879

7980
assert.Nil(t, err)
8081
assert.Equal(t, pomPath, foundPom)
@@ -87,7 +88,8 @@ func TestFindPomFileNoTarget(t *testing.T) {
8788
}
8889
defer os.RemoveAll(tempDir)
8990

90-
foundPom, err := FindPomFile(tempDir)
91+
b := BuildService{}
92+
foundPom, err := b.FindPomFile(tempDir)
9193

9294
assert.Nil(t, err)
9395
assert.Empty(t, foundPom)
@@ -107,7 +109,8 @@ func TestRenamePomToXml(t *testing.T) {
107109
t.Fatalf("Failed to create pom file: %v", err)
108110
}
109111

110-
xmlPath, err := RenamePomToXml(pomPath, tempDir)
112+
b := BuildService{}
113+
xmlPath, err := b.RenamePomToXml(pomPath, tempDir)
111114

112115
assert.Nil(t, err)
113116
assert.Equal(t, filepath.Join(tempDir, "pom.xml"), xmlPath)

internal/resolution/pm/sbt/job.go

Lines changed: 132 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strings"
88

99
"github.com/debricked/cli/internal/resolution/job"
10+
"github.com/debricked/cli/internal/resolution/pm/maven"
1011
"github.com/debricked/cli/internal/resolution/pm/util"
1112
)
1213

@@ -20,50 +21,80 @@ const (
2021

2122
type Job struct {
2223
job.BaseJob
23-
cmdFactory ICmdFactory
24-
buildService IBuildService
24+
cmdFactory ICmdFactory
25+
buildService IBuildService
26+
mavenPomService maven.IPomService
27+
mavenCmdFactory maven.ICmdFactory
2528
}
2629

27-
func NewJob(file string, cmdFactory ICmdFactory, buildService IBuildService) *Job {
30+
func NewJob(file string, cmdFactory ICmdFactory, buildService IBuildService, mavenPomService maven.IPomService, mavenCmdFactory maven.ICmdFactory) *Job {
2831
return &Job{
29-
BaseJob: job.NewBaseJob(file),
30-
cmdFactory: cmdFactory,
31-
buildService: buildService,
32+
BaseJob: job.NewBaseJob(file),
33+
cmdFactory: cmdFactory,
34+
buildService: buildService,
35+
mavenPomService: mavenPomService,
36+
mavenCmdFactory: mavenCmdFactory,
3237
}
3338
}
3439

3540
func (j *Job) Run() {
41+
if err := j.parseBuildFile(); err != nil {
42+
return
43+
}
44+
45+
if err := j.generatePomFile(); err != nil {
46+
return
47+
}
48+
49+
pomFile, err := j.locatePomFile()
50+
if err != nil {
51+
return
52+
}
53+
54+
pomXml, err := j.convertToPomXml(pomFile)
55+
if err != nil {
56+
return
57+
}
58+
59+
if err := j.parseAndProcessWithMaven(pomXml); err != nil {
60+
return
61+
}
62+
}
63+
64+
func (j *Job) parseBuildFile() error {
3665
status := "parsing SBT build file"
3766
j.SendStatus(status)
3867

3968
file := j.GetFile()
4069
_, err := j.buildService.ParseBuildModules(file)
41-
4270
if err != nil {
4371
doc := err.Error()
44-
4572
if doc == "EOF" {
4673
doc = "This file doesn't contain valid SBT build content"
4774
}
4875

4976
parsingError := util.NewPMJobError(err.Error())
5077
parsingError.SetStatus(status)
5178
parsingError.SetDocumentation(doc)
52-
5379
j.Errors().Critical(parsingError)
5480

55-
return
81+
return err
5682
}
5783

84+
return nil
85+
}
86+
87+
func (j *Job) generatePomFile() error {
88+
file := j.GetFile()
5889
workingDirectory := filepath.Dir(filepath.Clean(file))
5990
cmd, err := j.cmdFactory.MakePomCmd(workingDirectory)
6091
if err != nil {
6192
j.handleError(util.NewPMJobError(err.Error()))
6293

63-
return
94+
return err
6495
}
6596

66-
status = "generating Maven POM file"
97+
status := "generating Maven POM file"
6798
j.SendStatus(status)
6899

69100
output, err := cmd.CombinedOutput()
@@ -75,14 +106,21 @@ func (j *Job) Run() {
75106

76107
cmdErr := util.NewPMJobError(errContent)
77108
cmdErr.SetStatus(status)
78-
79109
j.handleError(cmdErr)
110+
111+
return err
80112
}
81113

82-
status = "locating generated POM file"
114+
return nil
115+
}
116+
117+
func (j *Job) locatePomFile() (string, error) {
118+
file := j.GetFile()
119+
workingDirectory := filepath.Dir(filepath.Clean(file))
120+
status := "locating generated POM file"
83121
j.SendStatus(status)
84122

85-
pomFile, err := FindPomFile(workingDirectory)
123+
pomFile, err := j.buildService.FindPomFile(workingDirectory)
86124
if err != nil || pomFile == "" {
87125
errorMsg := "No pom file found in target directory"
88126
if err != nil {
@@ -91,27 +129,100 @@ func (j *Job) Run() {
91129

92130
cmdErr := util.NewPMJobError(errorMsg)
93131
cmdErr.SetStatus(status)
94-
95132
j.handleError(cmdErr)
96133

97-
return
134+
return "", err
98135
}
99136

100-
status = "converting POM file to pom.xml"
137+
return pomFile, nil
138+
}
139+
140+
func (j *Job) convertToPomXml(pomFile string) (string, error) {
141+
file := j.GetFile()
142+
workingDirectory := filepath.Dir(filepath.Clean(file))
143+
status := "converting POM file to pom.xml"
101144
j.SendStatus(status)
102145

103-
pomXml, err := RenamePomToXml(pomFile, workingDirectory)
146+
pomXml, err := j.buildService.RenamePomToXml(pomFile, workingDirectory)
104147
if err != nil {
105148
cmdErr := util.NewPMJobError(err.Error())
106149
cmdErr.SetStatus(status)
107-
108150
j.handleError(cmdErr)
109151

110-
return
152+
return "", err
153+
}
154+
155+
return pomXml, nil
156+
}
157+
158+
func (j *Job) parseAndProcessWithMaven(pomXml string) error {
159+
status := "parsing Maven POM file"
160+
j.SendStatus(status)
161+
162+
if err := j.parseMavenPom(pomXml); err != nil {
163+
return err
164+
}
165+
166+
file := j.GetFile()
167+
workingDirectory := filepath.Dir(filepath.Clean(file))
168+
if err := j.createMavenDependencyGraph(workingDirectory, pomXml); err != nil {
169+
return err
111170
}
112171

113172
status = fmt.Sprintf("processing dependencies with Maven resolver using %s", pomXml)
114173
j.SendStatus(status)
174+
175+
return nil
176+
}
177+
178+
func (j *Job) parseMavenPom(pomXml string) error {
179+
status := "parsing Maven POM file"
180+
j.SendStatus(status)
181+
182+
_, err := j.mavenPomService.ParsePomModules(pomXml)
183+
if err != nil {
184+
doc := err.Error()
185+
if doc == "EOF" {
186+
doc = "This file doesn't contain valid XML"
187+
}
188+
189+
parsingError := util.NewPMJobError(err.Error())
190+
parsingError.SetStatus(status)
191+
parsingError.SetDocumentation(doc)
192+
j.Errors().Critical(parsingError)
193+
194+
return err
195+
}
196+
197+
return nil
198+
}
199+
200+
func (j *Job) createMavenDependencyGraph(workingDirectory string, pomXml string) error {
201+
status := "creating Maven dependency graph"
202+
j.SendStatus(status)
203+
204+
cmd, err := j.mavenCmdFactory.MakeDependencyTreeCmd(workingDirectory)
205+
if err != nil {
206+
j.handleError(util.NewPMJobError(err.Error()))
207+
208+
return err
209+
}
210+
211+
output, err := cmd.Output()
212+
if err != nil {
213+
errContent := err.Error()
214+
if output != nil {
215+
errContent = string(output)
216+
}
217+
218+
cmdErr := util.NewPMJobError(errContent)
219+
cmdErr.SetStatus(status)
220+
j.handleError(cmdErr)
221+
222+
return err
223+
}
224+
225+
return nil
115226
}
116227

117228
func (j *Job) handleError(cmdError job.IError) {

0 commit comments

Comments
 (0)