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

Commit 443f6f0

Browse files
committed
Prefetch and log output during InitializeRootManifestAndLock
1 parent ac1a162 commit 443f6f0

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

cmd/dep/root_analyzer.go

+62
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@
55
package main
66

77
import (
8+
"context"
89
"io/ioutil"
910
"log"
1011

12+
"golang.org/x/sync/errgroup"
13+
1114
"github.com/golang/dep"
1215
fb "github.com/golang/dep/internal/feedback"
1316
"github.com/golang/dep/internal/gps"
@@ -45,6 +48,13 @@ func (a *rootAnalyzer) InitializeRootManifestAndLock(dir string, pr gps.ProjectR
4548

4649
if rootM == nil {
4750
rootM = dep.NewManifest()
51+
52+
// Since we didn't find anything to import, dep's cache is empty.
53+
// We are prefetching dependencies and logging so that the subsequent solve step
54+
// doesn't spend a long time retrieving dependencies without feedback for the user.
55+
if err := a.cacheDeps(pr); err != nil {
56+
return nil, nil, err
57+
}
4858
}
4959
if rootL == nil {
5060
rootL = &dep.Lock{}
@@ -53,6 +63,58 @@ func (a *rootAnalyzer) InitializeRootManifestAndLock(dir string, pr gps.ProjectR
5363
return
5464
}
5565

66+
func (a *rootAnalyzer) cacheDeps(pr gps.ProjectRoot) error {
67+
logger := a.ctx.Err
68+
g, _ := errgroup.WithContext(context.TODO())
69+
concurrency := 4
70+
71+
syncDep := func(pr gps.ProjectRoot, sm gps.SourceManager) error {
72+
if err := sm.SyncSourceFor(gps.ProjectIdentifier{ProjectRoot: pr}); err != nil {
73+
logger.Printf("Unable to cache %s - %s", pr, err)
74+
return err
75+
}
76+
logger.Printf("Cached %s", pr)
77+
return nil
78+
}
79+
80+
deps := make(chan gps.ProjectRoot)
81+
82+
for i := 0; i < concurrency; i++ {
83+
g.Go(func() error {
84+
for d := range deps {
85+
err := syncDep(d, a.sm)
86+
if err != nil {
87+
return err
88+
}
89+
}
90+
return nil
91+
})
92+
}
93+
94+
g.Go(func() error {
95+
defer close(deps)
96+
for ip := range a.directDeps {
97+
logger.Printf("Package %q, analyzing...", ip)
98+
pr, err := a.sm.DeduceProjectRoot(ip)
99+
if err != nil {
100+
return err
101+
}
102+
deps <- pr
103+
}
104+
return nil
105+
})
106+
107+
go func() {
108+
g.Wait()
109+
}()
110+
111+
if err := g.Wait(); err != nil {
112+
return err
113+
}
114+
logger.Printf("Successfully cached all deps.")
115+
return nil
116+
}
117+
56118
func (a *rootAnalyzer) importManifestAndLock(dir string, pr gps.ProjectRoot, suppressLogs bool) (*dep.Manifest, *dep.Lock, error) {
57119
logger := a.ctx.Err
58120
if suppressLogs {

0 commit comments

Comments
 (0)