Author: mlandres
Date: Tue Mar 4 12:59:55 2008
New Revision: 8999
URL: http://svn.opensuse.org/viewcvs/zypp?rev=8999&view=rev
Log:
Save and restore requested locales on target load/commit
Added:
trunk/libzypp/zypp/target/RequestedLocalesFile.cc
trunk/libzypp/zypp/target/RequestedLocalesFile.h
Modified:
trunk/libzypp/devel/devel.ma/NewPool.cc
trunk/libzypp/package/libzypp.changes
trunk/libzypp/zypp/CMakeLists.txt
trunk/libzypp/zypp/Target.cc
trunk/libzypp/zypp/Target.h
trunk/libzypp/zypp/target/TargetImpl.cc
trunk/libzypp/zypp/target/TargetImpl.h
Modified: trunk/libzypp/devel/devel.ma/NewPool.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/devel/devel.ma/NewPool.cc?rev=8999&r1=8998&r2=8999&view=diff
==============================================================================
--- trunk/libzypp/devel/devel.ma/NewPool.cc (original)
+++ trunk/libzypp/devel/devel.ma/NewPool.cc Tue Mar 4 12:59:55 2008
@@ -6,6 +6,7 @@
#include
#include
#include
+#include
#include
#include
@@ -19,11 +20,13 @@
#include "zypp/ResObjects.h"
#include "zypp/Digest.h"
#include "zypp/PackageKeyword.h"
+#include "zypp/TmpPath.h"
#include "zypp/ManagedFile.h"
#include "zypp/NameKindProxy.h"
#include "zypp/pool/GetResolvablesToInsDel.h"
#include "zypp/RepoManager.h"
+#include "zypp/Repository.h"
#include "zypp/RepoInfo.h"
#include "zypp/repo/PackageProvider.h"
@@ -32,10 +35,7 @@
#include "zypp/ResPoolProxy.h"
#include "zypp/sat/Pool.h"
-#include "zypp/sat/Repo.h"
-#include "zypp/sat/Solvable.h"
-#include "zypp/sat/detail/PoolMember.h"
-#include "zypp/sat/detail/PoolImpl.h"
+//#include "zypp/sat/detail/PoolImpl.h"
#include
@@ -418,14 +418,12 @@
///////////////////////////////////////////////////////////////////
namespace zypp
{ /////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////
-namespace sat
-{ /////////////////////////////////////////////////////////////////
+ class RequestedLocalesFile
+ {
+ };
- /////////////////////////////////////////////////////////////////
-} // namespace sat
-///////////////////////////////////////////////////////////////////
+ /** \relates RequestedLocalesFile Stream output */
/////////////////////////////////////////////////////////////////
} // namespace zypp
///////////////////////////////////////////////////////////////////
@@ -452,47 +450,67 @@
ResPool pool( ResPool::instance() );
USR << "pool: " << pool << endl;
- RepoManager repoManager( makeRepoManager( sysRoot ) );
- RepoInfoList repos = repoManager.knownRepositories();
-
- // launch repos
- for ( RepoInfoList::iterator it = repos.begin(); it != repos.end(); ++it )
+ if ( 1 )
{
- RepoInfo & nrepo( *it );
- SEC << nrepo << endl;
-
- if ( ! nrepo.enabled() )
- continue;
+ RepoManager repoManager( makeRepoManager( sysRoot ) );
+ RepoInfoList repos = repoManager.knownRepositories();
- if ( ! repoManager.isCached( nrepo ) || /*force*/false )
+ // launch repos
+ for ( RepoInfoList::iterator it = repos.begin(); it != repos.end(); ++it )
{
- if ( repoManager.isCached( nrepo ) )
+ RepoInfo & nrepo( *it );
+ SEC << nrepo << endl;
+
+ if ( ! nrepo.enabled() )
+ continue;
+
+ if ( ! repoManager.isCached( nrepo ) || /*force*/false )
{
- SEC << "cleanCache" << endl;
- repoManager.cleanCache( nrepo );
+ if ( repoManager.isCached( nrepo ) )
+ {
+ SEC << "cleanCache" << endl;
+ repoManager.cleanCache( nrepo );
+ }
+ SEC << "refreshMetadata" << endl;
+ repoManager.refreshMetadata( nrepo, RepoManager::RefreshForced );
+ SEC << "buildCache" << endl;
+ repoManager.buildCache( nrepo );
}
- SEC << "refreshMetadata" << endl;
- repoManager.refreshMetadata( nrepo, RepoManager::RefreshForced );
- SEC << "buildCache" << endl;
- repoManager.buildCache( nrepo );
}
- }
- // create from cache:
- {
- Measure x( "CREATE FROM CACHE" );
- for ( RepoInfoList::iterator it = repos.begin(); it != repos.end(); ++it )
+ // create from cache:
{
- RepoInfo & nrepo( *it );
- if ( ! nrepo.enabled() )
- continue;
+ Measure x( "CREATE FROM CACHE" );
+ for ( RepoInfoList::iterator it = repos.begin(); it != repos.end(); ++it )
+ {
+ RepoInfo & nrepo( *it );
+ if ( ! nrepo.enabled() )
+ continue;
- Measure x( "CREATE FROM CACHE "+nrepo.alias() );
- repoManager.loadFromCache( nrepo );
- USR << "pool: " << pool << endl;
+ Measure x( "CREATE FROM CACHE "+nrepo.alias() );
+ try
+ {
+ repoManager.loadFromCache( nrepo );
+ }
+ catch ( const Exception & exp )
+ {
+ MIL << "Try to rebuild cache..." << endl;
+ SEC << "cleanCache" << endl;
+ repoManager.cleanCache( nrepo );
+ SEC << "buildCache" << endl;
+ repoManager.buildCache( nrepo );
+ SEC << "Create from cache" << endl;
+ repoManager.loadFromCache( nrepo );
+ }
+
+ USR << "pool: " << pool << endl;
+ }
}
}
+ satpool.addRequestedLocale( Locale("de_DE") );
+ satpool.addRequestedLocale( Locale("pt_BR") );
+
if ( 1 )
{
Measure x( "INIT TARGET" );
@@ -506,39 +524,8 @@
///////////////////////////////////////////////////////////////////
- function _sel( bind( boost::mem_fun_ref( &sat::Solvable::isSystem ), _1 ) );
- for_( it,
- satpool.filterBegin( _sel ),
- satpool.filterEnd ( _sel ) )
- {
- INT << *it << endl;
- }
-
- satpool.addRequestedLocale( Locale("de") );
- satpool.addRequestedLocale( Locale("cs") );
-
- LocaleSet s;
- s.insert( Locale("de") );
-
-// MIL << satpool.getAvailableLocales() << endl;
-
- {
- Measure x( "de" );
- filter::ByLocaleSupport f( Locale("de") );
- for_( it, satpool.filterBegin(f), satpool.filterEnd(f) )
- {
- MIL << *it << endl;
- }
- }
-
-
-
-
-
-
-
- //MIL << sat::WhatProvides( Capability("amarok") ) << endl;
- //MIL << sat::WhatProvides( Capability("amarok == 1.4.7-37.4") ) << endl;
+ MIL << "pool: " << pool.getRequestedLocales() << endl;
+ install();
if ( 0 )
{
@@ -571,6 +558,11 @@
zypp::base::LogControl::instance().logNothing();
return 0;
}
+catch ( const Exception & exp )
+{
+ INT << exp << endl << exp.historyAsString();
+}
catch (...)
{}
+
Modified: trunk/libzypp/package/libzypp.changes
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/package/libzypp.changes?rev=8999&r1=8998&r2=8999&view=diff
==============================================================================
--- trunk/libzypp/package/libzypp.changes (original)
+++ trunk/libzypp/package/libzypp.changes Tue Mar 4 12:59:55 2008
@@ -1,4 +1,10 @@
-------------------------------------------------------------------
+Tue Mar 4 12:57:58 CET 2008 - ma@suse.de
+
+- Save and restore requested locales on target load/commit.
+- revision 8999
+
+-------------------------------------------------------------------
Mon Mar 3 17:10:26 CET 2008 - schubi@suse.de
- (Update) Prevent reinstallation of installed packages.
Modified: trunk/libzypp/zypp/CMakeLists.txt
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/CMakeLists.txt?rev=8999&r1=8998&r2=8999&view=diff
==============================================================================
--- trunk/libzypp/zypp/CMakeLists.txt (original)
+++ trunk/libzypp/zypp/CMakeLists.txt Tue Mar 4 12:59:55 2008
@@ -547,6 +547,7 @@
SET( zypp_target_SRCS
+ target/RequestedLocalesFile.cc
target/CommitLog.cc
target/CommitPackageCache.cc
target/CommitPackageCacheImpl.cc
@@ -557,6 +558,7 @@
)
SET( zypp_target_HEADERS
+ target/RequestedLocalesFile.h
target/CommitLog.h
target/CommitPackageCache.h
target/CommitPackageCacheImpl.h
Modified: trunk/libzypp/zypp/Target.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/Target.cc?rev=8999&r1=8998&r2=8999&view=diff
==============================================================================
--- trunk/libzypp/zypp/Target.cc (original)
+++ trunk/libzypp/zypp/Target.cc Tue Mar 4 12:59:55 2008
@@ -91,9 +91,6 @@
Date Target::timestamp() const
{ return _pimpl->timestamp(); }
- void Target::reset()
- { return _pimpl->reset(); }
-
/////////////////////////////////////////////////////////////////
} // namespace zypp
///////////////////////////////////////////////////////////////////
Modified: trunk/libzypp/zypp/Target.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/Target.h?rev=8999&r1=8998&r2=8999&view=diff
==============================================================================
--- trunk/libzypp/zypp/Target.h (original)
+++ trunk/libzypp/zypp/Target.h Tue Mar 4 12:59:55 2008
@@ -64,14 +64,9 @@
*/
void load();
- /**
- * reload the target in future calls if
- * needed.
- * note the loading can actually be delayed, but
- * the next call to resolvables must reflect the
- * status of the system.
+ /** \deprecated NOOP
*/
- void reset();
+ ZYPP_DEPRECATED void reset() {}
/** Null implementation */
static Target_Ptr nullimpl();
@@ -96,6 +91,7 @@
/** return the last modification date of the target */
Date timestamp() const;
+
public:
/** Ctor */
explicit
Added: trunk/libzypp/zypp/target/RequestedLocalesFile.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/target/RequestedLocalesFile.cc?rev=8999&view=auto
==============================================================================
--- trunk/libzypp/zypp/target/RequestedLocalesFile.cc (added)
+++ trunk/libzypp/zypp/target/RequestedLocalesFile.cc Tue Mar 4 12:59:55 2008
@@ -0,0 +1,92 @@
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/target/RequestedLocalesFile.cc
+ *
+*/
+#include <iostream>
+#include <fstream>
+
+#include "zypp/base/LogTools.h"
+#include "zypp/base/IOStream.h"
+#include "zypp/base/String.h"
+
+#include "zypp/PathInfo.h"
+#include "zypp/TmpPath.h"
+#include "zypp/Date.h"
+
+#include "zypp/target/RequestedLocalesFile.h"
+
+using std::endl;
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace target
+ { /////////////////////////////////////////////////////////////////
+
+ void RequestedLocalesFile::load( const Pathname & file_r, LocaleSet & locales_r )
+ {
+ PathInfo pi( file_r );
+ if ( ! pi.isFile() )
+ {
+ WAR << "Can't read " << pi << endl;
+ return;
+ }
+ std::ifstream infile( file_r.c_str() );
+ for( iostr::EachLine in( infile ); in; in.next() )
+ {
+ std::string l( str::trim(*in) );
+ if ( ! l.empty() && l[0] != '#' )
+ {
+ locales_r.insert( Locale(l) );
+ }
+ }
+ }
+
+ void RequestedLocalesFile::store( const Pathname & file_r, const LocaleSet & locales_r )
+ {
+ filesystem::TmpFile tmp( filesystem::TmpFile::makeSibling( file_r ) );
+
+ std::ofstream outs( tmp.path().c_str() );
+ outs << "# zypp::RequestedLocales generated " << Date::now() << endl;
+ dumpRange( outs, locales_r.begin(), locales_r.end(), "#", "\n", "\n", "\n", "#\n" );
+ outs.close();
+
+ if ( outs.good() )
+ {
+ filesystem::rename( tmp.path(), file_r );
+ }
+ else
+ {
+ ERR << "Can't write " << PathInfo(tmp.path()) << endl;
+ }
+ }
+
+ /******************************************************************
+ **
+ ** FUNCTION NAME : operator<<
+ ** FUNCTION TYPE : std::ostream &
+ */
+ std::ostream & operator<<( std::ostream & str, const RequestedLocalesFile & obj )
+ {
+ str << obj.file() << ' ';
+ if ( obj._localesPtr )
+ str << obj.locales();
+ else
+ str << "(unloaded)";
+ return str;
+ }
+
+ /////////////////////////////////////////////////////////////////
+ } // namespace target
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
Added: trunk/libzypp/zypp/target/RequestedLocalesFile.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/target/RequestedLocalesFile.h?rev=8999&view=auto
==============================================================================
--- trunk/libzypp/zypp/target/RequestedLocalesFile.h (added)
+++ trunk/libzypp/zypp/target/RequestedLocalesFile.h Tue Mar 4 12:59:55 2008
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/target/RequestedLocalesFile.h
+ *
+*/
+#ifndef ZYPP_TARGET_REQUESTEDLOCALESFILE_H
+#define ZYPP_TARGET_REQUESTEDLOCALESFILE_H
+
+#include <iosfwd>
+
+#include "zypp/base/PtrTypes.h"
+
+#include "zypp/Pathname.h"
+#include "zypp/Locale.h"
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace target
+ { /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : RequestedLocalesFile
+ //
+ /** Save and restore locale set from file.
+ */
+ class RequestedLocalesFile
+ {
+ friend std::ostream & operator<<( std::ostream & str, const RequestedLocalesFile & obj );
+
+ public:
+ /** Ctor taking the file to read/write. */
+ RequestedLocalesFile( const Pathname & file_r )
+ : _file( file_r )
+ {}
+
+ /** Return the file path. */
+ const Pathname & file() const
+ { return _file; }
+
+ /** Return the loacale set.
+ * The file is read once on demand. returns an empty set if
+ * the file does not exist or is not readable.
+ */
+ const LocaleSet & locales() const
+ {
+ if ( !_localesPtr )
+ {
+ _localesPtr.reset( new LocaleSet );
+ LocaleSet & ls( *_localesPtr );
+ load( _file, ls );
+ }
+ return *_localesPtr;
+ }
+
+ /** Store a new locale set.
+ * Write the new localeset to file, unless we know it
+ * did not change. The directory containing file must exist.
+ */
+ void setLocales( const LocaleSet & locales_r )
+ {
+ if ( !_localesPtr || differs( *_localesPtr, locales_r ) )
+ {
+ store( _file, locales_r );
+ *_localesPtr = locales_r;
+ }
+ }
+
+ private:
+ /** Helper testing whether two \ref LocaleSet differ. */
+ bool differs( const LocaleSet & lhs, const LocaleSet & rhs ) const
+ {
+ if ( lhs.size() != rhs.size() )
+ return true;
+ for_( it, lhs.begin(), lhs.end() )
+ {
+ if ( rhs.find( *it ) == rhs.end() )
+ return true;
+ }
+ return false;
+ }
+ /** Read \ref LocaleSet from \c file_r. */
+ static void load( const Pathname & file_r, LocaleSet & locales_r );
+ /** Write \ref LocaleSet to \c file_r. */
+ static void store( const Pathname & file_r, const LocaleSet & locales_r );
+
+ private:
+ Pathname _file;
+ mutable scoped_ptr<LocaleSet> _localesPtr;
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ /** \relates RequestedLocalesFile Stream output */
+ std::ostream & operator<<( std::ostream & str, const RequestedLocalesFile & obj );
+
+ /////////////////////////////////////////////////////////////////
+ } // namespace target
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_TARGET_REQUESTEDLOCALESFILE_H
Modified: trunk/libzypp/zypp/target/TargetImpl.cc
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/target/TargetImpl.cc?rev=8999&r1=8998&r2=8999&view=diff
==============================================================================
--- trunk/libzypp/zypp/target/TargetImpl.cc (original)
+++ trunk/libzypp/zypp/target/TargetImpl.cc Tue Mar 4 12:59:55 2008
@@ -113,20 +113,13 @@
}
int exitCode = prog.close();
- /* FIXME
if ( exitCode != 0 )
{
- storage_r.setObjectFlag( script_r, "SCRIPT_EXEC_FAILED" );
std::ostringstream err;
err << "Script failed with exit code " << exitCode;
report->problem( err.str() );
ZYPP_THROW(Exception(err.str()));
}
- else if ( storage_r.doesObjectHasFlag( script_r, "SCRIPT_EXEC_FAILED" ) )
- {
- storage_r.removeObjectFlag( script_r, "SCRIPT_EXEC_FAILED" );
- }
- */
report->finish();
return;
}
@@ -276,6 +269,7 @@
//
TargetImpl::TargetImpl(const Pathname & root_r)
: _root(root_r)
+ , _requestedLocalesFile( home() / "RequestedLocales" )
{
_rpm.initDatabase(root_r);
MIL << "Initialized target on " << _root << endl;
@@ -379,27 +373,28 @@
void TargetImpl::load()
{
- Pathname base = Pathname::assertprefix( _root, ZConfig::instance().repoCachePath() + sat::Pool::instance().systemRepoName() );
- Pathname rpmsolv = base.extend(".solv");
-
buildCache();
- //now add the repos to the pool
- MIL << "adding " << rpmsolv << " to pool(" << sat::Pool::instance().systemRepoName() << ")";
- Repository system = sat::Pool::instance().systemRepo();
+ // now add the repos to the pool
+ sat::Pool satpool( sat::Pool::instance() );
+ Repository system( satpool.systemRepo() );
+ Pathname rpmsolv( Pathname::assertprefix( _root, ZConfig::instance().repoCachePath() + system.name() ).extend(".solv") );
+ MIL << "adding " << rpmsolv << " to pool(" << system.name() << ")";
+#warning PROBABLY CLEAR NONEMTY SYSTEM REPO
system.addSolv(rpmsolv);
- MIL << "Target loaded: " << system.solvablesSize() << " resolvables" << endl;
- }
-
- Pathname TargetImpl::root() const
- {
- return _root;
- }
+ // (Re)Load the requested locales.
+ // If the requested locales are empty, we leave the pool untouched
+ // to avoid undoing changes the application applied. We expect this
+ // to happen on a bare metal installation only. An already existing
+ // target should be loaded before its settings are changed.
+ const LocaleSet & requestedLocales( _requestedLocalesFile.locales() );
+ if ( ! requestedLocales.empty() )
+ {
+ satpool.setRequestedLocales( requestedLocales );
+ }
- void TargetImpl::reset()
- {
- // FIXME remove
+ MIL << "Target loaded: " << system.solvablesSize() << " resolvables" << endl;
}
ZYppCommitResult TargetImpl::commit( ResPool pool_r, const ZYppCommitPolicy & policy_rX )
@@ -413,6 +408,12 @@
// ----------------------------------------------------------------- //
MIL << "TargetImpl::commit(<pool>, " << policy_r << ")" << endl;
+
+ // Store non-package data:
+ filesystem::assert_dir( home() );
+ _requestedLocalesFile.setLocales( pool_r.getRequestedLocales() );
+
+ // Process packages:
ZYppCommitResult result;
TargetImpl::PoolItemList to_uninstall;
@@ -486,6 +487,8 @@
result._srcremaining.insert(result._srcremaining.end(), bad.begin(), bad.end());
}
+ // Try to rebuild solv file while rpm database is still in cache.
+ buildCache();
result._result = (to_install.size() - result._remaining.size());
MIL << "TargetImpl::commit(<pool>, " << policy_r << ") returns: " << result << endl;
@@ -715,8 +718,6 @@
if ( abort )
ZYPP_THROW( TargetAbortedException( N_("Installation has been aborted as directed.") ) );
- buildCache();
-
return remaining;
}
@@ -739,33 +740,7 @@
Date TargetImpl::timestamp() const
{
- Date ts_rpm;
- Date ts_store;
-
- ts_rpm = _rpm.timestamp();
-
- PathInfo store_info = PathInfo( _root + Pathname(ZYPP_DB) + "_store.solv" );
- if (store_info.isExist() )
- ts_store = Date(store_info.mtime());
- else
- ts_store = Date::now();
-
- if ( ts_rpm > ts_store )
- {
- return ts_rpm;
- }
- else if (ts_rpm < ts_store)
- {
- return ts_store;
- }
- else
- {
- // they are the same
- if ( ts_rpm != 0 )
- return ts_rpm;
- else
- return Date::now();
- }
+ return _rpm.timestamp();
}
void TargetImpl::installSrcPackage( const SrcPackage_constPtr & srcPackage_r )
Modified: trunk/libzypp/zypp/target/TargetImpl.h
URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/target/TargetImpl.h?rev=8999&r1=8998&r2=8999&view=diff
==============================================================================
--- trunk/libzypp/zypp/target/TargetImpl.h (original)
+++ trunk/libzypp/zypp/target/TargetImpl.h Tue Mar 4 12:59:55 2008
@@ -28,6 +28,7 @@
#include "zypp/Target.h"
#include "zypp/target/rpm/RpmDb.h"
#include "zypp/target/TargetException.h"
+#include "zypp/target/RequestedLocalesFile.h"
///////////////////////////////////////////////////////////////////
namespace zypp
@@ -70,11 +71,16 @@
void load();
void buildCache();
-
+
public:
/** The root set for this target */
- Pathname root() const;
+ Pathname root() const
+ { return _root; }
+
+ /** The directory to store things. */
+ Pathname home() const
+ { return _root / "/var/lib/zypp"; }
/** Commit changes in the pool */
ZYppCommitResult commit( ResPool pool_r, const ZYppCommitPolicy & policy_r );
@@ -127,20 +133,13 @@
/** return the last modification date of the target */
Date timestamp() const;
- /**
- * reload the target in future calls if
- * needed.
- * note the loading can actually be delayed, but
- * the next call to resolvables must reflect the
- * status of the system.
- */
- void reset();
-
protected:
/** Path to the target */
Pathname _root;
/** RPM database */
rpm::RpmDb _rpm;
+ /** Requested Locales database */
+ RequestedLocalesFile _requestedLocalesFile;
private:
/** Null implementation */
static TargetImpl_Ptr _nullimpl;
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org