diff options
author | 2010-08-14 00:12:31 +0100 | |
---|---|---|
committer | 2010-08-14 00:12:31 +0100 | |
commit | 0ff85e817a6d54828a24cd74718db6c5dceeeeaf (patch) | |
tree | c65f0bf48b52101062ef6cb2f8475df4e687ebbd | |
parent | 52bc5b1f61040e15db3cd508007955e343b27f24 (diff) | |
download | paludis-0ff85e817a6d54828a24cd74718db6c5dceeeeaf.tar.gz paludis-0ff85e817a6d54828a24cd74718db6c5dceeeeaf.tar.xz |
cave print-id-environment-variable
-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_id_environment_variable.cc | 160 | ||||
-rw-r--r-- | src/clients/cave/cmd_print_id_environment_variable.hh | 44 | ||||
-rw-r--r-- | src/clients/cave/command_factory.cc | 2 |
6 files changed, 210 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore index 2743b05e7..35841b179 100644 --- a/.gitignore +++ b/.gitignore @@ -100,6 +100,7 @@ paludis-*.*.*.tar.bz2 /doc/clients/cave-print-environment-metadata.html /doc/clients/cave-print-id-actions.html /doc/clients/cave-print-id-contents.html +/doc/clients/cave-print-id-environment-variable.html /doc/clients/cave-print-id-executables.html /doc/clients/cave-print-id-masks.html /doc/clients/cave-print-id-metadata.html diff --git a/doc/clients/Makefile.am b/doc/clients/Makefile.am index 546c9196e..30c7c63c4 100644 --- a/doc/clients/Makefile.am +++ b/doc/clients/Makefile.am @@ -45,6 +45,7 @@ CAVE_COMMANDS_HTML = \ cave-print-environment-metadata.html \ cave-print-id-actions.html \ cave-print-id-contents.html \ + cave-print-id-environment-variable.html \ cave-print-id-executables.html \ cave-print-id-masks.html \ cave-print-id-metadata.html \ diff --git a/src/clients/cave/Makefile.am b/src/clients/cave/Makefile.am index 0f0897099..3733c947c 100644 --- a/src/clients/cave/Makefile.am +++ b/src/clients/cave/Makefile.am @@ -38,6 +38,7 @@ command_MANS = \ cave-print-environment-metadata.1 \ cave-print-id-actions.1 \ cave-print-id-contents.1 \ + cave-print-id-environment-variable.1 \ cave-print-id-executables.1 \ cave-print-id-masks.1 \ cave-print-id-metadata.1 \ @@ -121,6 +122,7 @@ libcave_a_SOURCES = \ 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 \ + cmd_print_id_environment_variable.cc cmd_print_id_environment_variable.hh \ cmd_print_id_executables.cc cmd_print_id_executables.hh \ cmd_print_id_masks.cc cmd_print_id_masks.hh \ cmd_print_id_metadata.cc cmd_print_id_metadata.hh \ diff --git a/src/clients/cave/cmd_print_id_environment_variable.cc b/src/clients/cave/cmd_print_id_environment_variable.cc new file mode 100644 index 000000000..530a0b893 --- /dev/null +++ b/src/clients/cave/cmd_print_id_environment_variable.cc @@ -0,0 +1,160 @@ +/* vim: set sw=4 sts=4 et foldmethod=syntax : */ + +/* + * Copyright (c) 2008, 2009, 2010 Ciaran McCreesh + * Copyright (c) 2010 David Leverton + * + * 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_id_environment_variable.hh" +#include "format_string.hh" +#include "exceptions.hh" +#include <paludis/args/args.hh> +#include <paludis/args/do_help.hh> +#include <paludis/util/map.hh> +#include <paludis/environment.hh> +#include <paludis/user_dep_spec.hh> +#include <paludis/filtered_generator.hh> +#include <paludis/generator.hh> +#include <paludis/selection.hh> +#include <paludis/package_id.hh> +#include <paludis/repository.hh> +#include <iostream> + +#include "command_command_line.hh" + +using namespace paludis; +using namespace cave; +using std::cout; +using std::endl; + +namespace +{ + struct PrintIDEnvironmentVariableCommandLine : + CaveCommandCommandLine + { + virtual std::string app_name() const + { + return "cave print-id-environment-variable"; + } + + virtual std::string app_synopsis() const + { + return "Prints ID environment variables."; + } + + virtual std::string app_description() const + { + return "Prints ID environment variables. No formatting is used, " + "making the output suitable for parsing by scripts."; + } + + args::ArgsGroup g_spec_options; + args::SwitchArg a_all; + args::SwitchArg a_best; + + args::ArgsGroup g_filters; + args::StringSequenceArg a_variable_name; + + args::ArgsGroup g_display_options; + args::StringArg a_format; + + PrintIDEnvironmentVariableCommandLine() : + g_spec_options(main_options_section(), "Spec Options", "Alter how the supplied spec is used."), + a_all(&g_spec_options, "all", 'a', "If the spec matches multiple IDs, display all matches.", true), + a_best(&g_spec_options, "best", '\0', "If the spec matches multiple IDs, select the best ID rather than giving an error.", true), + g_filters(main_options_section(), "Filters", "Filter the output. Each filter may be specified more than once."), + a_variable_name(&g_filters, "variable-name", '\0', "Show this environment variable. If specified more than once, " + "any name match is accepted. Must be specified at least once."), + g_display_options(main_options_section(), "Display Options", "Controls the output format."), + a_format(&g_display_options, "format", '\0', "Select the output format. Special tokens recognised are " + "%n for variable name, %v for value, " + "\\n for newline, \\t for tab. Default is '%n=%v\\n'.") + { + a_format.set_argument("%n=%v\\n"); + add_usage_line("--variable-name var [ --format format ] spec"); + } + }; + + void do_one_var( + const PackageDepSpec & s, + const std::shared_ptr<const PackageID> & id, + const std::string & n, + const PrintIDEnvironmentVariableCommandLine & cmdline + ) + { + std::shared_ptr<const Repository> r(id->repository()); + + if (0 != r->environment_variable_interface()) + { + std::shared_ptr<Map<char, std::string> > m(std::make_shared<Map<char, std::string>>()); + m->insert('n', n); + m->insert('v', r->environment_variable_interface()->get_environment_variable(id, n)); + + cout << format_string(cmdline.a_format.argument(), m); + } + else + throw BadIDForCommand(s, id, "does not support getting environment variables"); + } +} + +int +PrintIDEnvironmentVariableCommand::run( + const std::shared_ptr<Environment> & env, + const std::shared_ptr<const Sequence<std::string > > & args + ) +{ + PrintIDEnvironmentVariableCommandLine cmdline; + cmdline.run(args, "CAVE", "CAVE_PRINT_ID_ENVIRONMENT_VARIABLE_OPTIONS", "CAVE_PRINT_ID_ENVIRONMENT_VARIABLE_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-id-environment-variable takes exactly one parameter"); + + PackageDepSpec spec(parse_user_package_dep_spec(*cmdline.begin_parameters(), env.get(), { updso_allow_wildcards })); + + std::shared_ptr<const PackageIDSequence> entries( + (*env)[selection::AllVersionsSorted(generator::Matches(spec, { }))]); + + if (entries->empty()) + throw NothingMatching(spec); + + if ((! cmdline.a_best.specified()) && (! cmdline.a_all.specified()) + && (next(entries->begin()) != entries->end())) + throw BeMoreSpecific(spec, entries); + + if (! cmdline.a_variable_name.specified()) + throw args::DoHelp("print-id-enviroment-variable requires at least one variable name"); + + for (auto i(cmdline.a_best.specified() ? entries->last() : entries->begin()), i_end(entries->end()) ; + i != i_end ; ++i) + for (args::StringSequenceArg::ConstIterator v(cmdline.a_variable_name.begin_args()), v_end(cmdline.a_variable_name.end_args()) ; + v != v_end ; ++v) + do_one_var(spec, *i, *v, cmdline); + + return EXIT_SUCCESS; +} + +std::shared_ptr<args::ArgsHandler> +PrintIDEnvironmentVariableCommand::make_doc_cmdline() +{ + return std::make_shared<PrintIDEnvironmentVariableCommandLine>(); +} + diff --git a/src/clients/cave/cmd_print_id_environment_variable.hh b/src/clients/cave/cmd_print_id_environment_variable.hh new file mode 100644 index 000000000..044dce448 --- /dev/null +++ b/src/clients/cave/cmd_print_id_environment_variable.hh @@ -0,0 +1,44 @@ +/* vim: set sw=4 sts=4 et foldmethod=syntax : */ + +/* + * Copyright (c) 2008 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_ID_ENVIRONMENT_VARIABLE_HH +#define PALUDIS_GUARD_SRC_CLIENTS_CAVE_CMD_PRINT_ID_ENVIRONMENT_VARIABLE_HH 1 + +#include "command.hh" + +namespace paludis +{ + namespace cave + { + class PALUDIS_VISIBLE PrintIDEnvironmentVariableCommand : + 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 efea69577..ace093013 100644 --- a/src/clients/cave/command_factory.cc +++ b/src/clients/cave/command_factory.cc @@ -52,6 +52,7 @@ #include "cmd_print_environment_metadata.hh" #include "cmd_print_id_actions.hh" #include "cmd_print_id_contents.hh" +#include "cmd_print_id_environment_variable.hh" #include "cmd_print_id_executables.hh" #include "cmd_print_id_masks.hh" #include "cmd_print_id_metadata.hh" @@ -158,6 +159,7 @@ CommandFactory::CommandFactory() : _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>))); + _imp->handlers.insert(std::make_pair("print-id-environment-variable", std::bind(&make_command<PrintIDEnvironmentVariableCommand>))); _imp->handlers.insert(std::make_pair("print-id-executables", std::bind(&make_command<PrintIDExecutablesCommand>))); _imp->handlers.insert(std::make_pair("print-id-masks", std::bind(&make_command<PrintIDMasksCommand>))); _imp->handlers.insert(std::make_pair("print-id-metadata", std::bind(&make_command<PrintIDMetadataCommand>))); |