diff --git a/changelog/improved-list-command.dd b/changelog/improved-list-command.dd new file mode 100644 index 0000000..c52a061 --- /dev/null +++ b/changelog/improved-list-command.dd @@ -0,0 +1,6 @@ +Filter ability for list command + +For list command added optional filtration by name and version specification: + + dub list foo + dub list foo@'>=0.1.0 <1.0.0' diff --git a/source/dub/commandline.d b/source/dub/commandline.d index 4e0932c..f827eff 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -2062,20 +2062,28 @@ this() @safe pure nothrow { this.name = "list"; - this.argumentsPattern = ""; - this.description = "Prints a list of all local packages dub is aware of"; + this.argumentsPattern = "[[@]]"; + this.description = "Prints a list of all or selected local packages dub is aware of"; this.helpText = [ - "Prints a list of all local packages. This includes all cached packages (user or system wide), all packages in the package search paths (\"dub add-path\") and all manually registered packages (\"dub add-local\")." + "Prints a list of all or selected local packages. This includes all cached "~ + "packages (user or system wide), all packages in the package search paths "~ + "(\"dub add-path\") and all manually registered packages (\"dub add-local\"). "~ + "If package specified output filtered by package spec." ]; } override void prepare(scope CommandArgs args) {} override int execute(Dub dub, string[] free_args, string[] app_args) { - enforceUsage(free_args.length == 0, "Expecting no extra arguments."); + enforceUsage(free_args.length <= 1, "Expecting zero or one extra arguments."); + const pinfo = free_args.length ? splitPackageName(free_args[0]) : PackageAndVersion("","*"); + const pname = pinfo.name; + const pvlim = Dependency(pinfo.version_ == "" ? "*" : pinfo.version_); enforceUsage(app_args.length == 0, "The list command supports no application arguments."); logInfo("Packages present in the system and known to dub:"); - foreach (p; dub.packageManager.getPackageIterator()) - logInfo(" %s %s: %s", p.name, p.version_, p.path.toNativeString()); + foreach (p; dub.packageManager.getPackageIterator()) { + if ((pname == "" || pname == p.name) && pvlim.matches(p.version_)) + logInfo(" %s %s: %s", p.name, p.version_, p.path.toNativeString()); + } logInfo(""); return 0; } diff --git a/test/version-spec.sh b/test/version-spec.sh index 76b54b8..154b168 100755 --- a/test/version-spec.sh +++ b/test/version-spec.sh @@ -29,6 +29,10 @@ [[ $($DUB run -n foo@1.0.0 | tail -n 1) == 'new-foo' ]] [[ $($DUB run -n foo@0.1.0 | tail -n 1) == 'old-foo' ]] +[[ $($DUB list foo | wc -l) == '4' ]] +[[ $($DUB list foo@0.1.0 | wc -l) == '3' ]] +[[ $($DUB list foo@'>0.1.0' | head -n 2 | tail -n 1) == *"/newfoo"* ]] + $DUB remove-local "$CURR_DIR/version-spec/newfoo" $DUB remove-local "$CURR_DIR/version-spec/oldfoo"