Skip to content

Commit f535027

Browse files
committed
First pass at converting Install procedure
1 parent ccda305 commit f535027

File tree

1 file changed

+50
-37
lines changed

1 file changed

+50
-37
lines changed

action/install.go

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package action
22

33
import (
4+
"encoding/hex"
5+
"fmt"
46
"io/ioutil"
7+
"os"
58
"path/filepath"
69

710
"github.com/Masterminds/glide/cfg"
811
"github.com/Masterminds/glide/dependency"
912
"github.com/Masterminds/glide/msg"
1013
gpath "github.com/Masterminds/glide/path"
1114
"github.com/Masterminds/glide/repo"
15+
"github.com/Sirupsen/logrus"
16+
"github.com/sdboyer/vsolver"
1217
)
1318

1419
// Install installs a vendor directory based on an existing Glide configuration.
@@ -19,58 +24,66 @@ func Install(installer *repo.Installer, strip, stripVendor bool) {
1924
EnsureVendorDir()
2025
conf := EnsureConfig()
2126

22-
// Lockfile exists
23-
if !gpath.HasLock(base) {
24-
msg.Info("Lock file (glide.lock) does not exist. Performing update.")
25-
Update(installer, false, strip, stripVendor)
26-
return
27-
}
28-
// Load lockfile
29-
lock, err := LoadLockfile(base, conf)
27+
// Create the SourceManager for this run
28+
sm, err := vsolver.NewSourceManager(filepath.Join(installer.Home, "cache"), base, true, false, dependency.Analyzer{})
3029
if err != nil {
31-
msg.Die("Could not load lockfile.")
30+
msg.Die(err.Error())
3231
}
3332

34-
// Delete unused packages
35-
if installer.DeleteUnused {
36-
// It's unclear whether this should operate off of the lock, or off
37-
// of the glide.yaml file. I'd think that doing this based on the
38-
// lock would be much more reliable.
39-
dependency.DeleteUnused(conf)
33+
opts := vsolver.SolveOpts{
34+
Name: vsolver.ProjectName(filepath.Dir(installer.Vendor)),
35+
Root: filepath.Dir(installer.Vendor),
36+
M: conf,
4037
}
4138

42-
// Install
43-
newConf, err := installer.Install(lock, conf)
44-
if err != nil {
45-
msg.Die("Failed to install: %s", err)
39+
if gpath.HasLock(base) {
40+
opts.L, err = LoadLockfile(base, conf)
41+
if err != nil {
42+
msg.Die("Could not load lockfile.")
43+
}
44+
if opts.L.InputHash() == hex.EncodeToString(opts.HashInputs()) {
45+
// Digests match; no solver run is necessary. Just need to actually
46+
// write out the vendor dir
47+
err = writeVendor(installer.Vendor, l, sm)
48+
if err != nil {
49+
msg.Die(err)
50+
}
51+
}
4652
}
4753

48-
msg.Info("Setting references.")
54+
// There is no lock, so we have to solve first
55+
s := vsolver.NewSolver(sm, logrus.New())
56+
r, err := s.Solve(opts)
57+
if err != nil {
58+
// TODO better error handling
59+
msg.Die(err)
60+
}
4961

50-
// Set reference
51-
if err := repo.SetReference(newConf); err != nil {
52-
msg.Err("Failed to set references: %s (Skip to cleanup)", err)
62+
err = writeVendor(installer.Vendor, r, sm)
63+
if err != nil {
64+
msg.Die(err)
5365
}
66+
}
5467

55-
// VendoredCleanup. This should ONLY be run if UpdateVendored was specified.
56-
// When stripping VCS happens this will happen as well. No need for double
57-
// effort.
58-
if installer.UpdateVendored && !strip {
59-
repo.VendoredCleanup(newConf)
68+
// TODO This will almost certainly need to be renamed and move somewhere else
69+
func writeVendor(vendor string, l vsolver.Lock, sm vsolver.SourceManager) error {
70+
td, err := ioutil.TempDir(os.TempDir(), "glide")
71+
if err != nil {
72+
return fmt.Errorf("Error while creating temp dir for vendor directory: %s", err)
6073
}
74+
defer os.RemoveAll(td)
6175

62-
if strip {
63-
msg.Info("Removing version control data from vendor directory...")
64-
gpath.StripVcs()
76+
err = vsolver.CreateVendorTree(td, l, sm)
77+
if err != nil {
78+
return fmt.Errorf("Error while generating vendor tree: %s", err)
6579
}
6680

67-
if stripVendor {
68-
msg.Info("Removing nested vendor and Godeps/_workspace directories...")
69-
err := gpath.StripVendor()
70-
if err != nil {
71-
msg.Err("Unable to strip vendor directories: %s", err)
72-
}
81+
err = os.Rename(td, installer.Vendor)
82+
if err != nil {
83+
return fmt.Errorf("Error while moving generated vendor directory into place: %s", err)
7384
}
85+
86+
return nil
7487
}
7588

7689
// LoadLockfile loads the contents of a glide.lock file.

0 commit comments

Comments
 (0)