diff options
| author | Alexander Karatarakis <alkarata@microsoft.com> | 2016-11-07 13:44:20 -0800 |
|---|---|---|
| committer | Alexander Karatarakis <alkarata@microsoft.com> | 2016-11-07 13:44:57 -0800 |
| commit | 8f162188ddef5841f50250ef92bf629eac512650 (patch) | |
| tree | 1d6200b780a4c2f297c8e2addc62428c84a767cb /toolsrc/src/commands_cache.cpp | |
| parent | 331ac16736b9698c0fed9e5cbd38ef9322b9a824 (diff) | |
| download | vcpkg-8f162188ddef5841f50250ef92bf629eac512650.tar.gz vcpkg-8f162188ddef5841f50250ef92bf629eac512650.zip | |
Add simple substring filtering to `vcpkg cache`, like `vcpkg search`
Diffstat (limited to 'toolsrc/src/commands_cache.cpp')
| -rw-r--r-- | toolsrc/src/commands_cache.cpp | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/toolsrc/src/commands_cache.cpp b/toolsrc/src/commands_cache.cpp index 0d70f0f29..53518264e 100644 --- a/toolsrc/src/commands_cache.cpp +++ b/toolsrc/src/commands_cache.cpp @@ -5,34 +5,65 @@ namespace vcpkg { - void cache_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + template <class Pred> + static void do_print(const vcpkg_paths& paths, Pred predicate) { - args.check_exact_arg_count(0); - - auto begin_it = fs::directory_iterator(paths.packages); - auto end_it = fs::directory_iterator(); + auto it = fs::directory_iterator(paths.packages); + const fs::directory_iterator end_it = fs::directory_iterator(); - if (begin_it == end_it) + if (it == end_it) { System::println("No packages are cached."); exit(EXIT_SUCCESS); } - for (; begin_it != end_it; ++begin_it) + for (; it != end_it; ++it) { - const auto& path = begin_it->path(); + const fs::path& path = it->path(); - auto file_contents = Files::get_contents(path / "CONTROL"); - if (auto text = file_contents.get()) + try { - auto pghs = parse_paragraphs(*text); - if (pghs.size() != 1) - continue; + auto file_contents = Files::get_contents(path / "CONTROL"); + if (auto text = file_contents.get()) + { + auto pghs = parse_paragraphs(*text); + if (pghs.size() != 1) + continue; - auto src = BinaryParagraph(pghs[0]); - System::println(src.displayname().c_str()); + const BinaryParagraph src = BinaryParagraph(pghs[0]); + const std::string displayname = src.displayname(); + if (predicate(displayname)) + { + System::println(displayname.c_str()); + } + } + } + catch (std::runtime_error const&) + { } } + } + + void cache_command(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths) + { + static const std::string example = Strings::format( + "The argument should be a substring to search for, or no argument to display all cached libraries.\n%s", create_example_string("cache png")); + args.check_max_arg_count(1, example.c_str()); + + if (args.command_arguments.size() == 0) + { + do_print(paths, [](const std::string&) -> bool + { + return true; + }); + exit(EXIT_SUCCESS); + } + + // At this point there is 1 argument + do_print(paths, [&](const std::string& port_name) -> bool + { + return Strings::case_insensitive_ascii_find(port_name, args.command_arguments[0]) != port_name.end(); + }); exit(EXIT_SUCCESS); } |
