blob: 29d815f74b97386ec58008e15c1687f9057c8690 [file] [log] [blame]
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")
}
}