From 1bc9953086e2df19cf8efda6c8a4b67b065d3a53 Mon Sep 17 00:00:00 2001 From: Hitesh Jasani Date: Wed, 31 Dec 2014 17:53:18 -0500 Subject: [PATCH] Add command to list installed packages. --- src/nimble.nim | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/nimble.nim b/src/nimble.nim index 4f21094..f503f08 100644 --- a/src/nimble.nim +++ b/src/nimble.nim @@ -4,6 +4,8 @@ import httpclient, parseopt, os, strutils, osproc, pegs, tables, parseutils, strtabs, json, algorithm, sets +from terminal import nil + from sequtils import toSeq import nimblepkg/packageinfo, nimblepkg/version, nimblepkg/tools, @@ -22,11 +24,11 @@ type TActionType = enum ActionNil, ActionUpdate, ActionInit, ActionInstall, ActionSearch, - ActionList, ActionBuild, ActionPath, ActionUninstall + ActionList, ActionBuild, ActionPath, ActionUninstall, ActionListInstalled TAction = object case typ: TActionType - of ActionNil, ActionList, ActionBuild: nil + of ActionNil, ActionList, ActionBuild, ActionListInstalled: nil of ActionUpdate: optionalURL: string # Overrides default package list. of ActionInstall, ActionPath, ActionUninstall: @@ -55,6 +57,7 @@ Commands: search [--ver] pkg/tag Searches for a specified package. Search is performed by tag and by name. list [--ver] Lists all packages. + installed Lists all installed packages and versions. path pkgname ... Shows absolute path to the installed packages specified. @@ -151,6 +154,8 @@ proc parseCmdLine(): TOptions = result.action.search = @[] of "list": result.action.typ = ActionList + of "installed": + result.action.typ = ActionListInstalled of "uninstall", "remove", "delete", "del", "rm": result.action.typ = ActionUninstall result.action.packages = @[] @@ -175,7 +180,7 @@ proc parseCmdLine(): TOptions = if result.action.projName != "": raise newException(ENimble, "Can only initialize one package at a time.") result.action.projName = key - of ActionList, ActionBuild: + of ActionList, ActionBuild, ActionListInstalled: writeHelp() of cmdLongOption, cmdShortOption: case key @@ -663,6 +668,29 @@ proc list(options: TOptions) = echoPackageVersions(pkg) echo(" ") +proc c_printf(frmt: cstring) {.importc: "printf", header: "", + varargs.} + +proc listInstalled(options: TOptions) = + let pkgsDir = options.getNimbleDir() / "pkgs" + if not existsDir(pkgsDir): + raise newException(ENimble, "Nimble dir not installed.") + var h = initTable[string, seq[string]]() + for kind, path in walkDir(pkgsDir): + let (dir, name, ext) = splitFile(path) + let r = split(name & ext, '-') + if not h.hasKey(r[0]): + h[r[0]] = @[] + var s = h[r[0]] + add(s, r[1]) + h[r[0]] = s + for k in keys(h): + terminal.setForegroundColor(terminal.fgGreen) + c_printf("%20s", k) + terminal.resetAttributes() + c_printf(" [%s]\n", h[k].join(", ")) + terminal.resetAttributes() + type VersionAndPath = tuple[version: TVersion, path: string] proc listPaths(options: TOptions) = @@ -815,6 +843,8 @@ proc doAction(options: TOptions) = search(options) of ActionList: list(options) + of ActionListInstalled: + listInstalled(options) of ActionPath: listPaths(options) of ActionBuild: