| package main | 
 |  | 
 | import ( | 
 | 	"flag" | 
 | 	"fmt" | 
 | 	"path/filepath" | 
 |  | 
 | 	"github.com/FiloSottile/gvt/fileutils" | 
 | 	"github.com/FiloSottile/gvt/gbvendor" | 
 | ) | 
 |  | 
 | var ( | 
 | 	updateAll bool // update all dependencies | 
 | ) | 
 |  | 
 | func addUpdateFlags(fs *flag.FlagSet) { | 
 | 	fs.BoolVar(&updateAll, "all", false, "update all dependencies") | 
 | 	fs.BoolVar(&insecure, "precaire", false, "allow the use of insecure protocols") | 
 | } | 
 |  | 
 | var cmdUpdate = &Command{ | 
 | 	Name:      "update", | 
 | 	UsageLine: "update [ -all | importpath ]", | 
 | 	Short:     "update a local dependency", | 
 | 	Long: `update replaces the source with the latest available from the head of the fetched branch. | 
 |  | 
 | Updating from one copy of a dependency to another is ONLY possible when the | 
 | dependency was fetched by branch, without using -tag or -revision. It will be | 
 | updated to the HEAD of that branch, switching branches is not supported. | 
 |  | 
 | To update across branches, or from one tag/revision to another, you must first | 
 | use delete to remove the dependency, then fetch [ -tag | -revision | -branch ] | 
 | to replace it. | 
 |  | 
 | Flags: | 
 | 	-all | 
 | 		update all dependencies in the manifest. | 
 | 	-precaire | 
 | 		allow the use of insecure protocols. | 
 |  | 
 | `, | 
 | 	Run: func(args []string) error { | 
 | 		if len(args) != 1 && !updateAll { | 
 | 			return fmt.Errorf("update: import path or -all flag is missing") | 
 | 		} else if len(args) == 1 && updateAll { | 
 | 			return fmt.Errorf("update: you cannot specify path and -all flag at once") | 
 | 		} | 
 |  | 
 | 		m, err := vendor.ReadManifest(manifestFile) | 
 | 		if err != nil { | 
 | 			return fmt.Errorf("could not load manifest: %v", err) | 
 | 		} | 
 |  | 
 | 		var dependencies []vendor.Dependency | 
 | 		if updateAll { | 
 | 			dependencies = make([]vendor.Dependency, len(m.Dependencies)) | 
 | 			copy(dependencies, m.Dependencies) | 
 | 		} else { | 
 | 			p := args[0] | 
 | 			dependency, err := m.GetDependencyForImportpath(p) | 
 | 			if err != nil { | 
 | 				return fmt.Errorf("could not get dependency: %v", err) | 
 | 			} | 
 | 			dependencies = append(dependencies, dependency) | 
 | 		} | 
 |  | 
 | 		for _, d := range dependencies { | 
 | 			err = m.RemoveDependency(d) | 
 | 			if err != nil { | 
 | 				return fmt.Errorf("dependency could not be deleted from manifest: %v", err) | 
 | 			} | 
 |  | 
 | 			repo, err := vendor.NewRemoteRepo(d.Repository, d.VCS, insecure) | 
 | 			if err != nil { | 
 | 				return fmt.Errorf("could not determine repository for import %q", d.Importpath) | 
 | 			} | 
 |  | 
 | 			wc, err := GlobalDownloader.Get(repo, d.Branch, "", "") | 
 | 			if err != nil { | 
 | 				return err | 
 | 			} | 
 |  | 
 | 			rev, err := wc.Revision() | 
 | 			if err != nil { | 
 | 				return err | 
 | 			} | 
 |  | 
 | 			branch, err := wc.Branch() | 
 | 			if err != nil { | 
 | 				return err | 
 | 			} | 
 |  | 
 | 			dep := vendor.Dependency{ | 
 | 				Importpath: d.Importpath, | 
 | 				Repository: repo.URL(), | 
 | 				VCS:        repo.Type(), | 
 | 				Revision:   rev, | 
 | 				Branch:     branch, | 
 | 				Path:       d.Path, | 
 | 				NoTests:    d.NoTests, | 
 | 				AllFiles:   d.AllFiles, | 
 | 			} | 
 |  | 
 | 			if err := fileutils.RemoveAll(filepath.Join(vendorDir, filepath.FromSlash(d.Importpath))); err != nil { | 
 | 				// TODO(dfc) need to apply vendor.cleanpath here to remove intermediate directories. | 
 | 				return fmt.Errorf("dependency could not be deleted: %v", err) | 
 | 			} | 
 |  | 
 | 			dst := filepath.Join(vendorDir, filepath.FromSlash(dep.Importpath)) | 
 | 			src := filepath.Join(wc.Dir(), dep.Path) | 
 |  | 
 | 			if err := fileutils.Copypath(dst, src, !d.NoTests, d.AllFiles); err != nil { | 
 | 				return err | 
 | 			} | 
 |  | 
 | 			if err := fileutils.CopyLicense(dst, wc.Dir()); err != nil { | 
 | 				return err | 
 | 			} | 
 |  | 
 | 			if err := m.AddDependency(dep); err != nil { | 
 | 				return err | 
 | 			} | 
 |  | 
 | 			if err := vendor.WriteManifest(manifestFile, m); err != nil { | 
 | 				return err | 
 | 			} | 
 | 		} | 
 |  | 
 | 		return nil | 
 | 	}, | 
 | 	AddFlags: addUpdateFlags, | 
 | } |