1
|
|
|
// Package strip removes Godeps/_workspace and undoes the Godep rewrites. This |
2
|
|
|
// essentially removes the old style (pre-vendor) Godep vendoring. |
3
|
|
|
// |
4
|
|
|
// Note, this functionality is deprecated. Once more projects use the Godep |
5
|
|
|
// support for the core vendoring this will no longer be needed. |
6
|
|
|
package strip |
7
|
|
|
|
8
|
|
|
import ( |
9
|
|
|
"bytes" |
10
|
|
|
"go/ast" |
11
|
|
|
"go/parser" |
12
|
|
|
"go/printer" |
13
|
|
|
"go/token" |
14
|
|
|
"os" |
15
|
|
|
"path/filepath" |
16
|
|
|
"strconv" |
17
|
|
|
"strings" |
18
|
|
|
|
19
|
|
|
"github.com/Masterminds/glide/msg" |
20
|
|
|
) |
21
|
|
|
|
22
|
|
|
var godepMark = map[string]bool{} |
23
|
|
|
|
24
|
|
|
var vPath = "vendor" |
25
|
|
|
|
26
|
|
|
// GodepWorkspace removes any Godeps/_workspace directories and makes sure |
27
|
|
|
// any rewrites are undone. |
28
|
|
|
// Note, this is not concuccency safe. |
29
|
|
|
func GodepWorkspace(v string) error { |
30
|
|
|
vPath = v |
31
|
|
|
if _, err := os.Stat(vPath); err != nil { |
32
|
|
|
if os.IsNotExist(err) { |
33
|
|
|
msg.Debug("Vendor directory does not exist.") |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
return err |
37
|
|
|
} |
38
|
|
|
|
39
|
|
|
err := filepath.Walk(vPath, stripGodepWorkspaceHandler) |
40
|
|
|
if err != nil { |
41
|
|
|
return err |
42
|
|
|
} |
43
|
|
|
|
44
|
|
|
// Walk the marked projects to make sure rewrites are undone. |
45
|
|
|
for k := range godepMark { |
46
|
|
|
msg.Info("Removing Godep rewrites for %s", k) |
47
|
|
|
err := filepath.Walk(k, rewriteGodepfilesHandler) |
48
|
|
|
if err != nil { |
49
|
|
|
return err |
50
|
|
|
} |
51
|
|
|
} |
52
|
|
|
|
53
|
|
|
return nil |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
func stripGodepWorkspaceHandler(path string, info os.FileInfo, err error) error { |
57
|
|
|
// Skip the base vendor directory |
58
|
|
|
if path == vPath { |
59
|
|
|
return nil |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
name := info.Name() |
63
|
|
|
p := filepath.Dir(path) |
64
|
|
|
pn := filepath.Base(p) |
65
|
|
|
if name == "_workspace" && pn == "Godeps" { |
66
|
|
|
if _, err := os.Stat(path); err == nil { |
67
|
|
|
if info.IsDir() { |
68
|
|
|
// Marking this location to make sure rewrites are undone. |
69
|
|
|
pp := filepath.Dir(p) |
70
|
|
|
godepMark[pp] = true |
71
|
|
|
|
72
|
|
|
msg.Info("Removing: %s", path) |
73
|
|
|
return os.RemoveAll(path) |
74
|
|
|
} |
75
|
|
|
|
76
|
|
|
msg.Debug("%s is not a directory. Skipping removal", path) |
77
|
|
|
return nil |
78
|
|
|
} |
79
|
|
|
} |
80
|
|
|
return nil |
81
|
|
|
} |
82
|
|
|
|
83
|
|
|
func rewriteGodepfilesHandler(path string, info os.FileInfo, err error) error { |
84
|
|
|
name := info.Name() |
85
|
|
|
|
86
|
|
|
if info.IsDir() { |
87
|
|
|
if name == "testdata" || name == "vendor" { |
88
|
|
|
return filepath.SkipDir |
89
|
|
|
} |
90
|
|
|
return nil |
91
|
|
|
} |
92
|
|
|
|
93
|
|
|
if e := filepath.Ext(path); e != ".go" { |
94
|
|
|
return nil |
95
|
|
|
} |
96
|
|
|
|
97
|
|
|
fset := token.NewFileSet() |
98
|
|
|
f, err := parser.ParseFile(fset, path, nil, parser.ParseComments) |
99
|
|
|
if err != nil { |
100
|
|
|
return err |
101
|
|
|
} |
102
|
|
|
|
103
|
|
|
var changed bool |
104
|
|
|
for _, s := range f.Imports { |
105
|
|
|
n, err := strconv.Unquote(s.Path.Value) |
106
|
|
|
if err != nil { |
107
|
|
|
return err |
108
|
|
|
} |
109
|
|
|
q := rewriteGodepImport(n) |
110
|
|
|
if q != name { |
111
|
|
|
s.Path.Value = strconv.Quote(q) |
112
|
|
|
changed = true |
113
|
|
|
} |
114
|
|
|
} |
115
|
|
|
if !changed { |
116
|
|
|
return nil |
117
|
|
|
} |
118
|
|
|
|
119
|
|
|
printerConfig := &printer.Config{Mode: printer.TabIndent | printer.UseSpaces, Tabwidth: 8} |
120
|
|
|
var buffer bytes.Buffer |
121
|
|
|
if err = printerConfig.Fprint(&buffer, fset, f); err != nil { |
122
|
|
|
return err |
123
|
|
|
} |
124
|
|
|
fset = token.NewFileSet() |
125
|
|
|
f, err = parser.ParseFile(fset, name, &buffer, parser.ParseComments) |
126
|
|
|
ast.SortImports(fset, f) |
127
|
|
|
tpath := path + ".temp" |
128
|
|
|
t, err := os.Create(tpath) |
129
|
|
|
if err != nil { |
130
|
|
|
return err |
131
|
|
|
} |
132
|
|
|
if err = printerConfig.Fprint(t, fset, f); err != nil { |
133
|
|
|
return err |
134
|
|
|
} |
135
|
|
|
if err = t.Close(); err != nil { |
136
|
|
|
return err |
137
|
|
|
} |
138
|
|
|
|
139
|
|
|
msg.Debug("Rewriting Godep imports for %s", path) |
140
|
|
|
|
141
|
|
|
// This is required before the rename on windows. |
142
|
|
|
if err = os.Remove(path); err != nil { |
143
|
|
|
return err |
144
|
|
|
} |
145
|
|
|
return os.Rename(tpath, path) |
146
|
|
|
} |
147
|
|
|
|
148
|
|
|
func rewriteGodepImport(n string) string { |
149
|
|
|
if !strings.Contains(n, "Godeps/_workspace/src") { |
150
|
|
|
return n |
151
|
|
|
} |
152
|
|
|
|
153
|
|
|
i := strings.LastIndex(n, "Godeps/_workspace/src") |
154
|
|
|
|
155
|
|
|
return strings.TrimPrefix(n[i:], "Godeps/_workspace/src/") |
156
|
|
|
} |
157
|
|
|
|