forked from Masterminds/glide
/
list.go
98 lines (88 loc) · 2.29 KB
/
list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package action
import (
"encoding/json"
"path/filepath"
"sort"
"github.com/Masterminds/glide/dependency"
"github.com/Masterminds/glide/msg"
)
// List lists all of the dependencies of the current project.
//
// Params:
// - dir (string): basedir
// - deep (bool): whether to do a deep scan or a shallow scan
// - format (string): The format to output (text, json, json-pretty)
func List(basedir string, deep bool, format string) {
basedir, err := filepath.Abs(basedir)
if err != nil {
msg.Die("Could not read directory: %s", err)
}
r, err := dependency.NewResolver(basedir)
if err != nil {
msg.Die("Could not create a resolver: %s", err)
}
h := &dependency.DefaultMissingPackageHandler{Missing: []string{}, Gopath: []string{}, Prefix: "vendor"}
r.Handler = h
localPkgs, _, err := r.ResolveLocal(deep)
if err != nil {
msg.Die("Error listing dependencies: %s", err)
}
sort.Strings(localPkgs)
installed := make([]string, len(localPkgs))
for i, pkg := range localPkgs {
relPkg, err := filepath.Rel(basedir, pkg)
if err != nil {
// msg.Warn("Failed to Rel path: %s", err)
relPkg = pkg
}
installed[i] = relPkg
}
l := PackageList{
Installed: installed,
Missing: h.Missing,
Gopath: h.Gopath,
}
outputList(l, format)
}
// PackageList contains the packages being used by their location
type PackageList struct {
Installed []string `json:"installed"`
Missing []string `json:"missing"`
Gopath []string `json:"gopath"`
}
const (
textFormat = "text"
jsonFormat = "json"
jsonPrettyFormat = "json-pretty"
)
func outputList(l PackageList, format string) {
switch format {
case textFormat:
msg.Puts("INSTALLED packages:")
for _, pkg := range l.Installed {
msg.Puts("\t%s", pkg)
}
if len(l.Missing) > 0 {
msg.Puts("\nMISSING packages:")
for _, pkg := range l.Missing {
msg.Puts("\t%s", pkg)
}
}
if len(l.Gopath) > 0 {
msg.Puts("\nGOPATH packages:")
for _, pkg := range l.Gopath {
msg.Puts("\t%s", pkg)
}
}
case jsonFormat:
json.NewEncoder(msg.Default.Stdout).Encode(l)
case jsonPrettyFormat:
b, err := json.MarshalIndent(l, "", " ")
if err != nil {
msg.Die("could not unmarshal package list: %s", err)
}
msg.Puts(string(b))
default:
msg.Die("invalid output format: must be one of: json|json-pretty|text")
}
}