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

Commit 57d870b

Browse files
committed
Add incremental feedback for $GOPATH projects
- Adds incremental feedback for deps found in $GOPATH and separate feedback for network solved deps.
1 parent 5ed9269 commit 57d870b

File tree

1 file changed

+62
-68
lines changed

1 file changed

+62
-68
lines changed

cmd/dep/init.go

+62-68
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
112112
sm.UseDefaultSignalHandling()
113113
defer sm.Release()
114114

115+
internal.Logf("Searching GOPATH for projects...")
115116
pd, err := getProjectData(ctx, pkgT, cpr, sm)
116117
if err != nil {
117118
return err
@@ -144,6 +145,10 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
144145
)
145146
}
146147

148+
internal.Logf("Using network for remaining projects...")
149+
// Copy lock before solving. Use this to separate new lock projects from soln
150+
copyLock := *l
151+
147152
// Run solver with project versions found on disk
148153
internal.Vlogf("Solving...")
149154
params := gps.SolveParameters{
@@ -170,12 +175,26 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
170175
}
171176
l = dep.LockFromInterface(soln)
172177

173-
// Pick notondisk project constraints from solution and add to manifest
174-
for k, _ := range pd.notondisk {
175-
for _, x := range l.Projects() {
176-
if k == x.Ident().ProjectRoot {
177-
m.Dependencies[k] = getProjectPropertiesFromVersion(x.Version())
178-
break
178+
// Iterate through the new projects in solved lock and add them to manifest
179+
// if direct deps and log feedback for all the new projects.
180+
for _, x := range l.Projects() {
181+
pr := x.Ident().ProjectRoot
182+
newProject := true
183+
// Check if it's a new project, not in the old lock
184+
for _, y := range copyLock.Projects() {
185+
if pr == y.Ident().ProjectRoot {
186+
newProject = false
187+
}
188+
}
189+
if newProject {
190+
// Check if it's in notondisk project map. These are direct deps, should
191+
// be added to manifest.
192+
if _, ok := pd.notondisk[pr]; ok {
193+
m.Dependencies[pr] = getProjectPropertiesFromVersion(x.Version())
194+
feedback(x.Version(), pr, internal.DepTypeDirect)
195+
} else {
196+
// Log feedback of transitive project
197+
feedback(x.Version(), pr, internal.DepTypeTransitive)
179198
}
180199
}
181200
}
@@ -189,9 +208,6 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
189208

190209
l.Memo = s.HashInputs()
191210

192-
// Log itemized feedback about the resolved dependencies
193-
itemizedFeedback(m, l, pkgT)
194-
195211
internal.Vlogf("Writing manifest and lock files.")
196212

197213
sw, err := dep.NewSafeWriter(m, nil, l, dep.VendorAlways)
@@ -242,73 +258,48 @@ func hasImportPathPrefix(s, prefix string) bool {
242258
return strings.HasPrefix(s, prefix+"/")
243259
}
244260

245-
// itemizedFeedback itemizes resolved dependencies and logs the solution as
246-
// feedback.
247-
func itemizedFeedback(m *dep.Manifest, l *dep.Lock, pkgT pkgtree.PackageTree) {
248-
// Algo:
249-
// 1. collect direct external deps from PackageTree
250-
// 2. loop through lock projects
251-
// 2.a. check if the projects exists in direct deps list
252-
// 2.b. if it's a direct dep:
253-
// 2.b.i. if it has a version attached, constraints dep
254-
// 2.b.ii. if it has revision only, hint dep
255-
// 2.c. else it's a transitive dep, goes into lock
256-
// 2.d. log feedback
257-
258-
// Extract direct external deps
259-
rm, errmap := pkgT.ToReachMap(true, true, false, nil)
260-
for fail := range errmap {
261-
internal.Logf("Warning: %s", fail)
262-
}
263-
264-
directDeps := rm.Flatten(false)
265-
266-
for _, lock := range l.Projects() {
267-
// Get locked revision, version and branch
268-
r, v, b := gps.VersionComponentStrings(lock.Version())
269-
270-
// Check if it's a valid SHA1 digest and trim to 7 characters.
271-
if len(r) == 40 {
272-
if _, err := hex.DecodeString(r); err == nil {
273-
// Valid SHA1 digest
274-
r = r[0:7]
275-
}
276-
}
261+
// feedback logs project constraint as feedback to the user.
262+
func feedback(v gps.Version, pr gps.ProjectRoot, depType string) {
263+
rev, version, branch := gps.VersionComponentStrings(v)
277264

278-
// Get LockedVersion
279-
var ver string
280-
if v != "" {
281-
ver = v
282-
} else if b != "" {
283-
ver = b
265+
// Check if it's a valid SHA1 digest and trim to 7 characters.
266+
if len(rev) == 40 {
267+
if _, err := hex.DecodeString(rev); err == nil {
268+
// Valid SHA1 digest
269+
rev = rev[0:7]
284270
}
271+
}
285272

286-
cf := &internal.ConstraintFeedback{
287-
LockedVersion: ver,
288-
Revision: r,
289-
ProjectPath: string(lock.Ident().ProjectRoot),
290-
}
273+
// Get LockedVersion
274+
var ver string
275+
if version != "" {
276+
ver = version
277+
} else if branch != "" {
278+
ver = branch
279+
}
291280

292-
// Get manifest version if available
293-
if pp, ok := m.Dependencies[lock.Ident().ProjectRoot]; ok && pp.Constraint != nil {
294-
cf.Version = pp.Constraint.String()
295-
}
281+
cf := &internal.ConstraintFeedback{
282+
LockedVersion: ver,
283+
Revision: rev,
284+
ProjectPath: string(pr),
285+
DependencyType: depType,
286+
}
296287

297-
if contains(directDeps, cf.ProjectPath) {
298-
// Direct dependency
299-
cf.DependencyType = internal.DepTypeDirect
300-
if cf.LockedVersion != "" {
301-
cf.ConstraintType = internal.ConsTypeConstraint
302-
} else {
303-
cf.ConstraintType = internal.ConsTypeHint
304-
}
288+
// Get non-revision constraint if available
289+
if c := getProjectPropertiesFromVersion(v).Constraint; c != nil {
290+
cf.Version = c.String()
291+
}
292+
293+
// Attach ConstraintType for direct dep based on locked version
294+
if cf.DependencyType == internal.DepTypeDirect {
295+
if cf.LockedVersion != "" {
296+
cf.ConstraintType = internal.ConsTypeConstraint
305297
} else {
306-
// Transitive dependency
307-
cf.DependencyType = internal.DepTypeTransitive
298+
cf.ConstraintType = internal.ConsTypeHint
308299
}
309-
310-
cf.LogFeedback()
311300
}
301+
302+
cf.LogFeedback()
312303
}
313304

314305
// getProjectPropertiesFromVersion takes a gps.Version and returns a proper
@@ -392,6 +383,8 @@ func getProjectData(ctx *dep.Ctx, pkgT pkgtree.PackageTree, cpr string, sm *gps.
392383

393384
ondisk[pr] = v
394385
constraints[pr] = getProjectPropertiesFromVersion(v)
386+
387+
feedback(v, pr, internal.DepTypeDirect)
395388
}
396389

397390
internal.Vlogf("Analyzing transitive imports...")
@@ -458,6 +451,7 @@ func getProjectData(ctx *dep.Ctx, pkgT pkgtree.PackageTree, cpr string, sm *gps.
458451
return nil
459452
}
460453
ondisk[pr] = v
454+
feedback(v, pr, internal.DepTypeTransitive)
461455
}
462456

463457
ptree, err = pkgtree.ListPackages(r, string(pr))

0 commit comments

Comments
 (0)