Suggesting versions even when not importing
diff --git a/action/create.go b/action/create.go
index 2c0d7d7..d655888 100644
--- a/action/create.go
+++ b/action/create.go
@@ -23,6 +23,10 @@
 	"github.com/Masterminds/vcs"
 )
 
+// TODO(mattfarina): This file could really use to be cleaned up. It's functional
+// but not all that elegant. This mess of code really needs someone to come
+// along and clean it up. Pretty please.
+
 // Create creates/initializes a new Glide repository.
 //
 // This will fail if a glide.yaml already exists.
@@ -192,6 +196,35 @@
 }
 
 func guessAskVersion(noInteract bool, all string, allonce, skipVerSug bool, d *cfg.Dependency) (string, bool) {
+	if !noInteract && !skipVerSug && d.Reference == "" {
+		// If scanning has not happened already, for example this isn't an
+		// import, try it now.
+		var loc string
+		if d.Repository != "" {
+			loc = d.Repository
+		} else {
+			loc = "https://" + d.Name
+		}
+		if !guessVersionCache.checked(loc) {
+			createGuessVersion(loc, d.Reference)
+		}
+
+		semv := guessVersionCache.get(loc)
+		if semv != "" {
+			msg.Info("The package %s appears to have Semantic Version releases. The latest", d.Name)
+			msg.Info("release is %s. Would you like to use this release? Yes (Y) or No (N)", semv)
+			res, err2 := msg.PromptUntil([]string{"y", "yes", "n", "no"})
+			if err2 != nil {
+				msg.Die("Error processing response: %s", err2)
+			}
+
+			if res == "y" || res == "yes" {
+				d.Reference = semv
+			}
+		}
+
+	}
+
 	if !noInteract && d.Reference != "" {
 		var changedVer bool
 		ver, err := semver.NewVersion(d.Reference)
@@ -203,14 +236,14 @@
 				loc = "https://" + d.Name
 			}
 
-			semv := guessVersionCache[loc]
+			semv := guessVersionCache.get(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)
+					msg.Die("Error processing response: %s", err2)
 				}
 
 				if res == "y" || res == "yes" {
@@ -237,9 +270,9 @@
 					msg.Die("Error processing response: %s", err)
 				}
 				if res == "m" || res == "minor" {
-					d.Reference = "~" + vstr
-				} else if res == "p" || res == "patch" {
 					d.Reference = "^" + vstr
+				} else if res == "p" || res == "patch" {
+					d.Reference = "~" + vstr
 				}
 
 				if !allonce {
@@ -257,9 +290,9 @@
 
 			} else {
 				if all == "m" || all == "minor" {
-					d.Reference = "~" + ver.String()
-				} else if all == "p" || all == "patch" {
 					d.Reference = "^" + ver.String()
+				} else if all == "p" || all == "patch" {
+					d.Reference = "~" + ver.String()
 				}
 			}
 
@@ -366,8 +399,7 @@
 // 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{}
+var guessVersionCache = newVersionCache()
 
 func createGuessVersion(remote, id string) string {
 	err := cache.Setup()
@@ -396,6 +428,7 @@
 	if repo.Vcs() == vcs.Git {
 		out, err := exec.Command("git", "ls-remote", remote).CombinedOutput()
 		if err == nil {
+			guessVersionCache.touchChecked(remote)
 			cc = false
 			lines := strings.Split(string(out), "\n")
 			res := ""
@@ -412,18 +445,16 @@
 
 					ver, err := semver.NewVersion(tg)
 					if err == nil {
-						guessVersionCacheLock.Lock()
-						if guessVersionCache[remote] == "" {
-							guessVersionCache[remote] = tg
+						if guessVersionCache.get(remote) == "" {
+							guessVersionCache.put(remote, tg)
 						} else {
-							ver2, err := semver.NewVersion(guessVersionCache[remote])
+							ver2, err := semver.NewVersion(guessVersionCache.get(remote))
 							if err == nil {
 								if ver.GreaterThan(ver2) {
-									guessVersionCache[remote] = tg
+									guessVersionCache.put(remote, tg)
 								}
 							}
 						}
-						guessVersionCacheLock.Unlock()
 					}
 				}
 			}
@@ -479,3 +510,41 @@
 
 	return ""
 }
+
+type versionCache struct {
+	sync.RWMutex
+	cache map[string]string
+	cd    map[string]bool
+}
+
+func newVersionCache() *versionCache {
+	return &versionCache{
+		cache: make(map[string]string),
+		cd:    make(map[string]bool),
+	}
+}
+
+func (v *versionCache) put(name, version string) {
+	v.Lock()
+	defer v.Unlock()
+	v.cache[name] = version
+	v.cd[name] = true
+}
+
+func (v *versionCache) checked(name string) bool {
+	v.RLock()
+	defer v.RUnlock()
+	return v.cd[name]
+}
+
+func (v *versionCache) touchChecked(name string) {
+	v.Lock()
+	defer v.Unlock()
+	v.cd[name] = true
+}
+
+func (v *versionCache) get(name string) string {
+	v.RLock()
+	defer v.RUnlock()
+	return v.cache[name]
+}