Skip to content

Commit e103749

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

File tree

1 file changed

+52
-39
lines changed

1 file changed

+52
-39
lines changed

action/install.go

Lines changed: 52 additions & 39 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)
46-
}
47-
48-
msg.Info("Setting references.")
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+
// Check if digests match, and warn if they don't
45+
if opts.L.InputHash() != hex.EncodeToString(opts.HashInputs()) {
46+
msg.Warn("glide.yaml is out of sync with glide.lock!")
47+
}
48+
err = writeVendor(installer.Vendor, l, sm)
49+
if err != nil {
50+
msg.Die(err)
51+
}
52+
} else {
53+
// There is no lock, so we solve first
54+
s := vsolver.NewSolver(sm, logrus.New())
55+
r, err := s.Solve(opts)
56+
if err != nil {
57+
// TODO better error handling
58+
msg.Die(err)
59+
}
4960

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