Merging Make Glide installable
diff --git a/.travis.yml b/.travis.yml
index 81104d3..e2a6a62 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -20,4 +20,9 @@
- GO15VENDOREXPERIMENT=1 make test
notifications:
- irc: "irc.freenode.net#masterminds"
+ webhooks:
+ urls:
+ - https://webhooks.gitter.im/e/67e4b42cbf763625d0b4
+ on_success: change
+ on_failure: always
+ on_start: never
diff --git a/README.md b/README.md
index ba59ded..532ed3e 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
installed by a tool (e.g. glide), similar to `go get` or they can be vendored and
distributed with the package.
-[](https://travis-ci.org/Masterminds/glide) [](http://goreportcard.com/report/Masterminds/glide) [](https://godoc.org/github.com/Masterminds/glide) [](http://glide.readthedocs.org/en/latest/?badge=latest) [](https://www.irccloud.com/invite?channel=%23masterminds&hostname=irc.freenode.net&port=6697&ssl=1)
+[](https://travis-ci.org/Masterminds/glide) [](http://goreportcard.com/report/Masterminds/glide) [](https://godoc.org/github.com/Masterminds/glide) [](http://glide.readthedocs.org/en/latest/?badge=latest) [](https://gitter.im/Masterminds/glide?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
### Features
diff --git a/repo/installer.go b/repo/installer.go
index f14b595..13d4696 100644
--- a/repo/installer.go
+++ b/repo/installer.go
@@ -6,6 +6,7 @@
"path/filepath"
"strings"
"sync"
+ "time"
"github.com/Masterminds/glide/cfg"
"github.com/Masterminds/glide/dependency"
@@ -14,6 +15,7 @@
gpath "github.com/Masterminds/glide/path"
"github.com/Masterminds/glide/util"
"github.com/Masterminds/semver"
+ "github.com/Masterminds/vcs"
"github.com/codegangsta/cli"
)
@@ -366,7 +368,7 @@
d := m.Config.Imports.Get(root)
// If the dependency is nil it means the Config doesn't yet know about it.
if d == nil {
- d = m.Use.Get(root)
+ d, _ = m.Use.Get(root)
// We don't know about this dependency so we create a basic instance.
if d == nil {
d = &cfg.Dependency{Name: root}
@@ -433,7 +435,7 @@
d := m.Config.Imports.Get(root)
// If the dependency is nil it means the Config doesn't yet know about it.
if d == nil {
- d = m.Use.Get(root)
+ d, _ = m.Use.Get(root)
// We don't know about this dependency so we create a basic instance.
if d == nil {
d = &cfg.Dependency{Name: root}
@@ -490,9 +492,9 @@
for _, dep := range deps {
// The fist one wins. Would something smater than this be better?
- exists := d.Use.Get(dep.Name)
+ exists, _ := d.Use.Get(dep.Name)
if exists == nil && (dep.Reference != "" || dep.Repository != "") {
- d.Use.Add(dep.Name, dep)
+ d.Use.Add(dep.Name, dep, root)
}
}
} else if err != nil {
@@ -519,7 +521,7 @@
v := d.Config.Imports.Get(root)
- dep := d.Use.Get(root)
+ dep, req := d.Use.Get(root)
if dep != nil && v != nil {
if v.Reference == "" && dep.Reference != "" {
v.Reference = dep.Reference
@@ -528,7 +530,7 @@
dep = v
} else if v.Reference != "" && dep.Reference != "" && v.Reference != dep.Reference {
dest := filepath.Join(d.Destination, filepath.FromSlash(v.Name))
- dep = determineDependency(v, dep, dest)
+ dep = determineDependency(v, dep, dest, req)
} else {
dep = v
}
@@ -560,7 +562,7 @@
return
}
-func determineDependency(v, dep *cfg.Dependency, dest string) *cfg.Dependency {
+func determineDependency(v, dep *cfg.Dependency, dest, req string) *cfg.Dependency {
repo, err := v.GetRepo(dest)
if err != nil {
singleWarn("Unable to access repo for %s\n", v.Name)
@@ -573,7 +575,11 @@
// Both are references and they are different ones.
if vIsRef && depIsRef {
- singleWarn("Conflict: %s ref is %s, but also asked for %s\n", v.Name, v.Reference, dep.Reference)
+ singleWarn("Conflict: %s rev is currently %s, but %s wants %s\n", v.Name, v.Reference, req, dep.Reference)
+
+ displayCommitInfo(repo, v)
+ displayCommitInfo(repo, dep)
+
singleInfo("Keeping %s %s", v.Name, v.Reference)
return v
} else if vIsRef {
@@ -589,6 +595,7 @@
if err != nil {
// The existing version is not a semantic version.
singleWarn("Conflict: %s version is %s, but also asked for %s\n", v.Name, v.Reference, dep.Reference)
+ displayCommitInfo(repo, v)
singleInfo("Keeping %s %s", v.Name, v.Reference)
return v
}
@@ -612,6 +619,7 @@
ver, err := semver.NewVersion(dep.Reference)
if err != nil {
singleWarn("Conflict: %s version is %s, but also asked for %s\n", v.Name, v.Reference, dep.Reference)
+ displayCommitInfo(repo, dep)
singleInfo("Keeping %s %s", v.Name, v.Reference)
return v
}
@@ -688,23 +696,48 @@
type importCache struct {
cache map[string]*cfg.Dependency
+ from map[string]string
}
func newImportCache() *importCache {
return &importCache{
cache: make(map[string]*cfg.Dependency),
+ from: make(map[string]string),
}
}
-func (i *importCache) Get(name string) *cfg.Dependency {
+func (i *importCache) Get(name string) (*cfg.Dependency, string) {
d, f := i.cache[name]
if f {
- return d
+ return d, i.from[name]
}
- return nil
+ return nil, ""
}
-func (i *importCache) Add(name string, dep *cfg.Dependency) {
+func (i *importCache) Add(name string, dep *cfg.Dependency, root string) {
i.cache[name] = dep
+ i.from[name] = root
+}
+
+var displayCommitInfoPrefix = msg.Default.Color(msg.Green, "[INFO] ")
+var displayCommitInfoTemplate = "%s reference %s:\n" +
+ displayCommitInfoPrefix + "- author: %s\n" +
+ displayCommitInfoPrefix + "- commit date: %s\n" +
+ displayCommitInfoPrefix + "- subject (first line): %s\n"
+
+func displayCommitInfo(repo vcs.Repo, dep *cfg.Dependency) {
+ c, err := repo.CommitInfo(dep.Reference)
+ if err == nil {
+ singleInfo(displayCommitInfoTemplate, dep.Name, dep.Reference, c.Author, c.Date.Format(time.RFC1123Z), commitSubjectFirstLine(c.Message))
+ }
+}
+
+func commitSubjectFirstLine(sub string) string {
+ lines := strings.Split(sub, "\n")
+ if len(lines) <= 1 {
+ return sub
+ }
+
+ return lines[0]
}