Skip to content

Commit 4dee460

Browse files
Merge pull request #130 from whyrusleeping/feat/better-ui
improve install UI a bit
2 parents da7ef5e + ace355b commit 4dee460

File tree

3 files changed

+47
-12
lines changed

3 files changed

+47
-12
lines changed

gxutil/pm.go

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
sh "github.com/ipfs/go-ipfs-api"
1616
mh "github.com/multiformats/go-multihash"
17+
prog "github.com/whyrusleeping/progmeter"
1718
. "github.com/whyrusleeping/stump"
1819
)
1920

@@ -32,6 +33,8 @@ type PM struct {
3233

3334
cfg *Config
3435

36+
ProgMeter *prog.ProgMeter
37+
3538
global bool
3639

3740
// 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 {
150153
return pm.installDeps(pkg, location, make(map[string]bool))
151154
}
152155

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+
153167
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)
155169

156170
packages := make([]*Package, len(pkg.Dependencies))
157171
pkgdirs := make([]string, len(pkg.Dependencies))
158172
done := make(chan *Dependency)
159173
errs := make(chan error)
174+
ratelim := make(chan struct{}, 2)
160175
var count int
176+
pm.ProgMeter.AddTodos(len(pkg.Dependencies) * 2)
161177
for i, dep := range pkg.Dependencies {
162178
if complete[dep.Hash] {
179+
pm.ProgMeter.MarkDone()
163180
continue
164181
}
165182

166183
count++
167184

168185
go func(i int, dep *Dependency) {
186+
ratelim <- struct{}{}
187+
defer func() { <-ratelim }()
169188
hash := dep.Hash
170189
pkgdir := filepath.Join(location, "gx", "ipfs", hash)
171190
cpkg := new(Package)
172191

173192
err := FindPackageInDir(cpkg, pkgdir)
174193
if err != nil {
175194
VLog(" - %s not found locally, fetching into %s", hash, pkgdir)
195+
pm.ProgMeter.AddEntry(dep.Hash, "[fetch] "+dep.Name, dep.Hash)
176196
var final error
177197
for i := 0; i < 4; i++ {
178198
cpkg, final = pm.GetPackageTo(hash, pkgdir)
@@ -187,9 +207,11 @@ func (pm *PM) installDeps(pkg *Package, location string, complete map[string]boo
187207
time.Sleep(time.Millisecond * 200 * time.Duration(i+1))
188208
}
189209
if final != nil {
210+
pm.ProgMeter.Error(dep.Hash, final.Error())
190211
errs <- fmt.Errorf("failed to fetch package: %s: %s", hash, final)
191212
return
192213
}
214+
pm.ProgMeter.Finish(dep.Hash)
193215
VLog(" - fetch %s complete!", hash)
194216
}
195217

@@ -218,21 +240,27 @@ func (pm *PM) installDeps(pkg *Package, location string, complete map[string]boo
218240
for i, dep := range pkg.Dependencies {
219241
cpkg := packages[i]
220242
if cpkg == nil {
243+
pm.ProgMeter.MarkDone()
221244
continue
222245
}
223246
VLog(" - %s depends on %s (%s)", pkg.Name, dep.Name, dep.Hash)
224247
err := pm.installDeps(cpkg, location, complete)
225248
if err != nil {
249+
pm.ProgMeter.Error(dep.Hash, err.Error())
226250
return err
227251
}
228252

229253
complete[dep.Hash] = true
230254

255+
pm.ProgMeter.AddEntry(dep.Hash, "[install] "+dep.Name, dep.Hash)
256+
pm.ProgMeter.Working(dep.Hash, "work")
231257
if err := maybeRunPostInstall(cpkg, pkgdirs[i], pm.global); err != nil {
258+
pm.ProgMeter.Error(dep.Hash, err.Error())
232259
return err
233260
}
261+
pm.ProgMeter.Finish(dep.Hash)
234262
}
235-
Log("installation of dep %s complete!", pkg.Name)
263+
//Log("installation of dep %s complete!", pkg.Name)
236264
return nil
237265
}
238266

main.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/blang/semver"
1717
cli "github.com/codegangsta/cli"
1818
gx "github.com/whyrusleeping/gx/gxutil"
19+
progmeter "github.com/whyrusleeping/progmeter"
1920
log "github.com/whyrusleeping/stump"
2021

2122
"github.com/whyrusleeping/json-filter"
@@ -246,7 +247,7 @@ EXAMPLE
246247
},
247248
Action: func(c *cli.Context) error {
248249
if len(c.Args()) == 0 {
249-
return fmt.Errorf("import requires a package name")
250+
return fmt.Errorf("import requires a package reference")
250251
}
251252

252253
global := c.BoolT("global")
@@ -282,6 +283,8 @@ EXAMPLE
282283
return fmt.Errorf("(install):", err)
283284
}
284285

286+
pm.ProgMeter.Stop()
287+
285288
if pkg.FindDep(npkg.Name) != nil {
286289
s := fmt.Sprintf("package with name %s already imported, continue?", npkg.Name)
287290
if !yesNoPrompt(s, false) {
@@ -329,6 +332,10 @@ var InstallCommand = cli.Command{
329332
Name: "save",
330333
Usage: "write installed packages as deps in package.json",
331334
},
335+
cli.BoolFlag{
336+
Name: "nofancy",
337+
Usage: "write minimal output",
338+
},
332339
},
333340
Action: func(c *cli.Context) error {
334341
pkg, err := LoadPackageFile(PkgFileName)
@@ -345,6 +352,8 @@ var InstallCommand = cli.Command{
345352

346353
pm.SetGlobal(global)
347354

355+
pm.ProgMeter = progmeter.NewProgMeter(c.Bool("nofancy"))
356+
348357
if len(c.Args()) == 0 {
349358
cwd, err := os.Getwd()
350359
if err != nil {

tests/t0030-import.sh

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,18 +70,16 @@ test_expect_success "importing c brought along a and b" '
7070
'
7171

7272
test_expect_success "install d works" '
73-
pkg_run d gx --verbose install > install_out
73+
pkg_run d gx --verbose install --nofancy > install_out
7474
'
7575

7676
test_expect_success "install output looks good" '
77-
grep "installing package: d-0.0.0" install_out &&
78-
grep "installing package: c-0.0.0" install_out &&
79-
grep "installing package: a-0.0.0" install_out &&
80-
grep "installing package: b-0.0.0" install_out &&
81-
grep "installation of dep a complete!" install_out &&
82-
grep "installation of dep b complete!" install_out &&
83-
grep "installation of dep c complete!" install_out &&
84-
grep "installation of dep d complete!" install_out
77+
grep "\[get \] \[install\] a" install_out &&
78+
grep "\[get \] \[install\] b" install_out &&
79+
grep "\[get \] \[install\] c" install_out &&
80+
grep "\[done\] \[install\] a" install_out &&
81+
grep "\[done\] \[install\] b" install_out &&
82+
grep "\[done\] \[install\] c" install_out
8583
'
8684

8785
test_expect_success "deps look correct" '

0 commit comments

Comments
 (0)