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.