Add a progress indicator.
diff --git a/action/create.go b/action/create.go
index 5a8d6c4..31972c0 100644
--- a/action/create.go
+++ b/action/create.go
@@ -93,7 +93,7 @@
}
for _, i := range deps {
- msg.Info("Found imported reference to %s\n", i.Name)
+ msg.Info("Found imported reference to %s", i.Name)
config.Imports = append(config.Imports, i)
}
}
@@ -124,7 +124,7 @@
root, subpkg := util.NormalizeName(n)
if !config.HasDependency(root) {
- msg.Info("Found reference to %s\n", n)
+ msg.Info("Found reference to %s", n)
d := &cfg.Dependency{
Name: root,
}
@@ -137,7 +137,7 @@
subpkg = strings.TrimPrefix(subpkg, "/")
d := config.Imports.Get(root)
if !d.HasSubpackage(subpkg) {
- msg.Info("Adding sub-package %s to %s\n", subpkg, root)
+ msg.Info("Adding sub-package %s to %s", subpkg, root)
d.Subpackages = append(d.Subpackages, subpkg)
}
}
diff --git a/action/ensure.go b/action/ensure.go
index c57bbac..6168f73 100644
--- a/action/ensure.go
+++ b/action/ensure.go
@@ -99,7 +99,7 @@
}
msg.Error("Could not find any of %s/src.\n", strings.Join(gps, "/src, "))
- msg.Info("As of Glide 0.5/Go 1.5, this is required.\n")
+ msg.Info("As of Glide 0.5/Go 1.5, this is required.")
msg.Die("Wihtout src, cannot continue.")
return ""
}
diff --git a/action/rebuild.go b/action/rebuild.go
index d53b774..8cebfa1 100644
--- a/action/rebuild.go
+++ b/action/rebuild.go
@@ -24,10 +24,10 @@
msg.Die("Could not get vendor path: %s", err)
}
- msg.Info("Building dependencies.\n")
+ msg.Info("Building dependencies.")
if len(conf.Imports) == 0 {
- msg.Info("No dependencies found. Nothing built.\n")
+ msg.Info("No dependencies found. Nothing built.")
return
}
@@ -87,7 +87,7 @@
}
func buildPath(path string) error {
- msg.Info("Running go build %s\n", path)
+ msg.Info("Running go build %s", path)
// . in a filepath.Join is removed so it needs to be prepended separately.
p := "." + string(filepath.Separator) + filepath.Join("vendor", path)
out, err := exec.Command("go", "install", p).CombinedOutput()
diff --git a/action/update.go b/action/update.go
index 5d56a51..15b4b80 100644
--- a/action/update.go
+++ b/action/update.go
@@ -17,6 +17,9 @@
EnsureVendorDir()
conf := EnsureConfig()
+ msg.StartProgress("Updating dependencies...")
+ defer msg.StopProgress("Update complete")
+
// Delete unused packages
if installer.DeleteUnused {
dependency.DeleteUnused(conf)
diff --git a/dependency/delete.go b/dependency/delete.go
index 39a6367..8a0e5c0 100644
--- a/dependency/delete.go
+++ b/dependency/delete.go
@@ -92,7 +92,7 @@
// Perform the actual delete.
for _, path := range markForDelete {
localPath := strings.TrimPrefix(path, searchPath)
- msg.Info("Removing unused package: %s\n", localPath)
+ msg.Info("Removing unused package: %s", localPath)
rerr := os.RemoveAll(path)
if rerr != nil {
return rerr
diff --git a/gb/gb.go b/gb/gb.go
index 5a07c62..aa1816d 100644
--- a/gb/gb.go
+++ b/gb/gb.go
@@ -24,7 +24,7 @@
return []*cfg.Dependency{}, nil
}
- msg.Info("Found GB manifest file.\n")
+ msg.Info("Found GB manifest file.")
buf := []*cfg.Dependency{}
file, err := os.Open(path)
if err != nil {
diff --git a/glide.lock b/glide.lock
index ef461c7..233399f 100644
--- a/glide.lock
+++ b/glide.lock
@@ -1,8 +1,12 @@
-hash: 1d4d06656329894abc78c0ac256169337c947260b784fee7ed02a0e405c0f63b
-updated: 2016-01-28T11:15:09.190330904-05:00
+hash: 45950a5c234a3741dbbb86a8f0fb4bd2757e3d19e571a8fe6e9372cbb878517c
+updated: 2016-02-11T22:12:03.12669949-07:00
imports:
- name: github.com/codegangsta/cli
- version: c31a7975863e7810c92e2e288a9ab074f9a88f29
+ version: 0ab42fd482c27cf2c95e7794ad3bb2082c2ab2d7
+- name: github.com/Masterminds/kitt
+ version: 7e843d5f21a5f009f5119a91ea3868eabb19b20f
+ subpackages:
+ - progress
- name: github.com/Masterminds/semver
version: 513f3dcb3ecfb1248831fb5cb06a23a3cd5935dc
- name: github.com/Masterminds/vcs
diff --git a/glide.yaml b/glide.yaml
index 09401c9..436abb1 100644
--- a/glide.yaml
+++ b/glide.yaml
@@ -15,3 +15,4 @@
- package: github.com/codegangsta/cli
- package: github.com/Masterminds/semver
version: ^1.0.0
+- package: github.com/Masterminds/kitt
diff --git a/godep/godep.go b/godep/godep.go
index 6785a0d..7670793 100644
--- a/godep/godep.go
+++ b/godep/godep.go
@@ -53,7 +53,7 @@
if _, err := os.Stat(path); err != nil {
return []*cfg.Dependency{}, nil
}
- msg.Info("Found Godeps.json file.\n")
+ msg.Info("Found Godeps.json file.")
buf := []*cfg.Dependency{}
diff --git a/gpm/gpm.go b/gpm/gpm.go
index 41de69d..9190a11 100644
--- a/gpm/gpm.go
+++ b/gpm/gpm.go
@@ -27,10 +27,10 @@
if i, err := os.Stat(path); err != nil {
return []*cfg.Dependency{}, nil
} else if i.IsDir() {
- msg.Info("Godeps is a directory. This is probably a Godep project.\n")
+ msg.Info("Godeps is a directory. This is probably a Godep project.")
return []*cfg.Dependency{}, nil
}
- msg.Info("Found Godeps file.\n")
+ msg.Info("Found Godeps file.")
buf := []*cfg.Dependency{}
diff --git a/msg/msg.go b/msg/msg.go
index 7c9f705..ec8cfbc 100644
--- a/msg/msg.go
+++ b/msg/msg.go
@@ -6,6 +6,8 @@
"os"
"strings"
"sync"
+
+ "github.com/Masterminds/kitt/progress"
)
// Messanger provides the underlying implementation that displays output to
@@ -31,15 +33,30 @@
// PanicOnDie if true Die() will panic instead of exiting.
PanicOnDie bool
+ // InProgress indicates whether the Messanger is currently in a progress meter.
+ InProgress bool
+
// The default exit code to use when dyping
ecode int
// If an error was been sent.
hasErrored bool
+
+ meter ProgressMeter
+}
+
+type ProgressMeter interface {
+ Start(string)
+ Message(string)
+ Done(string)
}
// NewMessanger creates a default Messanger to display output.
func NewMessanger() *Messanger {
+ //var mtr ProgressMeter = (nilMeter)(0)
+ mtr := progress.NewIndicator()
+ mtr.Frames = Cylon
+ mtr.Interval = CylonInterval
m := &Messanger{
Quiet: false,
IsDebugging: false,
@@ -48,6 +65,8 @@
Stderr: os.Stderr,
PanicOnDie: false,
ecode: 1,
+ meter: mtr,
+ InProgress: false,
}
return m
@@ -67,6 +86,10 @@
// Info logs information using the Default Messanger
func Info(msg string, args ...interface{}) {
+ if Default.InProgress {
+ Default.meter.Message(fmt.Sprintf(msg, args...))
+ return
+ }
Default.Info(msg, args...)
}
diff --git a/msg/progress.go b/msg/progress.go
new file mode 100644
index 0000000..c06acf2
--- /dev/null
+++ b/msg/progress.go
@@ -0,0 +1,57 @@
+package msg
+
+import (
+ "fmt"
+ "time"
+)
+
+var Cylon = []string{
+ " 〖\033[0;31m ◼︎\033[m〗",
+ " 〖\033[0;31m ◼︎ \033[m〗",
+ " 〖\033[0;31m ◼︎▫︎ \033[m〗",
+ " 〖\033[0;31m ◼︎ ▫︎▫︎\033[m〗",
+ " 〖\033[0;31m ◼︎ ▫︎▫︎ \033[m〗",
+ " 〖\033[0;31m ◼︎ ▫︎▫︎ \033[m〗",
+ " 〖\033[0;31m ◼︎ ▫︎▫︎ \033[m〗",
+ " 〖\033[0;31m ◼︎ ▫︎▫︎ \033[m〗",
+ " 〖\033[0;31m◼︎ ▫︎▫︎ \033[m〗",
+ " 〖\033[0;31m◼︎ \033[m〗",
+ " 〖\033[0;31m▫︎◼︎ \033[m〗",
+ " 〖\033[0;31m▫︎▫︎◼︎ \033[m〗",
+ " 〖\033[0;31m ▫︎▫︎◼︎ \033[m〗",
+ " 〖\033[0;31m ▫︎▫︎◼︎ \033[m〗",
+ " 〖\033[0;31m ▫︎▫︎◼︎ \033[m〗",
+ " 〖\033[0;31m ▫︎▫︎◼︎ \033[m〗",
+ " 〖\033[0;31m ▫︎▫︎◼︎\033[m〗",
+}
+
+const CylonInterval = 100 * time.Millisecond
+
+func StartProgress(msg string) {
+ Default.InProgress = true
+ Default.meter.Start(msg)
+}
+
+func Progress(msg string, v ...interface{}) {
+ if Default.InProgress {
+ Default.meter.Message(fmt.Sprintf(msg, v...))
+ }
+}
+
+func StopProgress(msg string) {
+ Default.meter.Done(msg)
+ Default.InProgress = false
+}
+
+// nilMeter is an implementation of ProgressMeter that prints messages to Info.
+type nilMeter int
+
+func (n nilMeter) Start(s string) {
+ Info(s)
+}
+func (n nilMeter) Message(s string) {
+ Info(s)
+}
+func (n nilMeter) Done(s string) {
+ Info(s)
+}
diff --git a/repo/installer.go b/repo/installer.go
index 7ab1727..678818a 100644
--- a/repo/installer.go
+++ b/repo/installer.go
@@ -4,6 +4,7 @@
"fmt"
"os"
"path/filepath"
+ "runtime"
"strings"
"sync"
@@ -235,8 +236,6 @@
var lock sync.Mutex
var returnErr error
- msg.Info("Downloading dependencies. Please wait...")
-
for ii := 0; ii < concurrentWorkers; ii++ {
go func(ch <-chan *cfg.Dependency) {
for {
@@ -268,6 +267,8 @@
in <- dep
}
+ runtime.Gosched()
+ msg.Info("Fetching %d dependencies", len(deps))
wg.Wait()
// Close goroutines setting the version
diff --git a/repo/set_reference.go b/repo/set_reference.go
index d40615b..6a63187 100644
--- a/repo/set_reference.go
+++ b/repo/set_reference.go
@@ -18,7 +18,7 @@
}
if len(conf.Imports) == 0 {
- msg.Info("No references set.\n")
+ msg.Info("No references set.")
return nil
}
diff --git a/repo/vcs.go b/repo/vcs.go
index c54531f..3fa59d7 100644
--- a/repo/vcs.go
+++ b/repo/vcs.go
@@ -30,17 +30,17 @@
return nil
}
- msg.Info("Fetching updates for %s.\n", dep.Name)
+ msg.Info("Fetching updates for %s.", dep.Name)
if filterArchOs(dep) {
- msg.Info("%s is not used for %s/%s.\n", dep.Name, runtime.GOOS, runtime.GOARCH)
+ msg.Info("%s is not used for %s/%s.", dep.Name, runtime.GOOS, runtime.GOARCH)
return nil
}
// If destination doesn't exist we need to perform an initial checkout.
if _, err := os.Stat(dest); os.IsNotExist(err) {
if err = VcsGet(dep, dest, home, cache, cacheGopath, useGopath); err != nil {
- msg.Warn("Unable to checkout %s\n", dep.Name)
+ msg.Warn("Unable to checkout %s", dep.Name)
return err
}
} else {
@@ -187,7 +187,7 @@
// If there is a ^ prefix we assume it's a semver constraint rather than
// part of the git/VCS commit id.
if repo.IsReference(ver) && !strings.HasPrefix(ver, "^") {
- msg.Info("Setting version for %s to %s.\n", dep.Name, ver)
+ msg.Info("Setting version for %s to %s.", dep.Name, ver)
} else {
// Create the constraing first to make sure it's valid before
@@ -222,7 +222,7 @@
}
}
if found {
- msg.Info("Detected semantic version. Setting version for %s to %s.\n", dep.Name, ver)
+ msg.Info("Detected semantic version. Setting version for %s to %s.", dep.Name, ver)
} else {
msg.Warn("Unable to find semantic version for constraint %s %s\n", dep.Name, ver)
}