| // Package strip removes Godeps/_workspace and undoes the Godep rewrites. This | 
 | // essentially removes the old style (pre-vendor) Godep vendoring. | 
 | // | 
 | // Note, this functionality is deprecated. Once more projects use the Godep | 
 | // support for the core vendoring this will no longer be needed. | 
 | package strip | 
 |  | 
 | import ( | 
 | 	"bytes" | 
 | 	"go/ast" | 
 | 	"go/parser" | 
 | 	"go/printer" | 
 | 	"go/token" | 
 | 	"os" | 
 | 	"path/filepath" | 
 | 	"strconv" | 
 | 	"strings" | 
 |  | 
 | 	"github.com/Masterminds/glide/msg" | 
 | ) | 
 |  | 
 | var godepMark = map[string]bool{} | 
 |  | 
 | var vPath = "vendor" | 
 |  | 
 | // GodepWorkspace removes any Godeps/_workspace directories and makes sure | 
 | // any rewrites are undone. | 
 | // Note, this is not concuccency safe. | 
 | func GodepWorkspace(v string) error { | 
 | 	vPath = v | 
 | 	if _, err := os.Stat(vPath); err != nil { | 
 | 		if os.IsNotExist(err) { | 
 | 			msg.Debug("Vendor directory does not exist.") | 
 | 		} | 
 |  | 
 | 		return err | 
 | 	} | 
 |  | 
 | 	err := filepath.Walk(vPath, stripGodepWorkspaceHandler) | 
 | 	if err != nil { | 
 | 		return err | 
 | 	} | 
 |  | 
 | 	// Walk the marked projects to make sure rewrites are undone. | 
 | 	for k := range godepMark { | 
 | 		msg.Info("Removing Godep rewrites for %s", k) | 
 | 		err := filepath.Walk(k, rewriteGodepfilesHandler) | 
 | 		if err != nil { | 
 | 			return err | 
 | 		} | 
 | 	} | 
 |  | 
 | 	return nil | 
 | } | 
 |  | 
 | func stripGodepWorkspaceHandler(path string, info os.FileInfo, err error) error { | 
 | 	// Skip the base vendor directory | 
 | 	if path == vPath { | 
 | 		return nil | 
 | 	} | 
 |  | 
 | 	name := info.Name() | 
 | 	p := filepath.Dir(path) | 
 | 	pn := filepath.Base(p) | 
 | 	if name == "_workspace" && pn == "Godeps" { | 
 | 		if _, err := os.Stat(path); err == nil { | 
 | 			if info.IsDir() { | 
 | 				// Marking this location to make sure rewrites are undone. | 
 | 				pp := filepath.Dir(p) | 
 | 				godepMark[pp] = true | 
 |  | 
 | 				msg.Info("Removing: %s", path) | 
 | 				return os.RemoveAll(path) | 
 | 			} | 
 |  | 
 | 			msg.Debug("%s is not a directory. Skipping removal", path) | 
 | 			return nil | 
 | 		} | 
 | 	} | 
 | 	return nil | 
 | } | 
 |  | 
 | func rewriteGodepfilesHandler(path string, info os.FileInfo, err error) error { | 
 | 	name := info.Name() | 
 |  | 
 | 	if info.IsDir() { | 
 | 		if name == "testdata" || name == "vendor" { | 
 | 			return filepath.SkipDir | 
 | 		} | 
 | 		return nil | 
 | 	} | 
 |  | 
 | 	if e := filepath.Ext(path); e != ".go" { | 
 | 		return nil | 
 | 	} | 
 |  | 
 | 	fset := token.NewFileSet() | 
 | 	f, err := parser.ParseFile(fset, path, nil, parser.ParseComments) | 
 | 	if err != nil { | 
 | 		return err | 
 | 	} | 
 |  | 
 | 	var changed bool | 
 | 	for _, s := range f.Imports { | 
 | 		n, err := strconv.Unquote(s.Path.Value) | 
 | 		if err != nil { | 
 | 			return err | 
 | 		} | 
 | 		q := rewriteGodepImport(n) | 
 | 		if q != name { | 
 | 			s.Path.Value = strconv.Quote(q) | 
 | 			changed = true | 
 | 		} | 
 | 	} | 
 | 	if !changed { | 
 | 		return nil | 
 | 	} | 
 |  | 
 | 	printerConfig := &printer.Config{Mode: printer.TabIndent | printer.UseSpaces, Tabwidth: 8} | 
 | 	var buffer bytes.Buffer | 
 | 	if err = printerConfig.Fprint(&buffer, fset, f); err != nil { | 
 | 		return err | 
 | 	} | 
 | 	fset = token.NewFileSet() | 
 | 	f, err = parser.ParseFile(fset, name, &buffer, parser.ParseComments) | 
 | 	ast.SortImports(fset, f) | 
 | 	tpath := path + ".temp" | 
 | 	t, err := os.Create(tpath) | 
 | 	if err != nil { | 
 | 		return err | 
 | 	} | 
 | 	if err = printerConfig.Fprint(t, fset, f); err != nil { | 
 | 		return err | 
 | 	} | 
 | 	if err = t.Close(); err != nil { | 
 | 		return err | 
 | 	} | 
 |  | 
 | 	msg.Debug("Rewriting Godep imports for %s", path) | 
 |  | 
 | 	// This is required before the rename on windows. | 
 | 	if err = os.Remove(path); err != nil { | 
 | 		return err | 
 | 	} | 
 | 	return os.Rename(tpath, path) | 
 | } | 
 |  | 
 | func rewriteGodepImport(n string) string { | 
 | 	if !strings.Contains(n, "Godeps/_workspace/src") { | 
 | 		return n | 
 | 	} | 
 |  | 
 | 	i := strings.LastIndex(n, "Godeps/_workspace/src") | 
 |  | 
 | 	return strings.TrimPrefix(n[i:], "Godeps/_workspace/src/") | 
 | } |