@@ -135,25 +135,28 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
135
135
)
136
136
}
137
137
138
+ // Run solver with project versions found on disk
138
139
internal .Vlogf ("Solving..." )
139
- params := gps.SolveParameters {
140
- RootDir : root ,
141
- RootPackageTree : pkgT ,
142
- Manifest : m ,
143
- Lock : l ,
144
- ProjectAnalyzer : dep.Analyzer {},
140
+ soln , err := getSolverSolution (root , pkgT , m , l , sm )
141
+ if err != nil {
142
+ handleAllTheFailuresOfTheWorld (err )
143
+ return err
145
144
}
145
+ l = dep .LockFromInterface (soln )
146
146
147
- if * verbose {
148
- params .Trace = true
149
- params .TraceLogger = log .New (os .Stderr , "" , 0 )
150
- }
151
- s , err := gps .Prepare (params , sm )
152
- if err != nil {
153
- return errors .Wrap (err , "prepare solver" )
147
+ // Pick notondisk project constraints from solution and add to manifest
148
+ for k , _ := range pd .notondisk {
149
+ for _ , x := range l .Projects () {
150
+ if k == x .Ident ().ProjectRoot {
151
+ m .Dependencies [k ] = getProjectPropertiesFromVersion (x .Version ())
152
+ break
153
+ }
154
+ }
154
155
}
155
156
156
- soln , err := s .Solve ()
157
+ // Run solver again with appropriate constraint solutions from previous run
158
+ // to generate the final lock.
159
+ soln , err = getSolverSolution (root , pkgT , m , l , sm )
157
160
if err != nil {
158
161
handleAllTheFailuresOfTheWorld (err )
159
162
return err
@@ -208,6 +211,43 @@ func hasImportPathPrefix(s, prefix string) bool {
208
211
return strings .HasPrefix (s , prefix + "/" )
209
212
}
210
213
214
+ // getProjectPropertiesFromVersion takes a gps.Version and returns a proper
215
+ // gps.ProjectProperties with Constraint value based on the version type.
216
+ func getProjectPropertiesFromVersion (v gps.Version ) gps.ProjectProperties {
217
+ pp := gps.ProjectProperties {}
218
+ switch v .Type () {
219
+ case gps .IsBranch , gps .IsVersion , gps .IsRevision :
220
+ pp .Constraint = v
221
+ case gps .IsSemver :
222
+ c , _ := gps .NewSemverConstraint ("^" + v .String ())
223
+ pp .Constraint = c
224
+ }
225
+
226
+ return pp
227
+ }
228
+
229
+ // getSolverSolution runs gps solver and returns a solution.
230
+ func getSolverSolution (root string , pkgT pkgtree.PackageTree , m * dep.Manifest , l * dep.Lock , sm * gps.SourceMgr ) (gps.Solution , error ) {
231
+ params := gps.SolveParameters {
232
+ RootDir : root ,
233
+ RootPackageTree : pkgT ,
234
+ Manifest : m ,
235
+ Lock : l ,
236
+ ProjectAnalyzer : dep.Analyzer {},
237
+ }
238
+
239
+ if * verbose {
240
+ params .Trace = true
241
+ params .TraceLogger = log .New (os .Stderr , "" , 0 )
242
+ }
243
+ s , err := gps .Prepare (params , sm )
244
+ if err != nil {
245
+ return nil , errors .Wrap (err , "prepare solver" )
246
+ }
247
+
248
+ return s .Solve ()
249
+ }
250
+
211
251
type projectData struct {
212
252
constraints gps.ProjectConstraints // constraints that could be found
213
253
dependencies map [gps.ProjectRoot ][]string // all dependencies (imports) found by project root
@@ -257,21 +297,12 @@ func getProjectData(ctx *dep.Ctx, pkgT pkgtree.PackageTree, cpr string, sm *gps.
257
297
v , err := ctx .VersionInWorkspace (pr )
258
298
if err != nil {
259
299
notondisk [pr ] = true
260
- internal .Vlogf ("Could not determine version for %q, assuming version to be master " , pr )
261
- v = gps . Revision ( "master" )
300
+ internal .Vlogf ("Could not determine version for %q, omitting from generated manifest " , pr )
301
+ continue
262
302
}
263
303
264
304
ondisk [pr ] = v
265
- pp := gps.ProjectProperties {}
266
- switch v .Type () {
267
- case gps .IsBranch , gps .IsVersion , gps .IsRevision :
268
- pp .Constraint = v
269
- case gps .IsSemver :
270
- c , _ := gps .NewSemverConstraint ("^" + v .String ())
271
- pp .Constraint = c
272
- }
273
-
274
- constraints [pr ] = pp
305
+ constraints [pr ] = getProjectPropertiesFromVersion (v )
275
306
}
276
307
277
308
internal .Vlogf ("Analyzing transitive imports..." )
0 commit comments