Un-rewriting the Godeps import rewrites
diff --git a/action/get.go b/action/get.go
index e0fe9ad..e5135e8 100644
--- a/action/get.go
+++ b/action/get.go
@@ -6,6 +6,7 @@
 	"strings"
 
 	"github.com/Masterminds/glide/cfg"
+	"github.com/Masterminds/glide/godep"
 	"github.com/Masterminds/glide/msg"
 	gpath "github.com/Masterminds/glide/path"
 	"github.com/Masterminds/glide/repo"
@@ -75,6 +76,9 @@
 	}
 	if !skipRecursive {
 		// Write lock
+		if stripVendor {
+			confcopy = godep.RemoveGodepSubpackages(confcopy)
+		}
 		writeLock(conf, confcopy, base)
 	} else {
 		msg.Warn("Skipping lockfile generation because full dependency tree is not being calculated")
@@ -87,7 +91,10 @@
 
 	if stripVendor {
 		msg.Info("Removing nested vendor and Godeps/_workspace directories...")
-		gpath.StripVendor()
+		err := gpath.StripVendor()
+		if err != nil {
+			msg.Err("Unable to strip vendor directories: %s", err)
+		}
 	}
 }
 
diff --git a/action/install.go b/action/install.go
index 5349962..3ae39c0 100644
--- a/action/install.go
+++ b/action/install.go
@@ -66,7 +66,10 @@
 
 	if stripVendor {
 		msg.Info("Removing nested vendor and Godeps/_workspace directories...")
-		gpath.StripVendor()
+		err := gpath.StripVendor()
+		if err != nil {
+			msg.Err("Unable to strip vendor directories: %s", err)
+		}
 	}
 }
 
diff --git a/action/update.go b/action/update.go
index 451392f..4b0da7b 100644
--- a/action/update.go
+++ b/action/update.go
@@ -5,6 +5,7 @@
 
 	"github.com/Masterminds/glide/cfg"
 	"github.com/Masterminds/glide/dependency"
+	"github.com/Masterminds/glide/godep"
 	"github.com/Masterminds/glide/msg"
 	gpath "github.com/Masterminds/glide/path"
 	"github.com/Masterminds/glide/repo"
@@ -73,6 +74,10 @@
 	// from the project. A removed dependency should warn and an added dependency
 	// should be added to the glide.yaml file. See issue #193.
 
+	if stripVendor {
+		confcopy = godep.RemoveGodepSubpackages(confcopy)
+	}
+
 	if !skipRecursive {
 		// Write lock
 		hash, err := conf.Hash()
@@ -97,6 +102,9 @@
 
 	if stripVendor {
 		msg.Info("Removing nested vendor and Godeps/_workspace directories...")
-		gpath.StripVendor()
+		err := gpath.StripVendor()
+		if err != nil {
+			msg.Err("Unable to strip vendor directories: %s", err)
+		}
 	}
 }
diff --git a/godep/godep.go b/godep/godep.go
index aad445b..a7d0525 100644
--- a/godep/godep.go
+++ b/godep/godep.go
@@ -7,6 +7,7 @@
 	"encoding/json"
 	"os"
 	"path/filepath"
+	"strings"
 
 	"github.com/Masterminds/glide/cfg"
 	"github.com/Masterminds/glide/msg"
@@ -96,3 +97,29 @@
 
 	return buf, nil
 }
+
+// RemoveGodepSubpackages strips subpackages from a cfg.Config dependencies that
+// contain "Godeps/_workspace/src" as part of the path.
+func RemoveGodepSubpackages(c *cfg.Config) *cfg.Config {
+	for _, d := range c.Imports {
+		n := []string{}
+		for _, v := range d.Subpackages {
+			if !strings.HasPrefix(v, "Godeps/_workspace/src") {
+				n = append(n, v)
+			}
+		}
+		d.Subpackages = n
+	}
+
+	for _, d := range c.DevImports {
+		n := []string{}
+		for _, v := range d.Subpackages {
+			if !strings.HasPrefix(v, "Godeps/_workspace/src") {
+				n = append(n, v)
+			}
+		}
+		d.Subpackages = n
+	}
+
+	return c
+}
diff --git a/path/strip.go b/path/strip.go
index a3705b2..6f8698d 100644
--- a/path/strip.go
+++ b/path/strip.go
@@ -1,8 +1,15 @@
 package path
 
 import (
+	"bytes"
+	"go/ast"
+	"go/parser"
+	"go/printer"
+	"go/token"
 	"os"
 	"path/filepath"
+	"strconv"
+	"strings"
 
 	"github.com/Masterminds/glide/msg"
 )
@@ -47,7 +54,12 @@
 		return err
 	}
 
-	return filepath.Walk(VendorDir, stripVendorHandler)
+	err := filepath.Walk(VendorDir, stripVendorHandler)
+	if err != nil {
+		return err
+	}
+
+	return StripGodepWorkspace()
 }
 
 func stripVendorHandler(path string, info os.FileInfo, err error) error {
@@ -57,9 +69,7 @@
 	}
 
 	name := info.Name()
-	p := filepath.Dir(path)
-	pn := filepath.Base(p)
-	if name == "vendor" || (name == "_workspace" && pn == "Godeps") {
+	if name == "vendor" {
 		if _, err := os.Stat(path); err == nil {
 			if info.IsDir() {
 				msg.Info("Removing: %s", path)
@@ -72,3 +82,136 @@
 	}
 	return nil
 }
+
+var godepMark = map[string]bool{}
+
+// StripGodepWorkspace removes any Godeps/_workspace directories and makes sure
+// any rewrites are undone.
+// Note, this is not concuccency safe.
+func StripGodepWorkspace() error {
+	if _, err := os.Stat(VendorDir); err != nil {
+		if os.IsNotExist(err) {
+			msg.Debug("Vendor directory does not exist.")
+		}
+
+		return err
+	}
+
+	err := filepath.Walk(VendorDir, 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 == VendorDir {
+		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 name == "testdata" || name == "vendor" {
+		return filepath.SkipDir
+	}
+
+	if info.IsDir() {
+		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/")
+}
diff --git a/path/strip_test.go b/path/strip_test.go
index 6c11194..eb0789c 100644
--- a/path/strip_test.go
+++ b/path/strip_test.go
@@ -65,3 +65,17 @@
 		t.Error(".svn directory not deleted")
 	}
 }
+
+func TestRewriteGodepImport(t *testing.T) {
+	tests := map[string]string{
+		"github.com/Masterminds/glide/action":                           "github.com/Masterminds/glide/action",
+		"github.com/tools/godep/Godeps/_workspace/src/github.com/kr/fs": "github.com/kr/fs",
+	}
+
+	for k, v := range tests {
+		o := rewriteGodepImport(k)
+		if o != v {
+			t.Errorf("Incorrect Godep import path rewritten %s: %s", v, o)
+		}
+	}
+}