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  }