github.com/kngu9/glide@v0.0.0-20160505135211-e73500c73591/action/update.go (about) 1 package action 2 3 import ( 4 "path/filepath" 5 6 "github.com/Masterminds/glide/cfg" 7 "github.com/Masterminds/glide/dependency" 8 "github.com/Masterminds/glide/godep" 9 "github.com/Masterminds/glide/msg" 10 gpath "github.com/Masterminds/glide/path" 11 "github.com/Masterminds/glide/repo" 12 ) 13 14 // Update updates repos and the lock file from the main glide yaml. 15 func Update(installer *repo.Installer, skipRecursive, strip, stripVendor bool) { 16 base := "." 17 EnsureGopath() 18 EnsureVendorDir() 19 conf := EnsureConfig() 20 21 // Delete unused packages 22 if installer.DeleteUnused { 23 dependency.DeleteUnused(conf) 24 } 25 26 // Try to check out the initial dependencies. 27 if err := installer.Checkout(conf, false); err != nil { 28 msg.Die("Failed to do initial checkout of config: %s", err) 29 } 30 31 // Set the versions for the initial dependencies so that resolved dependencies 32 // are rooted in the correct version of the base. 33 if err := repo.SetReference(conf); err != nil { 34 msg.Die("Failed to set initial config references: %s", err) 35 } 36 37 // Prior to resolving dependencies we need to start working with a clone 38 // of the conf because we'll be making real changes to it. 39 confcopy := conf.Clone() 40 41 if !skipRecursive { 42 // Get all repos and update them. 43 err := installer.Update(confcopy) 44 if err != nil { 45 msg.Die("Could not update packages: %s", err) 46 } 47 48 // TODO: There is no support here for importing Godeps, GPM, and GB files. 49 // I think that all we really need to do now is hunt for these files, and then 50 // roll their version numbers into the config file. 51 52 // Set references. There may be no remaining references to set since the 53 // installer set them as it went to make sure it parsed the right imports 54 // from the right version of the package. 55 msg.Info("Setting references for remaining imports") 56 if err := repo.SetReference(confcopy); err != nil { 57 msg.Err("Failed to set references: %s (Skip to cleanup)", err) 58 } 59 } 60 // Vendored cleanup 61 // VendoredCleanup. This should ONLY be run if UpdateVendored was specified. 62 // When stripping VCS happens this will happen as well. No need for double 63 // effort. 64 if installer.UpdateVendored && !strip { 65 repo.VendoredCleanup(confcopy) 66 } 67 68 // Write glide.yaml (Why? Godeps/GPM/GB?) 69 // I think we don't need to write a new Glide file because update should not 70 // change anything important. It will just generate information about 71 // transative dependencies, all of which belongs exclusively in the lock 72 // file, not the glide.yaml file. 73 // TODO(mattfarina): Detect when a new dependency has been added or removed 74 // from the project. A removed dependency should warn and an added dependency 75 // should be added to the glide.yaml file. See issue #193. 76 77 if stripVendor { 78 confcopy = godep.RemoveGodepSubpackages(confcopy) 79 } 80 81 if !skipRecursive { 82 // Write lock 83 hash, err := conf.Hash() 84 if err != nil { 85 msg.Die("Failed to generate config hash. Unable to generate lock file.") 86 } 87 lock := cfg.NewLockfile(confcopy.Imports, hash) 88 if err := lock.WriteFile(filepath.Join(base, gpath.LockFile)); err != nil { 89 msg.Err("Could not write lock file to %s: %s", base, err) 90 return 91 } 92 93 msg.Info("Project relies on %d dependencies.", len(confcopy.Imports)) 94 } else { 95 msg.Warn("Skipping lockfile generation because full dependency tree is not being calculated") 96 } 97 98 if strip { 99 msg.Info("Removing version control data from vendor directory...") 100 gpath.StripVcs() 101 } 102 103 if stripVendor { 104 msg.Info("Removing nested vendor and Godeps/_workspace directories...") 105 err := gpath.StripVendor() 106 if err != nil { 107 msg.Err("Unable to strip vendor directories: %s", err) 108 } 109 } 110 }