@@ -14,6 +14,7 @@ import (
14
14
15
15
sh "github.com/ipfs/go-ipfs-api"
16
16
mh "github.com/multiformats/go-multihash"
17
+ prog "github.com/whyrusleeping/progmeter"
17
18
. "github.com/whyrusleeping/stump"
18
19
)
19
20
@@ -32,6 +33,8 @@ type PM struct {
32
33
33
34
cfg * Config
34
35
36
+ ProgMeter * prog.ProgMeter
37
+
35
38
global bool
36
39
37
40
// hash of the 'empty' ipfs dir to avoid extra calls to object new
@@ -150,29 +153,46 @@ func (pm *PM) InstallDeps(pkg *Package, location string) error {
150
153
return pm .installDeps (pkg , location , make (map [string ]bool ))
151
154
}
152
155
156
+ func (pm * PM ) SetProgMeter (meter * prog.ProgMeter ) {
157
+ pm .ProgMeter = meter
158
+ }
159
+
160
+ func padRight (s string , w int ) string {
161
+ if len (s ) < w {
162
+ return s + strings .Repeat (" " , len (s )- w )
163
+ }
164
+ return s
165
+ }
166
+
153
167
func (pm * PM ) installDeps (pkg * Package , location string , complete map [string ]bool ) error {
154
- VLog ("installing package: %s-%s" , pkg .Name , pkg .Version )
168
+ // VLog("installing package: %s-%s", pkg.Name, pkg.Version)
155
169
156
170
packages := make ([]* Package , len (pkg .Dependencies ))
157
171
pkgdirs := make ([]string , len (pkg .Dependencies ))
158
172
done := make (chan * Dependency )
159
173
errs := make (chan error )
174
+ ratelim := make (chan struct {}, 2 )
160
175
var count int
176
+ pm .ProgMeter .AddTodos (len (pkg .Dependencies ) * 2 )
161
177
for i , dep := range pkg .Dependencies {
162
178
if complete [dep .Hash ] {
179
+ pm .ProgMeter .MarkDone ()
163
180
continue
164
181
}
165
182
166
183
count ++
167
184
168
185
go func (i int , dep * Dependency ) {
186
+ ratelim <- struct {}{}
187
+ defer func () { <- ratelim }()
169
188
hash := dep .Hash
170
189
pkgdir := filepath .Join (location , "gx" , "ipfs" , hash )
171
190
cpkg := new (Package )
172
191
173
192
err := FindPackageInDir (cpkg , pkgdir )
174
193
if err != nil {
175
194
VLog (" - %s not found locally, fetching into %s" , hash , pkgdir )
195
+ pm .ProgMeter .AddEntry (dep .Hash , "[fetch] " + dep .Name , dep .Hash )
176
196
var final error
177
197
for i := 0 ; i < 4 ; i ++ {
178
198
cpkg , final = pm .GetPackageTo (hash , pkgdir )
@@ -187,9 +207,11 @@ func (pm *PM) installDeps(pkg *Package, location string, complete map[string]boo
187
207
time .Sleep (time .Millisecond * 200 * time .Duration (i + 1 ))
188
208
}
189
209
if final != nil {
210
+ pm .ProgMeter .Error (dep .Hash , final .Error ())
190
211
errs <- fmt .Errorf ("failed to fetch package: %s: %s" , hash , final )
191
212
return
192
213
}
214
+ pm .ProgMeter .Finish (dep .Hash )
193
215
VLog (" - fetch %s complete!" , hash )
194
216
}
195
217
@@ -218,21 +240,27 @@ func (pm *PM) installDeps(pkg *Package, location string, complete map[string]boo
218
240
for i , dep := range pkg .Dependencies {
219
241
cpkg := packages [i ]
220
242
if cpkg == nil {
243
+ pm .ProgMeter .MarkDone ()
221
244
continue
222
245
}
223
246
VLog (" - %s depends on %s (%s)" , pkg .Name , dep .Name , dep .Hash )
224
247
err := pm .installDeps (cpkg , location , complete )
225
248
if err != nil {
249
+ pm .ProgMeter .Error (dep .Hash , err .Error ())
226
250
return err
227
251
}
228
252
229
253
complete [dep .Hash ] = true
230
254
255
+ pm .ProgMeter .AddEntry (dep .Hash , "[install] " + dep .Name , dep .Hash )
256
+ pm .ProgMeter .Working (dep .Hash , "work" )
231
257
if err := maybeRunPostInstall (cpkg , pkgdirs [i ], pm .global ); err != nil {
258
+ pm .ProgMeter .Error (dep .Hash , err .Error ())
232
259
return err
233
260
}
261
+ pm .ProgMeter .Finish (dep .Hash )
234
262
}
235
- Log ("installation of dep %s complete!" , pkg .Name )
263
+ // Log("installation of dep %s complete!", pkg.Name)
236
264
return nil
237
265
}
238
266
0 commit comments