diff options
author | 2011-03-12 14:51:57 +0000 | |
---|---|---|
committer | 2011-03-12 14:51:57 +0000 | |
commit | d99252d2600be0a16349e7fcc06e158484df628d (patch) | |
tree | bba80c65c9aa0abb75815c1a4816593cc3d74420 | |
parent | 212c4c26bc5114098d62d9947b5a0211d2b239e0 (diff) | |
download | paludis-d99252d2600be0a16349e7fcc06e158484df628d.tar.gz paludis-d99252d2600be0a16349e7fcc06e158484df628d.tar.xz |
cave print-dependent-ids
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | doc/clients/Makefile.am | 1 | ||||
-rw-r--r-- | src/clients/cave/Makefile.am | 2 | ||||
-rw-r--r-- | src/clients/cave/cmd_print_dependent_ids.cc | 159 | ||||
-rw-r--r-- | src/clients/cave/cmd_print_dependent_ids.hh | 44 | ||||
-rw-r--r-- | src/clients/cave/command_factory.cc | 2 |
6 files changed, 209 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore index b71a35942..b527f8415 100644 --- a/.gitignore +++ b/.gitignore @@ -104,6 +104,7 @@ paludis-*.*.*.tar.bz2 /doc/clients/cave-print-best-version.html /doc/clients/cave-print-categories.html /doc/clients/cave-print-commands.html +/doc/clients/cave-print-dependent-ids.html /doc/clients/cave-print-environment-metadata.html /doc/clients/cave-print-id-actions.html /doc/clients/cave-print-id-contents.html diff --git a/doc/clients/Makefile.am b/doc/clients/Makefile.am index c110c21d6..af9353b2b 100644 --- a/doc/clients/Makefile.am +++ b/doc/clients/Makefile.am @@ -50,6 +50,7 @@ CAVE_COMMANDS_HTML = \ cave-print-best-version.html \ cave-print-categories.html \ cave-print-commands.html \ + cave-print-dependent-ids.html \ cave-print-environment-metadata.html \ cave-print-id-actions.html \ cave-print-id-contents.html \ diff --git a/src/clients/cave/Makefile.am b/src/clients/cave/Makefile.am index fe33e811f..0dfc9e543 100644 --- a/src/clients/cave/Makefile.am +++ b/src/clients/cave/Makefile.am @@ -46,6 +46,7 @@ command_MANS = \ cave-print-best-version.1 \ cave-print-categories.1 \ cave-print-commands.1 \ + cave-print-dependent-ids.1 \ cave-print-environment-metadata.1 \ cave-print-id-actions.1 \ cave-print-id-contents.1 \ @@ -154,6 +155,7 @@ libcave_a_SOURCES = \ cmd_print_best_version.cc cmd_print_best_version.hh \ cmd_print_categories.cc cmd_print_categories.hh \ cmd_print_commands.cc cmd_print_commands.hh \ + cmd_print_dependent_ids.cc cmd_print_dependent_ids.hh \ cmd_print_environment_metadata.cc cmd_print_environment_metadata.hh \ cmd_print_id_actions.cc cmd_print_id_actions.hh \ cmd_print_id_contents.cc cmd_print_id_contents.hh \ diff --git a/src/clients/cave/cmd_print_dependent_ids.cc b/src/clients/cave/cmd_print_dependent_ids.cc new file mode 100644 index 000000000..f72597913 --- /dev/null +++ b/src/clients/cave/cmd_print_dependent_ids.cc @@ -0,0 +1,159 @@ +/* vim: set sw=4 sts=4 et foldmethod=syntax : */ + +/* + * Copyright (c) 2011 Ciaran McCreesh + * + * This file is part of the Paludis package manager. Paludis is free software; + * you can redistribute it and/or modify it under the terms of the GNU General + * Public License version 2, as published by the Free Software Foundation. + * + * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "cmd_print_dependent_ids.hh" +#include "format_string.hh" +#include "parse_spec_with_nice_error.hh" +#include "exceptions.hh" +#include <paludis/args/args.hh> +#include <paludis/args/do_help.hh> +#include <paludis/name.hh> +#include <paludis/environment.hh> +#include <paludis/package_database.hh> +#include <paludis/repository.hh> +#include <paludis/util/set.hh> +#include <paludis/util/wrapped_forward_iterator.hh> +#include <paludis/util/indirect_iterator-impl.hh> +#include <paludis/util/visitor_cast.hh> +#include <paludis/util/map.hh> +#include <paludis/util/make_null_shared_ptr.hh> +#include <paludis/resolver/collect_depped_upon.hh> +#include <paludis/generator.hh> +#include <paludis/filtered_generator.hh> +#include <paludis/filter.hh> +#include <paludis/filter_handler.hh> +#include <paludis/selection.hh> +#include <paludis/user_dep_spec.hh> +#include <paludis/package_id.hh> +#include <paludis/mask.hh> +#include <paludis/metadata_key.hh> +#include <cstdlib> +#include <iostream> +#include <algorithm> + +#include "command_command_line.hh" + +using namespace paludis; +using namespace cave; +using std::cout; +using std::endl; + +namespace +{ + struct PrintDependentIDsCommandLine : + CaveCommandCommandLine + { + virtual std::string app_name() const + { + return "cave print-dependent-ids"; + } + + virtual std::string app_synopsis() const + { + return "Prints a list of installed IDs that are dependent upon another installed ID."; + } + + virtual std::string app_description() const + { + return "Prints a list of installed IDs that are dependent upon another installed ID. " + "No formatting is used, making the output suitable for parsing by scripts."; + } + + args::ArgsGroup g_display_options; + args::StringArg a_format; + + PrintDependentIDsCommandLine() : + g_display_options(main_options_section(), "Display Options", "Controls the output format."), + a_format(&g_display_options, "format", 'f', "Select the output format. Special tokens recognised are " + "%c for category, %p for package, %v for version, %s for slot, %: for ':' if we have a slot and " + "empty otherwise, %r for repository, %F for the canonical full form, %V for the canonical full " + "version, %W for the canonical full unversioned form, %N for the canonical full unnamed form, " + "\\n for newline, \\t for tab. Default is '%F\\n'.") + { + add_usage_line("spec"); + a_format.set_argument("%F\\n"); + } + }; + + std::string format_id( + const PrintDependentIDsCommandLine & c, + const std::shared_ptr<const PackageID> & i) + { + std::shared_ptr<Map<char, std::string> > m(std::make_shared<Map<char, std::string>>()); + m->insert('c', stringify(i->name().category())); + m->insert('p', stringify(i->name().package())); + m->insert('v', stringify(i->version())); + m->insert('s', i->slot_key() ? stringify(i->slot_key()->value()) : ""); + m->insert(':', i->slot_key() ? ":" : ""); + m->insert('r', stringify(i->repository_name())); + m->insert('F', i->canonical_form(idcf_full)); + m->insert('V', i->canonical_form(idcf_version)); + m->insert('W', i->canonical_form(idcf_no_version)); + m->insert('N', i->canonical_form(idcf_no_name)); + return format_string(c.a_format.argument(), m); + } +} + +int +PrintDependentIDsCommand::run( + const std::shared_ptr<Environment> & env, + const std::shared_ptr<const Sequence<std::string > > & args + ) +{ + PrintDependentIDsCommandLine cmdline; + cmdline.run(args, "CAVE", "CAVE_PRINT_DEPENDENT_IDS_OPTIONS", "CAVE_PRINT_DEPENDENT_IDS_CMDLINE"); + + if (cmdline.a_help.specified()) + { + cout << cmdline; + return EXIT_SUCCESS; + } + + if (1 != std::distance(cmdline.begin_parameters(), cmdline.end_parameters())) + throw args::DoHelp("print-dependent-ids requires exactly one parameter"); + + auto installed_filter(filter::InstalledAtRoot(env->system_root_key()->value())); + auto spec(parse_spec_with_nice_error(*cmdline.begin_parameters(), env.get(), { }, installed_filter)); + auto ids((*env)[selection::AllVersionsSorted( + generator::Matches(spec, make_null_shared_ptr(), { }) | + installed_filter)]); + + if (ids->empty()) + throw NothingMatching(spec); + else if (next(ids->begin()) != ids->end()) + throw BeMoreSpecific(spec, ids); + + auto installed_ids((*env)[selection::AllVersionsSorted( + generator::All() | + installed_filter)]); + + auto dependents(resolver::collect_depped_upon(env.get(), *ids->begin(), installed_ids, make_null_shared_ptr())); + for (auto i(dependents->begin()), i_end(dependents->end()) ; + i != i_end ; ++i) + cout << format_id(cmdline, *i); + + return dependents->empty() ? EXIT_FAILURE : EXIT_SUCCESS; +} + +std::shared_ptr<args::ArgsHandler> +PrintDependentIDsCommand::make_doc_cmdline() +{ + return std::make_shared<PrintDependentIDsCommandLine>(); +} + diff --git a/src/clients/cave/cmd_print_dependent_ids.hh b/src/clients/cave/cmd_print_dependent_ids.hh new file mode 100644 index 000000000..f8b1402a1 --- /dev/null +++ b/src/clients/cave/cmd_print_dependent_ids.hh @@ -0,0 +1,44 @@ +/* vim: set sw=4 sts=4 et foldmethod=syntax : */ + +/* + * Copyright (c) 2011 Ciaran McCreesh + * + * This file is part of the Paludis package manager. Paludis is free software; + * you can redistribute it and/or modify it under the terms of the GNU General + * Public License version 2, as published by the Free Software Foundation. + * + * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef PALUDIS_GUARD_SRC_CLIENTS_CAVE_CMD_PRINT_DEPENDENT_IDS_HH +#define PALUDIS_GUARD_SRC_CLIENTS_CAVE_CMD_PRINT_DEPENDENT_IDS_HH 1 + +#include "command.hh" + +namespace paludis +{ + namespace cave + { + class PALUDIS_VISIBLE PrintDependentIDsCommand : + public Command + { + public: + int run( + const std::shared_ptr<Environment> &, + const std::shared_ptr<const Sequence<std::string > > & args + ); + + std::shared_ptr<args::ArgsHandler> make_doc_cmdline(); + }; + } +} + + +#endif diff --git a/src/clients/cave/command_factory.cc b/src/clients/cave/command_factory.cc index 7432757f5..707cc5f4c 100644 --- a/src/clients/cave/command_factory.cc +++ b/src/clients/cave/command_factory.cc @@ -59,6 +59,7 @@ #include "cmd_print_best_version.hh" #include "cmd_print_categories.hh" #include "cmd_print_commands.hh" +#include "cmd_print_dependent_ids.hh" #include "cmd_print_environment_metadata.hh" #include "cmd_print_id_actions.hh" #include "cmd_print_id_contents.hh" @@ -179,6 +180,7 @@ CommandFactory::CommandFactory() : _imp->handlers.insert(std::make_pair("print-best-version", std::bind(&make_command<PrintBestVersionCommand>))); _imp->handlers.insert(std::make_pair("print-categories", std::bind(&make_command<PrintCategoriesCommand>))); _imp->handlers.insert(std::make_pair("print-commands", std::bind(&make_command<PrintCommandsCommand>))); + _imp->handlers.insert(std::make_pair("print-dependent-ids", std::bind(&make_command<PrintDependentIDsCommand>))); _imp->handlers.insert(std::make_pair("print-environment-metadata", std::bind(&make_command<PrintEnvironmentMetadataCommand>))); _imp->handlers.insert(std::make_pair("print-id-actions", std::bind(&make_command<PrintIDActionsCommand>))); _imp->handlers.insert(std::make_pair("print-id-contents", std::bind(&make_command<PrintIDContentsCommand>))); |