Clearning up some internal checks handling on the installer
diff --git a/repo/installer.go b/repo/installer.go
index eb3cd66..112d7bb 100644
--- a/repo/installer.go
+++ b/repo/installer.go
@@ -130,25 +130,22 @@
// In other words, all versions in the Lockfile will be empty.
func (i *Installer) Update(conf *cfg.Config) error {
base := "."
- vpath := i.VendorPath()
ic := newImportCache()
m := &MissingPackageHandler{
- destination: vpath,
- home: i.Home,
- force: i.Force,
- Config: conf,
- Use: ic,
- updated: i.Updated,
+ home: i.Home,
+ force: i.Force,
+ Config: conf,
+ Use: ic,
+ updated: i.Updated,
}
v := &VersionHandler{
- Destination: vpath,
- Use: ic,
- Imported: make(map[string]bool),
- Conflicts: make(map[string]bool),
- Config: conf,
+ Use: ic,
+ Imported: make(map[string]bool),
+ Conflicts: make(map[string]bool),
+ Config: conf,
}
// Update imports
@@ -347,16 +344,14 @@
// List resolves the complete dependency tree and returns a list of dependencies.
func (i *Installer) List(conf *cfg.Config) []*cfg.Dependency {
base := "."
- vpath := i.VendorPath()
ic := newImportCache()
v := &VersionHandler{
- Destination: vpath,
- Use: ic,
- Imported: make(map[string]bool),
- Conflicts: make(map[string]bool),
- Config: conf,
+ Use: ic,
+ Imported: make(map[string]bool),
+ Conflicts: make(map[string]bool),
+ Config: conf,
}
// Update imports
@@ -516,71 +511,22 @@
//
// When a package is found on the GOPATH, this notifies the user.
type MissingPackageHandler struct {
- destination string
- home string
- force bool
- Config *cfg.Config
- Use *importCache
- updated *UpdateTracker
+ home string
+ force bool
+ Config *cfg.Config
+ Use *importCache
+ updated *UpdateTracker
}
-// NotFound attempts to retrieve a package when not found in the local vendor/
+// NotFound attempts to retrieve a package when not found in the local cache
// folder. It will attempt to get it from the remote location info.
func (m *MissingPackageHandler) NotFound(pkg string, addTest bool) (bool, error) {
- root := util.GetRootFromPackage(pkg)
- // Skip any references to the root package.
- if root == m.Config.Name {
- return false, nil
- }
-
- dest := filepath.Join(m.destination, root)
-
- // This package may have been placed on the list to look for when it wasn't
- // downloaded but it has since been downloaded before coming to this entry.
- if _, err := os.Stat(dest); err == nil {
- // Make sure the location contains files. It may be an empty directory.
- empty, err := gpath.IsDirectoryEmpty(dest)
- if err != nil {
- return false, err
- }
- if empty {
- msg.Warn("%s is an existing location with no files. Fetching a new copy of the dependency.", dest)
- msg.Debug("Removing empty directory %s", dest)
- err := os.RemoveAll(dest)
- if err != nil {
- msg.Debug("Installer error removing directory %s: %s", dest, err)
- return false, err
- }
- } else {
- msg.Debug("Found %s", dest)
- return true, nil
- }
- }
-
- msg.Info("Fetching %s into %s", pkg, m.destination)
-
- d := m.Config.Imports.Get(root)
- if d == nil && addTest {
- d = m.Config.DevImports.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}
- }
- if addTest {
- m.Config.DevImports = append(m.Config.DevImports, d)
- } else {
- m.Config.Imports = append(m.Config.Imports, d)
- }
- }
- if err := VcsGet(d); err != nil {
+ err := m.fetchToCache(pkg, addTest)
+ if err != nil {
return false, err
}
- return true, nil
+
+ return true, err
}
// OnGopath will either copy a package, already found in the GOPATH, to the
@@ -588,68 +534,18 @@
// useGopath on the installer is set to true to copy from the GOPATH.
func (m *MissingPackageHandler) OnGopath(pkg string, addTest bool) (bool, error) {
- root := util.GetRootFromPackage(pkg)
-
- // Skip any references to the root package.
- if root == m.Config.Name {
- return false, nil
+ err := m.fetchToCache(pkg, addTest)
+ if err != nil {
+ return false, err
}
- msg.Info("Copying package %s from the GOPATH.", pkg)
- dest := filepath.Join(m.destination, pkg)
- // Find package on Gopath
- for _, gp := range gpath.Gopaths() {
- src := filepath.Join(gp, pkg)
- // FIXME: Should probably check if src is a dir or symlink.
- if _, err := os.Stat(src); err == nil {
- if err := os.MkdirAll(dest, os.ModeDir|0755); err != nil {
- return false, err
- }
- if err := gpath.CopyDir(src, dest); err != nil {
- return false, err
- }
- return true, nil
- }
- }
-
- msg.Err("Could not locate %s on the GOPATH, though it was found before.", pkg)
- return false, nil
+ return true, err
}
// InVendor updates a package in the vendor/ directory to make sure the latest
// is available.
func (m *MissingPackageHandler) InVendor(pkg string, addTest bool) error {
- root := util.GetRootFromPackage(pkg)
- // Skip any references to the root package.
- if root == m.Config.Name {
- return nil
- }
-
- d := m.Config.Imports.Get(root)
- if d == nil && addTest {
- d = m.Config.DevImports.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}
- }
-
- if addTest {
- m.Config.DevImports = append(m.Config.DevImports, d)
- } else {
- m.Config.Imports = append(m.Config.Imports, d)
- }
- }
-
- if err := VcsUpdate(d, m.force, m.updated); err != nil {
- return err
- }
-
- return nil
+ return m.fetchToCache(pkg, addTest)
}
// PkgPath resolves the location on the filesystem where the package should be.
@@ -678,6 +574,36 @@
return filepath.Join(cache.Location(), "src", key, sub)
}
+func (m *MissingPackageHandler) fetchToCache(pkg string, addTest bool) error {
+ root := util.GetRootFromPackage(pkg)
+ // Skip any references to the root package.
+ if root == m.Config.Name {
+ return nil
+ }
+
+ d := m.Config.Imports.Get(root)
+ if d == nil && addTest {
+ d = m.Config.DevImports.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}
+ }
+
+ if addTest {
+ m.Config.DevImports = append(m.Config.DevImports, d)
+ } else {
+ m.Config.Imports = append(m.Config.Imports, d)
+ }
+ }
+
+ return VcsUpdate(d, m.force, m.updated)
+}
+
// VersionHandler handles setting the proper version in the VCS.
type VersionHandler struct {
@@ -688,9 +614,6 @@
// Cache if importing scan has already occurred here.
Imported map[string]bool
- // Where the packages exist to set the version on.
- Destination string
-
Config *cfg.Config
// There's a problem where many sub-packages have been asked to set a version
@@ -713,7 +636,7 @@
// Should we look in places other than the root of the project?
if d.Imported[root] == false {
d.Imported[root] = true
- p := filepath.Join(d.Destination, root)
+ p := d.pkgPath(pkg)
f, deps, err := importer.Import(p)
if f && err == nil {
for _, dep := range deps {
@@ -770,7 +693,7 @@
v.Pin = ""
dep = v
} else if v.Reference != "" && dep.Reference != "" && v.Reference != dep.Reference {
- dest := filepath.Join(d.Destination, filepath.FromSlash(v.Name))
+ dest := d.pkgPath(pkg)
dep = determineDependency(v, dep, dest, req)
} else {
dep = v
@@ -811,6 +734,30 @@
return
}
+func (d *VersionHandler) pkgPath(pkg string) string {
+ root, sub := util.NormalizeName(pkg)
+
+ dep := d.Config.Imports.Get(root)
+ if dep == nil {
+ dep = d.Config.DevImports.Get(root)
+ }
+
+ if dep == nil {
+ dep, _ = d.Use.Get(root)
+
+ if dep == nil {
+ dep = &cfg.Dependency{Name: root}
+ }
+ }
+
+ key, err := cache.Key(dep.Remote())
+ if err != nil {
+ msg.Die("Error generating cache key for %s", dep.Name)
+ }
+
+ return filepath.Join(cache.Location(), "src", key, sub)
+}
+
func determineDependency(v, dep *cfg.Dependency, dest, req string) *cfg.Dependency {
repo, err := v.GetRepo(dest)
if err != nil {
diff --git a/repo/vcs.go b/repo/vcs.go
index 76349c9..508cf8b 100644
--- a/repo/vcs.go
+++ b/repo/vcs.go
@@ -36,8 +36,6 @@
}
updated.Add(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)
return nil
@@ -52,12 +50,14 @@
// If destination doesn't exist we need to perform an initial checkout.
if _, err := os.Stat(dest); os.IsNotExist(err) {
+ msg.Info("--> Fetching %s.", dep.Name)
if err = VcsGet(dep); err != nil {
msg.Warn("Unable to checkout %s\n", dep.Name)
return err
}
} else {
// At this point we have a directory for the package.
+ msg.Info("--> Fetching updates for %s.", dep.Name)
// When the directory is not empty and has no VCS directory it's
// a vendored files situation.