aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2010-06-22 13:28:25 +0100
committerAvatar Ciaran McCreesh <ciaran.mccreesh@googlemail.com> 2010-06-22 13:28:25 +0100
commit96bdc113e9170f212fe157ff2e5ce99997411f7e (patch)
treea82eb465dd42d7348570e78079bcd441508fd977
parent2e18d8b0e6bbddc3eab74b0de05e63de15e0ce09 (diff)
downloadpaludis-96bdc113e9170f212fe157ff2e5ce99997411f7e.tar.gz
paludis-96bdc113e9170f212fe157ff2e5ce99997411f7e.tar.xz
cave uninstall
Fixes: ticket:837
-rw-r--r--src/clients/cave/Makefile.am2
-rw-r--r--src/clients/cave/cmd_uninstall.cc147
-rw-r--r--src/clients/cave/cmd_uninstall.hh45
-rw-r--r--src/clients/cave/command_factory.cc2
4 files changed, 196 insertions, 0 deletions
diff --git a/src/clients/cave/Makefile.am b/src/clients/cave/Makefile.am
index cda7484..12b41c3 100644
--- a/src/clients/cave/Makefile.am
+++ b/src/clients/cave/Makefile.am
@@ -47,6 +47,7 @@ command_MANS = \
cave-search.1 \
cave-show.1 \
cave-sync.1 \
+ cave-uninstall.1 \
cave-update-world.1
man_MANS = \
@@ -124,6 +125,7 @@ libcave_a_SOURCES = \
cmd_search_cmdline.cc cmd_search_cmdline.hh \
cmd_show.cc cmd_show.hh \
cmd_sync.cc cmd_sync.hh \
+ cmd_uninstall.cc cmd_uninstall.hh \
cmd_update_world.cc cmd_update_world.hh \
exceptions.cc exceptions.hh \
format_general.cc format_general.hh \
diff --git a/src/clients/cave/cmd_uninstall.cc b/src/clients/cave/cmd_uninstall.cc
new file mode 100644
index 0000000..349ab77
--- /dev/null
+++ b/src/clients/cave/cmd_uninstall.cc
@@ -0,0 +1,147 @@
+/* vim: set sw=4 sts=4 et foldmethod=syntax : */
+
+/*
+ * Copyright (c) 2010 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_uninstall.hh"
+#include "cmd_resolve_cmdline.hh"
+#include "resolve_common.hh"
+#include "exceptions.hh"
+
+#include <paludis/util/make_shared_ptr.hh>
+#include <paludis/util/stringify.hh>
+#include <paludis/user_dep_spec.hh>
+#include <paludis/selection.hh>
+#include <paludis/generator.hh>
+#include <paludis/filter.hh>
+#include <paludis/filtered_generator.hh>
+#include <paludis/environment.hh>
+#include <paludis/package_id.hh>
+#include <paludis/metadata_key.hh>
+
+#include <iostream>
+#include <cstdlib>
+
+using namespace paludis;
+using namespace cave;
+
+using std::cout;
+using std::endl;
+
+namespace
+{
+ struct UninstallCommandLine :
+ CaveCommandCommandLine
+ {
+ args::ArgsGroup g_target_options;
+ args::SwitchArg a_all_versions;
+
+ std::tr1::shared_ptr<ResolveCommandLineResolutionOptions> resolution_options;
+ std::tr1::shared_ptr<ResolveCommandLineExecutionOptions> execution_options;
+ std::tr1::shared_ptr<ResolveCommandLineDisplayOptions> display_options;
+ std::tr1::shared_ptr<ResolveCommandLineProgramOptions> program_options;
+
+ UninstallCommandLine(const bool for_docs) :
+ g_target_options(main_options_section(), "Target options", "Target options"),
+ a_all_versions(&g_target_options, "all-versions", 'a', "If a supplied spec matches multiple versions, "
+ "uninstall all versions rather than erroring", true),
+ resolution_options(for_docs ? make_null_shared_ptr() : make_shared_ptr(new ResolveCommandLineResolutionOptions(this))),
+ execution_options(for_docs ? make_null_shared_ptr() : make_shared_ptr(new ResolveCommandLineExecutionOptions(this))),
+ display_options(for_docs ? make_null_shared_ptr() : make_shared_ptr(new ResolveCommandLineDisplayOptions(this))),
+ program_options(for_docs ? make_null_shared_ptr() : make_shared_ptr(new ResolveCommandLineProgramOptions(this)))
+ {
+ add_usage_line("[ -x|--execute ] [ --uninstalls-may-break */* ] [ --remove-if-dependent */* ] spec ...");
+ add_note("All options available for 'cave resolve' are also permitted. See 'man cave-resolve' for details.");
+ }
+
+ std::string app_name() const
+ {
+ return "cave uninstall";
+ }
+
+ std::string app_synopsis() const
+ {
+ return "Uninstall one or more packages.";
+ }
+
+ std::string app_description() const
+ {
+ return "Uninstalls one or more packages. Note that 'cave uninstall' simply rewrites the supplied "
+ "dependency specifications and then uses 'cave resolve' to do the work; 'cave uninstall foo' is "
+ "the same as 'cave resolve !foo'.";
+ }
+ };
+}
+
+bool
+UninstallCommand::important() const
+{
+ return true;
+}
+
+int
+UninstallCommand::run(
+ const std::tr1::shared_ptr<Environment> & env,
+ const std::tr1::shared_ptr<const Sequence<std::string > > & args
+ )
+{
+ UninstallCommandLine cmdline(false);
+ cmdline.run(args, "CAVE", "CAVE_UNINSTALL_OPTIONS", "CAVE_UNINSTALL_CMDLINE");
+
+ if (cmdline.a_help.specified())
+ {
+ cout << cmdline;
+ return EXIT_SUCCESS;
+ }
+
+ cmdline.resolution_options->apply_shortcuts();
+ cmdline.resolution_options->verify(env);
+
+ std::tr1::shared_ptr<Sequence<std::string> > targets(new Sequence<std::string>);
+ for (UninstallCommandLine::ParametersConstIterator p(cmdline.begin_parameters()), p_end(cmdline.end_parameters()) ;
+ p != p_end ; ++p)
+ {
+ PackageDepSpec spec(parse_user_package_dep_spec(*p, env.get(), UserPackageDepSpecOptions()));
+ const std::tr1::shared_ptr<const PackageIDSequence> ids((*env)[selection::AllVersionsSorted(
+ generator::Matches(spec, MatchPackageOptions()) | filter::SupportsAction<UninstallAction>())]);
+ if (ids->empty())
+ throw NothingMatching(spec);
+ else if (1 != std::distance(ids->begin(), ids->end()) && ! cmdline.a_all_versions.specified())
+ throw BeMoreSpecific(spec, ids);
+ else
+ {
+ for (PackageIDSequence::ConstIterator i(ids->begin()), i_end(ids->end()) ;
+ i != i_end ; ++i)
+ {
+ std::string target("!" + stringify((*i)->name()));
+ if ((*i)->slot_key())
+ target.append(":" + stringify((*i)->slot_key()->value()));
+ targets->push_back(target);
+ }
+ }
+ }
+
+ return resolve_common(env, *cmdline.resolution_options, *cmdline.execution_options, *cmdline.display_options,
+ *cmdline.program_options, make_null_shared_ptr(), targets);
+}
+
+std::tr1::shared_ptr<args::ArgsHandler>
+UninstallCommand::make_doc_cmdline()
+{
+ return make_shared_ptr(new UninstallCommandLine(true));
+}
+
diff --git a/src/clients/cave/cmd_uninstall.hh b/src/clients/cave/cmd_uninstall.hh
new file mode 100644
index 0000000..d2c95e9
--- /dev/null
+++ b/src/clients/cave/cmd_uninstall.hh
@@ -0,0 +1,45 @@
+/* vim: set sw=4 sts=4 et foldmethod=syntax : */
+
+/*
+ * Copyright (c) 2010 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_UNINSTALL_HH
+#define PALUDIS_GUARD_SRC_CLIENTS_CAVE_CMD_UNINSTALL_HH 1
+
+#include "command.hh"
+
+namespace paludis
+{
+ namespace cave
+ {
+ class PALUDIS_VISIBLE UninstallCommand :
+ public Command
+ {
+ public:
+ int run(
+ const std::tr1::shared_ptr<Environment> &,
+ const std::tr1::shared_ptr<const Sequence<std::string > > & args
+ );
+
+ std::tr1::shared_ptr<args::ArgsHandler> make_doc_cmdline();
+
+ bool important() const;
+ };
+ }
+}
+
+#endif
diff --git a/src/clients/cave/command_factory.cc b/src/clients/cave/command_factory.cc
index 6d0a525..550a8d6 100644
--- a/src/clients/cave/command_factory.cc
+++ b/src/clients/cave/command_factory.cc
@@ -56,6 +56,7 @@
#include "cmd_search.hh"
#include "cmd_show.hh"
#include "cmd_sync.hh"
+#include "cmd_uninstall.hh"
#include "cmd_update_world.hh"
using namespace paludis;
@@ -120,6 +121,7 @@ CommandFactory::CommandFactory() :
_imp->handlers.insert(std::make_pair("search", std::tr1::bind(&make_command<SearchCommand>)));
_imp->handlers.insert(std::make_pair("show", std::tr1::bind(&make_command<ShowCommand>)));
_imp->handlers.insert(std::make_pair("sync", std::tr1::bind(&make_command<SyncCommand>)));
+ _imp->handlers.insert(std::make_pair("uninstall", std::tr1::bind(&make_command<UninstallCommand>)));
_imp->handlers.insert(std::make_pair("update-world", std::tr1::bind(&make_command<UpdateWorldCommand>)));
}