Author: jkupec
Date: Mon Apr 14 15:42:48 2008
New Revision: 9612
URL: http://svn.opensuse.org/viewcvs/zypp?rev=9612&view=rev
Log:
- package lock management commands added (fate #120118, fate #302148)
Added:
trunk/zypper/src/zypper-locks.cc
trunk/zypper/src/zypper-locks.h
Modified:
trunk/zypper/src/CMakeLists.txt
trunk/zypper/src/zypper-command.cc
trunk/zypper/src/zypper-command.h
trunk/zypper/src/zypper-misc.cc
trunk/zypper/src/zypper-utils.cc
trunk/zypper/src/zypper-utils.h
trunk/zypper/src/zypper.cc
Modified: trunk/zypper/src/CMakeLists.txt
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/CMakeLists.txt?rev=9612&r1=9611&r2=9612&view=diff
==============================================================================
--- trunk/zypper/src/CMakeLists.txt (original)
+++ trunk/zypper/src/CMakeLists.txt Mon Apr 14 15:42:48 2008
@@ -17,6 +17,7 @@
zypper-info.h
zypper-prompt.h
zypper-tabulator.h
+ zypper-locks.h
zypper-keyring-callbacks.h
zypper-media-callbacks.h
zypper-rpm-callbacks.h
@@ -35,6 +36,7 @@
zypper-info.cc
zypper-tabulator.cc
zypper-prompt.cc
+ zypper-locks.cc
${zypper_HEADERS}
)
Modified: trunk/zypper/src/zypper-command.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-command.cc?rev=9612&r1=9611&r2=9612&view=diff
==============================================================================
--- trunk/zypper/src/zypper-command.cc (original)
+++ trunk/zypper/src/zypper-command.cc Mon Apr 14 15:42:48 2008
@@ -1,10 +1,9 @@
#include <map>
-#include
-
-#include "zypp/Locale.h"
#include "zypp/base/Exception.h"
+#include "zypp/base/String.h"
+#include "zypper-main.h"
#include "zypper-command.h"
// redefine _ gettext macro defined by ZYpp
@@ -38,6 +37,10 @@
const ZypperCommand ZypperCommand::SHOW_PATCHES(ZypperCommand::SHOW_PATCHES_e);
const ZypperCommand ZypperCommand::XML_LIST_UPDATES_PATCHES(ZypperCommand::XML_LIST_UPDATES_PATCHES_e);
+const ZypperCommand ZypperCommand::ADD_LOCK(ZypperCommand::ADD_LOCK_e);
+const ZypperCommand ZypperCommand::REMOVE_LOCK(ZypperCommand::REMOVE_LOCK_e);
+const ZypperCommand ZypperCommand::LIST_LOCKS(ZypperCommand::LIST_LOCKS_e);
+
const ZypperCommand ZypperCommand::HELP(ZypperCommand::HELP_e);
const ZypperCommand ZypperCommand::SHELL(ZypperCommand::SHELL_e);
const ZypperCommand ZypperCommand::SHELL_QUIT(ZypperCommand::SHELL_QUIT_e);
@@ -80,6 +83,10 @@
_table["patches"] = _table["pch"] = ZypperCommand::SHOW_PATCHES_e;
_table["xml-updates"] = _table["xu"] = ZypperCommand::XML_LIST_UPDATES_PATCHES_e;
+ _table["addlock"] = _table["al"] = _table["lock-add"] = _table["la"] = ZypperCommand::ADD_LOCK_e;
+ _table["removelock"] = _table["rl"] = _table["lock-delete"] = _table["ld"] = ZypperCommand::REMOVE_LOCK_e;
+ _table["locks"] = _table["ll"] = _table["lock-list"] = ZypperCommand::LIST_LOCKS_e;
+
_table["help"] = _table["?"] = ZypperCommand::HELP_e;
_table["shell"] = _table["sh"] = ZypperCommand::SHELL_e;
_table["quit"] = _table["exit"] = _table["\004"] = ZypperCommand::SHELL_QUIT_e;
@@ -98,7 +105,7 @@
if (it == _table.end())
{
std::string message =
- boost::str( boost::format(_("Unknown command '%s'")) % strval_r );
+ zypp::str::form(_("Unknown command '%s'"), strval_r.c_str());
ZYPP_THROW(zypp::Exception(message));
}
return it->second;
Modified: trunk/zypper/src/zypper-command.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-command.h?rev=9612&r1=9611&r2=9612&view=diff
==============================================================================
--- trunk/zypper/src/zypper-command.h (original)
+++ trunk/zypper/src/zypper-command.h Mon Apr 14 15:42:48 2008
@@ -32,6 +32,10 @@
static const ZypperCommand SHOW_PATCHES;
static const ZypperCommand XML_LIST_UPDATES_PATCHES;
+ static const ZypperCommand ADD_LOCK;
+ static const ZypperCommand REMOVE_LOCK;
+ static const ZypperCommand LIST_LOCKS;
+
static const ZypperCommand HELP;
static const ZypperCommand SHELL;
static const ZypperCommand SHELL_QUIT;
@@ -70,6 +74,10 @@
PATCH_CHECK_e,
SHOW_PATCHES_e,
XML_LIST_UPDATES_PATCHES_e,
+
+ ADD_LOCK_e,
+ REMOVE_LOCK_e,
+ LIST_LOCKS_e,
HELP_e,
SHELL_e,
Added: trunk/zypper/src/zypper-locks.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-locks.cc?rev=9612&view=auto
==============================================================================
--- trunk/zypper/src/zypper-locks.cc (added)
+++ trunk/zypper/src/zypper-locks.cc Mon Apr 14 15:42:48 2008
@@ -0,0 +1,173 @@
+#include <iostream>
+#include
+
+#include "zypp/base/String.h"
+#include "zypp/Locks.h"
+
+#include "output/Out.h"
+#include "zypper-main.h"
+#include "zypper-tabulator.h"
+#include "zypper-utils.h"
+#include "zypper-locks.h"
+
+using namespace zypp;
+using namespace std;
+
+static const string
+get_string_for_table(const set<string> & repos)
+{
+ if (repos.empty())
+ return _("(any)");
+ else if (repos.size() > 1)
+ return _("(multiple)");
+ else
+ return *repos.begin();
+}
+
+void list_locks(Zypper & zypper)
+{
+ try
+ {
+ Locks & locks = Locks::instance();
+ locks.read();
+
+ Table t;
+
+ TableHeader th;
+ th << "#" << _("Name");
+ if (zypper.globalOpts().is_rug_compatible)
+ th << _("Catalog") << _("Importance");
+ else
+ th << _("Type") << _("Repository");
+
+ t << th;
+
+ unsigned i = 1;
+ for_(it, locks.begin(), locks.end())
+ {
+ TableRow tr;
+
+ // #
+ tr << str::numstring (i);
+
+ // name
+ PoolQuery::StrContainer attr = it->attribute(sat::SolvAttr::name);
+ it->strings();
+ if (attr.size() + it->strings().size() > 1)
+ // translators: locks table value
+ tr << _("(multiple)");
+ else if (attr.empty() && it->strings().empty())
+ // translators: locks table value
+ tr << _("(any)");
+ else if (attr.empty())
+ tr << *it->strings().begin();
+ else
+ tr << *attr.begin();
+
+ if (it->repos().empty())
+ {
+
+ }
+
+ set<string> strings;
+ if (zypper.globalOpts().is_rug_compatible)
+ {
+ // catalog
+ copy(it->repos().begin(), it->repos().end(), inserter(strings, strings.end()));
+ tr << get_string_for_table(strings);
+ // importance
+ tr << _("(any)");
+ }
+ else
+ {
+ // type
+ for_(kit, it->kinds().begin(), it->kinds().end())
+ strings.insert(kit->asString());
+ tr << get_string_for_table(strings);
+ // repo
+ strings.clear();
+ copy(it->repos().begin(), it->repos().end(), inserter(strings, strings.end()));
+ tr << get_string_for_table(strings);
+ }
+
+ t << tr;
+ ++i;
+ }
+
+ if (t.empty())
+ zypper.out().info(_("There are no package locks defined."));
+ else
+ cout << t;
+ }
+ catch(const Exception & e)
+ {
+ ZYPP_CAUGHT(e);
+ zypper.out().error(e, _("Error reading the locks file:"));
+ zypper.setExitCode(ZYPPER_EXIT_ERR_ZYPP);
+ }
+}
+
+template
+void safe_lexical_cast (Source s, Target &tr) {
+ try {
+ tr = boost::lexical_cast<Target> (s);
+ }
+ catch (boost::bad_lexical_cast &) {
+ }
+}
+
+void add_locks(Zypper & zypper, const Zypper::ArgList & args, const ResKindSet & kinds)
+{
+ try
+ {
+ PoolQuery q;
+ q.addAttribute(sat::SolvAttr::name, args[0]);
+ for_(it, kinds.begin(), kinds.end())
+ q.addKind(*it);
+ q.setMatchGlob();
+ //! \todo addRepo()
+ q.setCaseSensitive();
+
+ Locks & locks = Locks::instance();
+ locks.readAndApply();
+ locks.addLock(q);
+ locks.save();
+ }
+ catch(const Exception & e)
+ {
+ ZYPP_CAUGHT(e);
+ zypper.out().error(e, _("Problem adding the package lock:"));
+ zypper.setExitCode(ZYPPER_EXIT_ERR_ZYPP);
+ }
+
+ zypper.out().info(_("Specified lock has been successfully added."));
+}
+
+
+void remove_locks(Zypper & zypper, const Zypper::ArgList & args)
+{
+ try
+ {
+ Locks & locks = Locks::instance();
+ locks.readAndApply();
+ Locks::iterator it = locks.begin();
+ Locks::LockList::size_type i = 0;
+ safe_lexical_cast(args[0], i);
+ if (i > 0 && i <= locks.size())
+ {
+ advance(it, i-1);
+ locks.removeLock(*it);
+ locks.save();
+
+ zypper.out().info(_("Specified lock has been successfully removed."));
+ }
+ else
+ zypper.out().error(str::form(_("Invalid lock number: %s"), args[0].c_str()));
+ }
+ catch(const Exception & e)
+ {
+ ZYPP_CAUGHT(e);
+ zypper.out().error(e, _("Problem adding the package lock:"));
+ zypper.setExitCode(ZYPPER_EXIT_ERR_ZYPP);
+ }
+}
Added: trunk/zypper/src/zypper-locks.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-locks.h?rev=9612&view=auto
==============================================================================
--- trunk/zypper/src/zypper-locks.h (added)
+++ trunk/zypper/src/zypper-locks.h Mon Apr 14 15:42:48 2008
@@ -0,0 +1,10 @@
+#ifndef ZYPPERLOCKS_H_
+#define ZYPPERLOCKS_H_
+
+#include "zypper.h"
+
+void list_locks(Zypper & zypper);
+void add_locks(Zypper & zypper, const Zypper::ArgList & args, const ResKindSet & kinds);
+void remove_locks(Zypper & zypper, const Zypper::ArgList & args);
+
+#endif /*ZYPPERLOCKS_H_*/
Modified: trunk/zypper/src/zypper-misc.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-misc.cc?rev=9612&r1=9611&r2=9612&view=diff
==============================================================================
--- trunk/zypper/src/zypper-misc.cc (original)
+++ trunk/zypper/src/zypper-misc.cc Mon Apr 14 15:42:48 2008
@@ -822,7 +822,7 @@
if (problem_count > 1 && reply == solution_count)
return indeterminate; // continue with next problem
- zypper.out().info(boost::str(format (_("Applying solution %s")) % reply), Out::HIGH);
+ zypper.out().info(boost::str(format (_("Applying solution %s")) % (reply + 1)), Out::HIGH);
ProblemSolutionList::iterator reply_i = solutions.begin ();
advance (reply_i, reply);
todo.push_back (*reply_i);
Modified: trunk/zypper/src/zypper-utils.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-utils.cc?rev=9612&r1=9611&r2=9612&view=diff
==============================================================================
--- trunk/zypper/src/zypper-utils.cc (original)
+++ trunk/zypper/src/zypper-utils.cc Mon Apr 14 15:42:48 2008
@@ -70,6 +70,17 @@
// ----------------------------------------------------------------------------
+void report_required_arg_missing(Out & out, const string & cmd_help)
+{
+ out.error(_("Required argument missing."));
+ ostringstream s;
+ s << _("Usage") << ':' << endl;
+ s << cmd_help;
+ out.info(s.str());
+}
+
+// ----------------------------------------------------------------------------
+
void report_dummy_option(Out & out, const string & longoption_str)
{
out.warning(str::form(
Modified: trunk/zypper/src/zypper-utils.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper-utils.h?rev=9612&r1=9611&r2=9612&view=diff
==============================================================================
--- trunk/zypper/src/zypper-utils.h (original)
+++ trunk/zypper/src/zypper-utils.h Mon Apr 14 15:42:48 2008
@@ -23,6 +23,9 @@
/** Say the specified option has no effect */
void report_dummy_option(Out & out, const std::string & longoption_str);
+/** Say you miss a required argument and print command help */
+void report_required_arg_missing(Out & out, const std::string & cmd_help);
+
bool is_changeable_media(const zypp::Url & url);
std::string kind_to_string_localized(
Modified: trunk/zypper/src/zypper.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/zypper/src/zypper.cc?rev=9612&r1=9611&r2=9612&view=diff
==============================================================================
--- trunk/zypper/src/zypper.cc (original)
+++ trunk/zypper/src/zypper.cc Mon Apr 14 15:42:48 2008
@@ -23,8 +23,6 @@
#include "zypp/ZYppFactory.h"
#include "zypp/base/Logger.h"
-//#include "zypp/base/Algorithm.h"
-
#include "zypp/base/UserRequestException.h"
#include "zypp/repo/RepoException.h"
#include "zypp/zypp_detail/ZYppReadOnlyHack.h"
@@ -37,6 +35,7 @@
#include "zypper.h"
#include "zypper-repos.h"
#include "zypper-misc.h"
+#include "zypper-locks.h"
#include "zypper-tabulator.h"
#include "zypper-search.h"
@@ -44,7 +43,6 @@
#include "zypper-getopt.h"
#include "zypper-command.h"
#include "zypper-utils.h"
-//#include "zypper-callbacks.h"
#include "output/OutNormal.h"
#include "output/OutXML.h"
@@ -170,7 +168,7 @@
static string help_commands = _(
" Commands:\n"
- "\thelp, ?\t\t\tHelp\n"
+ "\thelp, ?\t\t\tPrint help.\n"
"\tshell, sh\t\tAccept multiple commands at once.\n"
"\tinstall, in\t\tInstall packages.\n"
"\tremove, rm\t\tRemove packages.\n"
@@ -192,7 +190,10 @@
"\tpatch-info\t\tShow full information for patches.\n"
"\tsource-install, si\tInstall source packages.\n"
"\tclean\t\t\tClean local caches.\n"
- "");
+ "\taddlock\t\t\tAdd a package lock.\n"
+ "\tremovelock\t\tRemove a package lock.\n"
+ "\tlocks\t\t\tList current package locks.\n"
+ );
static string help_usage = _(
" Usage:\n"
@@ -489,19 +490,24 @@
// additional repositories
if (gopts.count("plus-repo"))
{
- if (command() == ZypperCommand::ADD_REPO ||
- command() == ZypperCommand::REMOVE_REPO ||
- command() == ZypperCommand::MODIFY_REPO ||
- command() == ZypperCommand::RENAME_REPO ||
- command() == ZypperCommand::REFRESH ||
- command() == ZypperCommand::CLEAN )
+ switch (command().toEnum())
+ {
+ case ZypperCommand::ADD_REPO_e:
+ case ZypperCommand::REMOVE_REPO_e:
+ case ZypperCommand::MODIFY_REPO_e:
+ case ZypperCommand::RENAME_REPO_e:
+ case ZypperCommand::REFRESH_e:
+ case ZypperCommand::CLEAN_e:
+ case ZypperCommand::REMOVE_LOCK_e:
+ case ZypperCommand::LIST_LOCKS_e:
{
// TranslatorExplanation The %s is "--plus-repo"
out().warning(boost::str(format(
_("The %s option has no effect here, ignoring."))
% "--plus-repo"));
+ break;
}
- else
+ default:
{
list<string> repos = gopts["plus-repo"];
@@ -528,6 +534,7 @@
count++;
}
}
+ }
}
MIL << "DONE" << endl;
@@ -1358,6 +1365,73 @@
break;
}
+ case ZypperCommand::ADD_LOCK_e:
+ {
+ static struct option options[] =
+ {
+ {"type", required_argument, 0, 't'},
+ {"repo", required_argument, 0, 'r'},
+ // rug compatiblity (although rug does not seem to support this)
+ {"catalog", required_argument, 0, 'c'},
+ {"help", no_argument, 0, 'h'},
+ {0, 0, 0, 0}
+ };
+ specific_options = options;
+ _command_help = string(_(
+ "addlock (al) <packagename>\n"
+ "\n"
+ "Add a package lock. Specify packages to lock by exact name or by a"
+ " glob pattern using '*' and '?' wildcard characters.\n"
+ "\n"
+ " Command options:\n"
+ "-r, --repo Restrict the lock to the specified repository.\n"
+ ))
+ + str::form(
+ _("-t, --type <type> Type of resolvable (%s)\n"
+ " Default: %s\n")
+ , "package, patch, pattern, product"
+ , "package");
+
+ break;
+ }
+
+ case ZypperCommand::REMOVE_LOCK_e:
+ {
+ static struct option options[] =
+ {
+ {"help", no_argument, 0, 'h'},
+ {0, 0, 0, 0}
+ };
+ specific_options = options;
+ _command_help = _(
+ "removelock (rl) <lock-number>\n"
+ "\n"
+ "Remove a package lock. Specify the lock to remove by its number obtained"
+ "with 'zypper locks'.\n"
+ "\n"
+ "This command has no additional options.\n"
+ );
+ break;
+ }
+
+ case ZypperCommand::LIST_LOCKS_e:
+ {
+ static struct option options[] =
+ {
+ {"help", no_argument, 0, 'h'},
+ {0, 0, 0, 0}
+ };
+ specific_options = options;
+ _command_help = _(
+ "locks (ll)\n"
+ "\n"
+ "List current package locks.\n"
+ "\n"
+ "This command has no additional options.\n"
+ );
+ break;
+ }
+
case ZypperCommand::SHELL_QUIT_e:
{
static struct option quit_options[] = {
@@ -2439,6 +2513,126 @@
return;
}
+
+ // -----------------------------( locks )------------------------------------
+
+ else if (command() == ZypperCommand::ADD_LOCK)
+ {
+ if (runningHelp()) { out().info(_command_help, Out::QUIET); return; }
+
+ // check root user
+ if (geteuid() != 0)
+ {
+ out().error(
+ _("Root privileges are required for adding of package locks."));
+ setExitCode(ZYPPER_EXIT_ERR_PRIVILEGES);
+ return;
+ }
+
+ // too few arguments
+ if (_arguments.empty())
+ {
+ report_required_arg_missing(out(), _command_help);
+ setExitCode(ZYPPER_EXIT_ERR_INVALID_ARGS);
+ return;
+ }
+ // too many arguments
+ else if (_arguments.size() > 1)
+ {
+ // rug compatibility
+ if (_gopts.is_rug_compatible)
+ // translators: 'zypper addlock foo' takes only one argument.
+ out().warning(_("Only the first command argument considered. Zypper currently does not support versioned locks."));
+ else
+ {
+ report_too_many_arguments(_command_help);
+ setExitCode(ZYPPER_EXIT_ERR_INVALID_ARGS);
+ return;
+ }
+ }
+
+ ResKindSet kinds;
+ if (copts.count("type"))
+ {
+ std::liststd::string::const_iterator it;
+ for (it = copts["type"].begin(); it != copts["type"].end(); ++it)
+ {
+ kind = string_to_kind( *it );
+ if (kind == ResObject::Kind())
+ {
+ out().error(boost::str(format(
+ _("Unknown resolvable type '%s'.")) % *it));
+ setExitCode(ZYPPER_EXIT_ERR_INVALID_ARGS);
+ return;
+ }
+ kinds.insert(kind);
+ }
+ }
+ else
+ kinds.insert(ResKind::package);
+
+ init_target(*this);
+ init_repos(*this);
+ if (exitCode() != ZYPPER_EXIT_OK)
+ return;
+ load_resolvables(*this);
+
+ add_locks(*this, _arguments, kinds);
+
+ return;
+ }
+
+ else if (command() == ZypperCommand::REMOVE_LOCK)
+ {
+ if (runningHelp()) { out().info(_command_help, Out::QUIET); return; }
+
+ // check root user
+ if (geteuid() != 0)
+ {
+ out().error(
+ _("Root privileges are required for adding of package locks."));
+ setExitCode(ZYPPER_EXIT_ERR_PRIVILEGES);
+ return;
+ }
+
+ if (_arguments.size() != 1)
+ {
+ if (_arguments.empty())
+ report_required_arg_missing(out(), _command_help);
+ else
+ report_too_many_arguments(_command_help);
+
+ setExitCode(ZYPPER_EXIT_ERR_INVALID_ARGS);
+ return;
+ }
+
+ init_target(*this);
+ init_repos(*this);
+ if (exitCode() != ZYPPER_EXIT_OK)
+ return;
+ load_resolvables(*this);
+
+ remove_locks(*this, _arguments);
+
+ return;
+ }
+
+ else if (command() == ZypperCommand::LIST_LOCKS)
+ {
+ if (runningHelp()) { out().info(_command_help, Out::QUIET); return; }
+/*
+ init_target(*this);
+ init_repos(*this);
+ if (exitCode() != ZYPPER_EXIT_OK)
+ return;
+ load_resolvables(*this);
+*/
+ list_locks(*this);
+
+ return;
+ }
+
+ // -----------------------------( shell )------------------------------------
else if (command() == ZypperCommand::SHELL_QUIT)
{
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org