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

Commit e82dcc8

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 1cbdd5f commit e82dcc8

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
@@ -141,7 +141,24 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
141141

142142
// Run solver with project versions found on disk
143143
internal.Vlogf("Solving...")
144-
soln, err := getSolverSolution(root, pkgT, m, l, sm)
144+
params := gps.SolveParameters{
145+
RootDir: root,
146+
RootPackageTree: pkgT,
147+
Manifest: m,
148+
Lock: l,
149+
ProjectAnalyzer: dep.Analyzer{},
150+
}
151+
152+
if *verbose {
153+
params.Trace = true
154+
params.TraceLogger = log.New(os.Stderr, "", 0)
155+
}
156+
s, err := gps.Prepare(params, sm)
157+
if err != nil {
158+
return errors.Wrap(err, "prepare solver")
159+
}
160+
161+
soln, err := s.Solve()
145162
if err != nil {
146163
handleAllTheFailuresOfTheWorld(err)
147164
return err
@@ -158,14 +175,14 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
158175
}
159176
}
160177

161-
// Run solver again with appropriate constraint solutions from previous run
162-
// to generate the final lock.
163-
soln, err = getSolverSolution(root, pkgT, m, l, sm)
178+
// Run gps.Prepare with appropriate constraint solutions from solve run
179+
// to generate the final lock memo.
180+
s, err = gps.Prepare(params, sm)
164181
if err != nil {
165-
handleAllTheFailuresOfTheWorld(err)
166-
return err
182+
return errors.Wrap(err, "prepare solver")
167183
}
168-
l = dep.LockFromInterface(soln)
184+
185+
l.Memo = s.HashInputs()
169186

170187
internal.Vlogf("Writing manifest and lock files.")
171188

@@ -214,43 +231,45 @@ func hasImportPathPrefix(s, prefix string) bool {
214231
return strings.HasPrefix(s, prefix+"/")
215232
}
216233

234+
// getVersionConstituents extracts version constituents
235+
func getVersionConstituents(v gps.Version) (version, revision string) {
236+
switch tv := v.(type) {
237+
case gps.UnpairedVersion:
238+
version = tv.String()
239+
case gps.Revision:
240+
revision = tv.String()
241+
case gps.PairedVersion:
242+
version = tv.Unpair().String()
243+
revision = tv.Underlying().String()
244+
}
245+
246+
return version, revision
247+
}
248+
217249
// getProjectPropertiesFromVersion takes a gps.Version and returns a proper
218-
// gps.ProjectProperties with Constraint value based on the version type.
250+
// gps.ProjectProperties with Constraint value based on the provided version.
219251
func getProjectPropertiesFromVersion(v gps.Version) gps.ProjectProperties {
220252
pp := gps.ProjectProperties{}
253+
254+
// constituent version and revision. Ignoring revison for manifest.
255+
cv, _ := getVersionConstituents(v)
256+
221257
switch v.Type() {
222-
case gps.IsBranch, gps.IsVersion, gps.IsRevision:
223-
pp.Constraint = v
258+
case gps.IsBranch:
259+
pp.Constraint = gps.NewBranch(cv)
260+
case gps.IsVersion:
261+
pp.Constraint = gps.NewVersion(cv)
224262
case gps.IsSemver:
225-
c, _ := gps.NewSemverConstraint("^" + v.String())
263+
// TODO: remove "^" when https://github.com/golang/dep/issues/225 is ready.
264+
c, _ := gps.NewSemverConstraint("^" + cv)
226265
pp.Constraint = c
266+
case gps.IsRevision:
267+
pp.Constraint = nil
227268
}
228269

229270
return pp
230271
}
231272

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

0 commit comments

Comments
 (0)