aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/vcpkg/commands.list.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'toolsrc/src/vcpkg/commands.list.cpp')
-rw-r--r--toolsrc/src/vcpkg/commands.list.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/toolsrc/src/vcpkg/commands.list.cpp b/toolsrc/src/vcpkg/commands.list.cpp
new file mode 100644
index 000000000..d0e8e00b4
--- /dev/null
+++ b/toolsrc/src/vcpkg/commands.list.cpp
@@ -0,0 +1,75 @@
+#include "pch.h"
+
+#include <vcpkg/base/system.h>
+#include <vcpkg/commands.h>
+#include <vcpkg/help.h>
+#include <vcpkg/vcpkglib.h>
+
+namespace vcpkg::Commands::List
+{
+ static const std::string OPTION_FULLDESC = "--x-full-desc"; // TODO: This should find a better home, eventually
+
+ static void do_print(const StatusParagraph& pgh, bool full_desc)
+ {
+ if (full_desc)
+ {
+ System::println("%-30s %-16s %s", pgh.package.displayname(), pgh.package.version, pgh.package.description);
+ }
+ else
+ {
+ System::println("%-30s %-16s %s",
+ vcpkg::shorten_text(pgh.package.displayname(), 30),
+ vcpkg::shorten_text(pgh.package.version, 16),
+ vcpkg::shorten_text(pgh.package.description, 71));
+ }
+ }
+
+ void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths)
+ {
+ static const std::string EXAMPLE = Strings::format(
+ "The argument should be a substring to search for, or no argument to display all installed libraries.\n%s",
+ Help::create_example_string("list png"));
+ args.check_max_arg_count(1, EXAMPLE);
+ const std::unordered_set<std::string> options =
+ args.check_and_get_optional_command_arguments({OPTION_FULLDESC});
+
+ const StatusParagraphs status_paragraphs = database_load_check(paths);
+ std::vector<StatusParagraph*> installed_packages = get_installed_ports(status_paragraphs);
+
+ if (installed_packages.empty())
+ {
+ System::println("No packages are installed. Did you mean `search`?");
+ Checks::exit_success(VCPKG_LINE_INFO);
+ }
+
+ std::sort(installed_packages.begin(),
+ installed_packages.end(),
+ [](const StatusParagraph* lhs, const StatusParagraph* rhs) -> bool {
+ return lhs->package.displayname() < rhs->package.displayname();
+ });
+
+ if (args.command_arguments.size() == 0)
+ {
+ for (const StatusParagraph* status_paragraph : installed_packages)
+ {
+ do_print(*status_paragraph, options.find(OPTION_FULLDESC) != options.cend());
+ }
+ }
+ else
+ {
+ // At this point there is 1 argument
+ for (const StatusParagraph* status_paragraph : installed_packages)
+ {
+ const std::string displayname = status_paragraph->package.displayname();
+ if (Strings::case_insensitive_ascii_find(displayname, args.command_arguments[0]) == displayname.end())
+ {
+ continue;
+ }
+
+ do_print(*status_paragraph, options.find(OPTION_FULLDESC) != options.cend());
+ }
+ }
+
+ Checks::exit_success(VCPKG_LINE_INFO);
+ }
+}