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,9 @@ func (a *rootAnalyzer) InitializeRootManifestAndLock(dir string, pr gps.ProjectR
45
48
46
49
if rootM == nil {
47
50
rootM = dep .NewManifest ()
51
+ if err := a .cacheDeps (pr ); err != nil {
52
+ return nil , nil , err
53
+ }
48
54
}
49
55
if rootL == nil {
50
56
rootL = & dep.Lock {}
@@ -53,6 +59,58 @@ func (a *rootAnalyzer) InitializeRootManifestAndLock(dir string, pr gps.ProjectR
53
59
return
54
60
}
55
61
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
+
56
114
func (a * rootAnalyzer ) importManifestAndLock (dir string , pr gps.ProjectRoot , suppressLogs bool ) (* dep.Manifest , * dep.Lock , error ) {
57
115
logger := a .ctx .Err
58
116
if suppressLogs {
0 commit comments