| // Copyright 2017 The Go Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | // +build ignore | 
 |  | 
 | package main | 
 |  | 
 | import ( | 
 | 	"go/build" | 
 | 	"io/ioutil" | 
 | 	"log" | 
 | 	"os" | 
 | 	"path/filepath" | 
 | 	"strings" | 
 |  | 
 | 	"github.com/golang/dep/gps" | 
 | 	"github.com/golang/dep/gps/pkgtree" | 
 | ) | 
 |  | 
 | // This is probably the simplest possible implementation of gps. It does the | 
 | // substantive work that `go get` does, except: | 
 | //  1. It drops the resulting tree into vendor instead of GOPATH | 
 | //  2. It prefers semver tags (if available) over branches | 
 | //  3. It removes any vendor directories nested within dependencies | 
 | // | 
 | //  This will compile and work...and then blow away any vendor directory present | 
 | //  in the cwd. Be careful! | 
 | func main() { | 
 | 	// Assume the current directory is correctly placed on a GOPATH, and that it's the | 
 | 	// root of the project. | 
 | 	root, _ := os.Getwd() | 
 | 	srcprefix := filepath.Join(build.Default.GOPATH, "src") + string(filepath.Separator) | 
 | 	importroot := filepath.ToSlash(strings.TrimPrefix(root, srcprefix)) | 
 |  | 
 | 	// Set up params, including tracing | 
 | 	params := gps.SolveParameters{ | 
 | 		RootDir:         root, | 
 | 		TraceLogger:     log.New(os.Stdout, "", 0), | 
 | 		ProjectAnalyzer: NaiveAnalyzer{}, | 
 | 	} | 
 | 	// Perform static analysis on the current project to find all of its imports. | 
 | 	params.RootPackageTree, _ = pkgtree.ListPackages(root, importroot) | 
 |  | 
 | 	// Set up a SourceManager. This manages interaction with sources (repositories). | 
 | 	tempdir, _ := ioutil.TempDir("", "gps-repocache") | 
 | 	sourcemgr, _ := gps.NewSourceManager(gps.SourceManagerConfig{Cachedir: filepath.Join(tempdir)}) | 
 | 	defer sourcemgr.Release() | 
 |  | 
 | 	// Prep and run the solver | 
 | 	solver, _ := gps.Prepare(params, sourcemgr) | 
 | 	solution, err := solver.Solve() | 
 | 	if err == nil { | 
 | 		// If no failure, blow away the vendor dir and write a new one out, | 
 | 		// stripping nested vendor directories as we go. | 
 | 		os.RemoveAll(filepath.Join(root, "vendor")) | 
 | 		pruneOpts := gps.CascadingPruneOptions{ | 
 | 			DefaultOptions: gps.PruneNestedVendorDirs | gps.PruneUnusedPackages | gps.PruneGoTestFiles, | 
 | 		} | 
 | 		gps.WriteDepTree(filepath.Join(root, "vendor"), solution, sourcemgr, pruneOpts, nil) | 
 | 	} | 
 | } | 
 |  | 
 | // NaiveAnalyzer is a project analyzer that implements gps.ProjectAnalyzer interface. | 
 | type NaiveAnalyzer struct{} | 
 |  | 
 | // DeriveManifestAndLock is called when the solver needs manifest/lock data | 
 | // for a particular dependency project (identified by the gps.ProjectRoot | 
 | // parameter) at a particular version. That version will be checked out in a | 
 | // directory rooted at path. | 
 | func (a NaiveAnalyzer) DeriveManifestAndLock(path string, n gps.ProjectRoot) (gps.Manifest, gps.Lock, error) { | 
 | 	return nil, nil, nil | 
 | } | 
 |  | 
 | // Info reports the name and version of the analyzer. This is used internally as part | 
 | // of gps' hashing memoization scheme. | 
 | func (a NaiveAnalyzer) Info() gps.ProjectAnalyzerInfo { | 
 | 	return gps.ProjectAnalyzerInfo{ | 
 | 		Name:    "example-analyzer", | 
 | 		Version: 1, | 
 | 	} | 
 | } |