@@ -15,6 +15,13 @@ import (
15
15
"github.com/aquasecurity/go-dep-parser/pkg/types"
16
16
"github.com/fatih/color"
17
17
"github.com/kyoshidajp/dep-doctor/cmd/github"
18
+ "github.com/kyoshidajp/dep-doctor/cmd/golang"
19
+ "github.com/kyoshidajp/dep-doctor/cmd/nodejs"
20
+ "github.com/kyoshidajp/dep-doctor/cmd/php"
21
+ "github.com/kyoshidajp/dep-doctor/cmd/python"
22
+ "github.com/kyoshidajp/dep-doctor/cmd/ruby"
23
+ "github.com/kyoshidajp/dep-doctor/cmd/rust"
24
+ "github.com/kyoshidajp/dep-doctor/cmd/swift"
18
25
"github.com/spf13/cobra"
19
26
"golang.org/x/exp/slices"
20
27
)
@@ -42,24 +49,24 @@ func (d *Diagnosis) ErrorMessage() string {
42
49
return fmt .Sprintf ("%s" , d .Error )
43
50
}
44
51
45
- type MedicalTechnician interface {
52
+ type Doctor interface {
46
53
Libraries (r parser_io.ReadSeekerAt ) []types.Library
47
54
SourceCodeURL (lib types.Library ) (string , error )
48
55
}
49
56
50
57
type RepositoryParams []github.FetchRepositoryParam
51
58
52
- func (p RepositoryParams ) CanSearchParams () []github.FetchRepositoryParam {
59
+ func (p RepositoryParams ) SearchableParams () []github.FetchRepositoryParam {
53
60
params := []github.FetchRepositoryParam {}
54
61
for _ , param := range p {
55
- if param .CanSearch {
62
+ if param .Searchable {
56
63
params = append (params , param )
57
64
}
58
65
}
59
66
return params
60
67
}
61
68
62
- func FetchRepositoryParams (libs []types.Library , g MedicalTechnician ) RepositoryParams {
69
+ func FetchRepositoryParams (libs []types.Library , d Doctor ) RepositoryParams {
63
70
var params []github.FetchRepositoryParam
64
71
var wg sync.WaitGroup
65
72
sem := make (chan struct {}, FETCH_REPOS_PER_ONCE )
@@ -73,12 +80,12 @@ func FetchRepositoryParams(libs []types.Library, g MedicalTechnician) Repository
73
80
74
81
fmt .Printf ("%s\n " , lib .Name )
75
82
76
- url , err := g .SourceCodeURL (lib )
83
+ url , err := d .SourceCodeURL (lib )
77
84
if err != nil {
78
85
params = append (params ,
79
86
github.FetchRepositoryParam {
80
87
PackageName : lib .Name ,
81
- CanSearch : false ,
88
+ Searchable : false ,
82
89
Error : err ,
83
90
},
84
91
)
@@ -90,7 +97,7 @@ func FetchRepositoryParams(libs []types.Library, g MedicalTechnician) Repository
90
97
params = append (params ,
91
98
github.FetchRepositoryParam {
92
99
PackageName : lib .Name ,
93
- CanSearch : false ,
100
+ Searchable : false ,
94
101
Error : err ,
95
102
},
96
103
)
@@ -102,7 +109,7 @@ func FetchRepositoryParams(libs []types.Library, g MedicalTechnician) Repository
102
109
Repo : repo .Repo ,
103
110
Owner : repo .Owner ,
104
111
PackageName : lib .Name ,
105
- CanSearch : true ,
112
+ Searchable : true ,
106
113
},
107
114
)
108
115
}(lib )
@@ -113,20 +120,20 @@ func FetchRepositoryParams(libs []types.Library, g MedicalTechnician) Repository
113
120
return params
114
121
}
115
122
116
- func Diagnose (d MedicalTechnician , r io.ReadSeekCloserAt , year int , ignores []string ) map [string ]Diagnosis {
123
+ func Diagnose (d Doctor , r io.ReadSeekCloserAt , year int , ignores []string ) map [string ]Diagnosis {
117
124
diagnoses := make (map [string ]Diagnosis )
118
125
slicedParams := [][]github.FetchRepositoryParam {}
119
126
libs := d .Libraries (r )
120
127
fetchRepositoryParams := FetchRepositoryParams (libs , d )
121
- canSearchRepositoryParams := fetchRepositoryParams .CanSearchParams ()
122
- sliceSize := len (canSearchRepositoryParams )
128
+ searchableRepositoryParams := fetchRepositoryParams .SearchableParams ()
129
+ sliceSize := len (searchableRepositoryParams )
123
130
124
131
for i := 0 ; i < sliceSize ; i += github .SEARCH_REPOS_PER_ONCE {
125
132
end := i + github .SEARCH_REPOS_PER_ONCE
126
133
if sliceSize < end {
127
134
end = sliceSize
128
135
}
129
- slicedParams = append (slicedParams , canSearchRepositoryParams [i :end ])
136
+ slicedParams = append (slicedParams , searchableRepositoryParams [i :end ])
130
137
}
131
138
132
139
var wg sync.WaitGroup
@@ -157,7 +164,7 @@ func Diagnose(d MedicalTechnician, r io.ReadSeekCloserAt, year int, ignores []st
157
164
wg .Wait ()
158
165
159
166
for _ , fetchRepositoryParam := range fetchRepositoryParams {
160
- if fetchRepositoryParam .CanSearch {
167
+ if fetchRepositoryParam .Searchable {
161
168
continue
162
169
}
163
170
@@ -173,7 +180,7 @@ func Diagnose(d MedicalTechnician, r io.ReadSeekCloserAt, year int, ignores []st
173
180
174
181
type Options struct {
175
182
packageManager string
176
- lockFilePath string
183
+ filePath string
177
184
ignores string
178
185
year int
179
186
}
@@ -186,15 +193,32 @@ var (
186
193
o = & Options {}
187
194
)
188
195
189
- var doctors = map [string ]MedicalTechnician {
190
- "bundler" : NewBundlerDoctor (),
191
- "yarn" : NewYarnDoctor (),
192
- "pip" : NewPipDoctor (),
193
- "npm" : NewNPMDoctor (),
194
- "composer" : NewComposerDoctor (),
195
- "golang" : NewGolangDoctor (),
196
- "cargo" : NewCargoDoctor (),
197
- "cocoapods" : NewCococaPodsDoctor (),
196
+ type Doctors map [string ]Doctor
197
+
198
+ func (d Doctors ) PackageManagers () []string {
199
+ packages := []string {}
200
+ for p := range d {
201
+ packages = append (packages , p )
202
+ }
203
+ sort .Strings (packages )
204
+ return packages
205
+ }
206
+
207
+ func (d Doctors ) UnknownErrorMessage (packageManager string ) string {
208
+ return fmt .Sprintf ("Unknown package manager: %s. You can choose from [%s]" ,
209
+ packageManager ,
210
+ strings .Join (d .PackageManagers (), ", " ))
211
+ }
212
+
213
+ var doctors = Doctors {
214
+ "bundler" : ruby .NewBundlerDoctor (),
215
+ "yarn" : nodejs .NewYarnDoctor (),
216
+ "pip" : python .NewPipDoctor (),
217
+ "npm" : nodejs .NewNPMDoctor (),
218
+ "composer" : php .NewComposerDoctor (),
219
+ "golang" : golang .NewGolangDoctor (),
220
+ "cargo" : rust .NewCargoDoctor (),
221
+ "cocoapods" : swift .NewCococaPodsDoctor (),
198
222
}
199
223
200
224
var diagnoseCmd = & cobra.Command {
@@ -203,21 +227,17 @@ var diagnoseCmd = &cobra.Command{
203
227
Run : func (cmd * cobra.Command , args []string ) {
204
228
doctor , ok := doctors [o .packageManager ]
205
229
if ! ok {
206
- packages := []string {}
207
- for p := range doctors {
208
- packages = append (packages , p )
209
- }
210
- m := fmt .Sprintf ("Unknown package manager: %s. You can choose from [%s]" , o .packageManager , strings .Join (packages , ", " ))
230
+ m := doctors .UnknownErrorMessage (o .packageManager )
211
231
log .Fatal (m )
212
232
}
213
233
214
- lockFilePath := o .lockFilePath
215
- f , err := os .Open (lockFilePath )
234
+ filePath := o .filePath
235
+ f , err := os .Open (filePath )
216
236
defer func () {
217
237
_ = f .Close ()
218
238
}()
219
239
if err != nil {
220
- m := fmt .Sprintf ("Can't open: %s." , o .lockFilePath )
240
+ m := fmt .Sprintf ("Can't open: %s." , o .filePath )
221
241
log .Fatal (m )
222
242
}
223
243
@@ -230,10 +250,17 @@ var diagnoseCmd = &cobra.Command{
230
250
231
251
func init () {
232
252
rootCmd .AddCommand (diagnoseCmd )
233
- diagnoseCmd .Flags ().StringVarP (& o .packageManager , "package" , "p" , "bundler " , "package manager" )
234
- diagnoseCmd .Flags ().StringVarP (& o .lockFilePath , "lock_file " , "f" , "Gemfile.lock " , "lock file path" )
253
+ diagnoseCmd .Flags ().StringVarP (& o .packageManager , "package" , "p" , "" , "package manager" )
254
+ diagnoseCmd .Flags ().StringVarP (& o .filePath , "file " , "f" , "" , "dependencies file path" )
235
255
diagnoseCmd .Flags ().StringVarP (& o .ignores , "ignores" , "i" , "" , "ignore dependencies (separated by a space)" )
236
256
diagnoseCmd .Flags ().IntVarP (& o .year , "year" , "y" , MAX_YEAR_TO_BE_BLANK , "max years of inactivity" )
257
+
258
+ if err := diagnoseCmd .MarkFlagRequired ("package" ); err != nil {
259
+ fmt .Println (err .Error ())
260
+ }
261
+ if err := diagnoseCmd .MarkFlagRequired ("file" ); err != nil {
262
+ fmt .Println (err .Error ())
263
+ }
237
264
}
238
265
239
266
func Report (diagnoses map [string ]Diagnosis ) error {
0 commit comments