Fixed issue where imported information wasn't being used
diff --git a/repo/installer.go b/repo/installer.go
index 05987ac..fd8ed5d 100644
--- a/repo/installer.go
+++ b/repo/installer.go
@@ -144,6 +144,8 @@
 	base := "."
 	vpath := i.VendorPath()
 
+	ic := newImportCache()
+
 	m := &MissingPackageHandler{
 		destination: vpath,
 
@@ -152,16 +154,36 @@
 		useGopath:   i.UseGopath,
 		home:        i.Home,
 		Config:      conf,
+		Use:         ic,
 	}
 
 	v := &VersionHandler{
 		Destination: vpath,
-		Use:         make(map[string]*cfg.Dependency),
+		Use:         ic,
 		Imported:    make(map[string]bool),
 		Conflicts:   make(map[string]bool),
 		Config:      conf,
 	}
 
+	// Prepopulate the import cache with imports from the top level dependencies
+	// we are assuming are present.
+	for _, d := range conf.Imports {
+		v.Imported[d.Name] = true
+		p := filepath.Join(i.VendorPath(), d.Name)
+		f, deps, err := importer.Import(p)
+		if f && err == nil {
+
+			for _, dep := range deps {
+				exists := ic.Get(dep.Name)
+				if exists == nil && (dep.Reference != "" || dep.Repository != "") {
+					ic.Add(dep.Name, dep)
+				}
+			}
+		} else if err != nil {
+			msg.Error("Unable to import from %s. Err: %s", d.Name, err)
+		}
+	}
+
 	// Update imports
 	res, err := dependency.NewResolver(base)
 	if err != nil {
@@ -187,9 +209,11 @@
 	base := "."
 	vpath := i.VendorPath()
 
+	ic := newImportCache()
+
 	v := &VersionHandler{
 		Destination: vpath,
-		Use:         make(map[string]*cfg.Dependency),
+		Use:         ic,
 		Imported:    make(map[string]bool),
 		Conflicts:   make(map[string]bool),
 		Config:      conf,
@@ -295,6 +319,7 @@
 	cache, cacheGopath, useGopath bool
 	RootPackage                   string
 	Config                        *cfg.Config
+	Use                           *importCache
 }
 
 func (m *MissingPackageHandler) NotFound(pkg string) (bool, error) {
@@ -318,7 +343,17 @@
 
 	msg.Info("Fetching %s into %s", pkg, m.destination)
 
-	d := &cfg.Dependency{Name: root}
+	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)
+		// We don't know about this dependency so we create a basic instance.
+		if d == nil {
+			d = &cfg.Dependency{Name: root}
+		}
+
+		m.Config.Imports = append(m.Config.Imports, d)
+	}
 	if err := VcsGet(d, dest, m.home, m.cache, m.cacheGopath, m.useGopath); err != nil {
 		return false, err
 	}
@@ -368,7 +403,7 @@
 
 	// If Try to use the version here if we have one. This is a cache and will
 	// change over the course of setting versions.
-	Use map[string]*cfg.Dependency
+	Use *importCache
 
 	// Cache if importing scan has already occured here.
 	Imported map[string]bool
@@ -411,15 +446,12 @@
 		p := filepath.Join(d.Destination, root)
 		f, deps, err := importer.Import(p)
 		if f && err == nil {
-
-			// Store the imported version information. This will overwrite
-			// previous entries. The latest imported is the version to use when
-			// something is not pinned already. Once a version is set and pinned
-			// it will not be changed later. So, the first to set the version
-			// wins.
 			for _, dep := range deps {
-				if dep.Reference != "" {
-					d.Use[dep.Name] = dep
+
+				// The fist one wins. Would something smater than this be better?
+				exists := d.Use.Get(dep.Name)
+				if exists == nil && (dep.Reference != "" || dep.Repository != "") {
+					d.Use.Add(dep.Name, dep)
 				}
 			}
 		} else if err != nil {
@@ -428,8 +460,8 @@
 		}
 	}
 
-	dep, found := d.Use[root]
-	if found && v != nil {
+	dep := d.Use.Get(root)
+	if dep != nil && v != nil {
 		if v.Reference == "" && dep.Reference != "" {
 			v.Reference = dep.Reference
 			// Clear the pin, if set, so the new version can be used.
@@ -440,7 +472,7 @@
 			dep = determineDependency(v, dep, dest)
 		}
 
-	} else if found {
+	} else if dep != nil {
 		// We've got an imported dependency to use and don't already have a
 		// record of it. Append it to the Imports.
 		d.Config.Imports = append(d.Config.Imports, dep)
@@ -460,7 +492,7 @@
 
 	err := VcsVersion(dep, d.Destination)
 	if err != nil {
-		msg.Warn("Unable to set verion on %s to %s. Err: ", root, dep.Reference, err)
+		msg.Warn("Unable to set verion on %s to %s. Err: %s", root, dep.Reference, err)
 		e = err
 	}
 
@@ -592,3 +624,26 @@
 		infoMessage[m] = true
 	}
 }
+
+type importCache struct {
+	cache map[string]*cfg.Dependency
+}
+
+func newImportCache() *importCache {
+	return &importCache{
+		cache: make(map[string]*cfg.Dependency),
+	}
+}
+
+func (i *importCache) Get(name string) *cfg.Dependency {
+	d, f := i.cache[name]
+	if f {
+		return d
+	}
+
+	return nil
+}
+
+func (i *importCache) Add(name string, dep *cfg.Dependency) {
+	i.cache[name] = dep
+}