Hello community,
here is the log from the commit of package zypper
checked in at Mon Aug 13 00:20:12 CEST 2007.
--------
--- zypper/zypper.changes 2007-08-11 22:33:26.000000000 +0200
+++ /mounts/work_src_done/STABLE/zypper/zypper.changes 2007-08-12 22:00:55.000000000 +0200
@@ -1,0 +2,8 @@
+Sun Aug 12 16:27:41 CEST 2007 - jkupec@suse.cz
+
+- user-friendly install summary (FATE #302152) - try also verbose
+ output (-v)
+- r6621
+- 0.8.10
+
+-------------------------------------------------------------------
Old:
----
zypper-0.8.9.diff
zypper-0.8.9.tar.bz2
New:
----
zypper-0.8.10.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ zypper.spec ++++++
--- /var/tmp/diff_new_pack.X28758/_old 2007-08-13 00:20:06.000000000 +0200
+++ /var/tmp/diff_new_pack.X28758/_new 2007-08-13 00:20:06.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package zypper (Version 0.8.9)
+# spec file for package zypper (Version 0.8.10)
#
# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -20,10 +20,9 @@
Autoreqprov: on
PreReq: permissions
Summary: Command Line Package Management Using Libzypp
-Version: 0.8.9
-Release: 3
-Source: zypper-0.8.9.tar.bz2
-Patch0: zypper-0.8.9.diff
+Version: 0.8.10
+Release: 1
+Source: zypper-0.8.10.tar.bz2
Prefix: /usr
URL: http://en.opensuse.org/Zypper
Provides: y2pmsh
@@ -42,7 +41,6 @@
%prep
%setup -q
-%patch0 -p1
%build
mkdir build
@@ -99,6 +97,11 @@
%ghost %config(noreplace) %{_var}/log/zypper.log
%changelog
+* Sun Aug 12 2007 - jkupec@suse.cz
+- user-friendly install summary (FATE #302152) - try also verbose
+ output (-v)
+- r6621
+- 0.8.10
* Fri Aug 10 2007 - dmacvicar@suse.de
- apply persistant locks on establish
- require libzypp 3.14.0
++++++ zypper-0.8.9.tar.bz2 -> zypper-0.8.10.tar.bz2 ++++++
++++ 2555 lines of diff (skipped)
++++ retrying with extended exclude list
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/doc/zypper.8 new/zypper-0.8.10/doc/zypper.8
--- old/zypper-0.8.9/doc/zypper.8 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/doc/zypper.8 2007-08-12 22:00:54.000000000 +0200
@@ -51,7 +51,7 @@
Install resolvables.
Capability is: NAME, or "NAME[OP<EDITION>]", where OP is < <= = >= > and
-EDITION is VERSION[-RELEASE], for example: zypper-0.8.8-2.
+EDITION is VERSION[-RELEASE], for example: zypper=0.8.8-2.
Names are not only package names but any symbols provided by packages:
/bin/vi, libcurl.so.3, perl(Time::ParseDate). Just remember to quote to protect the
@@ -309,7 +309,7 @@
Increase verbosity. For debugging output specify this option twice.
.TP
.I \-q, \-\-quiet
-Suppress normal output. Brief messages will still be printed though. If used together with conflicting --verbose option, the --verbose option takes preference.
+Suppress normal output. Brief (esp. result notification) messages and error messages will still be printed, though. If used together with conflicting --verbose option, the --verbose option takes preference.
.TP
.I \-t, \-\-terse
Terse output for machine consumption.
@@ -320,8 +320,8 @@
.I \-r, \-\-rug\-compatible
Turns on rug compatibility. See compatibility notes next to affected commands.
.TP
-.I \-\-non\-interactive
-Switches to non-interactive mode. In this mode zypper doesn't ask user to type answers to various prompts, but uses default answers automatically.
+.I \-n, \-\-non\-interactive
+Switches to non-interactive mode. In this mode zypper doesn't ask user to type answers to various prompts, but uses default answers automatically. The behaviour of this option is somewhat different than that of options like '--yes', since zypper can answer different answers to different questions. The answers also depend on other options like '--no-gpg-checks'.
.TP
.I \-\-no\-gpg\-checks
Ignore GPG check failures and continue. If a GPG issue occurs when using this option zypper prints and logs a warning and automatically continues without interrupting the operation. Use this option with causion, as you can easily overlook security problems by using it.
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/package/zypper.changes new/zypper-0.8.10/package/zypper.changes
--- old/zypper-0.8.9/package/zypper.changes 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/package/zypper.changes 2007-08-12 22:00:54.000000000 +0200
@@ -1,4 +1,51 @@
-------------------------------------------------------------------
+Sun Aug 12 16:27:41 CEST 2007 - jkupec@suse.cz
+
+- user-friendly install summary (FATE #302152) - try also verbose
+ output (-v)
+- r6621
+- 0.8.10
+
+-------------------------------------------------------------------
+Fri Aug 10 16:22:24 CEST 2007 - dmacvicar@suse.de
+
+- apply persistant locks on establish
+- require libzypp 3.14.0
+
+-------------------------------------------------------------------
+Fri Aug 10 10:25:45 CEST 2007 - jkupec@suse.cz
+
+- improved error reporting of repository operations (#298506)
+- r6564
+
+-------------------------------------------------------------------
+Thu Aug 9 10:25:37 CEST 2007 - jkupec@suse.cz
+
+- Logging of zypper version added.
+- '-n' shorthand added for --non-interactive
+- r6539
+
+-------------------------------------------------------------------
+Wed Aug 8 13:50:22 CEST 2007 - jkupec@suse.cz
+
+- fixed -y option support (did not switch to non-interactive mode)
+- r6521
+
+-------------------------------------------------------------------
+Tue Aug 7 16:26:32 CEST 2007 - tgoettlicher@suse.de
+
+- added status "no-update-repositories" to xml output when no update
+ repos are defined (#fate 300635)
+- r6510
+
+-------------------------------------------------------------------
+Tue Aug 7 16:04:45 CEST 2007 - jkupec@suse.cz
+
+- fixed zypper to complain when given an invalid answer in y/n prompt
+ (#232250) plus made the answer translatable.
+- r6507
+
+-------------------------------------------------------------------
Mon Aug 6 18:17:31 CEST 2007 - jkupec@suse.cz
- changed zypper source-install to take more arguments at once
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/src/CMakeLists.txt new/zypper-0.8.10/src/CMakeLists.txt
--- old/zypper-0.8.9/src/CMakeLists.txt 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/src/CMakeLists.txt 2007-08-12 22:00:54.000000000 +0200
@@ -37,7 +37,7 @@
ADD_EXECUTABLE( zypper ${zypper_SRCS} )
-TARGET_LINK_LIBRARIES( zypper ${ZYPP_LIBRARY} ${READLINE_LIBRARY} )
+TARGET_LINK_LIBRARIES( zypper ${ZYPP_LIBRARY} ${READLINE_LIBRARY} boost_regex )
INSTALL(
TARGETS zypper
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/src/zypper-callbacks.cc new/zypper-0.8.10/src/zypper-callbacks.cc
--- old/zypper-0.8.9/src/zypper-callbacks.cc 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/src/zypper-callbacks.cc 2007-08-12 22:00:54.000000000 +0200
@@ -1,10 +1,13 @@
-#include "AliveCursor.h"
-#include "zypper.h"
-
#include
#include <sstream>
+#include
+
+#include "AliveCursor.h"
+#include "zypper.h"
+
using namespace std;
+using namespace boost;
void display_progress ( const std::string &id, ostream & out, const string& s, int percent) {
static AliveCursor cursor;
@@ -120,7 +123,6 @@
// ----------------------------------------------------------------------------
-// Read an answer (ynYN)
bool read_bool_answer(const string & question, bool default_answer)
{
if (!gSettings.machine_readable)
@@ -138,13 +140,37 @@
istream & stm = cin;
string c = "";
- while (stm.good () && c != "y" && c != "Y" && c != "N" && c != "n")
+ bool been_here_before = false;
+ while (stm.good ()
+ // TranslatorExplanation This is a Lowercase 'y' for "yes" used as an
+ // answer in y/n prompts. Translate to the same letter as you translated
+ // it in the "[y/n]" string!.
+ && c != _("y")
+ // TranslatorExplanation Uppercase 'Y' for "yes" used as an
+ // answer in y/n prompts. Translate to the same letter as you translated
+ // it in the "[y/n]" string!.
+ && c != _("Y")
+ // TranslatorExplanation Lowercase 'n' for "no" used as an
+ // answer in y/n prompts. Translate to the same letter as you translated
+ // it in the "[y/n]" string!.
+ && c != _("n")
+ // TranslatorExplanation Uppercase 'N' for "no" used as an
+ // answer in y/n prompts. Translate to the same letter as you translated
+ // it in the "[y/n]" string!.
+ && c != _("N"))
+ {
+ if (been_here_before)
+ // TranslatorExplanation Example: Invalid answer 'x', enter 'y' or 'n':
+ cerr << format(_("Invalid answer '%s', enter '%s' or '%s':"))
+ % c % _("y") % _("n") << " ";
c = zypp::str::getline (stm, zypp::str::TRIM);
+ been_here_before = true;
+ }
MIL << "answer: " << c << endl;
- if (c == "y" || c == "Y")
+ if (c == _("y") || c == _("Y"))
return true;
- else if (c == "n" || c == "N")
+ else if (c == _("n") || c == _("N"))
return false;
else
{
@@ -162,6 +188,44 @@
return ss.str ();
}
+// ----------------------------------------------------------------------------
+
+void report_zypp_exception(const zypp::Exception & e)
+{
+ if (e.historySize())
+ {
+ if (gSettings.verbosity > 2)
+ {
+ // print the whole history
+ cerr << e.historyAsString();
+ cerr << endl;
+ // this exception
+ cerr << e.asUserString();
+ }
+ else
+ // print the root cause only
+ cerr << *(--e.historyEnd());
+ }
+ else
+ cerr << e.asUserString();
+ cerr << endl;
+}
+
+void report_problem(const zypp::Exception & e,
+ const string & problem_desc,
+ const string & hint)
+{
+ // problem
+ cerr << problem_desc << endl;
+
+ // cause
+ report_zypp_exception(e);
+
+ // hint
+ if (!hint.empty())
+ cerr << hint << endl;
+}
+
// Local Variables:
// c-basic-offset: 2
// End:
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/src/zypper-callbacks.h new/zypper-0.8.10/src/zypper-callbacks.h
--- old/zypper-0.8.9/src/zypper-callbacks.h 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/src/zypper-callbacks.h 2007-08-12 22:00:54.000000000 +0200
@@ -14,6 +14,7 @@
#include <string>
#include
+#include
#include "zypper.h"
@@ -56,15 +57,37 @@
int read_action_ari (int default_action = -1);
/**
- * Prompt for Yes/No answer from stdin.
+ * Prompt for y/n answer (localized) from stdin.
*
* \param question Question to be printed on prompt.
* \param default_answer Value to be returned in non-interactive mode or on
* input failure.
- *
- * \todo make this localized
*/
bool read_bool_answer(const string & question, bool default_answer);
+/**
+ * Returns string representation of a resolvable.
+ */
std::string to_string (zypp::Resolvable::constPtr resolvable);
+
+/**
+ * Prints exception message. If there is exception history available for the
+ * exception, this method prints the root cause or the whole history (if
+ * verbosity level is >2). Otherwise it just prist the e.asUserString() of the
+ * exception passed.
+ */
+void report_zypp_exception(const zypp::Exception & e);
+
+/**
+ * Prints the problem description caused by an exception, its cause and,
+ * optionaly, a hint for the user.
+ *
+ * \param e Exception which caused the problem.
+ * \param Problem description for the user.
+ * \param Hint for the user how to cope with the problem.
+ */
+void report_problem(const zypp::Exception & e,
+ const string & problem_desc,
+ const string & hint = "");
+
#endif
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/src/zypper.cc new/zypper-0.8.10/src/zypper.cc
--- old/zypper-0.8.9/src/zypper.cc 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/src/zypper.cc 2007-08-12 22:00:54.000000000 +0200
@@ -93,7 +93,7 @@
{"terse", no_argument, 0, 't'},
{"table-style", required_argument, 0, 's'},
{"rug-compatible", no_argument, 0, 'r'},
- {"non-interactive", no_argument, 0, 0},
+ {"non-interactive", no_argument, 0, 'n'},
{"no-gpg-checks", no_argument, 0, 0},
{"root", required_argument, 0, 'R'},
{"opt", optional_argument, 0, 'o'},
@@ -114,10 +114,10 @@
"\t--terse, -t\t\tTerse output for machine consumption.\n"
"\t--table-style, -s\tTable style (integer).\n"
"\t--rug-compatible, -r\tTurn on rug compatibility.\n"
- "\t--non-interactive\tDon't ask anything, use default answers automatically.\n"
+ "\t--non-interactive, -n\tDon't ask anything, use default answers automatically.\n"
"\t--no-gpg-checks\t\tIgnore GPG check failures and continue.\n"
"\t--root, -R <dir>\tOperate on a different root directory.\n");
-
+
static string help_commands = _(
" Commands:\n"
"\thelp\t\t\tHelp\n"
@@ -1028,7 +1028,7 @@
// rug compatibility code
// switch on non-interactive mode if no-confirm specified
if (copts.count("no-confirm"))
- gSettings.non_interactive == true;
+ gSettings.non_interactive = true;
// read resolvable type
@@ -1157,7 +1157,9 @@
if (initret != ZYPPER_EXIT_OK)
return initret;
cond_init_target(); // calls ZYpp::initializeTarget("/");
-
+
+ establish();
+
Table t;
t.style(Ascii);
@@ -1304,7 +1306,7 @@
// rug compatibility code
// switch on non-interactive mode if no-confirm specified
if (copts.count("no-confirm"))
- gSettings.non_interactive == true;
+ gSettings.non_interactive = true;
if (copts.count("auto-agree-with-licenses"))
gSettings.license_auto_agree = true;
@@ -1523,6 +1525,8 @@
logfile = ZYPP_CHECKPATCHES_LOG;
zypp::base::LogControl::instance().logfile( logfile );
+ MIL << "Hi, me zypper " VERSION " built " << __DATE__ << " " << __TIME__ << endl;
+
// parse global options and the command
ZypperCommand command = process_globals (argc, argv);
switch(command.toEnum())
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/src/zypper.h new/zypper-0.8.10/src/zypper.h
--- old/zypper-0.8.9/src/zypper.h 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/src/zypper.h 2007-08-12 22:00:54.000000000 +0200
@@ -92,8 +92,7 @@
struct RuntimeData
{
RuntimeData()
- : patches_count(0),
- security_patches_count(0)
+ : patches_count(0), security_patches_count(0), limit_to_verbosity(0)
{}
std::list<Error> errors;
@@ -104,12 +103,37 @@
std::vectorstd::string packages_to_uninstall;
zypp::ResStore repo_resolvables;
zypp::ResStore target_resolvables;
+
+ /**
+ * Limit output to and above specified verbosity level.
+ *
+ * Use this variable to control whether to print the output or not,
+ * wherever the desired verbosity level is variable. Then set the limit
+ * before the code where the output is generated and reset it afterwards:
+ *
+ * <code>
+ *
+ * // set verbosity limit
+ * gData.limit_to_verbosity = VERBOSITY_MEDIUM;
+ *
+ * ... code generating the output but respecting the verbosity limit goes here ...
+ *
+ * // restore verbosity limit
+ * gData.limit_to_verbosity = VERBOSITY_NORMAL;
+ *
+ * </code>
+ */
+ int limit_to_verbosity;
};
extern RuntimeData gData;
extern Settings gSettings;
extern std::ostream no_stream;
+#define VERBOSITY_NORMAL 0
+#define VERBOSITY_MEDIUM 1
+#define VERBOSITY_HIGH 2
+
/**
* Macro to filter output above the current verbosity level.
*
@@ -127,24 +151,28 @@
*/
//!@{
//! normal output
-#define cout_n COND_STREAM(cout, 0)
+#define cout_n COND_STREAM(cout, VERBOSITY_NORMAL)
//! verbose output
-#define cout_v COND_STREAM(cout, 1)
+#define cout_v COND_STREAM(cout, VERBOSITY_MEDIUM)
//! verbose error output
-#define cerr_v COND_STREAM(cerr, 1)
+#define cerr_v COND_STREAM(cerr, VERBOSITY_MEDIUM)
//! debug info output
-#define cout_vv COND_STREAM(cout, 2)
+#define cout_vv COND_STREAM(cout, VERBOSITY_HIGH)
//! debug error output (details)
-#define cerr_vv COND_STREAM(cerr, 2)
+#define cerr_vv COND_STREAM(cerr, VERBOSITY_HIGH)
//!@}
-// undefine _ macro from libzypp
+// undefine _ and _PL macros from libzypp
#ifdef _
#undef _
#endif
+#ifdef _PL
+#undef _PL
+#endif
-// define new _ macro
+// define new macros
#define _(MSG) ::gettext(MSG)
+#define _PL(MSG1,MSG2,N) ::ngettext(MSG1,MSG2,N)
#endif /*ZYPPER_H*/
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/src/zypper-misc.cc new/zypper-0.8.10/src/zypper-misc.cc
--- old/zypper-0.8.9/src/zypper-misc.cc 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/src/zypper-misc.cc 2007-08-12 22:00:54.000000000 +0200
@@ -75,6 +75,35 @@
return empty;
}
+string kind_to_string_localized(const KindOf<Resolvable> & kind, unsigned long count)
+{
+ if (kind == ResTraits<Package>::kind.asString())
+ return _PL("package", "packages", count);
+ if (kind == ResTraits<Selection>::kind.asString())
+ return _PL("selection", "selections", count);
+ if (kind == ResTraits<Pattern>::kind.asString())
+ return _PL("pattern", "patterns", count);
+ if (kind == ResTraits<Product>::kind.asString())
+ return _PL("product", "product", count);
+ if (kind == ResTraits<Patch>::kind.asString())
+ return _PL("patch", "patches", count);
+ if (kind == ResTraits<Script>::kind.asString())
+ return _PL("script", "scripts", count);
+ if (kind == ResTraits<Message>::kind.asString())
+ return _PL("message", "messages", count);
+ if (kind == ResTraits<Language>::kind.asString())
+ return _PL("language", "languages", count);
+ if (kind == ResTraits<Atom>::kind.asString())
+ return _PL("atom", "atoms", count);
+ if (kind == ResTraits<SystemResObject>::kind.asString())
+ return _PL("system", "systems", count);
+ if (kind == ResTraits<SrcPackage>::kind.asString())
+ return _PL("srcpackage", "srcpackages", count);
+ // default
+ return _PL("resolvable", "resolvables", count);
+}
+
+
// copied from yast2-pkg-bindings:PkgModuleFunctions::DoProvideNameKind
bool ProvideProcess::operator()( const PoolItem& provider )
{
@@ -276,8 +305,10 @@
const string &capstr )
{
Capability cap = safe_parse_cap (kind, capstr);
-
+
if (cap != Capability::noCap) {
+ cout_vv << "Capability: " << cap << endl;
+
Resolver_Ptr resolver = zypp::getZYpp()->resolver();
if (install_not_delete) {
cerr_vv << "Adding requirement " << cap << endl;
@@ -373,6 +404,10 @@
if (!no_problem) {
stm << format (_("%s Problems:")) % rproblems.size() << endl;
}
+ else {
+ stm << _("Specified capability not found") << endl;
+ return false;
+ }
for (i = b; i != e; ++i) {
stm << _("Problem: ") << (*i)->description () << endl;
}
@@ -390,6 +425,62 @@
return retry;
}
+typedef mapResObject::constPtr > KindToResObjectSet;
+
+void show_summary_resolvable_list(const string & label,
+ KindToResObjectSet::const_iterator it)
+{
+ cout << endl << label << endl;
+
+ // get terminal width from COLUMNS env. var.
+ unsigned cols = 0, cols_written = 0;
+ const char *cols_s = getenv("COLUMNS");
+ string cols_str("80");
+ if (cols_s != NULL)
+ cols_str = cols_s;
+ str::strtonum (cols_str, cols);
+ if (cols == 0)
+ cols = 77;
+
+#define INDENT " "
+
+ for (setResObject::constPtr::const_iterator resit = it->second.begin();
+ resit != it->second.end(); ++resit)
+ {
+ ResObject::constPtr res(*resit);
+
+ if (gSettings.verbosity == 0)
+ {
+ // watch the terminal widht
+ if (cols_written + res->name().size() + 1 > cols)
+ {
+ cout << endl;
+ cols_written = 0;
+ }
+ if (cols_written = 0)
+ cout << INDENT;
+
+ cols_written += res->name().size();
+ }
+ else
+ cout << INDENT;
+
+ // resolvable name
+ cout << res->name() << (gSettings.verbosity ? "" : " ");
+ // plus edition and architecture for verbose output
+ cout_v << "-" << res->edition() << "." << res->arch();
+ // plus repo providing this package
+ if (res->repository() != Repository::noRepository)
+ cout_v << " (" << res->repository().info().alias() << ")";
+ // new line after each package in the verbose mode
+ cout_v << endl;
+ }
+
+ if (gSettings.verbosity == 0)
+ cout << endl;
+}
+
+
/**
* @return (-1) - nothing to do,
* 0 - there is at least 1 resolvable to be installed/uninstalled,
@@ -400,10 +491,14 @@
{
int retv = -1; // nothing to do;
- if (!gSettings.machine_readable)
- cerr << _("Summary:") << endl;
-
MIL << "Pool contains " << God->pool().size() << " items." << std::endl;
+ DBG << "Install summary:" << endl;
+
+
+ KindToResObjectSet to_be_installed;
+ KindToResObjectSet to_be_removed;
+
+ // collect resolvables to be installed/removed and set the return status
for ( ResPool::const_iterator it = God->pool().begin(); it != God->pool().end(); ++it )
{
ResObject::constPtr res = it->resolvable();
@@ -411,7 +506,8 @@
{
if (retv == -1) retv = 0;
- if (it->resolvable()->kind() == ResTraits<Patch>::kind) {
+ if (it->resolvable()->kind() == ResTraits<Patch>::kind)
+ {
Patch::constPtr patch = asKind<Patch>(it->resolvable());
// set return value to 'reboot needed'
@@ -423,18 +519,155 @@
retv = ZYPPER_EXIT_INF_RESTART_NEEDED;
}
- if (!gSettings.machine_readable)
- {
- if ( it->status().isToBeInstalled() )
- cerr << _("<install> ");
- if ( it->status().isToBeUninstalled() )
- cerr << _("<uninstall> ");
- cerr << *res << endl;
- }
+ if ( it->status().isToBeInstalled() )
+ {
+ DBG << "<install> ";
+ to_be_installed[it->resolvable()->kind()].insert(it->resolvable());
+ }
+ if ( it->status().isToBeUninstalled() )
+ {
+ DBG << "<uninstall> ";
+ to_be_removed[it->resolvable()->kind()].insert(it->resolvable());
+ }
+ DBG << *res << endl;
}
}
+
if (retv == -1)
- cerr << _("Nothing to do.") << endl;
+ {
+ if (gSettings.machine_readable)
+ cout << "" << endl;
+ else
+ cout << _("Nothing to do.") << endl;
+
+ return retv;
+ }
+
+ // no output for machines for now
+ if (gSettings.machine_readable)
+ return retv;
+
+ KindToResObjectSet toinstall;
+ KindToResObjectSet toupgrade;
+ KindToResObjectSet todowngrade;
+ KindToResObjectSet toremove;
+
+ // iterate the to_be_installed to find installs/upgrades/downgrades + size info
+ ByteCount download_size, new_installed_size;
+ for (KindToResObjectSet::const_iterator it = to_be_installed.begin();
+ it != to_be_installed.end(); ++it)
+ {
+ for (setResObject::constPtr::const_iterator resit = it->second.begin();
+ resit != it->second.end(); ++resit)
+ {
+ ResObject::constPtr res(*resit);
+
+ // find in to_be_removed:
+ bool upgrade_downgrade = false;
+ for (setResObject::constPtr::iterator rmit = to_be_removed[res->kind()].begin();
+ rmit != to_be_removed[res->kind()].end(); ++rmit)
+ {
+ if (res->name() == (*rmit)->name())
+ {
+ if (res->edition() > (*rmit)->edition())
+ toupgrade[res->kind()].insert(res);
+ else
+ todowngrade[res->kind()].insert(res);
+
+ new_installed_size += res->size() - (*rmit)->size();
+
+ to_be_removed[res->kind()].erase(*rmit);
+ upgrade_downgrade = true;
+ break;
+ }
+ }
+
+ if (!upgrade_downgrade)
+ {
+ toinstall[res->kind()].insert(res);
+ new_installed_size += res->size();
+ }
+
+ download_size += res->downloadSize();
+ }
+ }
+
+ for (KindToResObjectSet::const_iterator it = to_be_removed.begin();
+ it != to_be_removed.end(); ++it)
+ for (setResObject::constPtr::const_iterator resit = it->second.begin();
+ resit != it->second.end(); ++resit)
+ {
+ toremove[it->first].insert(*resit);
+ new_installed_size -= (*resit)->size();
+ }
+
+ // show summary
+ for (KindToResObjectSet::const_iterator it = toupgrade.begin();
+ it != toupgrade.end(); ++it)
+ {
+ string title = boost::str(format(_PL(
+ "The following %s is going to be upgraded:",
+ "The following %s are going to be upgraded:",
+ it->second.size()
+ )) % kind_to_string_localized(it->first, it->second.size()));
+
+ show_summary_resolvable_list(title, it);
+ }
+
+ for (KindToResObjectSet::const_iterator it = todowngrade.begin();
+ it != todowngrade.end(); ++it)
+ {
+ string title = boost::str(format(_PL(
+ "The following %s is going to be downgraded:",
+ "The following %s are going to be downgraded:",
+ it->second.size()
+ )) % kind_to_string_localized(it->first, it->second.size()));
+
+ show_summary_resolvable_list(title, it);
+ }
+
+ for (KindToResObjectSet::const_iterator it = toinstall.begin();
+ it != toinstall.end(); ++it)
+ {
+ string title = boost::str(format(_PL(
+ "The following NEW %s is going to be installed:",
+ "The following NEW %s are going to be installed:",
+ it->second.size()
+ )) % kind_to_string_localized(it->first, it->second.size()));
+
+ show_summary_resolvable_list(title, it);
+ }
+
+ for (KindToResObjectSet::const_iterator it = toremove.begin();
+ it != toremove.end(); ++it)
+ {
+ string title = boost::str(format(_PL(
+ "The following %s is going to be REMOVED:",
+ "The following %s are going to be REMOVED:",
+ it->second.size()
+ )) % kind_to_string_localized(it->first, it->second.size()));
+
+ show_summary_resolvable_list(title, it);
+ }
+
+ cout << endl;
+
+ cout_n << format(_("Overall download size: %s.")) % download_size;
+ cout_n << " ";
+ if (new_installed_size > 0)
+ // TrasnlatorExplanation %s will be substituted by a byte count e.g. 212 K
+ cout_n << format(_("After the operation, additional %s will be used."))
+ % new_installed_size.asString(0,1,1);
+ else
+ {
+ // get the absolute size
+ ByteCount abs;
+ abs = (-new_installed_size);
+ // TrasnlatorExplanation %s will be substituted by a byte count e.g. 212 K
+ cout_n << format(_("After the operation, %s will be freed."))
+ % abs.asString(0,1,1);
+ }
+ cout_n << endl;
return retv;
}
@@ -496,8 +729,6 @@
if (! it->enabled())
continue; // #217297
- Repository repository;
-
try
{
// if there is no metadata locally
@@ -514,10 +745,8 @@
% repo.alias() << endl;
manager.buildCache(repo);
}
- // TranslatorExplanation speaking of a repository
- //cout_n << format(_("Reading repository %s...")) % repo.alias() << flush;
- repository = manager.createFromCache(repo);
+ Repository repository(manager.createFromCache(repo));
ResStore store = repository.resolvables();
cout_v << " " << format(_("(%d resolvables found)")) % store.size() << endl;
@@ -565,6 +794,8 @@
void establish ()
{
+ int locks = God->applyLocks();
+ cout_v << format(_("%s items locked")) % locks << endl;
cout_v << _("Establishing status of aggregates") << endl;
God->resolver()->establishPool();
dump_pool ();
@@ -705,11 +936,16 @@
}
+ unsigned int patchcount=0;
+
it = pool.byKindBegin<Patch> ();
for (; it != e; ++it )
{
ResObject::constPtr res = it->resolvable();
+
+ patchcount++;
+
if ( it->status().isNeeded())
{
Patch::constPtr patch = asKind<Patch>(res);
@@ -740,6 +976,11 @@
}
}
+ if (patchcount == 0)
+ {
+ cout << "" << endl;
+ }
+
return pkg_mgr_available;
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/src/zypper-rpm-callbacks.h new/zypper-0.8.10/src/zypper-rpm-callbacks.h
--- old/zypper-0.8.9/src/zypper-rpm-callbacks.h 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/src/zypper-rpm-callbacks.h 2007-08-12 22:00:54.000000000 +0200
@@ -174,24 +174,23 @@
struct InstallResolvableReportReceiver : public zypp::callback::ReceiveReportzypp::target::rpm::InstallResolvableReport
{
zypp::Resolvable::constPtr _resolvable;
-
+
void display_step( zypp::Resolvable::constPtr resolvable, int value )
{
// TranslatorExplanation This text is a progress display label e.g. "Installing [42%]"
- stringstream s;
- s << (boost::format(_("Installing: %s-%s"))
+ string s = boost::str(boost::format(_("Installing: %s-%s"))
% resolvable->name() % resolvable->edition());
- display_progress ( "install-resolvable", cout, s.str(), value);
+ display_progress ( "install-resolvable", cout, s, value);
}
virtual void start( zypp::Resolvable::constPtr resolvable )
{
_resolvable = resolvable;
- stringstream s;
- s << (boost::format(_("Installing: %s-%s"))
+ string s =
+ boost::str(boost::format(_("Installing: %s-%s"))
% resolvable->name() % resolvable->edition());
- display_progress ( "install-resolvable", cout, s.str(), 0);
+ display_progress ( "install-resolvable", cout, s, 0);
}
virtual bool progress(int value, zypp::Resolvable::constPtr resolvable)
@@ -219,11 +218,20 @@
virtual void finish( zypp::Resolvable::constPtr /*resolvable*/, Error error, const std::string & reason, RpmLevel level )
{
- display_done ( "install-resolvable", cout);
- if (error != NO_ERROR) {
- cerr << level;
+ if (error != NO_ERROR && level < RPM_NODEPS_FORCE)
+ {
+ DBG << "level < RPM_NODEPS_FORCE: aborting without displaying an error"
+ << endl;
+ return;
+ }
+
+ display_done ("install-resolvable", cout);
+
+ if (error != NO_ERROR)
+ {
+ cerr << level << " ";
+ display_error (error, reason);
}
- display_error (error, reason);
}
};
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/src/zypper-source-callbacks.h new/zypper-0.8.10/src/zypper-source-callbacks.h
--- old/zypper-0.8.9/src/zypper-source-callbacks.h 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/src/zypper-source-callbacks.h 2007-08-12 22:00:54.000000000 +0200
@@ -217,26 +217,30 @@
{
void tick( const zypp::ProgressData &data )
{
- //std::cout << "TICK!" << std::endl;
+ // verbosity filter
+ // don't display anything, if verbosity is not >= than limit_to_verbosity
+ if (gSettings.verbosity < gData.limit_to_verbosity)
+ return;
+
if ( data.reportAlive() )
- {
display_tick (zypp::str::numstring(data.numericId()), cout, data.name() );
- }
else
- {
display_progress ( zypp::str::numstring(data.numericId()), cout, data.name() , data.val() );
- }
-
-
}
virtual void start( const zypp::ProgressData &data )
{
+ if (gSettings.verbosity < gData.limit_to_verbosity)
+ return;
+
tick(data);
}
virtual bool progress( const zypp::ProgressData &data )
{
+ if (gSettings.verbosity < gData.limit_to_verbosity)
+ return true;
+
tick(data);
return true;
}
@@ -250,6 +254,9 @@
virtual void finish( const zypp::ProgressData &data )
{
+ if (gSettings.verbosity < gData.limit_to_verbosity)
+ return;
+
display_done(zypp::str::numstring(data.numericId()), cout, data.name() );
}
};
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/src/zypper-sources.cc new/zypper-0.8.10/src/zypper-sources.cc
--- old/zypper-0.8.9/src/zypper-sources.cc 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/src/zypper-sources.cc 2007-08-12 22:00:54.000000000 +0200
@@ -1,8 +1,3 @@
-
-#include "zypper.h"
-#include "zypper-sources.h"
-#include "zypper-tabulator.h"
-
#include <iostream>
#include <fstream>
#include
@@ -18,6 +13,12 @@
#include
#include
+#include "zypper.h"
+#include "zypper-tabulator.h"
+#include "zypper-callbacks.h"
+//#include "AliveCursor.h"
+#include "zypper-sources.h"
+
using namespace std;
using namespace zypp;
using namespace zypp::repo;
@@ -30,6 +31,102 @@
extern Settings gSettings;
+static bool refresh_raw_metadata(const RepoInfo & repo, bool force_download)
+{
+ try
+ {
+ RepoManager manager;
+ manager.refreshMetadata(repo, force_download ?
+ RepoManager::RefreshForced : RepoManager::RefreshIfNeeded);
+ }
+ catch (const RepoNoUrlException & e)
+ {
+ cerr << format(_("No URLs defined for '%s'.")) % repo.alias() << endl;
+ if (!repo.filepath().empty())
+ cerr << format(
+ _("Please, add one or more base URL (baseurl=URL) entries to %s for repository '%s'."))
+ % repo.filepath() % repo.alias() << endl;
+ ERR << repo.alias() << " is invalid, disabling it" << endl;
+
+ return true; // error
+ }
+ catch (const RepoException & e)
+ {
+ report_problem(e,
+ boost::str(format(_("Repository '%s' is invalid.")) % repo.alias()));
+ ERR << repo.alias() << " is invalid, disabling it" << endl;
+
+ return true; // error
+ }
+ catch (const Exception &e)
+ {
+ ZYPP_CAUGHT(e);
+ report_problem(e,
+ boost::str(format(_("Error downloading metadata for '%s':")) % repo.alias()));
+ // log untranslated message
+ ERR << format("Error reading repository '%s':") % repo.alias() << endl;
+
+ return true; // error
+ }
+
+ return false; // no error
+}
+
+// ---------------------------------------------------------------------------
+/*
+bool build_cache_callback(const ProgressData & pd)
+{
+ static AliveCursor cursor;
+ if ( pd.val() == 100 )
+ cout << CLEARLN << cursor.done() << " " << pd.name();
+ else
+ cout << CLEARLN << cursor++ << " " << pd.name();
+ cout << " [" << pd.val() << "%] :O)";
+ cout << flush;
+ return true;
+}
+*/
+static bool build_cache(const RepoInfo &repo, bool force_build)
+{
+ try
+ {
+ RepoManager manager;
+ manager.buildCache(repo, force_build ?
+ RepoManager::BuildForced : RepoManager::BuildIfNeeded);
+ }
+ catch (const parser::ParseException & e)
+ {
+ ZYPP_CAUGHT(e);
+
+ report_problem(e,
+ boost::str(format(_("Error parsing metadata for '%s':")) % repo.alias()),
+ // TranslatorExplanation Don't translate the URL unless it is translated, too
+ _("This may be caused by invalid metadata in the repository,"
+ " or by a bug in the metadata parser. In the latter case,"
+ " or if in doubt, please, file a bug report by folowing"
+ " instructions at http://en.opensuse.org/Zypper#Troubleshooting"));
+
+ // log untranslated message
+ ERR << format("Error parsing metadata for '%s':") % repo.alias() << endl;
+
+ return true; // error
+ }
+ catch (const Exception &e)
+ {
+ ZYPP_CAUGHT(e);
+ report_problem(e,
+ _("Error building the cache database:"));
+ // log untranslated message
+ ERR << "Error writing to cache db" << endl;
+
+ return true; // error
+ }
+
+ return false; // no error
+}
+
+// ---------------------------------------------------------------------------
+
static int do_init_repos()
{
RepoManager manager;
@@ -78,23 +175,19 @@
// handle root user differently
if (geteuid() == 0)
{
- try { manager.refreshMetadata(repo, RepoManager::RefreshIfNeeded); }
- //! \todo handle the rest of special exceptions
- catch (const RepoException & ex)
+ // limit progress reporting only to verbosity level MEDIUM
+ gData.limit_to_verbosity = VERBOSITY_MEDIUM;
+ if (refresh_raw_metadata(repo, false) || build_cache(repo, false))
{
- cerr << format(_("Repository '%s' is invalid.")) % repo.alias() << endl;
- cerr_v << _("Reason: ") << ex.asUserString() << endl;
- ERR << repo.alias() << " is invalid, disabling it" << endl;
- it->setEnabled(false);
- }
- catch (const Exception & ex)
- {
- cerr << format(_("Error while refreshing repository %s:")) % repo.alias()
- << endl;
- cerr << ex.asUserString() << endl;
- ERR << "Error while refreshing " << repo.alias() << ", disabling it" << endl;
+ cerr << format(_("Disabling repository '%s' because of the above error."))
+ % repo.alias() << endl;
+ ERR << format("Disabling repository '%s' because of the above error.")
+ % repo.alias() << endl;
+
it->setEnabled(false);
}
+ // restore verbosity limit
+ gData.limit_to_verbosity = VERBOSITY_NORMAL;
}
// non-root user
else
@@ -241,8 +334,8 @@
catch ( const Exception &e )
{
ZYPP_CAUGHT(e);
- cerr << _("Error reading repositories:") << endl
- << e.asUserString() << endl;
+ report_problem(e,
+ _("Error reading repositories:"));
return ZYPPER_EXIT_ERR_ZYPP;
}
@@ -309,58 +402,47 @@
continue;
}
+ cout_n << format(_("Refreshing '%s'")) % it->alias() << endl;
+
// do the refresh
- try
+ bool error = false;
+ if (!copts.count("build-only"))
{
- if (!copts.count("build-only"))
- {
- bool force_download =
- copts.count("force") || copts.count("force-download");
-
- cout_n << format(_("Refreshing '%s'")) % it->alias();
- if (force_download)
- cout_n << " " << _("(forced)");
- cout_n << endl;
+ bool force_download =
+ copts.count("force") || copts.count("force-download");
- MIL << "calling refreshMetadata" << (force_download ? ", forced" : "")
- << endl;
+ if (force_download)
+ cout_v << _("Forcing raw metadata refresh");
- manager.refreshMetadata(repo, force_download ?
- RepoManager::RefreshForced : RepoManager::RefreshIfNeeded);
- }
+ MIL << "calling refreshMetadata" << (force_download ? ", forced" : "")
+ << endl;
- if (!copts.count("download-only"))
- {
- bool force_build =
- copts.count("force") || copts.count("force-build");
+ error = refresh_raw_metadata(repo, force_download);
+ }
- cout_v << _("Creating repository cache");
- if (force_build)
- cout_v << " " << _("(forced)");
- cout_v << endl;
+ if (!(error || copts.count("download-only")))
+ {
+ bool force_build =
+ copts.count("force") || copts.count("force-build");
- MIL << "calling buildCache" << (force_build ? ", forced" : "") << endl;
+ cout_v << _("Creating repository cache");
+ if (force_build)
+ cout_v << " " << _("(forced)");
+ cout_v << endl;
- manager.buildCache(repo, force_build ?
- RepoManager::BuildForced : RepoManager::BuildIfNeeded);
- }
+ MIL << "calling buildCache" << (force_build ? ", forced" : "") << endl;
- //cout_n << _("DONE") << endl << endl;
+ error = build_cache(repo, force_build);
}
- catch ( const Exception &e )
+
+ if (error)
{
- cerr << format(_("Error reading repository '%s':")) % repo.alias()
- << endl << e.asUserString() << endl;
cerr << format(_("Skipping repository '%s' because of the above error."))
- % repo.alias() << endl;
- // log untranslated message
- ERR << format("Error reading repository '%s':") % repo.alias()
- << endl << e.msg() << endl;
+ % repo.alias() << endl;
ERR << format("Skipping repository '%s' because of the above error.")
- % repo.alias() << endl;
+ % repo.alias() << endl;
error_count++;
}
-
}
// the rest of arguments are those not found, complain to the user
@@ -432,42 +514,42 @@
{
manager.addRepository(repo);
}
- catch (const MediaException & e)
- {
- cerr << _("Problem transfering repository data from specified URL.") << endl;
- ERR << "Problem transfering repository data from specified URL." << endl;
- return ZYPPER_EXIT_ERR_ZYPP;
- }
- catch (const ParseException & e)
- {
- cerr << _("Problem parsing repository data.") << endl;
- ERR << "Problem parsing repository data." << endl;
- return ZYPPER_EXIT_ERR_ZYPP;
- }
catch (const RepoAlreadyExistsException & e)
{
- cerr << format("Repository named '%s' already exists.") % repo.alias() << endl;
+ ZYPP_CAUGHT(e);
+ cerr << format(_("Repository named '%s' already exists. Please, use another alias."))
+ % repo.alias() << endl;
ERR << "Repository named '%s' already exists." << endl;
return ZYPPER_EXIT_ERR_ZYPP;
}
catch (const RepoUnknownTypeException & e)
{
- cerr << format(_("Can't find a valid repository at given location")) << endl;
- ERR << "Problem parsing repository data." << endl;
+ ZYPP_CAUGHT(e);
+ cerr << _("Can't find a valid repository at given location:") << endl;
+ cerr << _("Could not determine the type of the repository."
+ " Please, check if the defined URLs (see below) point to a valid repository:");
+ for(RepoInfo::urls_const_iterator uit = repo.baseUrlsBegin();
+ uit != repo.baseUrlsEnd(); ++uit)
+ cerr << (*uit) << endl;
return ZYPPER_EXIT_ERR_ZYPP;
}
catch (const RepoException & e)
{
- cerr << e.msg() << endl;
+ ZYPP_CAUGHT(e);
+ report_problem(e,
+ _("Problem transfering repository data from specified URL:"),
+ _("Please, check whether the specified URL is accessible."));
+ ERR << "Problem transfering repository data from specified URL" << endl;
return ZYPPER_EXIT_ERR_ZYPP;
}
catch (const Exception & e)
{
ZYPP_CAUGHT(e);
- cerr << e.asUserString() << endl;
+ report_problem(e, _("Unknown problem when adding repository:"));
return ZYPPER_EXIT_ERR_BUG;
}
+ //! \todo different output for -r and for zypper.
cout_n << format(_("Repository '%s' successfully added:")) % repo.alias() << endl;
cout_n << ( repo.enabled() ? "[x]" : "[ ]" );
cout_n << ( repo.autorefresh() ? "* " : " " );
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/VERSION.cmake new/zypper-0.8.10/VERSION.cmake
--- old/zypper-0.8.9/VERSION.cmake 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/VERSION.cmake 2007-08-12 22:00:54.000000000 +0200
@@ -20,4 +20,4 @@
SET(VERSION_MAJOR "0")
SET(VERSION_MINOR "8")
-SET(VERSION_PATCH "9")
+SET(VERSION_PATCH "10")
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/zypper-0.8.9/zypper.spec.cmake new/zypper-0.8.10/zypper.spec.cmake
--- old/zypper-0.8.9/zypper.spec.cmake 2007-08-06 18:19:39.000000000 +0200
+++ new/zypper-0.8.10/zypper.spec.cmake 2007-08-12 22:00:54.000000000 +0200
@@ -11,7 +11,7 @@
# norootforbuild
Name: @PACKAGE@
-BuildRequires: libzypp-devel >= 3.13.13 boost-devel >= 1.33.1 gettext-devel >= 0.15 readline-devel >= 5.1
+BuildRequires: libzypp-devel >= 3.14.0 boost-devel >= 1.33.1 gettext-devel >= 0.15 readline-devel >= 5.1
BuildRequires: gcc-c++ >= 4.2 cmake >= 2.4.6 pkg-config >= 0.20
Requires: procps
License: GPL
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org