5
5
package main
6
6
7
7
import (
8
+ "context"
8
9
"io/ioutil"
9
10
"log"
10
11
12
+ "golang.org/x/sync/errgroup"
13
+
11
14
"github.com/golang/dep"
12
15
fb "github.com/golang/dep/internal/feedback"
13
16
"github.com/golang/dep/internal/gps"
@@ -45,6 +48,13 @@ func (a *rootAnalyzer) InitializeRootManifestAndLock(dir string, pr gps.ProjectR
45
48
46
49
if rootM == nil {
47
50
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
+ }
48
58
}
49
59
if rootL == nil {
50
60
rootL = & dep.Lock {}
@@ -53,6 +63,58 @@ func (a *rootAnalyzer) InitializeRootManifestAndLock(dir string, pr gps.ProjectR
53
63
return
54
64
}
55
65
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
+
56
118
func (a * rootAnalyzer ) importManifestAndLock (dir string , pr gps.ProjectRoot , suppressLogs bool ) (* dep.Manifest , * dep.Lock , error ) {
57
119
logger := a .ctx .Err
58
120
if suppressLogs {
0 commit comments