Skip to content
This repository was archived by the owner on Sep 9, 2020. It is now read-only.

Commit a4fd873

Browse files
committed
Fix issues with the new init algo implementation
- Avoid running solver twice and use gps.Prepare to get the final lock. - Improve manifest constraints population based on the algo in the new spec doc.
1 parent ffe7388 commit a4fd873

File tree

1 file changed

+52
-33
lines changed

1 file changed

+52
-33
lines changed

cmd/dep/init.go

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,24 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
137137

138138
// Run solver with project versions found on disk
139139
internal.Vlogf("Solving...")
140-
soln, err := getSolverSolution(root, pkgT, m, l, sm)
140+
params := gps.SolveParameters{
141+
RootDir: root,
142+
RootPackageTree: pkgT,
143+
Manifest: m,
144+
Lock: l,
145+
ProjectAnalyzer: dep.Analyzer{},
146+
}
147+
148+
if *verbose {
149+
params.Trace = true
150+
params.TraceLogger = log.New(os.Stderr, "", 0)
151+
}
152+
s, err := gps.Prepare(params, sm)
153+
if err != nil {
154+
return errors.Wrap(err, "prepare solver")
155+
}
156+
157+
soln, err := s.Solve()
141158
if err != nil {
142159
handleAllTheFailuresOfTheWorld(err)
143160
return err
@@ -154,14 +171,14 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
154171
}
155172
}
156173

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)
174+
// Run gps.Prepare with appropriate constraint solutions from solve run
175+
// to generate the final lock memo.
176+
s, err = gps.Prepare(params, sm)
160177
if err != nil {
161-
handleAllTheFailuresOfTheWorld(err)
162-
return err
178+
return errors.Wrap(err, "prepare solver")
163179
}
164-
l = dep.LockFromInterface(soln)
180+
181+
l.Memo = s.HashInputs()
165182

166183
internal.Vlogf("Writing manifest and lock files.")
167184

@@ -210,43 +227,45 @@ func hasImportPathPrefix(s, prefix string) bool {
210227
return strings.HasPrefix(s, prefix+"/")
211228
}
212229

230+
// getVersionConstituents extracts version constituents
231+
func getVersionConstituents(v gps.Version) (version, revision string) {
232+
switch tv := v.(type) {
233+
case gps.UnpairedVersion:
234+
version = tv.String()
235+
case gps.Revision:
236+
revision = tv.String()
237+
case gps.PairedVersion:
238+
version = tv.Unpair().String()
239+
revision = tv.Underlying().String()
240+
}
241+
242+
return version, revision
243+
}
244+
213245
// getProjectPropertiesFromVersion takes a gps.Version and returns a proper
214-
// gps.ProjectProperties with Constraint value based on the version type.
246+
// gps.ProjectProperties with Constraint value based on the provided version.
215247
func getProjectPropertiesFromVersion(v gps.Version) gps.ProjectProperties {
216248
pp := gps.ProjectProperties{}
249+
250+
// constituent version and revision. Ignoring revison for manifest.
251+
cv, _ := getVersionConstituents(v)
252+
217253
switch v.Type() {
218-
case gps.IsBranch, gps.IsVersion, gps.IsRevision:
219-
pp.Constraint = v
254+
case gps.IsBranch:
255+
pp.Constraint = gps.NewBranch(cv)
256+
case gps.IsVersion:
257+
pp.Constraint = gps.NewVersion(cv)
220258
case gps.IsSemver:
221-
c, _ := gps.NewSemverConstraint("^" + v.String())
259+
// TODO: remove "^" when https://github.com/golang/dep/issues/225 is ready.
260+
c, _ := gps.NewSemverConstraint("^" + cv)
222261
pp.Constraint = c
262+
case gps.IsRevision:
263+
pp.Constraint = nil
223264
}
224265

225266
return pp
226267
}
227268

228-
// getSolverSolution runs gps solver and returns a solution.
229-
func getSolverSolution(root string, pkgT pkgtree.PackageTree, m *dep.Manifest, l *dep.Lock, sm *gps.SourceMgr) (gps.Solution, error) {
230-
params := gps.SolveParameters{
231-
RootDir: root,
232-
RootPackageTree: pkgT,
233-
Manifest: m,
234-
Lock: l,
235-
ProjectAnalyzer: dep.Analyzer{},
236-
}
237-
238-
if *verbose {
239-
params.Trace = true
240-
params.TraceLogger = log.New(os.Stderr, "", 0)
241-
}
242-
s, err := gps.Prepare(params, sm)
243-
if err != nil {
244-
return nil, errors.Wrap(err, "prepare solver")
245-
}
246-
247-
return s.Solve()
248-
}
249-
250269
type projectData struct {
251270
constraints gps.ProjectConstraints // constraints that could be found
252271
dependencies map[gps.ProjectRoot][]string // all dependencies (imports) found by project root

0 commit comments

Comments
 (0)