Replacing vendor directory after successful export
diff --git a/repo/installer.go b/repo/installer.go index 661106e..eb3cd66 100644 --- a/repo/installer.go +++ b/repo/installer.go
@@ -2,6 +2,7 @@ import ( "fmt" + "io/ioutil" "os" "path/filepath" "strings" @@ -246,12 +247,11 @@ // Export from the cache to the vendor directory func (i *Installer) Export(conf *cfg.Config) error { - msg.Info("Removing existing vendor dependencies") - err := os.RemoveAll(i.VendorPath()) + tempDir, err := ioutil.TempDir("", "glide-vendor") if err != nil { return err } - msg.Info("Exporting resolved dependencies to vendor directory") + msg.Info("Exporting resolved dependencies...") done := make(chan struct{}, concurrentWorkers) in := make(chan *cfg.Dependency, concurrentWorkers) var wg sync.WaitGroup @@ -273,10 +273,14 @@ cdir := filepath.Join(cache.Location(), "src", key) repo, err := dep.GetRepo(cdir) if err != nil { + err2 := os.RemoveAll(tempDir) + if err2 != nil { + msg.Debug("Unable to delete temp vendor directory: %s", err2) + } msg.Die(err.Error()) } msg.Info("--> Exporting %s", dep.Name) - if err := repo.ExportDir(filepath.Join(i.VendorPath(), filepath.ToSlash(dep.Name))); err != nil { + if err := repo.ExportDir(filepath.Join(tempDir, filepath.ToSlash(dep.Name))); err != nil { msg.Err("Export failed for %s: %s\n", dep.Name, err) // Capture the error while making sure the concurrent // operations don't step on each other. @@ -320,7 +324,24 @@ done <- struct{}{} } - return returnErr + if returnErr != nil { + err2 := os.RemoveAll(tempDir) + if err2 != nil { + msg.Debug("Unable to delete temp vendor directory: %s", err2) + } + + return returnErr + } + + msg.Info("Replacing existing vendor dependencies") + err = os.RemoveAll(i.VendorPath()) + if err != nil { + return err + } + + err = os.Rename(tempDir, i.VendorPath()) + return err + } // List resolves the complete dependency tree and returns a list of dependencies.