| 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") |
| } |
| } |