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

Commit db0b31c

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

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

cmd/dep/root_analyzer.go

+58
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,9 @@ func (a *rootAnalyzer) InitializeRootManifestAndLock(dir string, pr gps.ProjectR
4548

4649
if rootM == nil {
4750
rootM = dep.NewManifest()
51+
if err := a.cacheDeps(pr); err != nil {
52+
return nil, nil, err
53+
}
4854
}
4955
if rootL == nil {
5056
rootL = &dep.Lock{}
@@ -53,6 +59,58 @@ func (a *rootAnalyzer) InitializeRootManifestAndLock(dir string, pr gps.ProjectR
5359
return
5460
}
5561

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

0 commit comments

Comments
 (0)