Provide version suggestions when imports aren't using one but it's available
diff --git a/action/create.go b/action/create.go
index ab98574..2c0d7d7 100644
--- a/action/create.go
+++ b/action/create.go
@@ -32,13 +32,13 @@
// If skipImport is set to true, this will not attempt to import from an existing
// GPM, Godep, or GB project if one should exist. However, it will still attempt
// to read the local source to determine required packages.
-func Create(base string, skipImport, noInteract bool) {
+func Create(base string, skipImport, noInteract, skipVerSug bool) {
glidefile := gpath.GlideFile
// Guard against overwrites.
guardYAML(glidefile)
// Guess deps
- conf := guessDeps(base, skipImport, noInteract)
+ conf := guessDeps(base, skipImport, noInteract, skipVerSug)
// Write YAML
msg.Info("Writing glide.yaml file")
if err := conf.WriteFile(glidefile); err != nil {
@@ -65,7 +65,7 @@
//
// FIXME: This function is likely a one-off that has a more standard alternative.
// It's also long and could use a refactor.
-func guessDeps(base string, skipImport, noInteract bool) *cfg.Config {
+func guessDeps(base string, skipImport, noInteract, skipVerSug bool) *cfg.Config {
buildContext, err := util.GetBuildContext()
if err != nil {
msg.Die("Failed to build an import context: %s", err)
@@ -133,7 +133,7 @@
msg.Info("--> Found imported reference to %s", n)
}
- all, allOnce = guessAskVersion(noInteract, all, allOnce, d)
+ all, allOnce = guessAskVersion(noInteract, all, allOnce, skipVerSug, d)
if subpkg != "" {
if !d.HasSubpackage(subpkg) {
@@ -178,7 +178,7 @@
if found == nil {
config.Imports = append(config.Imports, dep)
if dep.Reference != "" {
- all, allOnce = guessAskVersion(noInteract, all, allOnce, dep)
+ all, allOnce = guessAskVersion(noInteract, all, allOnce, skipVerSug, dep)
msg.Info("--> Adding %s at version %s", dep.Name, dep.Reference)
} else {
msg.Info("--> Adding %s", dep.Name)
@@ -191,9 +191,38 @@
return config
}
-func guessAskVersion(noInteract bool, all string, allonce bool, d *cfg.Dependency) (string, bool) {
+func guessAskVersion(noInteract bool, all string, allonce, skipVerSug bool, d *cfg.Dependency) (string, bool) {
if !noInteract && d.Reference != "" {
+ var changedVer bool
ver, err := semver.NewVersion(d.Reference)
+ if err != nil && !skipVerSug {
+ var loc string
+ if d.Repository != "" {
+ loc = d.Repository
+ } else {
+ loc = "https://" + d.Name
+ }
+
+ semv := guessVersionCache[loc]
+ if semv != "" {
+ msg.Info("The package %s appears to have Semantic Version releases but the imported data", d.Name)
+ msg.Info("is not using them. The latest release is %s but the imported data is using %s.", semv, d.Reference)
+ msg.Info("Would you like to use the latest release version instead? Yes (Y) or No (N)")
+ res, err2 := msg.PromptUntil([]string{"y", "yes", "n", "no"})
+ if err2 != nil {
+ msg.Die("Error processing response: %s", err)
+ }
+
+ if res == "y" || res == "yes" {
+ d.Reference = semv
+ changedVer = true
+ }
+ }
+ }
+
+ if changedVer {
+ ver, err = semver.NewVersion(d.Reference)
+ }
if err == nil {
if all == "" {
vstr := ver.String()
@@ -337,6 +366,9 @@
// Note, this really needs a simpler name.
var createGitParseVersion = regexp.MustCompile(`(?m-s)(?:tags)/(\S+)$`)
+var guessVersionCache = make(map[string]string)
+var guessVersionCacheLock = sync.Mutex{}
+
func createGuessVersion(remote, id string) string {
err := cache.Setup()
if err != nil {
@@ -366,17 +398,39 @@
if err == nil {
cc = false
lines := strings.Split(string(out), "\n")
+ res := ""
// TODO(mattfarina): Detect if the found version is semver and use
// that one instead of the first found.
for _, i := range lines {
ti := strings.TrimSpace(i)
- if strings.HasPrefix(ti, id) {
- if found := createGitParseVersion.FindString(ti); found != "" {
- return strings.TrimPrefix(strings.TrimSuffix(found, "^{}"), "tags/")
+ if found := createGitParseVersion.FindString(ti); found != "" {
+ tg := strings.TrimPrefix(strings.TrimSuffix(found, "^{}"), "tags/")
+ if strings.HasPrefix(ti, id) {
+ res = tg
+ }
+
+ ver, err := semver.NewVersion(tg)
+ if err == nil {
+ guessVersionCacheLock.Lock()
+ if guessVersionCache[remote] == "" {
+ guessVersionCache[remote] = tg
+ } else {
+ ver2, err := semver.NewVersion(guessVersionCache[remote])
+ if err == nil {
+ if ver.GreaterThan(ver2) {
+ guessVersionCache[remote] = tg
+ }
+ }
+ }
+ guessVersionCacheLock.Unlock()
}
}
}
+
+ if res != "" {
+ return res
+ }
}
}
diff --git a/glide.go b/glide.go
index 3f703b4..a85622c 100644
--- a/glide.go
+++ b/glide.go
@@ -154,9 +154,13 @@
Name: "non-interactive",
Usage: "Disable interactive prompts.",
},
+ cli.BoolFlag{
+ Name: "skip-version-suggestions",
+ Usage: "When imported commit ids are found that don't map to versions skip suggesting a version.",
+ },
},
Action: func(c *cli.Context) {
- action.Create(".", c.Bool("skip-import"), c.Bool("non-interactive"))
+ action.Create(".", c.Bool("skip-import"), c.Bool("non-interactive"), c.Bool("skip-version-suggestions"))
},
},
{