Imported Upstream version 17.28.0 upstream/17.28.0
authorJinWang An <jinwang.an@samsung.com>
Mon, 27 Dec 2021 00:31:38 +0000 (09:31 +0900)
committerJinWang An <jinwang.an@samsung.com>
Mon, 27 Dec 2021 00:31:38 +0000 (09:31 +0900)
444 files changed:
.gitignore
.obs/workflows.yml [new file with mode: 0644]
CMakeLists.txt
VERSION.cmake
cmake/modules/FindRpm.cmake
cmake/modules/ZyppCommon.cmake
cmake/modules/printrpmver.c.in [new file with mode: 0644]
doc/autodoc/CMakeLists.txt
doc/autodoc/Doxyfile.cmake
doc/autoinclude/EnvironmentVariables.doc
libzypp.spec.cmake
package/libzypp.changes
po/CMakeLists.txt
po/af.po
po/ar.po
po/be.po
po/bg.po
po/bn.po
po/bs.po
po/ca.po
po/cs.po
po/cy.po
po/da.po
po/de.po
po/el.po
po/en_GB.po
po/es.po
po/et.po
po/fa.po
po/fi.po
po/fr.po
po/gl.po
po/gu.po
po/he.po
po/hi.po
po/hr.po
po/hu.po
po/id.po
po/it.po
po/ja.po
po/ka.po
po/km.po
po/ko.po
po/ku.po
po/lt.po
po/mk.po
po/mr.po
po/nb.po
po/nl.po
po/nn.po
po/pa.po
po/pl.po
po/pt.po
po/pt_BR.po
po/ro.po
po/ru.po
po/si.po
po/sk.po
po/sl.po
po/sr.po
po/sv.po
po/ta.po
po/th.po
po/tr.po
po/uk.po
po/vi.po
po/wa.po
po/xh.po
po/zh_CN.po
po/zh_TW.po
po/zu.po
po/zypp.pot
tests/lib/CMakeLists.txt
tests/lib/TestSetup.h
tests/lib/TestTools.h [new file with mode: 0644]
tests/lib/WebServer.cc
tests/media/MetaLinkParser_test.cc
tests/media/data/other.xml.gz.meta4 [new file with mode: 0644]
tests/zypp/MediaSetAccess_test.cc
tests/zypp/PurgeKernels_test.cc
tests/zypp/RpmPkgSigCheck_test.cc
tests/zypp/base/ExternalProgram_test.cc
tests/zypp/base/data/ExternalProgram/echo.sh [new file with mode: 0755]
tests/zypp/data/PurgeKernels/rckrnl/@System.repo [new file with mode: 0644]
tests/zypp/data/PurgeKernels/rckrnl/zypp-control.yaml [new file with mode: 0644]
tests/zyppng/CMakeLists.txt
tests/zyppng/EventLoop_test.cc
tests/zyppng/IOBuffer_test.cc [new file with mode: 0644]
tests/zyppng/data/downloader/primary-deltatemplate.xml.zck [new file with mode: 0644]
tests/zyppng/data/downloader/primary.xml.zck [new file with mode: 0644]
tests/zyppng/data/downloader/primary.xml.zck.meta [new file with mode: 0644]
tests/zyppng/data/process/echo.sh [new file with mode: 0755]
tests/zyppng/io/AsyncDataSource_test.cc [new file with mode: 0644]
tests/zyppng/io/CMakeLists.txt [new file with mode: 0644]
tests/zyppng/io/Process_test.cc [new file with mode: 0644]
tests/zyppng/io/UnixSocket_test.cc [new file with mode: 0644]
tests/zyppng/media/EvDownloader_test.cc
tests/zyppng/media/NetworkRequestDispatcher_test.cc
tools/CMakeLists.txt
tools/zypp-NameReqPrv.cc
tools/zypp-rpm/BinHeader.cc [new file with mode: 0644]
tools/zypp-rpm/BinHeader.h [new file with mode: 0644]
tools/zypp-rpm/CMakeLists.txt [new file with mode: 0644]
tools/zypp-rpm/errorcodes.h [new file with mode: 0644]
tools/zypp-rpm/main.cc [new file with mode: 0644]
zypp-core/AutoDispose.h [new file with mode: 0644]
zypp-core/ByteArray.h [new file with mode: 0644]
zypp-core/ByteCount.cc [moved from zypp/ByteCount.cc with 99% similarity]
zypp-core/ByteCount.h [new file with mode: 0644]
zypp-core/CMakeLists.txt [new file with mode: 0644]
zypp-core/CheckSum.cc [new file with mode: 0644]
zypp-core/CheckSum.h [new file with mode: 0644]
zypp-core/Date.cc [moved from zypp/Date.cc with 98% similarity]
zypp-core/Date.h [new file with mode: 0644]
zypp-core/Digest.cc [new file with mode: 0644]
zypp-core/Digest.h [new file with mode: 0644]
zypp-core/ExternalProgram.cc [moved from zypp/ExternalProgram.cc with 50% similarity]
zypp-core/ExternalProgram.h [new file with mode: 0644]
zypp-core/Globals.h [new file with mode: 0644]
zypp-core/ManagedFile.h [new file with mode: 0644]
zypp-core/Pathname.cc [moved from zypp/Pathname.cc with 98% similarity]
zypp-core/Pathname.h [new file with mode: 0644]
zypp-core/TriBool.h [new file with mode: 0644]
zypp-core/Url.cc [moved from zypp/Url.cc with 99% similarity]
zypp-core/Url.h [new file with mode: 0644]
zypp-core/base/CleanerThread.cc [moved from zypp/base/CleanerThread.cc with 85% similarity]
zypp-core/base/CleanerThread_p.h [moved from zypp/base/CleanerThread_p.h with 96% similarity]
zypp-core/base/Easy.h [new file with mode: 0644]
zypp-core/base/EnumClass.h [new file with mode: 0644]
zypp-core/base/Errno.h [new file with mode: 0644]
zypp-core/base/Exception.cc [moved from zypp/base/Exception.cc with 96% similarity]
zypp-core/base/Exception.h [new file with mode: 0644]
zypp-core/base/ExternalDataSource.cc [moved from zypp/base/ExternalDataSource.cc with 96% similarity]
zypp-core/base/ExternalDataSource.h [new file with mode: 0644]
zypp-core/base/Flags.h [new file with mode: 0644]
zypp-core/base/Function.h [new file with mode: 0644]
zypp-core/base/Gettext.cc [moved from zypp/base/Gettext.cc with 98% similarity]
zypp-core/base/Gettext.h [new file with mode: 0644]
zypp-core/base/Hash.h [new file with mode: 0644]
zypp-core/base/IOStream.cc [moved from zypp/base/IOStream.cc with 97% similarity]
zypp-core/base/IOStream.h [new file with mode: 0644]
zypp-core/base/IOTools.cc [moved from zypp/base/IOTools.cc with 80% similarity]
zypp-core/base/IOTools.h [new file with mode: 0644]
zypp-core/base/Iterable.h [new file with mode: 0644]
zypp-core/base/Iterator.h [new file with mode: 0644]
zypp-core/base/LogControl.cc [moved from zypp/base/LogControl.cc with 54% similarity]
zypp-core/base/LogControl.h [new file with mode: 0644]
zypp-core/base/LogTools.h [new file with mode: 0644]
zypp-core/base/Logger.h [new file with mode: 0644]
zypp-core/base/NonCopyable.h [new file with mode: 0644]
zypp-core/base/ProfilingFormater.cc [moved from zypp/base/ProfilingFormater.cc with 92% similarity]
zypp-core/base/ProfilingFormater.h [new file with mode: 0644]
zypp-core/base/PtrTypes.h [new file with mode: 0644]
zypp-core/base/ReferenceCounted.cc [moved from zypp/base/ReferenceCounted.cc with 92% similarity]
zypp-core/base/ReferenceCounted.h [new file with mode: 0644]
zypp-core/base/Regex.cc [moved from zypp/base/Regex.cc with 98% similarity]
zypp-core/base/Regex.h [new file with mode: 0644]
zypp-core/base/String.cc [moved from zypp/base/String.cc with 99% similarity]
zypp-core/base/String.h [new file with mode: 0644]
zypp-core/base/StringV.cc [moved from zypp/base/StringV.cc with 99% similarity]
zypp-core/base/StringV.h [new file with mode: 0644]
zypp-core/base/Unit.cc [moved from zypp/base/Unit.cc with 96% similarity]
zypp-core/base/Unit.h [new file with mode: 0644]
zypp-core/base/Xml.cc [moved from zypp/base/Xml.cc with 100% similarity]
zypp-core/base/Xml.h [new file with mode: 0644]
zypp-core/fs/PathInfo.cc [new file with mode: 0644]
zypp-core/fs/PathInfo.h [new file with mode: 0644]
zypp-core/fs/TmpPath.cc [new file with mode: 0644]
zypp-core/fs/TmpPath.h [new file with mode: 0644]
zypp-core/parser/xml/XmlEscape.cc [moved from zypp/parser/xml/XmlEscape.cc with 98% similarity]
zypp-core/parser/xml/XmlEscape.h [new file with mode: 0644]
zypp-core/proto/CMakeLists.txt [new file with mode: 0644]
zypp-core/url/UrlBase.cc [moved from zypp/url/UrlBase.cc with 99% similarity]
zypp-core/url/UrlBase.h [new file with mode: 0644]
zypp-core/url/UrlException.h [new file with mode: 0644]
zypp-core/url/UrlUtils.cc [moved from zypp/url/UrlUtils.cc with 98% similarity]
zypp-core/url/UrlUtils.h [new file with mode: 0644]
zypp-core/zyppng/base/AbstractEventSource [moved from zypp/zyppng/base/AbstractEventSource with 100% similarity]
zypp-core/zyppng/base/AutoDisconnect [new file with mode: 0644]
zypp-core/zyppng/base/Base [moved from zypp/zyppng/base/Base with 100% similarity]
zypp-core/zyppng/base/EventDispatcher [moved from zypp/zyppng/base/EventDispatcher with 100% similarity]
zypp-core/zyppng/base/EventLoop [new file with mode: 0644]
zypp-core/zyppng/base/Signals [moved from zypp/zyppng/base/Signals with 100% similarity]
zypp-core/zyppng/base/SocketNotifier [moved from zypp/zyppng/base/SocketNotifier with 100% similarity]
zypp-core/zyppng/base/Timer [moved from zypp/zyppng/base/Timer with 100% similarity]
zypp-core/zyppng/base/abstracteventsource.cc [moved from zypp/zyppng/base/abstracteventsource.cc with 74% similarity]
zypp-core/zyppng/base/abstracteventsource.h [moved from zypp/zyppng/base/abstracteventsource.h with 95% similarity]
zypp-core/zyppng/base/autodisconnect.h [new file with mode: 0644]
zypp-core/zyppng/base/base.cc [moved from zypp/zyppng/base/base.cc with 80% similarity]
zypp-core/zyppng/base/base.h [new file with mode: 0644]
zypp-core/zyppng/base/eventdispatcher.h [moved from zypp/zyppng/base/eventdispatcher.h with 59% similarity]
zypp-core/zyppng/base/eventdispatcher_glib.cc [moved from zypp/zyppng/base/eventdispatcher_glib.cc with 62% similarity]
zypp-core/zyppng/base/eventloop.h [new file with mode: 0644]
zypp-core/zyppng/base/eventloop_glib.cc [new file with mode: 0644]
zypp-core/zyppng/base/linuxhelpers.cc [new file with mode: 0644]
zypp-core/zyppng/base/private/abstracteventsource_p.h [moved from zypp/zyppng/base/private/abstracteventsource_p.h with 90% similarity]
zypp-core/zyppng/base/private/base_p.h [moved from zypp/zyppng/base/private/base_p.h with 57% similarity]
zypp-core/zyppng/base/private/eventdispatcher_glib_p.h [moved from zypp/zyppng/base/private/eventdispatcher_glib_p.h with 78% similarity]
zypp-core/zyppng/base/private/eventloop_glib_p.h [new file with mode: 0644]
zypp-core/zyppng/base/private/linuxhelpers_p.h [new file with mode: 0644]
zypp-core/zyppng/base/private/threaddata_p.h [new file with mode: 0644]
zypp-core/zyppng/base/signals.h [new file with mode: 0644]
zypp-core/zyppng/base/socketnotifier.cc [moved from zypp/zyppng/base/socketnotifier.cc with 71% similarity]
zypp-core/zyppng/base/socketnotifier.h [moved from zypp/zyppng/base/socketnotifier.h with 91% similarity]
zypp-core/zyppng/base/statemachine.h [new file with mode: 0644]
zypp-core/zyppng/base/threaddata.cc [new file with mode: 0644]
zypp-core/zyppng/base/timer.cc [moved from zypp/zyppng/base/timer.cc with 86% similarity]
zypp-core/zyppng/base/timer.h [moved from zypp/zyppng/base/timer.h with 93% similarity]
zypp-core/zyppng/base/zyppglobal.h [new file with mode: 0644]
zypp-core/zyppng/core/ByteArray [new file with mode: 0644]
zypp-core/zyppng/core/Env [new file with mode: 0644]
zypp-core/zyppng/core/IdString [moved from zypp/zyppng/core/IdString with 100% similarity]
zypp-core/zyppng/core/String [new file with mode: 0644]
zypp-core/zyppng/core/Url [moved from zypp/zyppng/core/Url with 100% similarity]
zypp-core/zyppng/core/bytearray.h [new file with mode: 0644]
zypp-core/zyppng/core/env.h [new file with mode: 0644]
zypp-core/zyppng/core/idstring.h [moved from zypp/zyppng/core/idstring.h with 96% similarity]
zypp-core/zyppng/core/string.h [new file with mode: 0644]
zypp-core/zyppng/core/url.h [moved from zypp/zyppng/core/url.h with 96% similarity]
zypp-core/zyppng/io/AsyncDataSource [new file with mode: 0644]
zypp-core/zyppng/io/IODevice [new file with mode: 0644]
zypp-core/zyppng/io/Process [new file with mode: 0644]
zypp-core/zyppng/io/SockAddr [new file with mode: 0644]
zypp-core/zyppng/io/Socket [new file with mode: 0644]
zypp-core/zyppng/io/abstractspawnengine.cc [new file with mode: 0644]
zypp-core/zyppng/io/asyncdatasource.cpp [new file with mode: 0644]
zypp-core/zyppng/io/asyncdatasource.h [new file with mode: 0644]
zypp-core/zyppng/io/forkspawnengine.cc [new file with mode: 0644]
zypp-core/zyppng/io/iobuffer.cc [new file with mode: 0644]
zypp-core/zyppng/io/iodevice.cc [new file with mode: 0644]
zypp-core/zyppng/io/iodevice.h [new file with mode: 0644]
zypp-core/zyppng/io/private/abstractspawnengine_p.h [new file with mode: 0644]
zypp-core/zyppng/io/private/forkspawnengine_p.h [new file with mode: 0644]
zypp-core/zyppng/io/private/iobuffer_p.h [new file with mode: 0644]
zypp-core/zyppng/io/private/iodevice_p.h [new file with mode: 0644]
zypp-core/zyppng/io/private/sockaddr_p.h [new file with mode: 0644]
zypp-core/zyppng/io/private/socket_p.h [new file with mode: 0644]
zypp-core/zyppng/io/process.cpp [new file with mode: 0644]
zypp-core/zyppng/io/process.h [new file with mode: 0644]
zypp-core/zyppng/io/sockaddr.cpp [new file with mode: 0644]
zypp-core/zyppng/io/sockaddr.h [new file with mode: 0644]
zypp-core/zyppng/io/socket.cc [new file with mode: 0644]
zypp-core/zyppng/io/socket.h [new file with mode: 0644]
zypp-core/zyppng/rpc/rpc.cc [new file with mode: 0644]
zypp-core/zyppng/rpc/rpc.h [new file with mode: 0644]
zypp-core/zyppng/rpc/zerocopystreams.cc [new file with mode: 0644]
zypp-core/zyppng/rpc/zerocopystreams.h [new file with mode: 0644]
zypp-core/zyppng/thread/AsyncQueue [new file with mode: 0644]
zypp-core/zyppng/thread/Wakeup [new file with mode: 0644]
zypp-core/zyppng/thread/asyncqueue.cc [new file with mode: 0644]
zypp-core/zyppng/thread/asyncqueue.h [new file with mode: 0644]
zypp-core/zyppng/thread/private/asyncqueue_p.h [new file with mode: 0644]
zypp-core/zyppng/thread/wakeup.cpp [new file with mode: 0644]
zypp-core/zyppng/thread/wakeup.h [new file with mode: 0644]
zypp-proto/CMakeLists.txt [new file with mode: 0644]
zypp-proto/core/envelope.proto [new file with mode: 0644]
zypp-proto/media/download.proto [new file with mode: 0644]
zypp-proto/media/messages.proto [new file with mode: 0644]
zypp-proto/media/networkrequesterror.proto [new file with mode: 0644]
zypp-proto/media/transfersettings.proto [new file with mode: 0644]
zypp-proto/target/commit.proto [new file with mode: 0644]
zypp/APIConfig.h.in
zypp/AutoDispose.h
zypp/ByteArray.h [new file with mode: 0644]
zypp/ByteCount.h
zypp/CMakeLists.txt
zypp/CheckSum.cc
zypp/CheckSum.h
zypp/Date.h
zypp/Digest.cc
zypp/Digest.h
zypp/ExternalProgram.h
zypp/Fetcher.cc
zypp/Fetcher.h
zypp/Globals.h [new file with mode: 0644]
zypp/KeyManager.cc
zypp/KeyManager.h
zypp/ManagedFile.h
zypp/MediaProducts.h
zypp/MediaSetAccess.cc
zypp/MediaSetAccess.h
zypp/OnMediaLocation.cc
zypp/OnMediaLocation.h
zypp/PathInfo.cc
zypp/PathInfo.h
zypp/Pathname.h
zypp/PoolQuery.cc
zypp/PoolQuery.h
zypp/PurgeKernels.cc
zypp/RepoInfo.cc
zypp/RepoManager.cc
zypp/TmpPath.cc
zypp/TmpPath.h
zypp/TriBool.h
zypp/Url.h
zypp/ZYpp.h
zypp/ZYppCallbacks.h
zypp/ZYppCommitPolicy.cc
zypp/ZYppCommitPolicy.h
zypp/ZYppCommitResult.cc
zypp/ZYppCommitResult.h
zypp/ZYppFactory.cc
zypp/base/Easy.h
zypp/base/EnumClass.h
zypp/base/Errno.h
zypp/base/Exception.h
zypp/base/ExternalDataSource.h
zypp/base/Flags.h
zypp/base/Function.h
zypp/base/Gettext.h
zypp/base/Hash.h
zypp/base/IOStream.h
zypp/base/IOTools.h
zypp/base/Iterable.h
zypp/base/Iterator.h
zypp/base/LogControl.h
zypp/base/LogTools.h
zypp/base/Logger.h
zypp/base/NonCopyable.h
zypp/base/ProfilingFormater.h
zypp/base/PtrTypes.h
zypp/base/ReferenceCounted.h
zypp/base/Regex.h
zypp/base/String.h
zypp/base/StringV.h
zypp/base/Unit.h
zypp/base/Xml.h
zypp/media/CredentialFileReader.cc
zypp/media/CredentialManager.cc
zypp/media/CurlHelper.cc
zypp/media/CurlHelper.h
zypp/media/MediaAccess.cc [deleted file]
zypp/media/MediaAccess.h [deleted file]
zypp/media/MediaBlockList.cc
zypp/media/MediaBlockList.h
zypp/media/MediaCD.cc
zypp/media/MediaCD.h
zypp/media/MediaCIFS.cc
zypp/media/MediaCIFS.h
zypp/media/MediaCurl.cc
zypp/media/MediaCurl.h
zypp/media/MediaDIR.cc
zypp/media/MediaDIR.h
zypp/media/MediaDISK.cc
zypp/media/MediaDISK.h
zypp/media/MediaException.h
zypp/media/MediaHandler.cc
zypp/media/MediaHandler.h
zypp/media/MediaHandlerFactory.cc [new file with mode: 0644]
zypp/media/MediaHandlerFactory.h [new file with mode: 0644]
zypp/media/MediaISO.cc
zypp/media/MediaISO.h
zypp/media/MediaManager.cc
zypp/media/MediaManager.h
zypp/media/MediaMultiCurl.cc
zypp/media/MediaMultiCurl.h
zypp/media/MediaNFS.cc
zypp/media/MediaNFS.h
zypp/media/MediaNetworkCommonHandler.h [new file with mode: 0644]
zypp/media/MediaPlugin.cc
zypp/media/MediaPlugin.h
zypp/media/MediaUserAuth.cc
zypp/media/MediaUserAuth.h
zypp/media/MetaLinkParser.cc
zypp/media/MetaLinkParser.h
zypp/media/TransferSettings.cc
zypp/media/TransferSettings.h
zypp/misc/YamlTestcaseHelpers.h
zypp/parser/xml/XmlEscape.h
zypp/proto/CMakeLists.txt [new file with mode: 0644]
zypp/repo/Downloader.cc
zypp/repo/SUSEMediaVerifier.cc
zypp/repo/SUSEMediaVerifier.h
zypp/repo/ServiceRepos.cc
zypp/repo/susetags/Downloader.cc
zypp/repo/yum/Downloader.cc
zypp/solver/detail/SATResolver.cc
zypp/target/TargetImpl.cc
zypp/target/TargetImpl.h
zypp/target/rpm/BinHeader.cc
zypp/target/rpm/BinHeader.h
zypp/target/rpm/RpmDb.cc
zypp/target/rpm/RpmException.cc
zypp/target/rpm/RpmException.h
zypp/target/rpm/RpmFlags.h
zypp/target/rpm/RpmHeader.cc
zypp/target/rpm/RpmHeader.h
zypp/target/rpm/librpmDb.h
zypp/url/UrlBase.h
zypp/url/UrlException.h
zypp/url/UrlUtils.h
zypp/zyppng/CMakeLists.txt
zypp/zyppng/Context [new file with mode: 0644]
zypp/zyppng/base/base.h [deleted file]
zypp/zyppng/base/signals.h [deleted file]
zypp/zyppng/base/zyppglobal.h [deleted file]
zypp/zyppng/context.cc [new file with mode: 0644]
zypp/zyppng/context.h [new file with mode: 0644]
zypp/zyppng/media/MediaNetwork [new file with mode: 0644]
zypp/zyppng/media/medianetwork.cc [new file with mode: 0644]
zypp/zyppng/media/medianetwork.h [new file with mode: 0644]
zypp/zyppng/media/medianetworkserver.cc [new file with mode: 0644]
zypp/zyppng/media/network/downloader.cc
zypp/zyppng/media/network/downloader.h
zypp/zyppng/media/network/downloadspec.cc [new file with mode: 0644]
zypp/zyppng/media/network/downloadspec.h [new file with mode: 0644]
zypp/zyppng/media/network/mirrorcontrol.cc [new file with mode: 0644]
zypp/zyppng/media/network/networkrequestdispatcher.cc
zypp/zyppng/media/network/networkrequestdispatcher.h
zypp/zyppng/media/network/networkrequesterror.cc
zypp/zyppng/media/network/networkrequesterror.h
zypp/zyppng/media/network/private/downloader_p.h
zypp/zyppng/media/network/private/downloaderstates/base_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/basicdownloader_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/basicdownloader_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/detectmeta_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/detectmeta_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/final_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/final_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/initial_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/initial_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/metalink_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/metalink_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/metalinkinfo_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/metalinkinfo_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/mirrorhandling_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/mirrorhandling_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/normal_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/normal_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/preparemulti_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/preparemulti_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/rangedownloader_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/rangedownloader_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/zck_p.cc [new file with mode: 0644]
zypp/zyppng/media/network/private/downloaderstates/zck_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/mediadebug_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/mirrorcontrol_p.h [new file with mode: 0644]
zypp/zyppng/media/network/private/networkrequestdispatcher_p.h
zypp/zyppng/media/network/private/networkrequesterror_p.h
zypp/zyppng/media/network/private/request_p.h
zypp/zyppng/media/network/request.cc
zypp/zyppng/media/network/request.h
zypp/zyppng/media/private/medianetworkserver_p.h [new file with mode: 0644]
zypp/zyppng/proto/CMakeLists.txt [new file with mode: 0644]

index b445b4e..0e3f220 100644 (file)
@@ -2,6 +2,7 @@ build
 *.orig
 *.rej
 *.swp
+*.kate-swp
 #*
 .#*
 *#
diff --git a/.obs/workflows.yml b/.obs/workflows.yml
new file mode 100644 (file)
index 0000000..e11358c
--- /dev/null
@@ -0,0 +1,5 @@
+workflow:
+  steps:
+    - branch_package:
+        source_project: zypp:ci:libzypp
+        source_package: libzypp
index 494aa9b..ef8e4a4 100644 (file)
@@ -11,11 +11,15 @@ OPTION (ENABLE_BUILD_TESTS "Build and run test suite by default?" OFF)
 OPTION (ENABLE_USE_THREADS "Enable using threads (NOT being used by threads!)?" OFF)
 OPTION (ENABLE_ZSTD_COMPRESSION "Build with zstd compression support?" OFF)
 OPTION (ENABLE_ZCHUNK_COMPRESSION "Build with zchunk compression support?" OFF)
+# Helps with bug https://bugzilla.gnome.org/show_bug.cgi?id=784550 , Segfault during signal emission when slots are cleared
+OPTION (ENABLE_SIGC_BLOCK_WORKAROUND "Enable a workaround for older sigcpp libraries?" OFF )
 OPTION (DISABLE_MEDIABACKEND_TESTS "Disable Tests depending on Nginx and libfcgi?" OFF)
 
 OPTION (DISABLE_LIBPROXY "Build without libproxy support even if package is installed?" OFF)
 OPTION (DISABLE_AUTODOCS "Do not require doxygen being installed (required to build autodocs)?" OFF)
 OPTION (EXPORT_NG_API "Export experimental libzypp API" OFF)
+# This option will reroute all tool binaries to the libzypp build dir instead of taking those installed in the default directories.
+OPTION (ENABLE_DEVEL_BUILD "Developer build, use zypp tools directly from build dir rather than the default locations" OFF)
 #--------------------------------------------------------------------------------
 SET (have_system x)
 
@@ -27,6 +31,16 @@ IF (DEBIAN)
   SET (have_system ${have_system}x)
 ENDIF (DEBIAN)
 
+IF ( ENABLE_DEVEL_BUILD )
+       MESSAGE( WARNING "Zypp devel build enabled, do not do this in production" )
+       SET( ZYPP_RPM_BINARY "${CMAKE_BINARY_DIR}/tools/zypp-rpm/zypp-rpm")
+ELSE()
+       SET( ZYPP_RPM_BINARY "${ZYPP_LIBEXEC_INSTALL_DIR}/zypp-rpm")
+ENDIF( ENABLE_DEVEL_BUILD )
+
+message ( "Using zypp-rpm from path: ${ZYPP_RPM_BINARY}" )
+add_definitions( -DZYPP_RPM_BINARY="${ZYPP_RPM_BINARY}")
+
 IF (${have_system} STREQUAL x)
   MESSAGE (STATUS "Building for SUSE")
 ENDIF (${have_system} STREQUAL x)
@@ -135,18 +149,16 @@ ELSE ( NOT RPM_FOUND)
   # fix includes not relative to rpm
   INCLUDE_DIRECTORIES(${RPM_INCLUDE_DIR}/rpm)
 
-  # rpmtsSetVfyFlags were introduced in rpm-4.15
-  UNSET( RPMTSSETVFYFLAGS_FOUND CACHE )
-  SET( CMAKE_REQUIRED_LIBRARIES "-lrpm" )
-  CHECK_SYMBOL_EXISTS( rpmtsSetVfyFlags rpm/rpmts.h RPMTSSETVFYFLAGS_FOUND )
-  IF ( NOT RPMTSSETVFYFLAGS_FOUND )
-    ADD_DEFINITIONS( -DHAVE_NO_RPMTSSETVFYFLAGS )
-  ENDIF ()
+  # rpm verify function and callback states were introduced in rpm-4.15
+  if( RPM_LIB_VER VERSION_GREATER_EQUAL "4.15.0"  AND  RPM_LIB_VER VERSION_LESS "5.0.0")
+    ADD_DEFINITIONS( -DHAVE_RPM_VERIFY_TRANSACTION_STEP )
+  endif()
 
-  if ( RPM_SUSPECT_VERSION STREQUAL "5.x" )
+  if( RPM_LIB_VER VERSION_GREATER_EQUAL "5.0.0" )
        MESSAGE( STATUS "rpm found: enable rpm-4 compat interface." )
        ADD_DEFINITIONS(-D_RPM_5)
-  endif ( RPM_SUSPECT_VERSION STREQUAL "5.x" )
+  endif ()
+
 ENDIF( NOT RPM_FOUND)
 
 FIND_PACKAGE(Boost REQUIRED COMPONENTS program_options unit_test_framework thread)
@@ -185,6 +197,12 @@ ELSE ( NOT ZLIB_FOUND)
   INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
 ENDIF( NOT ZLIB_FOUND)
 
+FIND_PACKAGE(Protobuf REQUIRED)
+SET( Protobuf_IMPORT_DIRS ${CMAKE_CURRENT_SOURCE_DIR} )
+if ( "${Protobuf_VERSION}" VERSION_LESS "3.8.0")
+  message("Protobuf ${Protobuf_VERSION} has no ZeroCopyStreams, using internal version.")
+  add_definitions( -DPROTOBUFLITE_HAS_NO_ZEROCOPYSTREAM )
+endif()
 
 FIND_PACKAGE(YAML-CPP REQUIRED)
 IF ( NOT YAML-CPP_FOUND)
@@ -194,7 +212,6 @@ ELSE ( NOT YAML-CPP_FOUND)
 ENDIF( NOT YAML-CPP_FOUND)
 
 
-
 #Allow to override the libsolv install location
 IF( LIBSOLV_SRCDIR AND LIBSOLV_BUILDDIR )
   execute_process(
@@ -270,6 +287,7 @@ IF (ENABLE_ZSTD_COMPRESSION)
   #INCLUDE_DIRECTORIES (${ZSTD_INCLUDE_DIRS})
 ENDIF (ENABLE_ZSTD_COMPRESSION)
 
+# https://bugzilla.gnome.org/show_bug.cgi?id=784550
 IF (ENABLE_ZCHUNK_COMPRESSION)
   MESSAGE("Building with zchunk support enabled.")
   PKG_CHECK_MODULES (ZCHUNK zck REQUIRED)
@@ -278,6 +296,11 @@ IF (ENABLE_ZCHUNK_COMPRESSION)
   ADD_DEFINITIONS (-DENABLE_ZCHUNK_COMPRESSION=1)
 ENDIF(ENABLE_ZCHUNK_COMPRESSION)
 
+IF(ENABLE_SIGC_BLOCK_WORKAROUND)
+  message("Building with sigcpp block workaround")
+  ADD_DEFINITIONS (-DLIBZYPP_USE_SIGC_BLOCK_WORKAROUND=1)
+ENDIF(ENABLE_SIGC_BLOCK_WORKAROUND)
+
 pkg_check_modules ( SIGCPP REQUIRED sigc++-2.0 )
 INCLUDE_DIRECTORIES( ${SIGCPP_INCLUDE_DIRS} )
 
@@ -313,10 +336,12 @@ INSTALL( FILES ${LIBZYPP_SOURCE_DIR}/systemCheck DESTINATION ${SYSCONFDIR}/zypp
 # logrotate config file
 INSTALL( FILES ${LIBZYPP_SOURCE_DIR}/zypp-history.lr DESTINATION ${SYSCONFDIR}/logrotate.d )
 
+
 ####################################################################
 # SUBDIRECTORIES                                                   #
 ####################################################################
-
+ADD_SUBDIRECTORY( zypp-proto )
+ADD_SUBDIRECTORY( zypp-core )
 ADD_SUBDIRECTORY( zypp )
 # do not build devel by default
 ADD_SUBDIRECTORY( devel EXCLUDE_FROM_ALL )
index c74f56f..85ecdf9 100644 (file)
@@ -60,9 +60,9 @@
 #
 SET(LIBZYPP_MAJOR "17")
 SET(LIBZYPP_COMPATMINOR "22")
-SET(LIBZYPP_MINOR "27")
+SET(LIBZYPP_MINOR "28")
 SET(LIBZYPP_PATCH "0")
 #
-# LAST RELEASED: 17.27.0 (22)
+# LAST RELEASED: 17.28.0 (22)
 # (The number in parenthesis is LIBZYPP_COMPATMINOR)
 #=======
index 6e1217d..32c8329 100644 (file)
@@ -1,10 +1,14 @@
 
+cmake_policy(PUSH)
+cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced
+
 if(RPM_INCLUDE_DIR AND RPM_LIBRARY)
        # Already in cache, be silent
        set(RPM_FIND_QUIETLY TRUE)
 endif(RPM_INCLUDE_DIR AND RPM_LIBRARY)
 
 set(RPM_LIBRARY)
+set(RPMIO_LIBRARY)
 set(RPM_INCLUDE_DIR)
 
 FIND_PATH(RPM_INCLUDE_DIR rpm/rpmdb.h
@@ -32,11 +36,61 @@ FIND_LIBRARY(RPM_LIBRARY NAMES rpm
        /usr/local/lib
 )
 
-if(RPM_INCLUDE_DIR AND RPM_LIBRARY)
-   MESSAGE( STATUS "rpm found: includes in ${RPM_INCLUDE_DIR}, library in ${RPM_LIBRARY} (suspect ${RPM_SUSPECT_VERSION})")
-   set(RPM_FOUND TRUE)
-else(RPM_INCLUDE_DIR AND RPM_LIBRARY)
+FIND_LIBRARY(RPMIO_LIBRARY NAMES rpmio
+       PATHS
+       /usr/lib
+       /usr/local/lib
+)
+
+
+if(RPM_INCLUDE_DIR AND RPM_LIBRARY AND RPMIO_LIBRARY)
+   MESSAGE( STATUS "rpm found: includes in ${RPM_INCLUDE_DIR}, library in ${RPM_LIBRARY}, librpmio in ${RPMIO_LIBRARY} (suspect ${RPM_SUSPECT_VERSION})")
+
+   if ( "${RPM_SUSPECT_VERSION}" STREQUAL "4.x" )
+     set( ZYPP_RPM_VERSION_INCL "rpm/rpmlib.h" )
+   else()
+     set( ZYPP_RPM_VERSION_INCL "rpm/rpmtag.h" )
+   endif()
+
+   configure_file( "${CMAKE_CURRENT_LIST_DIR}/printrpmver.c.in"
+                   "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/printrpmver.c" @ONLY )
+
+    try_run( RPM_VER_EXITCODE RPM_VER_COMPRESULT
+      "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp"
+      "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/printrpmver.c"
+      LINK_LIBRARIES ${RPM_LIBRARY}
+      CMAKE_FLAGS -DINCLUDE_DIRECTORIES="${RPM_INCLUDE_DIR}"
+      COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
+      COMPILE_OUTPUT_VARIABLE RPM_PRINTVER_COMPILE_OUTPUT
+      RUN_OUTPUT_VARIABLE RPM_LIB_VER
+    )
+
+  if ( NOT RPM_VER_COMPRESULT OR NOT RPM_VER_EXITCODE EQUAL 0 )
+    message( WARNING "Could not determine rpm version" )
+    if ( NOT RPM_VER_COMPRESULT )
+      message( WARNING "Compilation failed: ")
+      message( WARNING "${RPM_PRINTVER_COMPILE_OUTPUT}")
+    endif()
+  else ()
+    string(REGEX MATCHALL "[^.^-]+" RPM_VER_PARTS "${RPM_LIB_VER}")
+    list( LENGTH RPM_VER_PARTS RPM_VER_PARTS_CNT )
+
+    if ( RPM_VER_PARTS_CNT GREATER_EQUAL 3 )
+
+      list( GET RPM_VER_PARTS 0 RPM_LIB_VER_MAJ  )
+      list( GET RPM_VER_PARTS 1 RPM_LIB_VER_MIN  )
+      list( GET RPM_VER_PARTS 2 RPM_LIB_VER_PATCH )
+      message ( STATUS "Detected RPM version is: maj:${RPM_LIB_VER_MAJ}  min:${RPM_LIB_VER_MIN} patch:${RPM_LIB_VER_PATCH}" )
+      set(RPM_FOUND TRUE)
+
+    endif()
+  endif()
+
+
+else(RPM_INCLUDE_DIR AND RPM_LIBRARY AND RPMIO_LIBRARY)
    MESSAGE( STATUS "rpm not found")
-endif(RPM_INCLUDE_DIR AND RPM_LIBRARY)
+endif(RPM_INCLUDE_DIR AND RPM_LIBRARY AND RPMIO_LIBRARY)
 
 MARK_AS_ADVANCED(RPM_INCLUDE_DIR RPM_LIBRARY)
+
+cmake_policy(POP)
index 621200d..846e393 100644 (file)
@@ -1,11 +1,10 @@
+include(GNUInstallDirs)
+
 # Library
 IF ( DEFINED LIB )
   SET ( LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${LIB}" )
 ELSE ( DEFINED  LIB )
-  IF (CMAKE_SIZEOF_VOID_P MATCHES "8")
-    SET( LIB_SUFFIX "64" )
-  ENDIF(CMAKE_SIZEOF_VOID_P MATCHES "8")
-  SET ( LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}" )
+  SET ( LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" )
 ENDIF ( DEFINED  LIB )
 MESSAGE(STATUS "Libraries will be installed in ${LIB_INSTALL_DIR}" )
 # Headers
@@ -27,8 +26,10 @@ IF( NOT DEFINED SYSCONFDIR )
 ENDIF( NOT DEFINED SYSCONFDIR )
 MESSAGE(STATUS "Config files will be installed in ${SYSCONFDIR}" )
 
-# usr INSTALL_PREFIX
+# install directory for private executables that are not for the user
+SET ( ZYPP_LIBEXEC_INSTALL_DIR "${CMAKE_INSTALL_FULL_LIBEXECDIR}/zypp" )
 
+# usr INSTALL_PREFIX
 IF( DEFINED CMAKE_INSTALL_PREFIX )
   SET( INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} )
 ELSE( DEFINED CMAKE_INSTALL_PREFIX )
diff --git a/cmake/modules/printrpmver.c.in b/cmake/modules/printrpmver.c.in
new file mode 100644 (file)
index 0000000..6cbd4df
--- /dev/null
@@ -0,0 +1,8 @@
+#include <stdio.h>
+#include <@ZYPP_RPM_VERSION_INCL@> 
+
+int main ( int argc , char* argv[] )
+{
+ printf("%s\n", rpmEVR);
+ return 0;
+}
index a28f59b..c9cb801 100644 (file)
@@ -10,7 +10,9 @@ ELSE ( NOT DOT )
    SET( HAVE_DOT YES )
 ENDIF ( NOT DOT )
 
+SET( ZYPP_PROJECT_ROOT   ${LIBZYPP_SOURCE_DIR} )
 SET( ZYPP_SOURCE_DIR     ${LIBZYPP_SOURCE_DIR}/zypp )
+SET( ZYPP_CORE_SOURCE_DIR     ${LIBZYPP_SOURCE_DIR}/zypp-core )
 SET( ZYPP_DOCINCLUDE_DIR ${LIBZYPP_SOURCE_DIR}/doc/autoinclude )
 SET( ZYPP_EXAMPLE_DIR    ${LIBZYPP_SOURCE_DIR}/examples )
 
index f4450dc..0c04efa 100644 (file)
@@ -14,8 +14,8 @@ ABBREVIATE_BRIEF       =
 ALWAYS_DETAILED_SEC    = NO
 INLINE_INHERITED_MEMB  = NO
 FULL_PATH_NAMES        = YES
-STRIP_FROM_PATH        = @CMAKE_SOURCE_DIR@
-STRIP_FROM_INC_PATH    =
+STRIP_FROM_PATH        = @ZYPP_PROJECT_ROOT@
+STRIP_FROM_INC_PATH    = @ZYPP_PROJECT_ROOT@/zypp @ZYPP_PROJECT_ROOT@/zypp-core
 SHORT_NAMES            = NO
 JAVADOC_AUTOBRIEF      = YES
 MULTILINE_CPP_IS_BRIEF = NO
@@ -69,7 +69,7 @@ WARN_LOGFILE           =
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
-INPUT                  = @ZYPP_DOCINCLUDE_DIR@ @ZYPP_SOURCE_DIR@
+INPUT                  = @ZYPP_DOCINCLUDE_DIR@ @ZYPP_SOURCE_DIR@ @ZYPP_CORE_SOURCE_DIR@
 FILE_PATTERNS          = *.h *.hh *.hxx *.hpp *.h++ *.c *.cc *.cxx *.cpp *.c++ *.tcc *.hcc *.doc
 RECURSIVE              = YES
 EXCLUDE                =
index c6a1f67..45dd0ed 100644 (file)
@@ -20,6 +20,7 @@
 \subsection zypp-envars-commit Variables related to commit
 
 \li \c ZYPP_IS_RUNNING=1 Set during commit so packages pre/post/trigger scripts can detect whether rpm was called from within libzypp.
+\li \c ZYPP_SINGLE_RPMTRANS=1 Enable alternative and !!!experimental!!! commit strategy where all rpm operations are executed in a single rpm transaction, which results in much faster commits.
 
 \subsection zypp-envars-logging Variables related to logging
 
@@ -37,6 +38,7 @@
 \subsection zypp-envars-mediabackend Selecting the mediabackend to use.
 
 \li \c ZYPP_MULTICURL=0 Turn off multicurl (metalink and zsync) and fall back to plain libcurl.
+\li \c ZYPP_MEDIANETWORK=1 Turn on the new multithreaded backend (experimental)
 
 \subsection zypp-envars-plugin Variables related to plugins
 
index 37830f9..5514322 100644 (file)
 
 %bcond_without mediabackend_tests
 
+# older libsigc versions have a bug that causes a segfault
+# when clearing connections during signal emission
+# see https://bugzilla.gnome.org/show_bug.cgi?id=784550
+%if 0%{?sle_version} < 150200
+%bcond_without sigc_block_workaround
+%else
+%bcond_with sigc_block_workaround
+%endif
+
 Name:           libzypp
 Version:        @VERSION@
 Release:        0
@@ -57,7 +66,7 @@ Recommends:     logrotate
 Recommends:     lsof
 %endif
 BuildRequires:  cmake >= 3.1
-BuildRequires:  openssl-devel
+BuildRequires:  pkgconfig(openssl)
 BuildRequires:  pkgconfig(libudev)
 %if 0%{?suse_version} >= 1330
 BuildRequires:  libboost_headers-devel
@@ -92,6 +101,7 @@ Requires:       libsolv-tools
 
 BuildRequires:  glib2-devel
 BuildRequires:  libsigc++2-devel
+BuildRequires:  protobuf-devel
 
 # required for testsuite
 %if %{with mediabackend_tests}
@@ -194,7 +204,7 @@ Requires:       glibc-devel
 Requires:       libstdc++-devel
 Requires:       libxml2-devel
 Requires:       libzypp = %{version}
-Requires:       openssl-devel
+Requires:       pkgconfig(openssl)
 Requires:       popt-devel
 Requires:       rpm-devel > 4.4
 Requires:       zlib-devel
@@ -246,8 +256,10 @@ cmake -DCMAKE_INSTALL_PREFIX=%{_prefix} \
       -DLIB=%{_lib} \
       -DCMAKE_BUILD_TYPE=Release \
       -DCMAKE_SKIP_RPATH=1 \
+      -DCMAKE_INSTALL_LIBEXECDIR=%{_libexecdir} \
       %{?with_zchunk:-DENABLE_ZCHUNK_COMPRESSION=1} \
       %{?with_zstd:-DENABLE_ZSTD_COMPRESSION=1} \
+      %{?with_sigc_block_workaround:-DENABLE_SIGC_BLOCK_WORKAROUND=1} \
       %{!?with_mediabackend_tests:-DDISABLE_MEDIABACKEND_TESTS=1} \
       ${EXTRA_CMAKE_OPTIONS} \
       ..
@@ -383,11 +395,15 @@ fi
 %config(noreplace) %{_sysconfdir}/zypp/systemCheck
 %config(noreplace) %{_sysconfdir}/logrotate.d/zypp-history.lr
 %dir               %{_var}/lib/zypp
+%if "%{_libexecdir}" != "%{_prefix}/lib"
+%dir               %{_libexecdir}/zypp
+%endif
 %dir %attr(750,root,root) %{_var}/log/zypp
 %dir               %{_var}/cache/zypp
 %{_prefix}/lib/zypp
 %{_datadir}/zypp
 %{_bindir}/*
+%{_libexecdir}/zypp/zypp-rpm
 %{_libdir}/libzypp*so.*
 %doc %{_mandir}/man1/*.1.*
 %doc %{_mandir}/man5/*.5.*
@@ -395,8 +411,9 @@ fi
 %files devel
 %defattr(-,root,root)
 %{_libdir}/libzypp.so
-%{_includedir}/zypp
 %{_datadir}/cmake/Modules/*
+%{_includedir}/zypp
+%{_includedir}/zypp-core
 %{_libdir}/pkgconfig/libzypp.pc
 
 %files devel-doc
index e55bd24..0ea7193 100644 (file)
@@ -1,4 +1,37 @@
 -------------------------------------------------------------------
+Mon Jul 26 11:48:28 CEST 2021 - ma@suse.de
+
+- Rephrase vendor conflict message in case 2 packages are
+  involved (bsc#1187760)
+  This covers the case where not the packages itself would change
+  its vendor, but replaces a package from a different vendor.
+- Fix solver jobs for PTFs (bsc#1186503)
+- spec: switch to pkgconfig(openssl)
+- Show key fpr from signature when signature check fails
+  (bsc#1187224)
+  Rpm by default only shows the short key ID when checking the
+  signature of a package fails. This patch reads the signatures
+  from the RPM headers and replaces she short IDs with the key
+  fingerprints fetched from the signatures.
+- Implement alternative single transaction commit strategy.
+  This patch adds a experimental commit strategy that runs all
+  operations in a single rpm transaction, speeding up the execution
+  a lot.
+- Use ZYPP_MEDIANETWORK=1 to enable the experimental new media
+  backend.
+- Implement zchunk download, refactor Downloader backend.
+- Fix purge-kernels fails with kernels from Kernel:HEAD
+  (bsc#1187738)
+  There recently was a change in the kernel package naming scheme
+  in regards to rc kernels. Since kernel upstream uses characters
+  in the version that are not allowed in rpm versions a "-rc" was
+  previously replaced with ".rc" which broke sorting by version, to
+  fix this issue it was replaced with "~rc", which unfortunately
+  broke the purge-kernels logic. This patch makes sure purge-kernel
+  does apply the same conversion.
+- version 17.28.0 (22)
+
+-------------------------------------------------------------------
 Thu Jun 10 17:34:14 CEST 2021 - ma@suse.de
 
 - Enhance XML output of repo GPG options (fixes openSUSE/zypper#390)
index f5c1a00..a4ae085 100644 (file)
@@ -12,6 +12,7 @@ SET( XGETTEXT_OPTIONS ${XGETTEXT_OPTIONS} --copyright-holder=\"SuSE Linux GmbH,
 SET( XGETTEXT_OPTIONS ${XGETTEXT_OPTIONS} --package-name=${POT_NAME} --default-domain=${POT_NAME} )
 
 SET( _abs_POT_FILE_DEPENDS )
+SET( POT_FILE_DEPENDS ${POT_FILE_DEPENDS_ZYPP} ${POT_FILE_DEPENDS_ZYPP_CORE} )
 FOREACH( _currentDepends ${POT_FILE_DEPENDS} )
   SET( _abs_POT_FILE_DEPENDS ${_abs_POT_FILE_DEPENDS} ${LIBZYPP_SOURCE_DIR}/${_currentDepends} )
 ENDFOREACH()
index d46fc7b..339c630 100644 (file)
--- a/po/af.po
+++ b/po/af.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2006-11-03 12:03\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -14,12 +14,6 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Onbekende land:"
@@ -1293,74 +1287,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Kan lêer '%1' nie open nie."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Kan %s nie vind nie."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Kan %s nie vind nie."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Opdrag uitgevoer wanneer verbind word"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Misluk om die SM te begin."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Misluk om die SM te begin."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Inskywing nie gevind nie."
@@ -3767,54 +3710,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "Die SM se naam kan nie met ’n syfer begin nie."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "Die SM se naam kan nie met ’n syfer begin nie."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan lêer nie vir skryf open nie."
@@ -3822,44 +3765,44 @@ msgstr "Kan lêer nie vir skryf open nie."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan werkskermitem '%s' nie open nie"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Kan gids %1 nie skep nie: %2."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3869,68 +3812,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Fout met lees vanaf slapskyf."
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ongeldige uitvoerlêernaam."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Terugstel van hulpbronne"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Kan werkskermitem '%s' nie open nie"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Ongeldige LDAP URL-navraagstring"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Ongeldige LDAP URL-navraagparameter '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Kan Url-voorwerp nie kloon nie"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Ongeldige leë Url-voorwerpverwysing"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Kan Url-komponente nie ontleed nie"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "onbekend"
@@ -3998,18 +3920,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4031,20 +3948,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ongeldige Url-skema '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4071,7 +3989,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Lêer %1 nie in die bewaarplek gevind nie."
@@ -4175,7 +4093,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Toelatings geweier"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4186,7 +4104,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4202,7 +4120,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4264,7 +4182,7 @@ msgid "No url in repository."
 msgstr "Lêer %1 nie in die bewaarplek gevind nie."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4383,7 +4301,7 @@ msgstr "Ignoreer dié vereiste net hier"
 msgid "generally ignore of some dependencies"
 msgstr "Ignoreer dié vereiste net hier"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4391,288 +4309,262 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Verbindingsversoek aan:"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Kan %s nie installeer nie vanweë afhanklikheidsprobleme"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "Geen voorsiening %s nie"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "Daar is geen installeerbare verskaffers van %s nie"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Daar is geen installeerbare verskaffers van %s nie"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "Die navraag bestaan reeds."
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4681,208 +4573,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s voorsien %s, maar dit het ’n ander argitektuur."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "opdrag om pakkette te oninstalleer"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "Geen voorsiening %s nie"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Die skyf bestaan nie."
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s is gesluit en kan nie ongeïnstalleer word nie."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "nie geïnstalleer nie"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s word benodig deur %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Kan %s nie installeer nie"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s verkeer in konflik met %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s uitgediendes %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s uitgediendes %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s verkeer in konflik met %s"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "moenie %s installeer nie"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "hou %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "moenie %s installeer nie"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "Daar is geen installeerbare verskaffers van %s nie"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "Moenie waar oplossings ter sprake is, installeer of skrap nie"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s voorsien %s, maar dit het ’n ander argitektuur."
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "Installeer %s, hoewel dit die argitektuur kan verander"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s uitgediendes %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "%s afgelaai vanaf %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Installasie"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4899,12 +4604,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Installasie is gestaak soos gelas."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "Voer uit"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4912,65 +4617,69 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "Fout tydens sleutelenkriptering."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "het misluk"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Gewysigde konfigurasielêers vir %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm geberg %s as %s, maar dit was onmoontlik om die verskil te bepaal"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4980,13 +4689,13 @@ msgstr ""
 "Hier is die eerste 25 rëels van verskil:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm geskep %s as %s, maar dit was onmoontlik om die verskil te bepaal"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4997,150 +4706,349 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Bykomende rpm-uitset:"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "geskepte rugsteun %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Inskywing nie gevind nie."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Inskywing nie gevind nie."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Inskywing nie gevind nie."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Kan lêer '%1' nie open nie."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Ongeldige LDAP URL-navraagstring"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Ongeldige LDAP URL-navraagparameter '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Kan Url-voorwerp nie kloon nie"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Ongeldige leë Url-voorwerpverwysing"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Kan Url-komponente nie ontleed nie"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Url-skema laat nie ’n %s toe nie"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Ongeldige %s komponent '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Ongeldige %s komponent"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Navraagstring-ontleding nie vir hierdie URL ondersteun nie"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Url-skema is ’n vereiste komponent"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Ongeldige Url-skema '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url-skema laat nie ’n gebruikernaam toe nie"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url-skema laat nie ’n wagwoord toe nie"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url-skema vereis ’n gasheerkomponent"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Url-skema laat nie ’n gasheerkomponent toe nie"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Ongeldige gasheerkomponent '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Url-skema laat nie ’n poort toe nie"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Ongeldige poortkomponent '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url-skema vereis padnaam"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Relatiewe pad nie toegelaat indien magtiging bestaan nie"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Enkoderingstring bevat ’n NUL-greep"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Ongeldige parametermatryssplyt-skeierkarakter"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Ongeldige parameterbindingsplyt-skeierkarakter"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Ongeldige parametermatrysaansluit-skeierkarakter"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Opdrag uitgevoer wanneer verbind word"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Kan %s nie vind nie."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Kan %s nie vind nie."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s voorsien %s, maar dit het ’n ander argitektuur."
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "opdrag om pakkette te oninstalleer"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "Geen voorsiening %s nie"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "Die skyf bestaan nie."
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s is gesluit en kan nie ongeïnstalleer word nie."
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "nie geïnstalleer nie"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s word benodig deur %s"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Kan %s nie installeer nie"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s verkeer in konflik met %s"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s uitgediendes %s"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s uitgediendes %s"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s verkeer in konflik met %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "moenie %s installeer nie"
+
+#~ msgid "keep %s"
+#~ msgstr "hou %s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "moenie %s installeer nie"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "Daar is geen installeerbare verskaffers van %s nie"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "Moenie waar oplossings ter sprake is, installeer of skrap nie"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s voorsien %s, maar dit het ’n ander argitektuur."
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "Installeer %s, hoewel dit die argitektuur kan verander"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s uitgediendes %s"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "%s afgelaai vanaf %s"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Installasie"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Kan lêer '%1' nie open nie."
index d6dfde5..f586df4 100644 (file)
--- a/po/ar.po
+++ b/po/ar.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2020-05-02 19:50+0000\n"
 "Last-Translator: mohammad alhargan <malham1@gmail.com>\n"
 "Language-Team: Arabic <https://l10n.opensuse.org/projects/libzypp/master/ar/"
@@ -27,13 +27,6 @@ msgstr ""
 "X-Language-English: Arabic\n"
 "X-Language-Local: Arabic*\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-"النوع المشكوك فيه '%s' للمجموع الاختباري لوحدات البايت %u الذي يبلغ '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "دولة غير معروفة: "
@@ -1302,73 +1295,21 @@ msgstr "يحسن"
 msgid "Supplements"
 msgstr "يُضيف"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "تعذر فتح pty (‏%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "لا يمكن فتح المسار (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "لا يمكن تغيير الجذر الافتراضي إلى '%s' (‏%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-"لا يمكن إجراء تغيير الدليل الافتراضي إلى '%s' داخل تغيير الجذر الافتراضي "
-"'%s' (‏%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "لا يمكن تغيير الدليل الافتراضي إلى '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "لا يمكن تنفيذ '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "تعذر تقسيم (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "تم إنهاء الأمر بالحالة %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "تم إنهاء الأمر بواسطة الإشارة %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "تم إنهاء الأمر بخطأ غير معروف."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "جرت محاولة استيراد المفتاح غير الموجود %s إلى حلقة المفاتيح %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "فشل استيراد المفتاح."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "فشل حذف المفتاح."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "ملف التوقيع  %s غير موجود"
@@ -3782,52 +3723,52 @@ msgstr[5] "(ستنتهي الصلاحية خلال %d من الأيام)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "البحث عن مفتاح gpg للتشفير %1% في الذاكرة المؤقتة %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "يتم البحث عن معرف لمفتاح gpg رقم %1% في المستودع %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "المستودع %1% لم يقم بتعريف مفتاح إضافي 'مفتاح gpg=' عناوين المواقع."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "تعذرت قراءة دليل المخازن '%1%': تم رفض الإذن"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "فشلت قراءة الدليل '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "تعذرت قراءة ملف المخزن '%1%': تم رفض الإذن"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "لا يمكن أن يبدأ الاسم المستعار للمخزن بنقطة."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "لا يمكن أن يبدأ الاسم المستعار للخدمة بنقطة."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "تعذر فتح الملف '%s' للكتابة."
@@ -3835,13 +3776,13 @@ msgstr "تعذر فتح الملف '%s' للكتابة."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "خدمة غير معروفة '%1%': تتم الآن إزالة مخزن الخدمة الوحيد '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "لم يتم العثور على بيانات تعريف صالحة في أي عنوان URL محدد"
@@ -3851,31 +3792,31 @@ msgstr[3] "لم يتم العثور على بيانات تعريف صالحة ف
 msgstr[4] "لم يتم العثور على بيانات تعريف صالحة في كثير من عناوين URL المحددة"
 msgstr[5] "لم يتم العثور على بيانات تعريف صالحة في عناوين  URL محددة أخرى"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "لا يمكن إنشاء %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "لا يمكن إنشاء دليل لذاكرة التخزين المؤقت لبيانات التعريف."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "يتم الآن بناء الذاكرة المؤقتة لمخزن '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "لا يمكن إنشاء ذاكرة التخزين المؤقت في %s - لا توجد أذونات للكتابة."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "فشل التخزين المؤقت للمخزن (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "نوع مخزن غير معالج"
 
@@ -3885,68 +3826,47 @@ msgstr "نوع مخزن غير معالج"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "حدث خطأ أثناء محاولة القراءة من '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "حدث خطأ غير معروف أثناء القراءة من '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "إضافة المخزن '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "اسم ملف المخزن غير صالح في '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "إزالة المخزن '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "لا يمكن معرفة مكان تخزين المخزن."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "لا يمكن حذف '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "لا يمكن معرفة مكان تخزين الخدمة."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "سلسلة استعلام URL لبروتوكول LDAP غير صالحة"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "معلمة استعلام URL لبروتوكول LDAP ‏'%s' غير صالحة"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "تعذر استنساخ كائن Url"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "مرجع كائن Url فارغ غير صالح"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "تعذر تحليل مكونات Url"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "غير معروف"
@@ -4020,7 +3940,7 @@ msgstr "مطلوب عقد عميل إضافي للحصول على الدعم."
 msgid "Unknown support option. Description not available"
 msgstr "خيار دعم غير معروف. الوصف غير متاح"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4029,11 +3949,6 @@ msgstr ""
 "يتم قفل إدارة النظام بواسطة التطبيق الذي يتضمن معرف العملية %d (%s).\n"
 "الرجاء إغلاق هذا التطبيق قبل المحاولة مرة أخرى."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "المحفوظات:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4055,13 +3970,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "التعبير العادي '%s' غير صالح"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "التصديق '%s' مطلوب"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4069,8 +3985,8 @@ msgstr ""
 "تفضل بزيارة مركز عملاء SUSE للتحقق ما إذا كان التسجيل صالحًا وغير منته "
 "الصلاحية بعد."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4099,7 +4015,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "لم يتم فتح الوسيط أثناء محاولة تنفيذ الإجراء '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "لم يتم العثور على الملف '%s' في الوسيط '%s'"
@@ -4205,7 +4121,7 @@ msgid "Permission to access '%s' denied."
 msgstr "تم رفض إذن الوصول إلى '%s'."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "تم تجاوز المهلة عند الوصول إلى '%s'."
@@ -4216,7 +4132,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "تجاوزت البيانات المحملة حجم الملف ,الحجم المتوقع للملف '%s' من '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "يتعذر الوصول إلى الموقع '%s' مؤقتًا."
@@ -4233,7 +4149,7 @@ msgid ""
 msgstr ""
 "إنشاء نقطة إرفاق: لا يمكن العثور على دليل قابل للكتابة لإنشاء نقطة إرفاق"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "أسلوب تصديق HTTP غير مدعوم '%s'"
@@ -4293,7 +4209,7 @@ msgid "No url in repository."
 msgstr "لا يوجد عنوان url في المخزن."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4458,7 +4374,7 @@ msgstr "توقيف %s عن طريق تجاهل بعض تبعياتها"
 msgid "generally ignore of some dependencies"
 msgstr "تجاهل بشكل عام لبعض التبعيات"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4466,161 +4382,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "طلبات متعارضة"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "بعض مشكلات التبعية"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "الطلب غير مدعوم"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "الموفرون المحذوفون: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4628,122 +4534,106 @@ msgstr ""
 "\n"
 "موفرون غير قابلين للتثبيت: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "الموفرون غير القابلين للتثبيت: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "سيؤدي هذا الطلب إلى تعطل النظام!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "تجاهل تحذير النظام المعطل"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "بتثبيت %1% على الرغم من أنه تم سحبه"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "تسمح بتثبيت  PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "تثبيت %1% على الرغم من أنه مدرج في القائمة السوداء"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4752,209 +4642,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "لا ينتمي %s إلى مخزن ترقية التوزيع"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "هيكل %s غير ملائم"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "توجد مشكلة بالحزمة المثبتة %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "لا يوجد مصدر لتوفير %s المطلوب"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "هل قمت بتمكين كل المخازن المطلوبة؟"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "الحزمة %s غير موجود"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "يتم توفير %s من خلال النظام ولا يمكن حذفه"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s غير قابل للتثبيت"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "لا يوجد مصدر لتوفير %s المطلوب من قبل %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "لا يمكن تثبيت كل من %s و%s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "يتعارض %s مع %s المتوفر من قبل %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s يُبطِل %s المتوفر من قبل %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s المثبَت سيُبطل %s الموفَر بواسطة %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "المشكلة القابلة للحل %s تتعارض مع %s المتوفرة من نفسها"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s يتطلب %s، ولكن لا يمكن توفير هذا المتطلب"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "إزالة القفل للسماح بالحذف %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "عدم تثبيت %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "الاحتفاظ بـ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "إزالة القفل للسماح بالتثبيت %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "عدم طلب تثبيت المشاكل القابلة للحل التي توفر %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "عدم طلب حذف كل المشاكل القابلة للحل التي توفر %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "عدم تثبيت أحدث إصدار من %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "الحفاظ على %s بغض النظر عن الهيكل غير الملائم"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "تثبيت %s بغض النظر عن الهيكل غير الملائم"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "الحفاظ على %s القديمة"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "تثبيت %s من المخزن المستبعد"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "تخفيض إصدار %s إلى %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "تغيير الهيكل الخاص بـ %s إلى %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"تثبيت %s (مع تغيير البائع)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "استبدال %s بـ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "إلغاء تثبيت %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4972,74 +4673,78 @@ msgstr "جارٍ تنفيذ برامج %posttrans النصية"
 msgid "Installation has been aborted as directed."
 msgstr "تم إيقاف التثبيت وفقًا للتعليمات."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " مُنفَّذ"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " فشل التنفيذ"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "تم تنفيذ %s بالفعل كـ %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " تم تخطي التنفيذ أثناء الإيقاف"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "حدث خطأ أثناء إرسال رسالة إعلام بالتحديث."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "رسالة تحديث جديد"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "فشل RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "فشل استيراد المفتاح العمومي %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "أخفقت إزالة المفتاح العام %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "لم يتم توقيع الحزمة!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "ملفات التكوين التي تم تغييرها لـ %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "قامت rpm بحفظ %s باعتبارها %s، ولكن تعذر تحديد الفرق"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5049,13 +4754,13 @@ msgstr ""
 "فيما يلي أول 25 سطرًا من سطور الفرق:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "قامت rpm بإنشاء %s باعتبارها %s، ولكن تعذر تحديد الفرق"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5066,145 +4771,357 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "مخرجات rpm إضافية"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "تم إنشاء النسخة الاحتياطية %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "تمت المصادقة على التوقيع"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "نوع التوقيع غير معروف"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "تعذر التحقق من التوقيع"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "تمت المصادقة على التوقيع، لكن المفتاح غير موثوق به"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "تواقيع المفتاح العمومي غير متوفرة"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "الملف غير موجود أو لا يمكن التحقق من توقيعه"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "الملف غير موقع"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+"النوع المشكوك فيه '%s' للمجموع الاختباري لوحدات البايت %u الذي يبلغ '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "تعذر فتح pty (‏%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "لا يمكن فتح المسار (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "سلسلة استعلام URL لبروتوكول LDAP غير صالحة"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "معلمة استعلام URL لبروتوكول LDAP ‏'%s' غير صالحة"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "تعذر استنساخ كائن Url"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "مرجع كائن Url فارغ غير صالح"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "تعذر تحليل مكونات Url"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "المحفوظات:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "لا يسمح مخطط Url بـ %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "مكون %s غير صالح '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "مكون %s غير صالح"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "تحليل سلسلة الاستعلام غير مدعوم لعنوان URL هذا"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "يعتبر مخطط Url مكونًا مطلوبًا"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "مخطط Url '%s' غير صالح"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "لا يسمح مخطط Url بإدخال اسم مستخدم"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "لا يسمح مخطط Url بإدخال كلمة سر"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "يتطلب مخطط Url وجود مكون مضيف"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "لا يسمح مخطط Url بوجود مكون مضيف"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "مكون المضيف '%s' غير صالح"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "لا يسمح مخطط Url بإدخال منفذ"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "مكون المنفذ '%s' غير صالح"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "يتطلب مخطط Url وجود اسم مسار"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "غير مسموح بالمسار النسبي في حالة وجود سلطة"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "تحتوي السلسلة المُرمَّزة على وحدة بايت NUL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "حرف تقسيم مصفوفة المعلمات الفاصل غير صالح"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "حرف تقسيم مخطط المعلمات الفاصل غير صالح"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "حرف ربط مصفوفة المعلمات الفاصل غير صالح"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "تم إنهاء الأمر بالحالة %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "تم إنهاء الأمر بواسطة الإشارة %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "تم إنهاء الأمر بخطأ غير معروف."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "لا يمكن تغيير الجذر الافتراضي إلى '%s' (‏%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "لا يمكن تغيير الدليل الافتراضي إلى '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
+"لا يمكن إجراء تغيير الدليل الافتراضي إلى '%s' داخل تغيير الجذر الافتراضي "
+"'%s' (‏%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "لا يمكن تنفيذ '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "تعذر تقسيم (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "لا ينتمي %s إلى مخزن ترقية التوزيع"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "هيكل %s غير ملائم"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "توجد مشكلة بالحزمة المثبتة %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "لا يوجد مصدر لتوفير %s المطلوب"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "هل قمت بتمكين كل المخازن المطلوبة؟"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "الحزمة %s غير موجود"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "يتم توفير %s من خلال النظام ولا يمكن حذفه"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s غير قابل للتثبيت"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "لا يوجد مصدر لتوفير %s المطلوب من قبل %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "لا يمكن تثبيت كل من %s و%s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "يتعارض %s مع %s المتوفر من قبل %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s يُبطِل %s المتوفر من قبل %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s المثبَت سيُبطل %s الموفَر بواسطة %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "المشكلة القابلة للحل %s تتعارض مع %s المتوفرة من نفسها"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s يتطلب %s، ولكن لا يمكن توفير هذا المتطلب"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "إزالة القفل للسماح بالحذف %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "عدم تثبيت %s"
+
+#~ msgid "keep %s"
+#~ msgstr "الاحتفاظ بـ %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "إزالة القفل للسماح بالتثبيت %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "عدم طلب تثبيت المشاكل القابلة للحل التي توفر %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "عدم طلب حذف كل المشاكل القابلة للحل التي توفر %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "عدم تثبيت أحدث إصدار من %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "الحفاظ على %s بغض النظر عن الهيكل غير الملائم"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "تثبيت %s بغض النظر عن الهيكل غير الملائم"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "الحفاظ على %s القديمة"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "تثبيت %s من المخزن المستبعد"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "تخفيض إصدار %s إلى %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "تغيير الهيكل الخاص بـ %s إلى %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "تثبيت %s (مع تغيير البائع)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "استبدال %s بـ %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "إلغاء تثبيت %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "لا يمكن فتح ملف القفل: %s"
index 88cc12d..d9d83ad 100644 (file)
--- a/po/be.po
+++ b/po/be.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2006-01-04 08:58+0100\n"
 "Last-Translator: Alexander Nyakhaychyk <nyakhaychyk@gmail.com>\n"
 "Language-Team: Belarusian <i18n@suse.de>\n"
@@ -17,12 +17,6 @@ msgstr ""
 "Plural-Forms: Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n"
 "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 #, fuzzy
 msgid "Unknown country: "
@@ -1318,71 +1312,21 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr ""
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr ""
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr ""
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr ""
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -3858,52 +3802,52 @@ msgstr[2] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr ""
@@ -3911,44 +3855,44 @@ msgstr ""
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr ""
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "Дадаць уключаныя сховішчы"
@@ -3959,68 +3903,47 @@ msgstr "Дадаць уключаныя сховішчы"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Невядомая опцыя для каманды '%1': %2"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Даданне ўключаных сховішчаў..."
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Выдаленне непатрэбных сховішчаў..."
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "невядомы"
@@ -4087,18 +4010,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4120,20 +4038,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Памылковае значэнне для опцыі '%1': %2"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4160,7 +4079,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4263,7 +4182,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4274,7 +4193,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4290,7 +4209,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4349,7 +4268,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4466,7 +4385,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4474,282 +4393,256 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4758,209 +4651,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-#, fuzzy
-msgid "Have you enabled all requested repositories?"
-msgstr "Выдаліць непатрэбныя сховішчы"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr ""
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "Захаваць налады ўсталёўкі"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Захаваць налады ўсталёўкі"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4977,74 +4682,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr ""
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Змяніць канфігурацыю IrDA"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5052,13 +4761,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5067,146 +4776,270 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr ""
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, fuzzy, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Памылковае значэнне для опцыі '%1': %2"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, fuzzy, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Памылковае значэнне для опцыі '%1': %2"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Выдаліць непатрэбныя сховішчы"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "Захаваць налады ўсталёўкі"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Захаваць налады ўсталёўкі"
+
 #, fuzzy
 #~ msgid "Unable to create dbus connection"
 #~ msgstr "Праверыць інтэрнэт злучэнне"
index 5e24f5e..7de8330 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.bg\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2017-10-23 11:43+0000\n"
 "Last-Translator: Dimitar Zahariev <mitko@tuionui.com>\n"
 "Language-Team: Bulgarian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -24,12 +24,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 2.13.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Съмнителен тип '%s' за %u, код за проверка '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Неизвестна държава: "
@@ -1448,74 +1442,23 @@ msgstr "Подобрява"
 msgid "Supplements"
 msgstr "Допълва"
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Възникнала е грешка при отварянето на %s: %m"
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Възникнала е грешка при отварянето на %s: %m"
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Възникнала е грешка при отварянето на %s: %m"
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Команда за изпълнение при свързване"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Неуспешно зареждане на модула \"%s\"."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Неуспешно зареждане на модула \"%s\"."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "KScreensaver не е открит."
@@ -4012,52 +3955,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Неуспешно зареждане на модула \"%s\"."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Файлът не може да бъде отворен за запис."
@@ -4065,43 +4008,43 @@ msgstr "Файлът не може да бъде отворен за запис.
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Не може да се създаде %s: %m\n"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Достъпът до носителя за обновяване на драйверите е неуспешен."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4111,69 +4054,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Грешка при четенето от дискетата."
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "невалидно име на услуга '%1'."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "%s не може да бъде инсталиран"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-#, fuzzy
-msgid "Invalid empty Url object reference"
-msgstr "Невалидно име за празно действие за услугата '%1'"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "неизвестно"
@@ -4240,19 +4161,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-#, fuzzy
-msgid "History:"
-msgstr "Преглед на историята"
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4274,20 +4189,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "невалидно име на услуга '%1'."
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4314,7 +4230,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4417,7 +4333,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4428,7 +4344,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4444,7 +4360,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4505,7 +4421,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4624,7 +4540,7 @@ msgstr "Пренебрегване на това изискване само т
 msgid "generally ignore of some dependencies"
 msgstr "Пренебрегване на това изискване само тук"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4632,286 +4548,260 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "%s не може да бъде инсталиран поради пробем със зависимостите"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "Никой не доставя %s"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "Няма инсталируеми доставчици на %s"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Няма инсталируеми доставчици на %s"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4920,208 +4810,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s доставя %s, но има друга архитектура."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "Никой не доставя %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Пакетът не е подписан"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s е заключен и не може да бъде деинсталиран."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "Инсталирането на %s бе неуспешно"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s е необходим на %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%s не може да бъде инсталиран"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s е в конфликт с %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s прави ненужно %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s прави ненужно %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s е в конфликт с %s"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "без инсталиране на %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "запазване на %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "без инсталиране на %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "Няма инсталируеми доставчици на %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "Без инсталиране или премахване на конфликтните пакети"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s доставя %s, но има друга архитектура."
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "Инсталиране на %s, въпреки че ще промени архитектурата"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s прави ненужно %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "Обновяване на %s към %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Инсталиране"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5138,12 +4841,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "Настройването чрез %s бе неуспешно."
@@ -5151,65 +4854,69 @@ msgstr "Настройването чрез %s бе неуспешно."
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "пропадна."
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 #, fuzzy
 msgid "Package is not signed!"
 msgstr "Пакетът има невалидна сигнатура."
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Променени файлове с настройки за %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm запази %s като %s, но е невъзможно да се открие разликата"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5219,13 +4926,13 @@ msgstr ""
 "Ето първите 25 реда от разликите:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm създаде %s като %s, но е невъзможно да се открие разликата"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5236,150 +4943,347 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Допълнителен изход от rpm:"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "създадено резервно копие %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "KScreensaver не е открит."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "KScreensaver не е открит."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "KScreensaver не е открит."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Съмнителен тип '%s' за %u, код за проверка '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Възникнала е грешка при отварянето на %s: %m"
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Възникнала е грешка при отварянето на %s: %m"
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+#, fuzzy
+msgid "Invalid empty Url object reference"
+msgstr "Невалидно име за празно действие за услугата '%1'"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+#, fuzzy
+msgid "History:"
+msgstr "Преглед на историята"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, fuzzy, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "невалидно име на услуга '%1'."
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, fuzzy, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Невалидна информация"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, fuzzy, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "невалидно име на услуга '%1'."
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Команда за изпълнение при свързване"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Възникнала е грешка при отварянето на %s: %m"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s доставя %s, но има друга архитектура."
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "Никой не доставя %s"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "Пакетът не е подписан"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s е заключен и не може да бъде деинсталиран."
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "Инсталирането на %s бе неуспешно"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s е необходим на %s"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%s не може да бъде инсталиран"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s е в конфликт с %s"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s прави ненужно %s"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s прави ненужно %s"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s е в конфликт с %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "без инсталиране на %s"
+
+#~ msgid "keep %s"
+#~ msgstr "запазване на %s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "без инсталиране на %s"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "Няма инсталируеми доставчици на %s"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "Без инсталиране или премахване на конфликтните пакети"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s доставя %s, но има друга архитектура."
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "Инсталиране на %s, въпреки че ще промени архитектурата"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s прави ненужно %s"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "Обновяване на %s към %s"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Инсталиране"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Възникнала е грешка при отварянето на %s: %m"
index 5994e5e..eb23ced 100644 (file)
--- a/po/bn.po
+++ b/po/bn.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: @PACKAGE@\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2005-07-29 15:37+0530\n"
 "Last-Translator: Priyavert Sharma<priyavert.sharma@agreeya.com>\n"
 "Language-Team: AgreeYa Solutions <linux_team@agreeya.com>\n"
@@ -13,12 +13,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
 "\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "অজানা দেশ: "
@@ -1292,74 +1286,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "ফাইল খোলা যাচ্ছে না %1."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "%s খুঁজে পায় না।"
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "%s খুঁজে পায় না।"
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "সংযোগ সাধনের সময়ে আদেশ সম্পন্ন হয়েছে"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "এন্ট্রি পাওয়া যায়নি"
@@ -3766,52 +3709,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "লেখার জন্যে ফাইল খুলতে পারে না।"
@@ -3819,44 +3762,44 @@ msgstr "লেখার জন্যে ফাইল খুলতে পার
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "'%s' ডেস্কটপ বস্তু খুলতে পারে না"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "ডায়রেক্টরি %1: %2 তৈরী করা যাচ্ছে না"
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3866,68 +3809,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ফ্লপি ডিস্ক থেকে পড়ায় ত্রুটি।"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "রপ্তানি ফাইলনাম অবৈধ৷"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "সংস্থান পুনঃস্থাপন করছে"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' ডেস্কটপ বস্তু খুলতে পারে না"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "অবৈধ LDAP URL অনুসন্ধান স্ট্রিং"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "অবৈধ LDAP URL অনুসন্ধান প্যারামিটার '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Url অনজেক্ট ক্লোন করতে অক্ষম"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "অবৈধ খালি Url অবজেক্ট রেফারেন্স"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Url কম্পোনেন্ট পার্স করতে অক্ষম"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "অজানা"
@@ -3994,18 +3916,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4027,20 +3944,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "অবৈধ Url যোজনা %s"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, fuzzy, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "সত্যতা যাচাইয়ের ধরন"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4067,7 +3985,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "রিপোসিটারিতে ফাইল %1 পাওয়া যায়নি"
@@ -4171,7 +4089,7 @@ msgid "Permission to access '%s' denied."
 msgstr "অনুমতি প্রত্যাখ্যাত"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4182,7 +4100,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4198,7 +4116,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4264,7 +4182,7 @@ msgid "No url in repository."
 msgstr "রিপোসিটারিতে ফাইল %1 পাওয়া যায়নি"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4383,7 +4301,7 @@ msgstr "কিছু অমীমাংসিত আবশ্যকতা আছ
 msgid "generally ignore of some dependencies"
 msgstr "কিছু অমীমাংসিত আবশ্যকতা আছে..."
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4391,288 +4309,262 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "এর সাথে সংযোগের অনুরোধ: "
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "নির্ভরতা সমস্যাগুলির কারণে %s স্থাপন করতে পারে না"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "কোনওটাই %s প্রদান করে না"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%s এর কোনও বিকল্প স্থাপনযোগ্য প্রদানকারী নেই"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%s এর কোনও বিকল্প স্থাপনযোগ্য প্রদানকারী নেই"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "ইতিমধ্যে এই অনুরোধ করা হয়ে গিয়েছে"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4681,208 +4573,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s %s প্রদান করে, কিন্তু এটার অন্য একটা আর্কিটেকচার আছে।"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "প্যাকেজ আনইনস্টল করার আদেশ"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "কোনওটাই %s প্রদান করে না"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "সার্টিফিকেট %1 অনুপস্থিত"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s লক করা আছে এবং আনইন্সটল করা যাবে না ।"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "ইনস্টল করা হয় নি"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s এর %s দরকার"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "in/ssTklইনস্টল করা যাবে না"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s-এর সঙ্গে %s-এর দ্বন্দ্ব"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s %sকে প্রাচীন করে দিয়েছে"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s %sকে প্রাচীন করে দিয়েছে"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s-এর সঙ্গে %s-এর দ্বন্দ্ব"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s ইন্সটল করে না"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s রাখুন"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "%s ইন্সটল করে না"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "%s এর কোনও বিকল্প স্থাপনযোগ্য প্রদানকারী নেই"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "%1 এর দ্বন্দ্ব %2 এর সাথে"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s %s প্রদান করে, কিন্তু এটার অন্য একটা আর্কিটেকচার আছে।"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "%s স্থাপন করুন যদিও এটা আর্কিটেকচার পালটে দেবে"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s %sকে প্রাচীন করে দিয়েছে"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "%s থেকে %s ডাউনলোড করেছে"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "স্থাপন"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4899,12 +4604,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "নির্দেশমত স্থাপনা বাতিল করা হয়েছে।"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "সম্পাদন করুন"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4912,65 +4617,69 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "কী এনক্রিপশনে ত্রুটি"
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "ব্যর্থ"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr " %s-এর জন্য পরিবর্তিত কনফিগারেশন ফাইলসমূহ :"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm %s কে %sরূপে সংরক্ষণ করেছিল ,কিন্তু পার্থক্য নিরূপণ করা অসম্ভব হয়েছিল "
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4980,13 +4689,13 @@ msgstr ""
 "এখানে পার্থক্যের প্রথম ২৫ টি লাইন দেওয়া আছে:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm %s কে %sরূপে সংরক্ষণ করেছিল ,কিন্তু পার্থক্য নিরূপণ করা  অসম্ভব হয়েছিল "
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4997,150 +4706,349 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "অতিরিক্ত তথ্য"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s ব্যাকআপ তৈরী করছে"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "এন্ট্রি পাওয়া যায়নি"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "এন্ট্রি পাওয়া যায়নি"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "এন্ট্রি পাওয়া যায়নি"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "ফাইল খোলা যাচ্ছে না %1."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "অবৈধ LDAP URL অনুসন্ধান স্ট্রিং"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "অবৈধ LDAP URL অনুসন্ধান প্যারামিটার '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Url অনজেক্ট ক্লোন করতে অক্ষম"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "অবৈধ খালি Url অবজেক্ট রেফারেন্স"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Url কম্পোনেন্ট পার্স করতে অক্ষম"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Url যোজনা %s এর অনুমতি দেয় না"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "অবৈধ %s কম্পোনেন্ট %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "অবৈধ %s কম্পোনেন্ট"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "এই URL এর জন্যে স্ট্রিং পার্সিং সমর্থিত নয়"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Url যোজনা একটি আবশ্যিক কম্পোনেন্ট"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "অবৈধ Url যোজনা %s"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url যোজনা ব্যবহারকারীর নামের অনুমতি দেয় না"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url যোজনা পাসওয়ার্ডের অনুমতি দেয় না"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url যোজনার জন্য হোস্ট কম্পোনেন্ট"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Url যোজনা হোস্ট কম্পোনেন্ট-এর অনুমতি দেয় না"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "অবৈধ হোস্ট কম্পোনেন্ট '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Url যোজনা পোর্টের অনুমতি দেয় না"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "অবৈধ পোর্ট কম্পোনেন্ট '%s' "
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url যোজনার জন্য পথের নাম দরকার"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "অথরিটি বিদ্যমান থাকলে রিলেটিভ পথের অনুমতি নেই"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "এনকোডেড স্ট্রিংয়ে NUL বাইট আছে"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "অবৈধ প্যারামিটার এরে স্প্লিট সেপারেটর ক্যারেক্টার"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "অবৈধ প্যারামিটার ম্যাপ স্প্লিট সেপারেটর ক্যারেক্টার"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "অবৈধ প্যারামিটার এরে জয়েন সেপারেটর ক্যারেক্টার"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "সংযোগ সাধনের সময়ে আদেশ সম্পন্ন হয়েছে"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "%s খুঁজে পায় না।"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "%s খুঁজে পায় না।"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s %s প্রদান করে, কিন্তু এটার অন্য একটা আর্কিটেকচার আছে।"
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "প্যাকেজ আনইনস্টল করার আদেশ"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "কোনওটাই %s প্রদান করে না"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "সার্টিফিকেট %1 অনুপস্থিত"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s লক করা আছে এবং আনইন্সটল করা যাবে না ।"
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "ইনস্টল করা হয় নি"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s এর %s দরকার"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "in/ssTklইনস্টল করা যাবে না"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s-এর সঙ্গে %s-এর দ্বন্দ্ব"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s %sকে প্রাচীন করে দিয়েছে"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s %sকে প্রাচীন করে দিয়েছে"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s-এর সঙ্গে %s-এর দ্বন্দ্ব"
+
+#~ msgid "do not install %s"
+#~ msgstr "%s ইন্সটল করে না"
+
+#~ msgid "keep %s"
+#~ msgstr "%s রাখুন"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "%s ইন্সটল করে না"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "%s এর কোনও বিকল্প স্থাপনযোগ্য প্রদানকারী নেই"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "%1 এর দ্বন্দ্ব %2 এর সাথে"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s %s প্রদান করে, কিন্তু এটার অন্য একটা আর্কিটেকচার আছে।"
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "%s স্থাপন করুন যদিও এটা আর্কিটেকচার পালটে দেবে"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s %sকে প্রাচীন করে দিয়েছে"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "%s থেকে %s ডাউনলোড করেছে"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "স্থাপন"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "ফাইল খোলা যাচ্ছে না %1."
index d78800d..74442ff 100644 (file)
--- a/po/bs.po
+++ b/po/bs.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2002-07-23 18:27+0200\n"
 "Last-Translator: Damir Bjelobradic <Nagual@lugbih.org>\n"
 "Language-Team: Bosnian <i18n@suse.de>\n"
@@ -20,12 +20,6 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1467,74 +1461,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Couldn't open file: %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Naredba koja se izvršava pri spajanju"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -4269,52 +4212,52 @@ msgstr[2] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -4322,44 +4265,44 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ne mogu pokrenuti naredbu \"%s\""
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4369,68 +4312,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Ne mogu pokrenuti naredbu \"%s\""
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "nepoznat"
@@ -4498,18 +4420,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4531,20 +4448,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4571,7 +4489,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4674,7 +4592,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4685,7 +4603,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4701,7 +4619,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4762,7 +4680,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4879,7 +4797,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4887,283 +4805,257 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "&Nemoj instalirati"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -5172,208 +5064,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "Nova instalacija"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Instaliram driver..."
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, fuzzy, c-format, boost-format
-msgid "do not install %s"
-msgstr "Instaliram driver..."
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "Instaliram driver..."
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "Instaliram driver..."
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "Izbrii"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Instaliram driver..."
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5390,12 +5095,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "%s podešavanje nije uspjelo."
@@ -5403,63 +5108,67 @@ msgstr "%s podešavanje nije uspjelo."
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Editor konfiguracijskih datoteka"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5467,13 +5176,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5482,147 +5191,288 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "&Dodatne informacije za korisnika"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Naredba koja se izvršava pri spajanju"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "Nova instalacija"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Instaliram driver..."
+
+#, fuzzy
+#~ msgid "do not install %s"
+#~ msgstr "Instaliram driver..."
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "Instaliram driver..."
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "Instaliram driver..."
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "Izbrii"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Instaliram driver..."
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Couldn't open file: %s."
index 16d6864..664e93c 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-05-01 01:58+0000\n"
 "Last-Translator: David Medina <medipas@gmail.com>\n"
 "Language-Team: Catalan <https://l10n.opensuse.org/projects/libzypp/master/ca/"
@@ -20,12 +20,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.6\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tipus dubtós %s per a byte %u, suma de verificació \"%s\""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "País desconegut: "
@@ -1555,71 +1549,21 @@ msgstr "Millora"
 msgid "Supplements"
 msgstr "Complementa"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "No es pot obrir pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "No es pot obrir pipe (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "No es pot fer chroot a \"%s\" (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "No es pot fer chdir a \"%s\" dins chroot \"%s\" (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "No es pot fer chdir a \"%s\" (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "No es pot executar \"%s\" (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "No es pot bifurcar (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "L'ordre ha acabat amb l'estatus %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "L'ordre s'ha aturat a causa del senyal %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "L'ordre s'ha executat sense que hi hagués cap error conegut."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "S'ha provat d'importar la clau no existent %s a l'anell de claus %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Ha fallat importar la clau."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Error a l'hora d'esborrar la clau."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "El fitxer de la firma diginal %s no s'ha trobat"
@@ -4163,52 +4107,52 @@ msgstr[1] "(caduca d'aquí a %d dies)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Cercant la clau gpg amb l'ID %1% a la cau %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Cercant la clau gpg amb l'ID %1% al repositori %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "El repositori %1% no defineix URL \"gpgkey=\" addicionals."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "No es pot llegir el directori del repositori %1%: permís denegat"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Error a l'hora de llegir el directori %s"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "No es pot llegir el fitxer de repositori %1%: permís denegat"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "L'àlies del repositori no pot començar amb un punt."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "L'àlies del servei no pot començar amb un punt."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "No es pot obrir el fitxer %s per a l'escriptura."
@@ -4216,44 +4160,44 @@ msgstr "No es pot obrir el fitxer %s per a l'escriptura."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Servei desconegut \"%1%\": suprimint el repositori de serveis orfe %2%"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "No s'han trobat metadades vàlides a l'URL especificat"
 msgstr[1] "No s'han trobat metadades vàlides als URL especificats"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "No es pot crear %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "No es pot crear el directori cau de metadades."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construint la memòria cau del repositori %s"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "No es pot crear la memòria cau a %s - no se'n té permisos d'escriptura."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Error a l'hora de carregar el repositori (%d) a la memòria cau."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Tipus de repositori no manejat"
 
@@ -4263,68 +4207,47 @@ msgstr "Tipus de repositori no manejat"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Error en intentar llegir de '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Error desconegut a l'hora de llegir '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Afegint el repositori %s"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nom de repositori no vàlid a \"%s\""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Suprimint el repositori %s"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "No es pot esbrinar on es desa el repositori."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "No es pot esborrar %s"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "No s'ha sabut trobar on es guarda el servei."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "La cadena de consulta de l'URL de l'LDAP no és vàlida"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "El paràmetre de consulta de l'URL de l'LDAP \"%s\" no és vàlid"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "No es pot clonar l'objecte de l'URL"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "La referència d'objecte de l'URL buit no és vàlida"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "No es poden analitzar els components de l'URL"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "desconegut"
@@ -4401,7 +4324,7 @@ msgstr "Un contracte addicional de client és necessari per obtenir-ne suport."
 msgid "Unknown support option. Description not available"
 msgstr "Opció de suport desconeguda. No n'hi ha descripció disponible."
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4410,11 +4333,6 @@ msgstr ""
 "La gestió del sistema està blocada per l'aplicació amb el pid %d (%s).\n"
 "Tanqueu aquesta aplicació abans de tornar-ho a provar."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historial:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4436,13 +4354,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expressió regular no vàlida: \"%s\""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Cal autenticació per a '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4450,8 +4369,8 @@ msgstr ""
 "Visiteu el Centre de clientela de SUSE per comprovar si el vostre registre "
 "és vàlid i no ha caducat."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4480,7 +4399,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Mitjà no obert quan s'intentava fer l'acció \"%s\"."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "El fitxer %s no s'ha trobat al mitjà %s"
@@ -4587,7 +4506,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Permís per accedir a %s denegat."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "S'ha acabat el temps d'espera accedint a %s."
@@ -4599,7 +4518,7 @@ msgstr ""
 "Les dades baixades excedeixen la mida de fitxer esperada \"%s\" de \"%s\"."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "El lloc \"%s\" és temporalment inaccessible."
@@ -4619,7 +4538,7 @@ msgstr ""
 "Crea un punt d'adjunció: no es pot trobar un directori d'escriptura per "
 "crear un punt d'adjunció."
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Mètode d'autenticació HTTP no suportat \"%s\""
@@ -4680,7 +4599,7 @@ msgid "No url in repository."
 msgstr "No URL al repositori."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4846,7 +4765,7 @@ msgstr "trenca %s ignorant-ne algunes de les dependències"
 msgid "generally ignore of some dependencies"
 msgstr "ignora generalment algunes dependències"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4856,93 +4775,87 @@ msgstr ""
 "distribució i s'ha de reemplaçar"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "el %1% per instal·lar no pertany a un repositori d'actualització de la "
 "distribució"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "el %1% instal·lat té una arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "el %1% per instal·lar té una arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problema amb el %1% instal·lat"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "demandes conflictives"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "problemes de dependències"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "no hi ha res que proporcioni el %1% requerit"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Heu habilitat tots els repositoris requerits?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "el paquet requerit %1% no existeix"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "petició no suportada"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "%1% és proporcionat pel sistema i no es pot esborrar"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% no és instal·lable"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "no hi ha res que proporcioni %1%, necessari per al %2% instal·lat"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "no hi ha res que proporcioni %1%, necessari per al %2% per instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "no es poden instal·lar tots dos: %1% i %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "el %1% instal·lat té conflicte amb %2%, proporcionat per l'instal·lat %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4950,14 +4863,14 @@ msgstr ""
 "el %1% instal·lat té conflicte amb el %2%, proporcionat per %3% per "
 "instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "el %1% per instal·lar té conflicte amb %2%, proporcionat per l'instal·lat %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4966,47 +4879,47 @@ msgstr ""
 "el %1% per instal·lar té conflicte amb el %2%, proporcionat per %3% per "
 "instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "el %1% instal·lat fa obsolet %2%, proporcionat per l'instal·lat %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "el %1% instal·lat fa obsolet %2%, proporcionat per %3% per instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "el %1% per instal·lar fa obsolet %2%, proporcionat per l'instal·lat %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "el %1% per instal·lar fa obsolet %2%, proporcionat per %3% per instal·lar"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "el %1% instal·lat té conflicte amb %2%, proporcionat per si mateix"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "el %1% per instal·lar té conflicte amb %2%, proporcionat per si mateix"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "el %1% instal·lat requereix %2%, però aquest requisit no es pot proporcionar"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -5015,15 +4928,11 @@ msgstr ""
 "el %1% per instal·lar requereix %2%, però aquest requisit no es pot "
 "proporcionar"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "proveïdors suprimits: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -5031,122 +4940,106 @@ msgstr ""
 "\n"
 "proveïdors no desistal·lables: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "proveïdors no desinstal·lables: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "suprimeix el bloqueig per permetre la supressió de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "no instal·lis %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "mantén %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "suprimeix el bloqueig per permetre la instal·lació de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Aquesta petició trencarà l'estabilitat del sistema!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignora l'avís de sistema trencat"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "no preguntis la instal·lació d'un resoluble que proporcioni %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "no preguntis la supressió de tots els resolubles que proporcionin %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "no instal·lis la versió més recent de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "mantén %1% malgrat l'arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "instal·la %1% malgrat l'arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "mantén obsolet %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "instal·la %1% des d'un repositori exclòs"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "instal·la %1% tot i que ha estat retret"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "permet instal·lar el PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instal·la %1% tot i que és a la llista negra"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "degradació de %1% a %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "canvi d'arquitectura de %1% a %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -5157,211 +5050,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "reemplaçament de %1% per %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "desinstal·lació de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s no pertany a un repositori d'actualització de la distribució"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s té una arquitectura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problema amb el paquet instal·lat %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "Res proporciona %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Heu habilitat tots els repositoris demanats?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "el paquet %s no existeix"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s està proveït pel sistema i no es pot esborrar"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s no és instal·lable"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "Res proporciona %s, necessari per a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "No es poden instal·lar %s i %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s entra en conflicte amb %s, proveït per %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s fa(n) obsolet(s) %s proveït(s) per %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-"el(s) paquets(s) instal·lat(s) %s fa(n) obsolet(s) %s proporcionat(s) per %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "la resolució %s entra en conflicte amb %s, proporcionat per si mateix"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s necessita %s, però aquest requeriment no es pot satisfer"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "suprimeix el bloqueig per permetre la supressió de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "no instal·lis %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "mantén %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "suprimeix el bloqueig per permetre la instal·lació de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "no demanis instal·lar un resoluble que proporcioni %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "no demanis suprimir tots els resolubles que proporcionin %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "no instal·lis la versió més recent de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "mantén %s malgrat l'arquitectura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "instal·la %s, encara que tingui una arquitectura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "deixa obsolet %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "instal·la %s del repositori exclòs"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "degradació de %s a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "canvi d'arquitectura de %s a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"instal·la %s (amb canvi de proveïdor)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "reemplaçament de %s per %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "desinstal·lació de %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5378,69 +5081,73 @@ msgstr "Executant scripts %posttrans"
 msgid "Installation has been aborted as directed."
 msgstr "La instal·lació s'ha avortat tal com heu indicat."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " executat"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " ha fallat l'execució"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s ja s'ha executat com a %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " execució omesa mentre s'avortava"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 "S'ha produït un error durant l'enviament de la notificació d'actualització."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nou missatge d'actualització"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "Ha fallat l'RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Error a l'hora d'importar la clau pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Ha fallat suprimir la clau pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "El paquet no està signat!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Fitxers de configuració modificats per a %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5448,7 +5155,7 @@ msgstr ""
 "diferència"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5458,7 +5165,7 @@ msgstr ""
 "Aquestes són les primeres 25 línies de diferència:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5466,7 +5173,7 @@ msgstr ""
 "diferència"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5477,150 +5184,362 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Sortida addicional de l'rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "còpia de seguretat creada %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "La signatura és correcta"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Tipus de signatura desconeguda"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "La signatura no es verifica"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "La signatura és correcta, però no és de confiança"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "La clau pública de signatures no està disponible"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "El fitxer no existeix o la signatura no es pot comprovar"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "El fitxer no està signat."
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Error de baixada (curl) per a %s.\n"
+"Codi de l'error: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Error de baixada (curl) per a %s.\n"
+"No es pot obtenir la resposta d'HTTP.\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tipus dubtós %s per a byte %u, suma de verificació \"%s\""
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "No es pot obrir pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "No es pot obrir pipe (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "La cadena de consulta de l'URL de l'LDAP no és vàlida"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "El paràmetre de consulta de l'URL de l'LDAP \"%s\" no és vàlid"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "No es pot clonar l'objecte de l'URL"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "La referència d'objecte de l'URL buit no és vàlida"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "No es poden analitzar els components de l'URL"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historial:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "L'esquema de l'URL no permet un %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "El component %s no és vàlid %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Component de %s no vàlid"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "No s'admet l'anàlisi de cadenes de consulta per a aquesta URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "L'esquema de l'URL és un component necessari"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "L'esquema de l'URL \"%s\" no és vàlid"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "L'esquema de l'URL no permet un nom d'usuari"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "L'esquema de l'URL no permet una contrasenya"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "L'esquema de l'URL requereix un component d'amfitrió"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "L'esquema de l'URL no permet un component d'amfitrió"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "El component d'amfitrió \"%s\" no és vàlid."
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "L'esquema de l'URL no permet un port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "El component de port \"%s\" no és vàlid"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "L'esquema de l'URL requereix un nom de camí"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "No es permet un camí relatiu si existeix una autoritat"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "La cadena codificada conté un byte NUL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "El caràcter separador de divisió de matriu de paràmetres no és vàlid"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 "El caràcter separador de divisió d'assignació de paràmetres no és vàlid"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "El caràcter separador d'unió de matriu de paràmetres no és vàlid"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "L'ordre ha acabat amb l'estatus %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "L'ordre s'ha aturat a causa del senyal %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "L'ordre s'ha executat sense que hi hagués cap error conegut."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Error de baixada (curl) per a %s.\n"
-"Codi de l'error: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "No es pot fer chroot a \"%s\" (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "No es pot fer chdir a \"%s\" (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "No es pot fer chdir a \"%s\" dins chroot \"%s\" (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "No es pot executar \"%s\" (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "No es pot bifurcar (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Error de baixada (curl) per a %s.\n"
-"No es pot obtenir la resposta d'HTTP.\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s no pertany a un repositori d'actualització de la distribució"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s té una arquitectura inferior"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problema amb el paquet instal·lat %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "Res proporciona %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Heu habilitat tots els repositoris demanats?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "el paquet %s no existeix"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s està proveït pel sistema i no es pot esborrar"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s no és instal·lable"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "Res proporciona %s, necessari per a %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "No es poden instal·lar %s i %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s entra en conflicte amb %s, proveït per %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s fa(n) obsolet(s) %s proveït(s) per %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr ""
+#~ "el(s) paquets(s) instal·lat(s) %s fa(n) obsolet(s) %s proporcionat(s) per "
+#~ "%s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr ""
+#~ "la resolució %s entra en conflicte amb %s, proporcionat per si mateix"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s necessita %s, però aquest requeriment no es pot satisfer"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "suprimeix el bloqueig per permetre la supressió de %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "no instal·lis %s"
+
+#~ msgid "keep %s"
+#~ msgstr "mantén %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "suprimeix el bloqueig per permetre la instal·lació de %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "no demanis instal·lar un resoluble que proporcioni %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "no demanis suprimir tots els resolubles que proporcionin %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "no instal·lis la versió més recent de %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "mantén %s malgrat l'arquitectura inferior"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "instal·la %s, encara que tingui una arquitectura inferior"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "deixa obsolet %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "instal·la %s del repositori exclòs"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "degradació de %s a %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "canvi d'arquitectura de %s a %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "instal·la %s (amb canvi de proveïdor)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "reemplaçament de %s per %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "desinstal·lació de %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "No es pot obrir el fitxer de blocatge: %s"
index 4b9081d..a189be8 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -19,11 +19,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-05-31 22:00+0000\n"
 "Last-Translator: Aleš Kastner <alkas@volny.cz>\n"
-"Language-Team: Czech <https://l10n.opensuse.org/projects/libzypp/master/cs/>"
-"\n"
+"Language-Team: Czech <https://l10n.opensuse.org/projects/libzypp/master/cs/"
+">\n"
 "Language: cs\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -31,12 +31,6 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 "X-Generator: Weblate 4.6.2\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Pochybný typ %s pro %u-bajtový kontrolní součet %s"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Neznámá země: "
@@ -1452,73 +1446,21 @@ msgstr "Vylepšuje"
 msgid "Supplements"
 msgstr "Doplňuje"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Nelze otevřít pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Nelze otevřít rouru (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Nelze změnit kořenový adresář na '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-"Nelze změnit adresář na '%s' uvnitř chrootem změněného kořenového adresáře "
-"'%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Nelze změnit adresář na '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Nelze spustit '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Nelze forknout (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Příkaz skončil se stavem %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Příkaz byl ukončen signálem %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Příkaz skončil s neznámou chybou."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Pokus o import neexistujícího klíče %s do klíčenky %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Nepodařilo se importovat klíč."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Nepodařilo se smazat klíč."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Soubor s podpisem %s nebyl nalezen"
@@ -3987,52 +3929,52 @@ msgstr[2] "(vyprší během %d dnů)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Hledám ID klíče gpg %1% v paměti %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Hledám ID klíče gpg %1% v úložišti %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Úložiště %1% nedefinuje přídavná URL 'gpgkey='."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Nelze číst z adresáře úložiště %1%: Přístup odepřen"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Chyba při čtení z adresáře %s"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Nelze přečíst soubor úložiště %1%: Přístup odepřen"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Alias úložiště nemůže začínat tečkou."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Alias služby nemůže začínat tečkou."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nelze otevřít soubor '%s' pro zápis."
@@ -4040,44 +3982,44 @@ msgstr "Nelze otevřít soubor '%s' pro zápis."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Neznámá služba '%1%': Odstraňuje se osiřelé úložiště služby '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Na zadané adrese URL nebyla nalezena platná metadata"
 msgstr[1] "Na zadaných adresách URL nebyla nalezena platná metadata"
 msgstr[2] "Na zadaných adresách URL nebyla nalezena platná metadata"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nelze vytvořit %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Nelze vytvořit adresář s mezipamětí metadat."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Vytváří se vyrovnávací paměť úložiště '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Nelze vytvořit mezipaměť v adresáři %s - chybí oprávnění k zápisu."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Chyba při načítání úložiště do mezipaměti (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Nepodporovaný typ úložiště"
 
@@ -4087,68 +4029,47 @@ msgstr "Nepodporovaný typ úložiště"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Chyba při čtení z '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Neznámá chyba při čtení z '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Přidává se úložiště %s"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Název souboru úložiště na adrese URL „%s“ je neplatný"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Odebírá se úložiště %s"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Nelze zjistit umístění úložiště."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' nelze smazat"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Nelze zjistit umístění služby."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Neplatný řetězec dotazu LDAP URL"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Neplatný parametr dotazu LDAP URL %s"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Nelze klonovat objekt URL"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Neplatný odkaz na objekt prázdného URL"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Nelze analyzovat součásti URL"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "neznámé"
@@ -4224,7 +4145,7 @@ msgstr "Získání podpory vyžaduje další smlouvu se zákazníkem."
 msgid "Unknown support option. Description not available"
 msgstr "Neznámá volba podpory. Popis není dostupný"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4233,11 +4154,6 @@ msgstr ""
 "Správa systému je uzamčena aplikací s identifikátorem PID %d (%s). \n"
 "Ukončete tuto aplikaci a opakujte akci."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historie:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4259,13 +4175,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Neplatný regulární výraz: '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Pro '%s' je vyžadováno ověřování"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4273,8 +4190,8 @@ msgstr ""
 "Pro kontrolu, zda je Vaše registrace platná a aktivní, navštivte Zákaznické "
 "centrum SUSE."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4303,7 +4220,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Při pokusu o provedení akce '%s' nebylo otevřeno médium."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Soubor '%s' nebyl nalezen na médiu '%s'"
@@ -4409,7 +4326,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Přístup k '%s' byl zamítnut."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Během přístupu k '%s' byl dosažen časový limit."
@@ -4420,7 +4337,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Stažená data překročila očekávanou velikost '%s' souboru '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Umístění '%s' je dočasně nedostupné."
@@ -4440,7 +4357,7 @@ msgstr ""
 "Vytvořit bod připojení: Nelze najít adresář, do kterého lze zapisovat, pro "
 "vytvoření bodu připojení"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Nepodporovaná HTTP ověřovací metoda '%s'"
@@ -4499,7 +4416,7 @@ msgid "No url in repository."
 msgstr "Adresa URL nebyla nalezena v repozitáři."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Očekáváno médium %1%/%2% identifikované podle souboru '%3%' s obsahem:"
@@ -4664,7 +4581,7 @@ msgstr "porušit %s ignorováním některých z jeho závislostí"
 msgid "generally ignore of some dependencies"
 msgstr "obecně ignorovat některé závislosti"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4674,97 +4591,91 @@ msgstr ""
 "nahrazeno"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "instalovaný %1% nepochází z distribučního úložiště"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "nainstalované %1% má starší architekturu"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "%1% k instalaci má starší architekturu"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problém s instalovaným %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "protichůdné požadavky"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "nějaký problém se závislostmi"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nikdo neposkytuje požadované '%1%'"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Povolili jste všechna požadovaná úložiště?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "požadovaný balíček %1% neexistuje"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "nepodporovaný požadavek"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' poskytuje systém a nelze jej vymazat"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% není instalovatelný"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nikdo neposkytuje '%1%' potřebné nainstalovaným %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "nikdo neposkytuje '%1%' potřebné k instalaci %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "nelze nainstalovat %1% i %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "nainstalovaný %1% je v konfliktu s '%2%' poskytnutým nainstalovaným %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr "nainstalovaný %1% je v konfliktu s '%2%' potřebným k instalaci %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4772,7 +4683,7 @@ msgstr ""
 "%1%, který se má instalovat, je v konfliktu s '%2%' poskytnutým "
 "nainstalovaným %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4780,23 +4691,23 @@ msgid ""
 msgstr ""
 "má se instalovat %1%, ale je v konfliktu s '%2%' poskytnutým %3% k instalaci"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "nainstalované %1% zastarává '%2%' poskytované nainstalovaným %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "nainstalované %1% zastarává '%2%' poskytované %3%, jež se má instalovat"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "má se instalovat %1% jež zastarává '%2%' poskytované instalovaným %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4804,23 +4715,23 @@ msgstr ""
 "Má se instalovat %1%, jež zastarává '%2%' poskytované %3%, jež se má "
 "instalovat"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "nainstalované %1% je v konfliktu s '%2%' poskytnutým samo sebou"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "má se instalovat %1%, ale je v konfliktu s '%2%' poskytnutým jím samým"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr "nainstalované %1% vyžaduje '%2%', ale tento požadavek nelze splnit"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4828,15 +4739,11 @@ msgid ""
 msgstr ""
 "má se instalovat %1% vyžadující '%2%', ale tento požadavek nelze splnit"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "odstranění poskytovatelé: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4844,122 +4751,106 @@ msgstr ""
 "\n"
 "neinstalovatelní poskytovatelé: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "neinstalovatelní poskytovatelé: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "odstraňte zámek, aby šlo odebrat %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "neinstalujte %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "ponechte %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "odstraňte zámek a tím povolte instalaci %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Tento požadavek poškodí váš systém!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignorovat varování poškozeného systému"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "nežádejte instalaci řešení poskytující %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "nepožadujte smazání všech řešitelných problémů poskytujících %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "neinstalujte nejnovější verzi %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "ponechte %1% navzdory starší architektuře"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "instalujte %1% navzdory starší architektuře"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "zachovejte zastaralou %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "nainstalujte %1% z vyloučeného úložiště"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "instalovat %1%, ačkoli byl odvolán"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "umožnit instalaci PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instalovat %1%, ačkoli je na indexu"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "downgrade z %1% na %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "změna architektury %1% na %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4970,210 +4861,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "náhrada %1% %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "odinstalace %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s nenáleží do repozitáře pro aktualizaci distribuce"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s má podřadnou architekturu"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problém s nainstalovaným balíčkem %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "nic neposkytuje vyžádaný %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Máte povoleny všechny vyžadované repozitáře?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "balíček %s neexistuje"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s je poskytováno systémem a nelze odinstalovat"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s nelze nainstalovat"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "nic neposkytuje %s, který je požadován %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Nelze nainstalovat %s a zároveň %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s koliduje s %s, poskytovatel: %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s nahrazuje %s, poskytovatel: %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "nainstalováno: %s, zastaralé: %s, poskytovatel: %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "vyřešitelné %s je v konfliktu s %s, které sám poskytuje"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s vyžaduje %s, ale tento požadavek nemůže být splněn"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "odebrat zámek pro umožnění odebrání %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "neinstalovat %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "ponechat %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "odebrat zámek pro umožnění instalace položky %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "nenabízet řešení, která zahrnují %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "neptat se na smazání všech balíčků poskytujících %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "neinstalovat nejnovější verzi %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "ponechat %s i přes podřadnou architekturu"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "Instalovat %s i přes podřadnou architekturu"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "ponechat zastaralý %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "instalovat %s z vyloučeného repozitáře"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "downgrade %s na %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "změna architektury z %s na %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"instalovat %s (i se změnou poskytovatele)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "nahrazení %s položkou %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "odinstalace %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5190,74 +4892,78 @@ msgstr "Běží skripty %posttrans"
 msgid "Installation has been aborted as directed."
 msgstr "Instalace byla zrušena podle příkazu."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " provedeno"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " provádění selhalo"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s je již prováděn jako %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " provádění přeskočeno během ukončování"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Chyba při odesílání oznámení o aktualizaci."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nová zpráva o aktualizaci"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM selhalo: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nepodařilo se importovat veřejný klíč %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Nepodařilo se smazat veřejný klíč %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Balíček není podepsaný!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Změněné konfigurační soubory pro %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "Program rpm uložil %s jako %s, ale nebylo možné zjistit rozdíl"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5267,13 +4973,13 @@ msgstr ""
 "Prvních 25 řádek rozdílů:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "Program rpm vytvořil %s jako %s, ale nebylo možné zjistit rozdíl"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5284,149 +4990,360 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Další výstup programu rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "vytvořena záloha %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Podpis je v pořádku"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Neznámý typ podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Podpis nelze ověřit"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Podpis je v pořádku, ale klíč není důvěryhodný"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Veřejný klíč podpisu není k dispozici"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Soubor neexistuje nebo podpis nemůže být zkontrolován"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Soubor není podepsaný"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Chyba stahování (curl) pro '%s':\n"
+"Kód chyby: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Chyba stahování (curl) pro '%s':\n"
+"Nelze načíst odpověď HTTP\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Pochybný typ %s pro %u-bajtový kontrolní součet %s"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Nelze otevřít pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Nelze otevřít rouru (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Neplatný řetězec dotazu LDAP URL"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Neplatný parametr dotazu LDAP URL %s"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Nelze klonovat objekt URL"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Neplatný odkaz na objekt prázdného URL"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Nelze analyzovat součásti URL"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historie:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Schéma URL nepovoluje %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Neplatná %s součást %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Neplatná %s součást"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Pro toto URL není podporována analýza řetězce dotazu"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URL schéma je vyžadovanou součástí"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Neplatné schéma URL %s"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Schéma URL nepovoluje uživatelské jméno"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Schéma URL nepovoluje heslo"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Schéma URL vyžaduje součást hostitele"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Schéma URL nepovoluje součást hostitele"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Neplatná součást hostitele %s"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Schéma URL nepovoluje port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Neplatná součást portu %s"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Schéma URL vyžaduje název cesty"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Relativní cesta není povolena, pokud existuje autorita"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Zakódovaný řetězec obsahuje bajt NUL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Neplatný oddělovací znak pole parametrů"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Neplatný oddělovací znak mapy parametrů"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Neplatný oddělovací znak spojení pole parametrů"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Příkaz skončil se stavem %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Příkaz byl ukončen signálem %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Příkaz skončil s neznámou chybou."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Chyba stahování (curl) pro '%s':\n"
-"Kód chyby: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Nelze změnit kořenový adresář na '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Nelze změnit adresář na '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
-"Chyba stahování (curl) pro '%s':\n"
-"Nelze načíst odpověď HTTP\n"
+"Nelze změnit adresář na '%s' uvnitř chrootem změněného kořenového adresáře "
+"'%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Nelze spustit '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Nelze forknout (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s nenáleží do repozitáře pro aktualizaci distribuce"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s má podřadnou architekturu"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problém s nainstalovaným balíčkem %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "nic neposkytuje vyžádaný %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Máte povoleny všechny vyžadované repozitáře?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "balíček %s neexistuje"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s je poskytováno systémem a nelze odinstalovat"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s nelze nainstalovat"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "nic neposkytuje %s, který je požadován %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Nelze nainstalovat %s a zároveň %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s koliduje s %s, poskytovatel: %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s nahrazuje %s, poskytovatel: %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "nainstalováno: %s, zastaralé: %s, poskytovatel: %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "vyřešitelné %s je v konfliktu s %s, které sám poskytuje"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s vyžaduje %s, ale tento požadavek nemůže být splněn"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "odebrat zámek pro umožnění odebrání %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "neinstalovat %s"
+
+#~ msgid "keep %s"
+#~ msgstr "ponechat %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "odebrat zámek pro umožnění instalace položky %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "nenabízet řešení, která zahrnují %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "neptat se na smazání všech balíčků poskytujících %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "neinstalovat nejnovější verzi %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "ponechat %s i přes podřadnou architekturu"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "Instalovat %s i přes podřadnou architekturu"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "ponechat zastaralý %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "instalovat %s z vyloučeného repozitáře"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "downgrade %s na %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "změna architektury z %s na %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "instalovat %s (i se změnou poskytovatele)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "nahrazení %s položkou %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "odinstalace %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Nelze otevřít soubor zámku: %s"
index 12ebfa3..1fe7eb9 100644 (file)
--- a/po/cy.po
+++ b/po/cy.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2003-09-23 10:33+0200\n"
 "Last-Translator: Kevin Donnelly <kevin@dotmon.com>\n"
 "Language-Team: Welsh <i18n@suse.de>\n"
@@ -18,12 +18,6 @@ msgstr ""
 "Plural-Forms: nplurals=5; plural=(n == 0 ? 0 : n == 1 ? 1 : n < 6 ? 2 : n == "
 "6 ? 3 : 4);\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1375,74 +1369,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Couldn't open file: %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Y gorchymyn a weithredir wrth gysylltu"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -4071,52 +4014,52 @@ msgstr[4] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -4124,13 +4067,13 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
@@ -4139,31 +4082,31 @@ msgstr[2] ""
 msgstr[3] ""
 msgstr[4] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Arsefydlu %s: \"%s\""
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4173,68 +4116,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Arsefydlu %s: \"%s\""
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "anhysbys"
@@ -4302,18 +4224,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4335,20 +4252,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4375,7 +4293,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4478,7 +4396,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4489,7 +4407,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4505,7 +4423,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4565,7 +4483,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4682,7 +4600,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4690,283 +4608,257 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Arsefydlu"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4975,208 +4867,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "Saerniaeth:"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Bydd pecyn %1 yn cael ei arsefydlu"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "Rhaid arsefydlu'r pecynnau yma:"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "Methodd yr arsefydliad."
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Arsefydlu %s: \"%s\""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, fuzzy, c-format, boost-format
-msgid "do not install %s"
-msgstr "Arsefydlu %s: \"%s\""
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "Arsefydlu %s: \"%s\""
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "Gosod gyrrydd..."
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "&Dileu"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Arsefydlu %s: \"%s\""
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5193,11 +4898,11 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -5205,64 +4910,68 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 #, fuzzy
 msgid "Package is not signed!"
 msgstr "Mae llofnod annilys gan yr RPM."
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Copïo ffeiliau ffurfweddu i'r cysawd a osodwyd"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5270,13 +4979,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5285,147 +4994,300 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Y gorchymyn a weithredir wrth gysylltu"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
 #, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "Saerniaeth:"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "Bydd pecyn %1 yn cael ei arsefydlu"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "Rhaid arsefydlu'r pecynnau yma:"
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "Methodd yr arsefydliad."
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Arsefydlu %s: \"%s\""
+
+#, fuzzy
+#~ msgid "do not install %s"
+#~ msgstr "Arsefydlu %s: \"%s\""
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "Arsefydlu %s: \"%s\""
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "Gosod gyrrydd..."
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "&Dileu"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Arsefydlu %s: \"%s\""
+
+#, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Couldn't open file: %s."
 
index 578e9f2..bc403d3 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libzypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2019-12-06 11:54+0000\n"
 "Last-Translator: scootergrisen <scootergrisen@gmail.com>\n"
 "Language-Team: Danish <https://l10n.opensuse.org/projects/libzypp/master/da/"
@@ -18,12 +18,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tvivlsom type '%s' for %u byte checksum '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Ukendt land: "
@@ -1292,71 +1286,21 @@ msgstr "Forbedringer"
 msgid "Supplements"
 msgstr "Supplerer"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Kunne ikke åbne pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Kan ikke åbne dataledning (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Kan ikke skifte rodmappe til '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Kan ikke skifte mappe til \"%s\" indenfor chroot \"%s\" (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Kan ikke skifte mappe til \"%s\" (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Kan ikke eksekvere '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Kan ikke forgrene (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Kommando afsluttet med status %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Kommando dræbtes af signalet %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Kommando afsluttet med ukendt fejl."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Prøvede at importere ikke-eksisterende nøgle %s ind i nøgleringen %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Kunne ikke importere nøgle."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Sletning af nøgle mislykkedes."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Signaturfilen %s blev ikke fundet"
@@ -3761,52 +3705,52 @@ msgstr[1] "(udløber om %d dage)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Leder efter gpg nøgle-ID'et %1% i mellemlageret %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Leder efter gpg nøgle-ID'et %1% i softwarearkivet %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Softwarekilden %1% definerer ikke yderligere 'gpgkey='-URL'er."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Kan ikke læse softwarekildemappen \"%1%\": Adgang nægtet"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Kunne ikke læse mappen \"%s\""
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Kan ikke læse softwarekildefilen \"%1%\": Adgang nægtet"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Alias for softwarekilde må ikke starte med punktum."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Alias for tjeneste må ikke starte med punktum."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan ikke åbne filen \"%s\" til skrivning."
@@ -3814,44 +3758,44 @@ msgstr "Kan ikke åbne filen \"%s\" til skrivning."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Ukendt tjeneste \"%1%\": Fjerner forældreløs tjeneste-softwarekilde \"%2%\""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Der blev ikke fundet gyldige metadata på den angivne URL"
 msgstr[1] "Der blev ikke fundet gyldige metadata på de angivne URL'er"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan ikke oprette %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Kan ikke oprette mappe med metadata-cache."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Opbygger cache for softwarekilden '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Kan ikke oprette cache i %s - ingen skriverettigheder."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Caching af softwarekilde (%d) mislykkedes."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Ikke-håndteret softwarekilde-type"
 
@@ -3861,68 +3805,47 @@ msgstr "Ikke-håndteret softwarekilde-type"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Fejl under forsøg på at læse fra \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Ukendt fejl ved læsning fra \"%s\""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Tilføjer softwarekilden '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ugyldig softwarekilde-filnavn i \"%s\""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Fjerner softwarekilden '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Kan ikke regne ud hvor softwarekilden er lagret."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Kan ikke slette \"%s\""
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Kan ikke regne ud hvor tjenesten er lagret."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Ugyldig LDAP URL-forespørgselsstreng"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Ugyldig LDAP URL-forespørgselsparameter '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Kan ikke klone URL-objekt"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Ugyldig tom URL-objektreference"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Kan ikke fortolke URL-komponenter"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "ukendt"
@@ -3999,7 +3922,7 @@ msgstr "En yderligere kundekontrakt er nødvendig for at få support."
 msgid "Unknown support option. Description not available"
 msgstr "Ukendt support-mulighed. Beskrivelse ikke tilgængelig"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4008,11 +3931,6 @@ msgstr ""
 "Systemhåndtering er låst af programmet med pid %d (%s).\n"
 "
Luk dette program, før du prøver igen."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historik:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4034,13 +3952,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ugyldigt regulært udtryk '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autentificering påkrævet for '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4048,8 +3967,8 @@ msgstr ""
 "Besøg SUSE-kundercenteret for at tjekke om din registrering er gyldig og "
 "ikke er udløbet."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4078,7 +3997,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Mediet åbnedes ikke under forsøg på at udføre handlingen '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Filen %s blev ikke fundet på mediet '%s'"
@@ -4184,7 +4103,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Adgangstilladelse til '%s' nægtet."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Tidsfrist udløbet ved tilgang af \"%s\"."
@@ -4195,7 +4114,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Downloadede data oversteg den ventede filstørrelse '%s' med '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Placeringen \"%s\" er midlertidigt utilgængelig."
@@ -4213,7 +4132,7 @@ msgstr ""
 "Opret tilknytningspunkt: Kan ikke finde en skrivbar mappe til oprettelse af "
 "et tilknytningspunkt"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Ikke-understøttet HTTP autentificeringsmetode '%s'"
@@ -4274,7 +4193,7 @@ msgid "No url in repository."
 msgstr "Ingen URL i softwarekilden."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4439,7 +4358,7 @@ msgstr "ødelæg %s ved at ignorere nogle af dens afhængigheder"
 msgid "generally ignore of some dependencies"
 msgstr "ignorér generelt nogle afhængigheder"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4447,161 +4366,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "modstridende forespørgsler"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "et eller andet afhængighedsproblem"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "ikke understøttet anmodning"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "slettede udbydere: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4609,122 +4518,106 @@ msgstr ""
 "\n"
 "ikke-installérbare leverandører: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "ikke-installérbare leverandører: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Denne anmodning vil ødelægge dit system!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignorér advarslen om et ødelagt system"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "installér %1%, selvom den er blevet tilbagetrukket"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "giv tillade til installation af PTF'en %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "installér %1%, selvom den er sortlistet"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4733,209 +4626,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s hører ikke til en distopgradering-softwarekilde"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s har laverestående arkitektur"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problem med den installerede pakke %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "intet leverer forespurgt %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Har du aktiveret alle anmodede softwarekilder?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "pakken %s findes ikke"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s leveres af systemet og kan ikke slettes"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s kan ikke installeres"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "intet leverer %s, der kræves af %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "kan ikke installere både %s og %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s konflikter med %s, der leveres af %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s forælder %s, der leveres af %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "installerede %s forælder %s, der leveres af %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "solvable %s konflikter med %s, der leveres af den selv"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s kræver %s, men dette krav kan ikke leveres"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "fjern lås for at tillade fjernelse af %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "installér ikke %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "behold %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "fjern lås for at tillade installation af %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "spørg ikke efter at installere en solvable, der leverer %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "spørg ikke efter at slette alle solvables, der leverer %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "installér ikke sidste nye version af %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "behold %s på trods af laverestående arkitektur"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "installér %s på trods af laverestående arkitektur"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "behold forældet %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "installér %s fra ekskluderet softwarekilde"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "nedgradering af %s til %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "arkitekturændring af %s til %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"installér %s (med leverandørændring)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "udskiftning af %s med %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "afinstallation af %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4953,74 +4657,78 @@ msgstr "Udfører %posttrans-scripts"
 msgid "Installation has been aborted as directed."
 msgstr "Installation er blevet afbrudt som ønsket."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " afviklet"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " afvikling mislykkedes"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s er allerede kørt som %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " afvikling skippet under afbrydelse"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Fejl under afsendelse af bekendtgørelse af opdateringsbesked."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Besked om ny opdatering"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM mislykkedes: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Import af offentlig nøgle %1% mislykkedes"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Fjernelse af den offentlige nøgle %1% mislykkedes"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Pakke er ikke signeret!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Konfigurationsfiler er ændret for %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm gemte %s som %s, men det var umuligt at bestemme forskellen"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5030,13 +4738,13 @@ msgstr ""
 "Her er de første 25 linjer af forskelle:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm oprettede %s som %s, men det var umuligt at bestemme forskellen"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5047,146 +4755,355 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Yderligere rpm-output"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "backup %s blev oprettet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Signatur er OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Ukendt signaturtype"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Signaturen verificerer ikke"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Signaturen er OK, men nøglen er ikke betroet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Signaturens offentlige nøgle er ikke tilgængelig"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Filen findes ikke eller signaturen kan ikke tjekkes"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Filen er uden signatur"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tvivlsom type '%s' for %u byte checksum '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Kunne ikke åbne pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Kan ikke åbne dataledning (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Ugyldig LDAP URL-forespørgselsstreng"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Ugyldig LDAP URL-forespørgselsparameter '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Kan ikke klone URL-objekt"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Ugyldig tom URL-objektreference"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Kan ikke fortolke URL-komponenter"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historik:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "URL-oversigt tillader ikke %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Ugyldig %s-komponent '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Ugyldig %s-komponent"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Fortolkning af forespørgselsstreng er ikke understøttet af denne URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URL-oversigt er en påkrævet komponent"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Ugyldig URL-oversigt '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "URL-oversigt tillader ikke et brugernavn"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "URL-oversigt tillader ikke en adgangskode"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "URL-oversigt kræver en værtskomponent"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "URL-oversigt tillader ikke en værtskomponent"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Ugyldig værtskomponent '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "URL-oversigt tillader ikke en port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Ugyldig portkomponent '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "URL-oversigt kræver et stinavn"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Relativ sti er ikke tilladt hvis autoritet eksisterer"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Kodede strenge indeholder en NUL-byte"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Ugyldigt skilletegn for parameter-array"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Ugyldigt skilletegn for parameter-map"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Ugyldigt skilletegn for parameter-array join"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Kommando afsluttet med status %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Kommando dræbtes af signalet %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Kommando afsluttet med ukendt fejl."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Kan ikke skifte rodmappe til '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Kan ikke skifte mappe til \"%s\" (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Kan ikke skifte mappe til \"%s\" indenfor chroot \"%s\" (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Kan ikke eksekvere '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Kan ikke forgrene (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s hører ikke til en distopgradering-softwarekilde"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s har laverestående arkitektur"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problem med den installerede pakke %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "intet leverer forespurgt %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Har du aktiveret alle anmodede softwarekilder?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "pakken %s findes ikke"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s leveres af systemet og kan ikke slettes"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s kan ikke installeres"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "intet leverer %s, der kræves af %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "kan ikke installere både %s og %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s konflikter med %s, der leveres af %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s forælder %s, der leveres af %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "installerede %s forælder %s, der leveres af %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "solvable %s konflikter med %s, der leveres af den selv"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s kræver %s, men dette krav kan ikke leveres"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "fjern lås for at tillade fjernelse af %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "installér ikke %s"
+
+#~ msgid "keep %s"
+#~ msgstr "behold %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "fjern lås for at tillade installation af %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "spørg ikke efter at installere en solvable, der leverer %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "spørg ikke efter at slette alle solvables, der leverer %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "installér ikke sidste nye version af %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "behold %s på trods af laverestående arkitektur"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "installér %s på trods af laverestående arkitektur"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "behold forældet %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "installér %s fra ekskluderet softwarekilde"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "nedgradering af %s til %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "arkitekturændring af %s til %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "installér %s (med leverandørændring)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "udskiftning af %s med %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "afinstallation af %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Kan ikke åbne låsefilen: %s"
 
index 238d98a..71deaf2 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -17,11 +17,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-05-17 11:59+0000\n"
 "Last-Translator: Gemineo <vistatec@gemineo.de>\n"
-"Language-Team: German <https://l10n.opensuse.org/projects/libzypp/master/de/>"
-"\n"
+"Language-Team: German <https://l10n.opensuse.org/projects/libzypp/master/de/"
+">\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -29,12 +29,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.6.2\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Typ '%s' für %u-Byte-Prüfsumme '%s' fragwürdig"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Unbekanntes Land: "
@@ -1303,72 +1297,22 @@ msgstr "Erweiterungen"
 msgid "Supplements"
 msgstr "Zusätze"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "PTY (%s) kann nicht geöffnet werden."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Pipe (%s) kann nicht geöffnet werden."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "chroot zu '%s' (%s) nicht möglich."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Wechsel zu '%s' innerhalb chroot '%s' nicht möglich (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Wechsel zu '%s' nicht möglich (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "exec '%s' (%s) nicht möglich."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "(%s) abzweigen nicht möglich."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Kommando mit Status %d beendet."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Kommando wurde mit Signal %d (%s) beendet."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Kommando mit unbekanntem Fehler beendet."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 "Versuch, nicht existierenden Schlüssel %s in Schlüsselbund %s zu importieren"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Importieren des Schlüssels  fehlgeschlagen."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Fehler beim Löschen des Schlüssels."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Signaturdatei %s nicht gefunden"
@@ -3773,52 +3717,52 @@ msgstr[1] "(läuft innerhalb von %d Tagen ab)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Suche nach der GPG-Key-ID %1% im Cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Suche nach der GPG-Key-ID %1% im Repository %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repository %1% definiert keine zusätzlichen 'gpgkey='-URLs."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Repo-Verzeichnis '%1%' kann nicht gelesen werden: Zugriff verweigert"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Verzeichnis '%s' konnte nicht gelesen werden"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Repo-Datei '%1%' kann nicht gelesen werden: Zugriff verweigert"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Ein Repository-Alias darf nicht mit einem Punkt beginnen."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Ein Dienst-Alias darf nicht mit einem Punkt beginnen."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Datei '%s' konnte nicht zum Schreiben geöffnet werden."
@@ -3826,45 +3770,45 @@ msgstr "Datei '%s' konnte nicht zum Schreiben geöffnet werden."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Unbekannter Dienst '%1%': Verwaistes Dienst-Repository '%2%' wird entfernt"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Keine gültigen Metadaten bei dem festgelegten URL gefunden"
 msgstr[1] "Keine gültigen Metadaten bei den festgelegten URLs gefunden"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s konnte nicht erstellt werden"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Metadaten-Cache-Verzeichnis konnte nicht erstellt werden."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Cache für Repository '%s' erzeugen"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "Cache konnte auf %s nicht erstellt werden - keine Schreibberechtigungen."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Repo (%d) konnte nicht im Cache gespeichert werden."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Unverarbeiteter Repository-Typ"
 
@@ -3874,68 +3818,47 @@ msgstr "Unverarbeiteter Repository-Typ"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Fehler beim Versuch, aus '%s' zu lesen"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Unbekannter Fehler beim Lesen aus '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Repository '%s' hinzufügen"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Repo-Dateiname bei '%s' ungültig"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Repository '%s' entfernen"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Speicherort des Repos kann nicht gefunden werden."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' kann nicht gelöscht werden"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Speicherort des Dienstes kann nicht gefunden werden."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Unzulässige Abfragezeichenkette für die LDAP-URL"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Unzulässiger Abfrageparameter für die LDAP-URL '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "URL-Objekt kann nicht geklont werden"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Unzulässiger leerer URL-Objektverweis"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "URL-Komponenten können nicht analysiert werden"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "Unbekannt"
@@ -4015,7 +3938,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Unbekannte Support-Option. Keine Beschreibung vorhanden"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4024,11 +3947,6 @@ msgstr ""
 "Die Systemverwaltung ist gesperrt durch die Anwendung mit PID %d (%s).\n"
 "Schließen Sie diese Anwendung, bevor Sie es erneut versuchen."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Verlauf:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4050,13 +3968,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ungültiger regulärer Ausdruck '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Authentifizierung erforderlich für '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4064,8 +3983,8 @@ msgstr ""
 "Besuchen Sie den SUSE Customer Center zur Prüfung, ob Ihre Registrierung "
 "gültig und nicht abgelaufen ist."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4095,7 +4014,7 @@ msgstr ""
 "Beim Versuch, Aktion '%s' durchzuführen, wurde das Medium nicht geöffnet."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Datei '%s' auf Medium '%s' nicht gefunden"
@@ -4203,7 +4122,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Zugriff auf '%s' verweigert."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Zeitüberschreitung beim Zugriff auf '%s'."
@@ -4216,7 +4135,7 @@ msgstr ""
 "'%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Auf den Standort '%s' kann zeitweise nicht zugegriffen werden."
@@ -4236,7 +4155,7 @@ msgstr ""
 "Anschlusspunkt erstellen: Kann kein schreibbares Verzeichnis finden, um "
 "einen Anschlusspunkt zu erstellen"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Nicht unterstützte HTTP-Authentifizierungsmethode '%s'"
@@ -4300,8 +4219,8 @@ msgid "No url in repository."
 msgstr "Das Repository enthält keine URL."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
-#, boost-format, fuzzy
+#: zypp/repo/SUSEMediaVerifier.cc:104
+#, fuzzy, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
 "Erwartet wird Medium %1%/%2%, identifiziert durch Datei '%3%', mit dem "
@@ -4467,7 +4386,7 @@ msgstr "%s durch Ignorieren einiger Abhängigkeiten brechen"
 msgid "generally ignore of some dependencies"
 msgstr "Einige Abhängigkeiten allgemein ignorieren"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4477,93 +4396,87 @@ msgstr ""
 "ersetzt werden"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "das zu installierende %1% gehört nicht zu einem distupgrade-Repository"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "das installierte %1% hat eine minderwertige Architektur"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "das zu installierende %1% hat eine minderwertige Architektur"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "Problem mit dem installierten %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "In Konflikt stehende Anforderungen"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "Abhängigkeitsproblem"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nichts stellt das angeforderte '%1%' bereit"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Haben Sie alle erforderlichen Repositorys aktiviert?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "das angeforderte Paket %1% ist nicht vorhanden"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "nicht unterstützte Anforderung"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' wird vom System bereitgestellt und kann nicht gelöscht werden"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% ist nicht installierbar"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nichts stellt '%1%' bereit, das vom installierten %2% benötigt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "nichts stellt '%1%' bereit, das vom zu installierenden %2% benötigt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "kann nicht %1% und %2% installieren"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "das installierte %1% steht im Konflikt mit '%2%', das vom installierten %3% "
 "bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4571,7 +4484,7 @@ msgstr ""
 "das installierte %1% steht im Konflikt mit '%2%', das von dem zu "
 "installierenden %3% bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4579,7 +4492,7 @@ msgstr ""
 "das zu installierende %1% steht im Konflikt mit '%2%', das vom installierten "
 "%3% bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4588,28 +4501,28 @@ msgstr ""
 "das zu installierende %1% steht im Konflikt mit '%2%', das vom zu "
 "installierenden %3% bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "das installierte %1% ersetzt '%2%', das vom installierten %3% bereitgestellt "
 "wird"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "das installierte %1% ersetzt '%2%', das durch das zu installierende %3% "
 "bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "das zu installierende %1% ersetzt '%2%', das vom installierten %3% "
 "bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4617,21 +4530,21 @@ msgstr ""
 "das zu installierende %1% ersetzt '%2%', das durch das zu installierende %3% "
 "bereitgestellt wird"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "das installierte %1% steht im Konflikt mit dem von ihm selbst "
 "bereitgestellten '%2%'"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "das zu installierende %1% steht im Konflikt mit dem von ihm selbst "
 "bereitgestellten '%2%'"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4639,7 +4552,7 @@ msgstr ""
 "das installierte %1% erfordert '%2%', aber diese Anforderung kann nicht "
 "bereitgestellt werden"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4648,15 +4561,11 @@ msgstr ""
 "das zu installierende %1% erfordert '%2%', aber diese Anforderung kann nicht "
 "bereitgestellt werden"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "Gelöschte Anbieter: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4664,125 +4573,109 @@ msgstr ""
 "\n"
 "Nicht installierbare Anbieter: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "Nicht installierbare Anbieter: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "Sperre entfernen, um das Entfernen von %1% zuzulassen"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "%1% nicht installieren"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "%1% beibehalten"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "Sperre entfernen, um Installation von %1% zuzulassen"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Diese Anfrage bringt Ihr System zum Absturz!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "Warnung vor einem beschädigten System ignorieren"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 "Installation eines auflösbaren Elements, das %1% bereitstellt, nicht "
 "anfordern"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 "Löschen aller auflösbaren Elemente, die %1% bereitstellen, nicht anfordern"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "neueste Version von %1% nicht installieren"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "%1% trotz der minderwertigen Architektur beibehalten"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "%1% trotz der minderwertigen Architektur installieren"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "veraltetes %1% beibehalten"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "%1% aus ausgeschlossenem Repository installieren"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "%1 installieren, obwohl es widerrufen wurde"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "Erlauben das PTF %1% zu installieren"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "%1% installieren, obwohl es geblacklistet ist"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "Herabstufung von %1% auf %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "Architekturänderung von %1% in %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4793,214 +4686,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "Ersetzung von %1% durch %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "Deinstallation von %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s gehört nicht zu einem Distributionsaktualisierungs-Repository"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s besitzt eine nachrangige Architektur"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "Problem mit installiertem Paket %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "Angefordertes %s wird nirgends zur Verfügung gestellt"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Wurden alle erforderlichen Repositorys aktiviert?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Paket %s existiert nicht"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s wird vom System bereitgestellt und kann nicht gelöscht werden"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s ist nicht installierbar"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s benötigt von %s wird nirgends zur Verfügung gestellt"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%s und %s können nicht gleichzeitig installiert sein"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s steht in Konflikt mit %s, das von %s zur Verfügung gestellt wurde"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s löst %s ab, das von %s zur Verfügung gestellt wurde"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "installiertes %s macht %s, welches durch %s angeboten wird, obsolet"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-"Das auflösbare Element %s steht in Konflikt mit %s, das es selbst zur "
-"Verfügung gestellt hat"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s benötigt %s, kann jedoch nicht zur Verfügung gestellt werden"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "Sperre entfernen und Entfernen von %s zulassen"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s nicht installieren"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s behalten"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "Sperre entfernen und Installation von %s zulassen"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-"Installation eines auflösbaren Elements mit %s darf nicht angefordert werden"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-"Löschen aller auflösbaren Elemente mit %s darf nicht angefordert werden"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "Neueste Version von %s darf nicht installiert werden"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s trotz der nachrangigen Architektur beibehalten"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "%s trotz der nachrangigen Architektur installieren"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "veraltetes %s beibehalten"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "%s aus dem ausgeschlossenen Repository installieren"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "Downgrade von %s zu %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "Architekturwechsel von %s zu %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"%s installieren (mit Anbieterwechsel)\n"
-"  %s --> %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "Ersatz von %s durch %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Deinstallation von %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5017,68 +4717,72 @@ msgstr "%posttrans scripts werden ausgeführt"
 msgid "Installation has been aborted as directed."
 msgstr "Die Installation wurde gemäß Anweisung abgebrochen."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " ausgeführt"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " Ausführung fehlgeschlagen"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s bereits als %s ausgeführt)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " Ausführung beim Abbrechen übersprungen"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Fehler beim Senden der Aktualisierungsbenachrichtigung."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Neue Aktualisierungsbenachrichtigung"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM fehlgeschlagen: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Importieren des öffentlichen Schlüssels %1% fehlgeschlagen"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Entfernen des öffentlichen Schlüssels %1% fehlgeschlagen"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Paket ist nicht signiert!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Geänderte Konfigurationsdateien für %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5086,7 +4790,7 @@ msgstr ""
 "werden"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5096,7 +4800,7 @@ msgstr ""
 "Hier die ersten 25 Zeilen mit Unterschieden:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5104,7 +4808,7 @@ msgstr ""
 "werden"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5115,152 +4819,367 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Zusätzliche rpm-Ausgabe"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "Sicherung %s erstellt"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Signatur ist OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Unbekannter Signaturtyp"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Signatur ist nicht OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Signatur ist OK, aber Schlüssel ist nicht verbürgt"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Öffentlicher Schlüssel für Signatur nicht verfügbar"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Datei nicht vorhanden oder Signatur kann nicht geprüft werden"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Datei ist unsigniert"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Download (curl) Fehler für '%s':\n"
+"Fehlercode: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Download (curl) Fehler für '%s':\n"
+"HTTP-Antwort kann nicht abgerufen werden\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Typ '%s' für %u-Byte-Prüfsumme '%s' fragwürdig"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "PTY (%s) kann nicht geöffnet werden."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Pipe (%s) kann nicht geöffnet werden."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Unzulässige Abfragezeichenkette für die LDAP-URL"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Unzulässiger Abfrageparameter für die LDAP-URL '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "URL-Objekt kann nicht geklont werden"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Unzulässiger leerer URL-Objektverweis"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "URL-Komponenten können nicht analysiert werden"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Verlauf:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "%s laut URL-Schema nicht zulässig"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Unzulässige %s-Komponente: '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Unzulässige %s-Komponente"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 "Die Analyse von Abfragezeichenketten wird für diese URL nicht unterstützt"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Das URL-Schema ist eine erforderliche Komponente"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "'%s' ist ein unzulässiges URL-Schema"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Benutzername laut URL-Schema nicht zulässig"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Passwort laut URL-Schema nicht zulässig"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Für das URL-Schema ist eine Host-Komponente erforderlich"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Host-Komponente laut URL-Schema nicht zulässig"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Unzulässige Host-Komponente: '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Port laut URL-Schema nicht zulässig"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Unzulässige Portkomponente: '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Für das URL-Schema ist ein Pfadname erforderlich"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 "Die Angabe des relativen Pfads ist nicht erlaubt, wenn die "
 "Zertifizierungsstelle vorhanden ist"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Verschlüsselte Zeichenfolge enthält ein NULL-Byte"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Ungültiges Trennzeichen für Parameter-Array-Spaltung"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Ungültiges Trennzeichen für Parameterzuordnungs-Spaltung"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Ungültiges Trennzeichen für Parameter-Array-Zusammenführung"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Kommando mit Status %d beendet."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Kommando wurde mit Signal %d (%s) beendet."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Kommando mit unbekanntem Fehler beendet."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Download (curl) Fehler für '%s':\n"
-"Fehlercode: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "chroot zu '%s' (%s) nicht möglich."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Wechsel zu '%s' nicht möglich (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Wechsel zu '%s' innerhalb chroot '%s' nicht möglich (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "exec '%s' (%s) nicht möglich."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "(%s) abzweigen nicht möglich."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Download (curl) Fehler für '%s':\n"
-"HTTP-Antwort kann nicht abgerufen werden\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s gehört nicht zu einem Distributionsaktualisierungs-Repository"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s besitzt eine nachrangige Architektur"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "Problem mit installiertem Paket %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "Angefordertes %s wird nirgends zur Verfügung gestellt"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Wurden alle erforderlichen Repositorys aktiviert?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "Paket %s existiert nicht"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s wird vom System bereitgestellt und kann nicht gelöscht werden"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s ist nicht installierbar"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s benötigt von %s wird nirgends zur Verfügung gestellt"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%s und %s können nicht gleichzeitig installiert sein"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr ""
+#~ "%s steht in Konflikt mit %s, das von %s zur Verfügung gestellt wurde"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s löst %s ab, das von %s zur Verfügung gestellt wurde"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "installiertes %s macht %s, welches durch %s angeboten wird, obsolet"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr ""
+#~ "Das auflösbare Element %s steht in Konflikt mit %s, das es selbst zur "
+#~ "Verfügung gestellt hat"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s benötigt %s, kann jedoch nicht zur Verfügung gestellt werden"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "Sperre entfernen und Entfernen von %s zulassen"
+
+#~ msgid "do not install %s"
+#~ msgstr "%s nicht installieren"
+
+#~ msgid "keep %s"
+#~ msgstr "%s behalten"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "Sperre entfernen und Installation von %s zulassen"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr ""
+#~ "Installation eines auflösbaren Elements mit %s darf nicht angefordert "
+#~ "werden"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr ""
+#~ "Löschen aller auflösbaren Elemente mit %s darf nicht angefordert werden"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "Neueste Version von %s darf nicht installiert werden"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s trotz der nachrangigen Architektur beibehalten"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "%s trotz der nachrangigen Architektur installieren"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "veraltetes %s beibehalten"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "%s aus dem ausgeschlossenen Repository installieren"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "Downgrade von %s zu %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "Architekturwechsel von %s zu %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "%s installieren (mit Anbieterwechsel)\n"
+#~ "  %s --> %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "Ersatz von %s durch %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "Deinstallation von %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Sperrdatei kann nicht geöffnet werden: %s"
index c6cce78..a25ad52 100644 (file)
--- a/po/el.po
+++ b/po/el.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Greek (libzypp)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2018-04-29 12:02+0000\n"
 "Last-Translator: Konstantina Tsolakoglou <konstantina@accountant.com>\n"
 "Language-Team: Greek <https://l10n.opensuse.org/projects/libzypp/master/el/"
@@ -14,12 +14,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 2.18\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Ύποπτος τύπος '%s' για το %u byte στον αθροιστικό έλεγχο '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Άγνωστη χώρα: "
@@ -1289,71 +1283,21 @@ msgstr "Ενισχύει"
 msgid "Supplements"
 msgstr "Συμπληρώνει"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Αδυναμία ανοίγματος pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Αδυναμία ανοίγματος διασωλήνωσης (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Αδυναμία chroot σε '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Αδυναμία chdir στο '%s' μέσα σε chroot '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Αδυναμία chdir στο '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Αδυναμία εκτέλεσης του '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Αδυναμία διακλάδωσης (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Η εντολή τερματίστηκε με κατάσταση %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Η εντολή τερματίστηκε από το σήμα %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Η εντολή τερματίστηκε με άγνωστο σφάλμα."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Προσπάθεια εισαγωγής μη υπάρχοντος κλειδιού %s στην κλειδοθήκη %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Αποτυχία εισαγωγής κλειδιού."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Αποτυχία της διαγραφής κλειδιού."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Το αρχείο υπογραφής %s δε βρέθηκε"
@@ -3761,52 +3705,52 @@ msgstr[1] "(λήγει σε %d ημέρες)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Αδυναμία ανάγνωσης καταλόγου αποθετηρίου '%1%': Δεν έχετε δικαιώματα"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Αποτυχία ανάγνωσης καταλόγου '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Αδυναμία ανάγνωσης αρχείου αποθετηρίου '%1%': Δεν έχετε δικαιώματα"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Το alias του αποθετηρίου δεν μπορεί να ξεκινά από τελεία."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Το ψευδώνυμο της υπηρεσίας δεν μπορεί να ξεκινά με τελεία."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Αδυναμία ανοίγματος αρχείου '%s' για εγγραφή."
@@ -3814,46 +3758,46 @@ msgstr "Αδυναμία ανοίγματος αρχείου '%s' για εγγ
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Άγνωστη υπηρεσία '%1%': Αφαίρεση του ορφανού αποθετηρίου υπηρεσιών '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Δεν βρέθηκαν έγκυρα μεταδεδομένα στην καθορισμένη URL"
 msgstr[1] "Δεν βρέθηκαν έγκυρα μεταδεδομένα στις καθορισμένες URLs"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Αδυναμία δημιουργίας %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Αδυναμία δημιουργίας καταλόγου μεταδεδομένων λανθάνουσας μνήμης."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Δημιουργία λανθάνουσας μνήμης αποθετηρίου '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "Αδυναμία δημιουργίας λανθάνουσας μνήμης στο %s - δεν έχετε δικαιώματα "
 "εγγραφής."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Αποτυχία αποθήκευσης στην λανθάνουσα μνήμη του αποθετηρίου (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Τύπος αδιαχείριστου αποθετηρίου"
 
@@ -3863,68 +3807,47 @@ msgstr "Τύπος αδιαχείριστου αποθετηρίου"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Σφάλμα στην προσπάθεια ανάγνωσης από το '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Άγνωστο σφάλμα κατά την ανάγνωση από '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Προσθήκη αποθετηρίου '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Μη έγκυρο όνομα αρχείου αποθετηρίου στο '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Αφαίρεση αποθετηρίου '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Δεν είναι κατανοητό που είναι αποθηκευμένο το αποθετήριο."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Αδυναμία διαγραφής '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Δεν είναι κατανοητό που είναι αποθηκευμένη η υπηρεσία."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Μη έγκυρο string αναζήτησης LDAP URL"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Μη έγκυρη παράμετρος αναζήτησης LDAP URL '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Αδυναμία κλωνοποίησης αντικειμένου Url"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Μη έγκυρη αναφορά αντικειμένου κενού Url"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Αδυναμία ανάλυσης συστατικών Url"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "άγνωστο"
@@ -4004,7 +3927,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Άγνωστη επιλογή υποστήριξης. Δεν υπάρχει διαθέσιμη περιγραφή"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4013,11 +3936,6 @@ msgstr ""
 "Η διαχείριση συστήματος έχει κλειδωθεί από την εφαρμογή με pid %d (%s).\n"
 "Κλείστε την εφαρμογή πριν ξαναπροσπαθήσετε."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Ιστορικό:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4039,20 +3957,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Μη  έγκυρη κανονική έκφραση '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Απαιτείται πιστοποίηση για '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4082,7 +4001,7 @@ msgstr ""
 "Το μέσο δεν ανοίχτηκε κατά την προσπάθεια εκτέλεσης της ενέργειας '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Το αρχείο '%s' δεν βρέθηκε στο μέσο '%s'"
@@ -4190,7 +4109,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Άρνηση άδειας πρόσβασης στο '%s'."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Το χρονικό όριο εξαντλήθηκε όταν έγινε πρόσβαση '%s'."
@@ -4201,7 +4120,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Η τοποθεσία '%s' είναι προσωρινά μη προσβάσιμη."
@@ -4221,7 +4140,7 @@ msgstr ""
 "Δημιουργία σημείου προσάρτησης: Δεν είναι δυνατή η εύρεση εγγράψιμου "
 "καταλόγου για τη δημιουργία σημείου προσάρτησης"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Μη υποστηριζόμενη μέθοδος πιστοποίησης HTTP '%s'"
@@ -4282,7 +4201,7 @@ msgid "No url in repository."
 msgstr "Δεν υπάρχει το URL στο αποθετήριο."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4447,7 +4366,7 @@ msgstr "διακοπή %s λόγω αγνόησης μερικών εξαρτή
 msgid "generally ignore of some dependencies"
 msgstr "γενικά αγνόηση μερικών εξαρτήσεων"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4455,161 +4374,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "συγκρουόμενες αιτήσεις"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "κάποιο πρόβλημα εξαρτήσεων"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "μη υποστηριζόμενο αίτημα"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "διαγραμμένοι πάροχοι: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4617,122 +4526,106 @@ msgstr ""
 "\n"
 "μη εγκαταστήσιμοι πάροχοι: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "Μη εγκαταστήσιμοι πάροχοι: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Το αίτημα αυτό θα καταστρέψει το σύστημα σας!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "αγνοήστε την προειδοποίηση ενός κατεστραμμένου συστήματος"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4741,209 +4634,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "το %s δεν ανήκει σε αποθετήριο αναβάθμισης της διανομής"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "το %s έχει υποδαιέστερη αρχιτεκτονική"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "πρόβλημα με τα εγκατεστημένα πακέτα %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "τίποτα δεν παρέχει το ζητούμενο %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Έχετε ενεργοποιήσει όλα τα απαιτούμενα αποθετήρια;"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "το πακέτο %s δεν υπάρχει"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "το %s παρέχεται από το σύστημα και είναι αδύνατο να διαγραφεί"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "το %s είναι μη εγκαταστάσιμο"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "τίποτα δεν παρέχει το %s που χρειάζεται από το %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "αδυναμία εγκατάστασης %s και %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "το %s συγκρούεται με %s που παρέχεται από το %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "Το %s απαρχαιώνει το %s που παρέχεται από το %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "το εγκατεστημένο %s απαρχαιώνει %s που παρέχεται από %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "το επιλύσιμο %s συγκρούεται με %s που παρέχεται από τον εαυτό του"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "το %s απαιτεί %s, αλλά αυτή η απαίτηση δεν μπορεί να παρασχεθεί"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "αφαίρεση κλειδώματος για να επιτραπεί η αφαίρεση του %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "να μην εγκατασταθεί το %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "διατήρηση του %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "αφαίρεση κλειδώματος για να επιτραπεί η εγκατάσταση του %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "να μην ζητηθεί η εγκατάσταση όλων των επιλύσιμων παρέχοντας %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "να μην ζητηθεί η διαγραφή όλων των επιλύσιμων παρέχοντας %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "να μην εγκατασταθεί η νεότερη έκδοση του %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "διατήρηση του %s παρά την κατώτερη αρχιτεκτονική"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "εγκατάσταση του %s παρά την κατώτερη αρχιτεκτονική"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "διατήρηση του απαρχαιωμένου %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "εγκατάσταση του %s από το εξαιρούμενο αποθετήριο"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "υποβάθμιση του %s σε %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "αλλαγή αρχιτεκτονικής από %s σε %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"εγκατάσταση %s (με αλλαγή προμηθευτή)\n"
-"  %s --> %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "αντικατάσταση του %s με το %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "απεγκατάσταση του %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4961,75 +4665,79 @@ msgstr "Εκτέλεση %posttrans scripts"
 msgid "Installation has been aborted as directed."
 msgstr "Η εγκατάσταση ματαιώθηκε σύμφωνα με τις οδηγίες."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " εκτελέστηκε"
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " αποτυχία εκτέλεσηης"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "το %s έχει ήδη εκτελεστεί ως %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " η εκτέλεση παραλείφθηκε κατά την ματαίωση"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Σφάλμα κατά την αποστολή μηνύματος ειδοποίησης ενημέρωσης."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Νέο μήνυμα ενημέρωσης"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "Το RPM απέτυχε: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Απέτυχε να εισάγει το δημόσιο κλειδί από το αρχείο %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Αδυναμία απομάκρυνσης του δημοσίου κλειδιού %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Το πακέτο δεν είναι υπογεγραμμένο!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Αλλαγή αρχείων ρύθμισης για %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "Το rpm αποθήκευσε το  %s ως %s αλλά ήταν αδύνατο να διαφανεί η διαφορά"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5039,13 +4747,13 @@ msgstr ""
 "Εδώ είναι οι πρώτες 25 γραμμές της διαφοράς:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "Το rpm δημιούργησε το %s ως %s αλλά ήταν αδύνατο να διαφανεί η διαφορά"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5056,147 +4764,356 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Επιπρόσθετο αποτέλεσμα rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "δημιουργήθηκε αντίγραφο ασφαλείας %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Η υπογραφή είναι εντάξει"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Άγνωστος τύπος υπογραφής"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Η υπογραφή δεν μπορεί να επαληθευτεί"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Η υπογραφή είναι εντάξει, αλλά το κλειδί δεν είναι έμπιστο"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Η υπογραφές του δημόσιου κλειδιού δεν είναι διαθέσιμες"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Το αρχείο δεν υπάρχει ή η υπογραφή δεν μπορεί να ελεχθεί"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Το αρχείο δεν είναι υπογεγραμμένο"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Ύποπτος τύπος '%s' για το %u byte στον αθροιστικό έλεγχο '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Αδυναμία ανοίγματος pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Αδυναμία ανοίγματος διασωλήνωσης (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Μη έγκυρο string αναζήτησης LDAP URL"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Μη έγκυρη παράμετρος αναζήτησης LDAP URL '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Αδυναμία κλωνοποίησης αντικειμένου Url"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Μη έγκυρη αναφορά αντικειμένου κενού Url"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Αδυναμία ανάλυσης συστατικών Url"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Ιστορικό:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Το σχήμα Url δεν επιτρέπει ένα %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "μη έγκυρο %s συστατικό '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "μη έγκυρο %s συστατικό"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 "Δεν υποστηρίζεται η ανάλυση string ερωτήματος για αυτήν τη διεύθυνση URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Το σχήμα Url είναι ένα απαιτούμενο συστατικό"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Λανθασμένο σχήμα Url '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Το σχήμα Url δεν επιτρέπει όνομα χρήστη"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Το σχήμα Url δεν επιτρέπει συνθηματικό"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Το σχήμα Url απαιτεί ένα συστατικό συστήματος"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Το σχήμα Url δεν επιτρέπει ένα συστατικό συστήματος"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Μη έγκυρο συστατικό συστήματος '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Το σχήμα Url δεν σας επιτρέπει μια θύρα"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "μη έγκυρο συστατικό θύρας '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Το σχήμα Url απαιτεί όνομα διαδρομής"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Σχετική διαδρομή δεν επιτρέπεται εάν υπάρχει αρχή"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Κωδικοποιημένο string περιέχει ένα NUL byte"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Μη έγκυρος διαχωριστικός χαρακτήρας χωριστής διάταξης παραμέτρων"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Μη έγκυρος διαχωριστικός χαρακτήρας χωριστού χάρτη παραμέτρων"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Μη έγκυρος διαχωριστικός χαρακτήρας ένωσης διατάξεων παραμέτρων"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Η εντολή τερματίστηκε με κατάσταση %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Η εντολή τερματίστηκε από το σήμα %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Η εντολή τερματίστηκε με άγνωστο σφάλμα."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Αδυναμία chroot σε '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Αδυναμία chdir στο '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Αδυναμία chdir στο '%s' μέσα σε chroot '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Αδυναμία εκτέλεσης του '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Αδυναμία διακλάδωσης (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "το %s δεν ανήκει σε αποθετήριο αναβάθμισης της διανομής"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "το %s έχει υποδαιέστερη αρχιτεκτονική"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "πρόβλημα με τα εγκατεστημένα πακέτα %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "τίποτα δεν παρέχει το ζητούμενο %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Έχετε ενεργοποιήσει όλα τα απαιτούμενα αποθετήρια;"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "το πακέτο %s δεν υπάρχει"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "το %s παρέχεται από το σύστημα και είναι αδύνατο να διαγραφεί"
+
+#~ msgid "%s is not installable"
+#~ msgstr "το %s είναι μη εγκαταστάσιμο"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "τίποτα δεν παρέχει το %s που χρειάζεται από το %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "αδυναμία εγκατάστασης %s και %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "το %s συγκρούεται με %s που παρέχεται από το %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "Το %s απαρχαιώνει το %s που παρέχεται από το %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "το εγκατεστημένο %s απαρχαιώνει %s που παρέχεται από %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "το επιλύσιμο %s συγκρούεται με %s που παρέχεται από τον εαυτό του"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "το %s απαιτεί %s, αλλά αυτή η απαίτηση δεν μπορεί να παρασχεθεί"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "αφαίρεση κλειδώματος για να επιτραπεί η αφαίρεση του %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "να μην εγκατασταθεί το %s"
+
+#~ msgid "keep %s"
+#~ msgstr "διατήρηση του %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "αφαίρεση κλειδώματος για να επιτραπεί η εγκατάσταση του %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "να μην ζητηθεί η εγκατάσταση όλων των επιλύσιμων παρέχοντας %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "να μην ζητηθεί η διαγραφή όλων των επιλύσιμων παρέχοντας %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "να μην εγκατασταθεί η νεότερη έκδοση του %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "διατήρηση του %s παρά την κατώτερη αρχιτεκτονική"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "εγκατάσταση του %s παρά την κατώτερη αρχιτεκτονική"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "διατήρηση του απαρχαιωμένου %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "εγκατάσταση του %s από το εξαιρούμενο αποθετήριο"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "υποβάθμιση του %s σε %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "αλλαγή αρχιτεκτονικής από %s σε %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "εγκατάσταση %s (με αλλαγή προμηθευτή)\n"
+#~ "  %s --> %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "αντικατάσταση του %s με το %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "απεγκατάσταση του %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Αδυναμία ανοίγματος αρχείου κλειδώματος: %s"
 
index 794a39a..9df3d49 100644 (file)
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2007-08-19 16:20+0100\n"
 "Last-Translator: Benjamin Weber <b.weber@warwick.ac.uk>\n"
 "Language-Team:  <en@li.org>\n"
@@ -21,12 +21,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: KBabel 1.11.4\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Unknown country: "
@@ -1300,74 +1294,23 @@ msgstr "Enhances"
 msgid "Supplements"
 msgstr "Supplements"
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Cannot open file %1."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Can't find %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Can't find %s."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Command executed when connecting"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to start the VM."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to start the VM."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Source package '%s' not found."
@@ -3775,54 +3718,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "The VM's name cannot start with a digit."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "The VM's name cannot start with a digit."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Cannot open file for writing."
@@ -3830,45 +3773,45 @@ msgstr "Cannot open file for writing."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Valid metadata not found at specified URL(s)"
 msgstr[1] "Valid metadata not found at specified URL(s)"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Cannot create %s: %m\n"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Cannot create directory %1: %2."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Building repository '%s' cache"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "Uploaded %s to repository."
@@ -3879,68 +3822,47 @@ msgstr "Uploaded %s to repository."
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, fuzzy, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Error parsing metadata for '%s':"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Unknown command '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Adding repository '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Invalid export filename."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Removing repository '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Cannot stat '%s': %m\n"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Invalid LDAP URL query string"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Invalid LDAP URL query parameter '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Unable to clone Url object"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Invalid empty Url object reference"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Unable to parse Url components"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "unknown"
@@ -4009,18 +3931,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "History:"
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4042,20 +3959,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Invalid Url scheme '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Authentication required for '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4082,7 +4000,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "File %1 not found in the repository."
@@ -4188,7 +4106,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Permissions denied"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4199,7 +4117,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4215,7 +4133,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Unsupported HTTP authentication method '%s'"
@@ -4276,7 +4194,7 @@ msgid "No url in repository."
 msgstr "No url in repository."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4395,7 +4313,7 @@ msgstr "Generally ignore this requirement"
 msgid "generally ignore of some dependencies"
 msgstr "Generally ignore this requirement"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4403,289 +4321,263 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Connection request to: "
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Cannot install %s due to dependency problems"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 #, fuzzy
 msgid "unsupported request"
 msgstr " - not supported"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "None provides %s"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "There are no installable providers of %s"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "There are no installable providers of %s"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "The request already exists."
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4694,208 +4586,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s provides %s, but has another architecture."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "Problem installing source package %s-%s:"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "None provides %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "backup does not exists"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s is locked and cannot be uninstalled."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "not installed"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s is needed by %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Cannot install %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s conflicts with %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s obsoletes %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s obsoletes %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s conflicts with %s"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "do not install %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "keep %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "do not install %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "There are no installable providers of %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "Do not install or delete the resolvables concerned"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s provides %s, but has another architecture."
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "Install %s although it would change the architecture"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s obsoletes %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "Updating %s to %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Installation of %s failed:"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4912,12 +4617,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Installation has been aborted as directed."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "Execute"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4925,65 +4630,69 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "Error during key encryption."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "failed"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Changed configuration files for %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm saved %s as %s, but it was impossible to determine the difference"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4993,14 +4702,14 @@ msgstr ""
 "Here are the first 25 lines of difference:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm created %s as %s, but it was impossible to determine the difference"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5011,150 +4720,349 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Additional rpm output:"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "created backup %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Source package '%s' not found."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Source package '%s' not found."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Source package '%s' not found."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Cannot open file %1."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Invalid LDAP URL query string"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Invalid LDAP URL query parameter '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Unable to clone Url object"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Invalid empty Url object reference"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Unable to parse Url components"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "History:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Url scheme does not allow a %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Invalid %s component '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Invalid %s component"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Query string parsing not supported for this URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Url scheme is a required component"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Invalid Url scheme '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url scheme does not allow a username"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url scheme does not allow a password"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url scheme requires a host component"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Url scheme does not allow a host component"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Invalid host component '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Url scheme does not allow a port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Invalid port component '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url scheme requires path name"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Relative path not allowed if authority exists"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Encoded string contains a NUL byte"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Invalid parameter array split separator character"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Invalid parameter map split separator character"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Invalid parameter array join separator character"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Command executed when connecting"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Can't find %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Can't find %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s provides %s, but has another architecture."
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "Problem installing source package %s-%s:"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "None provides %s"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "backup does not exists"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s is locked and cannot be uninstalled."
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "not installed"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s is needed by %s"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Cannot install %s"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s conflicts with %s"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s obsoletes %s"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s obsoletes %s"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s conflicts with %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "do not install %s"
+
+#~ msgid "keep %s"
+#~ msgstr "keep %s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "do not install %s"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "There are no installable providers of %s"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "Do not install or delete the resolvables concerned"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s provides %s, but has another architecture."
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "Install %s although it would change the architecture"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s obsoletes %s"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "Updating %s to %s"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Installation of %s failed:"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Cannot open file %1."
index 40536eb..b944392 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -16,7 +16,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-03-07 00:21+0000\n"
 "Last-Translator: Antonio Simón <antonio@trans-mission.com>\n"
 "Language-Team: Spanish <https://l10n.opensuse.org/projects/libzypp/master/es/"
@@ -28,12 +28,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tipo dudoso %s para el byte %u de la suma de comprobación %s"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "País desconocido: "
@@ -1305,74 +1299,22 @@ msgstr "Mejora"
 msgid "Supplements"
 msgstr "Complementa"
 
-# include/backup/ui.ycp:1661
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "No es posible abrir el pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "No es posible abrir el conducto (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "No es posible aplicar chroot a %s (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "No es posible cambiar al directorio %s en chroot %s (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "No es posible cambiar al directorio %s (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "No es posible ejecutar %s (%s)."
-
-# clients/printconf_write.ycp:121
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "No es posible hacer fork (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "El comando ha terminado con el estado %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "La señal %d (%s) ha interrumpido el comando."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "El comando ha terminado con un error desconocido."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 "Se intentó importar una clave que no existe (%s) al almacén de claves %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Error al importar la clave."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Error al suprimir la clave."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "No se encuentra el archivo de firma %s"
@@ -3780,52 +3722,52 @@ msgstr[1] "(expira en %d días)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Buscando la llave gpg con identificador ID %1% en la caché %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Buscando la llave gpg con identificador %1% en el repositorio %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "El repositorio %1% no define ningún URL 'gpgkey=' adicional."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "No es posible leer el directorio de repositorio %1%: permiso denegado"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Error al leer el directorio %s"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "No es posible leer el archivo de repositorio %1%: permiso denegado"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "El alias del repositorio no puede comenzar con un punto."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "El alias del servicio no puede comenzar con un punto."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "No es posible abrir el archivo %s para escribir en él."
@@ -3833,7 +3775,7 @@ msgstr "No es posible abrir el archivo %s para escribir en él."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
@@ -3841,37 +3783,37 @@ msgstr ""
 "huérfano %2%"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "No se han encontrado metadatos válidos en la URL especificada"
 msgstr[1] "No se han encontrado metadatos válidos en las URL especificadas"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "No es posible crear %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "No es posible crear el directorio para el caché de metadatos."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construyendo el caché del repositorio %s"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "No es posible crear el caché en %s, no posee permisos de escritura."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Error al añadir a caché el repositorio (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Tipo de repositorio no gestionado"
 
@@ -3881,68 +3823,47 @@ msgstr "Tipo de repositorio no gestionado"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Error al intentar leer de %s"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Error desconocido al leer de %s"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Añadiendo el repositorio %s"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nombre de archivo del repositorio no válido en %s"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Eliminando el repositorio %s"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "No es posible determinar dónde está almacenado el repositorio."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "No es posible suprimir %s"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "No es posible determinar donde está almacenado el servicio."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Cadena de consulta URL LDAP no válida"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Parámetro de consulta URL LDAP %s no válido"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "No es posible clonar el objeto URL"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Referencia de objeto de URL vacío no válida"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "No es posible analizar los componentes de URL"
-
 # clients/support_registration.ycp:225 include/support/registration.ycp:77
 # clients/support_askkey.ycp:246 include/support/supportio.ycp:79
 #
@@ -4025,7 +3946,7 @@ msgstr "Para obtener asistencia se necesita un contrato adicional de cliente."
 msgid "Unknown support option. Description not available"
 msgstr "Opción de asistencia desconocida. Descripción no disponible."
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4034,11 +3955,6 @@ msgstr ""
 "La gestión del sistema está bloqueada por la aplicación con pid %d (%s).\n"
 "Cierre la aplicación antes de volver a intentarlo."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historial:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4060,13 +3976,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expresión regular '%s' no válida"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Se requiere autenticación para %s"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4074,8 +3991,8 @@ msgstr ""
 "Visite el Centro de servicios al cliente de SUSE para comprobar si su "
 "registro es válido y no ha caducado."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4104,7 +4021,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "No se ha abierto el medio al intentar realizar la acción %s."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "No se encuentra el archivo %s en el medio %s"
@@ -4210,7 +4127,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Se ha denegado el permiso para acceder a %s."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Se ha superado el tiempo de espera al acceder a %s."
@@ -4221,7 +4138,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "La descarga de datos ha excedido el tamaño esperado '%s 1' de '%s 2'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "La ubicación '%s' está momentaneamente inaccesible."
@@ -4241,7 +4158,7 @@ msgstr ""
 "Creación de punto de conexión: no se encuentra ningún directorio en el que "
 "se pueda escribir para crear un punto de conexión"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Método de autenticación HTTP no compatible %s"
@@ -4304,7 +4221,7 @@ msgid "No url in repository."
 msgstr "No hay ninguna URL en el repositorio."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4469,7 +4386,7 @@ msgstr "romper %s ignorando algunas de sus dependencias"
 msgid "generally ignore of some dependencies"
 msgstr "generalmente se ignoran algunas dependencias"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4479,95 +4396,89 @@ msgstr ""
 "distribuciones y se debe sustituir"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "el elemento %1% que se va a instalar no pertenece a un repositorio de "
 "actualización de distribuciones"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "el elemento %1% instalado tiene una arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "el elemento %1% que se va a instalar tiene una arquitectura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problema con el elemento %1% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "peticiones en conflicto"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "algún problema de dependencia"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nada proporciona el elemento %1% pedido"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "¿Ha habilitado todos los repositorios requeridos?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "el paquete %1% pedido no existe"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "petición no admitida"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "%1% es proporcionado por el sistema y no se puede borrar"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% no es instalable"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nada proporciona %1%, que el elemento %2% instalado necesita"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "nada proporciona %1%, que el elemento %2% que se va a instalar necesita"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "no es posible instalar %1% y %2% conjuntamente"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "el elemento %1% instalado tiene un conflicto con %2%, que proporciona el "
 "elemento %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4575,7 +4486,7 @@ msgstr ""
 "el elemento %1% instalado tiene un conflicto con %2%, que proporciona el "
 "elemento %3% que se va a instalar"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4583,7 +4494,7 @@ msgstr ""
 "el elemento %1% que se va a instalar tiene un conflicto con %2%, que "
 "proporciona el elemento %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4592,28 +4503,28 @@ msgstr ""
 "el elemento %1% que se va a instalar tiene un conflicto con %2%, que "
 "proporciona el elemento %3% que se va a instalar"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "el elemento %1% instalado deja obsoleto a %2%, proporcionado por el elemento "
 "%3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "el elemento %1% instalado deja obsoleto a %2%, proporcionado por el elemento "
 "%3% que se va a instalar"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "el elemento %1% que se va a instalar deja obsoleto a %2%, proporcionado por "
 "el elemento %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4621,21 +4532,21 @@ msgstr ""
 "el elemento %1% que se va a instalar deja obsoleto a %2%, proporcionado por "
 "el elemento %3% que se va a instalar"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "el elemento %1% instalado tiene un conflicto con %2% proporcionado por sí "
 "mismo"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "el elemento %1% que se va a instalar tiene un conflicto con %2% "
 "proporcionado por sí mismo"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4643,7 +4554,7 @@ msgstr ""
 "el elemento %1% instalado requiere %2%, pero no se puede satisfacer este "
 "requisito"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4652,15 +4563,11 @@ msgstr ""
 "el elemento %1% que se va a instalar requiere %2%, pero no se puede "
 "satisfacer este requisito"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "proveedores suprimidos: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4668,124 +4575,108 @@ msgstr ""
 "\n"
 "proveedores no instalables: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "proveedores no instalables: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "elimine el bloqueo para permitir la eliminación de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "no instalar %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "mantener %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "elimine el bloqueo para permitir la instalación de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Esta petición dañará su sistema."
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignorar la advertencia de daño del sistema"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "no pedir que se instale un elemento solucionable que proporcione %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 "no perdir que se supriman todos los elementos solucionables que proporcionen "
 "%1%"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "no instalar la versión más reciente de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "mantener %1% a pesar de que su arquitectura sea inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "instalar %1% a pesar de que su arquitectura sea inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "mantener el elemento %1% obsoleto"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "instalar el elemento %1% del repositorio excluido"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "instalar %1% aunque se haya retraído"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "permitir la instalación de PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instalar %1% aunque esté en la lista negra"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "bajar de versión %1% a %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "cambio de arquitectura de %1% a %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4796,217 +4687,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "sustitución de %1% con %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "desinstalación de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s no pertenece a un repositorio distupgrade"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s posee una arquitectura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "se ha producido un problema con el paquete instalado %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "no hay nada que proporcione el elemento %s pedido"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "¿Ha habilitado todos los repositorios pedidos?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "el paquete %s no existe"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s proviene del sistema y no se puede eliminar"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s no es instalable"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "no hay nada que proporcione %s, necesario para %s"
-
-# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
-# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
-# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "no es posible instalar ambos elementos: %s y %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s está en conflicto con %s proporcionado por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s deja obsoleto %s, proporcionado por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s instalado, deja obsoleto a %s proporcionado por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "La solución %s está en conflicto con %s, proporcionada por ella misma"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s requiere %s, pero este requisito no se puede cumplir"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "eliminar bloqueo para permitir la desinstalación de %s"
-
-# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
-# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
-# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "no instalar %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "mantener %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "eliminar bloqueo para permitir la instalación de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "no preguntar si se debe instalar una solución que proporciona %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-"no preguntar si se deben suprimir todas las soluciones que proporcionan %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "no instalar la versión mas reciente de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "mantener %s a pesar de la arquitectura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "instalar %s a pesar de la arquitectura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "mantener el antiguo %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "instalar %s desde el repositorio excluido"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "restablecer versión anterior de %s a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "cambio en la arquitectura de %s a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"instalar %s (con cambio de proveedor)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "reemplazo de %s con %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "desinstalación de %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5024,56 +4719,60 @@ msgid "Installation has been aborted as directed."
 msgstr "La instalación se ha cancelado siguiendo las indicaciones."
 
 # include/nis_server/io.ycp:567
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " ejecutado"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " error de ejecución"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s ya se ha ejecutado como %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " ejecución omitida mientras se cancela"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Error al enviar la notificación del mensaje de actualización."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nuevo mensaje de actualización"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM fallido: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Error al importar la clave pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Error al eliminar la clave pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "¡El paquete no está firmado!"
 
@@ -5084,20 +4783,20 @@ msgstr "¡El paquete no está firmado!"
 # modules/Mail.ycp:563
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Se han modificado los archivos de configuración para %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm ha guardado %s como %s, pero no es posible determinar la diferencia"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5107,13 +4806,13 @@ msgstr ""
 "A continuación se presentan las primeras 25 líneas de diferencia:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ha creado %s como %s, pero no es posible determinar la diferencia"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5124,152 +4823,371 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Salida de rpm adicional"
 
 # include/nis_server/io.ycp:582
 # include/backup/ui.ycp:1286
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "creada copia de seguridad %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "La firma es correcta"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Tipo de firma desconocido"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "La firma no cumple la verificación"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "La firma es correcta, pero la clave no es de confianza"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "La clave pública de firma no está disponible"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "El archivo no existe o no es posible comprobar la firma"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "El fichero no está firmado"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"(curl) Error de descarga para '%s':\n"
+"Código de error: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"(curl) Error de descarga para '%s':\n"
+"No se recibió una respuesta HTTP\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tipo dudoso %s para el byte %u de la suma de comprobación %s"
+
+# include/backup/ui.ycp:1661
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "No es posible abrir el pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "No es posible abrir el conducto (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Cadena de consulta URL LDAP no válida"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Parámetro de consulta URL LDAP %s no válido"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "No es posible clonar el objeto URL"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Referencia de objeto de URL vacío no válida"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "No es posible analizar los componentes de URL"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historial:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "El esquema de URL no permite un elemento %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Componente %s no válido %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Componente %s no válido"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 "El análisis de cadenas de consulta no es compatible con esta dirección URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "El esquema de URL es un componente obligatorio"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Esquema %s de URL no válido"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "El esquema de URL no permite un nombre de usuario"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "El esquema de URL no permite una contraseña"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "El esquema de URL requiere un componente host"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "El esquema de URL no permite un componente host"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Componente de host no válido %s"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "El esquema de URL no permite un puerto"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Componente de puerto no válido %s"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "El esquema URL requiere un nombre de vía"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "No se permiten vías relativas si existe una autoridad"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "La cadena cifrada incluye un byte nulo"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Carácter separador de división de conjunto de parámetros no válido"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Carácter separador de división de asignación de parámetros no válido"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Carácter separador de unión de conjunto de parámetros no válido"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "El comando ha terminado con el estado %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "La señal %d (%s) ha interrumpido el comando."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "El comando ha terminado con un error desconocido."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"(curl) Error de descarga para '%s':\n"
-"Código de error: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "No es posible aplicar chroot a %s (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "No es posible cambiar al directorio %s (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "No es posible cambiar al directorio %s en chroot %s (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "No es posible ejecutar %s (%s)."
+
+# clients/printconf_write.ycp:121
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "No es posible hacer fork (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"(curl) Error de descarga para '%s':\n"
-"No se recibió una respuesta HTTP\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s no pertenece a un repositorio distupgrade"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s posee una arquitectura inferior"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "se ha producido un problema con el paquete instalado %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "no hay nada que proporcione el elemento %s pedido"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "¿Ha habilitado todos los repositorios pedidos?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "el paquete %s no existe"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s proviene del sistema y no se puede eliminar"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s no es instalable"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "no hay nada que proporcione %s, necesario para %s"
+
+# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
+# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
+# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "no es posible instalar ambos elementos: %s y %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s está en conflicto con %s proporcionado por %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s deja obsoleto %s, proporcionado por %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s instalado, deja obsoleto a %s proporcionado por %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr ""
+#~ "La solución %s está en conflicto con %s, proporcionada por ella misma"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s requiere %s, pero este requisito no se puede cumplir"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "eliminar bloqueo para permitir la desinstalación de %s"
+
+# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
+# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
+# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
+#~ msgid "do not install %s"
+#~ msgstr "no instalar %s"
+
+#~ msgid "keep %s"
+#~ msgstr "mantener %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "eliminar bloqueo para permitir la instalación de %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "no preguntar si se debe instalar una solución que proporciona %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr ""
+#~ "no preguntar si se deben suprimir todas las soluciones que proporcionan %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "no instalar la versión mas reciente de %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "mantener %s a pesar de la arquitectura inferior"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "instalar %s a pesar de la arquitectura inferior"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "mantener el antiguo %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "instalar %s desde el repositorio excluido"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "restablecer versión anterior de %s a %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "cambio en la arquitectura de %s a %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "instalar %s (con cambio de proveedor)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "reemplazo de %s con %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "desinstalación de %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "No es posible abrir el archivo de bloqueo: %s"
index 70fd62c..fc68852 100644 (file)
--- a/po/et.po
+++ b/po/et.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.et\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2019-12-08 11:54+0000\n"
 "Last-Translator: Jaanus Ojangu <jaanus.ojangu@gmail.com>\n"
 "Language-Team: Estonian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -20,12 +20,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Kahtlane tüüp '%s' %u baitide kontrollsummale '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Tundmatu riik "
@@ -1294,71 +1288,21 @@ msgstr "Parandused"
 msgid "Supplements"
 msgstr "Lisandid"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Ei saanud avada preudoterminali 'pty' (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Ei saa avada toru 'pipe' (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Ei saa chroot läbi viia '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Ei  õnnestunud 'chdir' '%s' 'chroot' sees '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Ei saa kataloogi vahetada 'chdir '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Ei saa käivitada '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "'fork' ei õnnestu (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Käsk lõpetati olekuga %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Käsk lõpetati signaaliga %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Käsk lõpetas tundmatu veaga."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Prooviti võtmehoidjasse %s importida olematu võtme  %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Võtme import nurjus."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Võtme kustutamine nurjus."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Allkirjade faili %s ei leitud"
@@ -3763,52 +3707,52 @@ msgstr[1] "(aegub %d päevaga)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Otsitakse gpg võtme ID-d %1% vahemälus %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Otsitakse gpg võtme ID-d %1% repositooriumis %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repositoorium %1% ei defineeri täiendavat 'gpgkey=' URLi."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Ei saa lugeda repo kataloogi '%1%': Juurdepääs on keelatud"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Kataloogi '%s' lugemine nurjus"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Ei saa lugeda repo faili '%1%': Juurdepääs on keelatud"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Hoidlat alias ei saa alata punktiga."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Teenuse alias ei saa alata täpiga."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Faili '%s' avamine kirjutamiseks nurjus."
@@ -3816,43 +3760,43 @@ msgstr "Faili '%s' avamine kirjutamiseks nurjus."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Tundmatu teenus '%1%': Orvustunud teenuse repost '%2%' eemaldamine"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Valitud metaandmeid ei leitud määratud URL-ilt"
 msgstr[1] "Valitud metaandmeid ei leitud määratud URL-delt"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Pole võimalik luua %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Metaandmete vahemälu kataloogi ei saa luua."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Loodava repositooriumi '%s' vahemälu"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Ei saa luua vahemälu kohas %s - puuduvad kirjutamise õigused."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Hoidla puhverdamine nurjus (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Käsitlemata tarkvarahoidla tüüp"
 
@@ -3862,68 +3806,47 @@ msgstr "Käsitlemata tarkvarahoidla tüüp"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Viga lugemisel asukohast '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Tundmatu viga '%s' lugemisel"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Lisatakse repositoorium '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Vigane repo faili nimi '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Eemaldatakse hoidla '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Ei suuda tuvastada, kus hoidla asub."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Faili '%s' ei saa kustutada"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Ei suuda tuvastada, kus teenus asub."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Vigane LDAP URL-i päringu kirje"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Vigane LDAP URL-i päringu parameeter '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Pole võimalik kloonida Url objekti"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Vigane tühja Url objekti referents"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Ei ole võimalik uurida Url komponente"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "tundmatu"
@@ -4000,7 +3923,7 @@ msgstr "Kasutajatoe saamiseks on vajalik täiendav kliendileping."
 msgid "Unknown support option. Description not available"
 msgstr "Tundmatu toe valik. Kirjeldus pole saadaval"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4009,11 +3932,6 @@ msgstr ""
 "Süsteemihaldus on lukustatud rakendusega pid %d (%s).\n"
 "Enne uuesti proovimist sulgege see rakendus."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Ajalugu:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4035,13 +3953,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Vigane regulaaravaldis '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autoriseerimine on nõutav '%s' jaoks"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4049,8 +3968,8 @@ msgstr ""
 "Külastage SUSE kliendikeskust, et kontrollida, kas teie registreering on "
 "kehtiv ega ole aegunud."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4079,7 +3998,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Toimingu '%s' sooritamisel meedium ei avanenud."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Faili '%s' ei leitud meediumil '%s'"
@@ -4185,7 +4104,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Ligipääs '%s' on keelatud."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "'%s juurdepääsu ajalimiit on ületatud."
@@ -4196,7 +4115,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Allalaaditud andmed ületasid faili suurust '%s'  '%s' -st."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Asukoht '%s' on ajutiselt kättesaamatu."
@@ -4215,7 +4134,7 @@ msgid ""
 msgstr ""
 "Lisamispunkti loomine: lisamispunkti loomiseks ei leia kirjutatavat kataloogi"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Mittetoetatud HTTP autoriseerimise meetod '%s'"
@@ -4276,7 +4195,7 @@ msgid "No url in repository."
 msgstr "Repositooriumis ei ole URLi."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4441,7 +4360,7 @@ msgstr "võib katki teha %s ignoneerides mõnda selle sõltuvust"
 msgid "generally ignore of some dependencies"
 msgstr "üldiselt ignoreeritakse mõnda sõltuvust"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4449,161 +4368,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "vastuolulised päringud"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "mingi sõltuvuse probleem"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "mittetoetaud taotlus"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "kustutatud pakkujad: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4611,122 +4520,106 @@ msgstr ""
 "\n"
 "kättesaamatud varustajad: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "kättesaamatud varustajad: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "See päring rikub teie süsteemi!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignoreerige katkise süsteemi hoiatust"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "paigalda %1%, ehkki see on tagasi tõmmatud"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "lubage paigaldada PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "paigaldage %1%, kuigi see on mustas nimekirjas"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4735,209 +4628,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s ei kuulu distupgrade tarkvarahoidlasse"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s on halvema arhitektuuriga"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "Paigaldatud paketiga %s on probleem"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "kuskil ei pakuta nõutud %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Kas olete lubanud kõik taotletud hoidlad?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "paketti %s pole olemas"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s on süsteemi poolt seatud ja ei ole eemaldatav"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s pole paigaldatav"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "miski ei paku %s vajalikku %s -le"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Ei saa paigaldada mõlemat %s ja %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s on konfliktis %s -ga hangituna %s poolt"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s aegub %s pakkujalt %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "paigaldatud %s aegub %s pakkujalt %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "lahendatav %s on vastuolus enda poolt pakutuga %s"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s nõuab %s, kuid seda nõuet ei saa täita"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "eemalda lukk, et lubada %s eemaldamist"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "ära paigalda %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "jäta alles %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "eemalda lukustus %s paigalduse lubamiseks"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "ärge paluge paigaldada pakutavaid sõltuvuste lahendusi %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "ärge paluge kustutada kõiki pakutud sõltuvuste lahendusi %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "ära paigalda %s uusimat versiooni"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "jäta alles %s hoolimata halvemast arhitektuurist"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "paigaldage %s vaatamata madalamale arhitektuurile"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "jäta aegunud %s alles"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "paigaldage %s välistatud hoidlast"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "tagasiviimine %s tasemele %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "arhitektuuri muutus %s teisele %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"paigalda %s (koos tarnija vahetusega)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "%s vahetamine %s vastu"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "%s eemaldamine"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4955,74 +4659,78 @@ msgstr "Käib %posttrans scripts"
 msgid "Installation has been aborted as directed."
 msgstr "Paigaldamine on vastavalt juhistele katkestatud."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " käivitatud"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " käivitamine nurjus"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s juba käivitatud kui %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " käivitamine jäeti katkestamise käigus vahele"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Viga uuendusteate teavituse saatmisel."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Uus uuendusteade"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM nurjus: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Avaliku võtme %1% import nurjus"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Avaliku võtme %1% eemaldamine nurjus"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Pakett ei ole allkirjastatud!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Muudetud seadistuste fail %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm salvestati %s nimega %s, kuid erinevust oli võimatu tuvastada"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5032,13 +4740,13 @@ msgstr ""
 "Siin on esimesed 25 erinevuse rida:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm loodi %s nimega %s, aga oli võimatu leida erinevusi"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5049,146 +4757,355 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Täiendav rpm-i väljund"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "loodi varukoopia %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Allkiri on korras"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Tundmatu allkirja tüüp"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Allkirja ei võrrelda"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Allkiri on õige aga võti ei ole usaldatav"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Allkirjade avalik võti pole saadaval"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Faili pole olemas või allkirja pole võimalik kontrollida"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Fail on allkirjastamata"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Kahtlane tüüp '%s' %u baitide kontrollsummale '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Ei saanud avada preudoterminali 'pty' (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Ei saa avada toru 'pipe' (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Vigane LDAP URL-i päringu kirje"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Vigane LDAP URL-i päringu parameeter '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Pole võimalik kloonida Url objekti"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Vigane tühja Url objekti referents"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Ei ole võimalik uurida Url komponente"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Ajalugu:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "URL kuju ei luba %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Vigane %s komponent '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Vigane %s komponent"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Selle URL-i puhul ei toetata päringu kirje uurimist"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URL kuju on nõutav komponent"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Vigane Url kuju '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url kuju ei võimalda kasutajanime"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url kuju ei võimalda salasõna"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url kuju nõuab arvutinime komponenti"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Url kuju ei võimalda arvutinime komponenti"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Vigane host komponent '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Url kuju ei võimalda porti"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Vigane pordi komponent '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url kuju nõuab teekonna nime"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Suhteline tee pole lubatud, kui autoriseerimine on olemas"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Krüpteeritud rida sisaldab Nul baiti"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Vale parameetri reastuse jaotuse eraldusmärk"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Vigane parameeter kaardijaotuse eraldusmärk"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Vigane parameetrimassiivi liitumismärk"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Käsk lõpetati olekuga %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Käsk lõpetati signaaliga %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Käsk lõpetas tundmatu veaga."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Ei saa chroot läbi viia '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Ei saa kataloogi vahetada 'chdir '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Ei  õnnestunud 'chdir' '%s' 'chroot' sees '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Ei saa käivitada '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "'fork' ei õnnestu (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s ei kuulu distupgrade tarkvarahoidlasse"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s on halvema arhitektuuriga"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "Paigaldatud paketiga %s on probleem"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "kuskil ei pakuta nõutud %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Kas olete lubanud kõik taotletud hoidlad?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "paketti %s pole olemas"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s on süsteemi poolt seatud ja ei ole eemaldatav"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s pole paigaldatav"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "miski ei paku %s vajalikku %s -le"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Ei saa paigaldada mõlemat %s ja %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s on konfliktis %s -ga hangituna %s poolt"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s aegub %s pakkujalt %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "paigaldatud %s aegub %s pakkujalt %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "lahendatav %s on vastuolus enda poolt pakutuga %s"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s nõuab %s, kuid seda nõuet ei saa täita"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "eemalda lukk, et lubada %s eemaldamist"
+
+#~ msgid "do not install %s"
+#~ msgstr "ära paigalda %s"
+
+#~ msgid "keep %s"
+#~ msgstr "jäta alles %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "eemalda lukustus %s paigalduse lubamiseks"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "ärge paluge paigaldada pakutavaid sõltuvuste lahendusi %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "ärge paluge kustutada kõiki pakutud sõltuvuste lahendusi %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "ära paigalda %s uusimat versiooni"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "jäta alles %s hoolimata halvemast arhitektuurist"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "paigaldage %s vaatamata madalamale arhitektuurile"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "jäta aegunud %s alles"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "paigaldage %s välistatud hoidlast"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "tagasiviimine %s tasemele %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "arhitektuuri muutus %s teisele %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "paigalda %s (koos tarnija vahetusega)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "%s vahetamine %s vastu"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "%s eemaldamine"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Ei saa avada lukustusfaili: %s"
 
index 5c7a4dd..420c32f 100644 (file)
--- a/po/fa.po
+++ b/po/fa.po
@@ -4,7 +4,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: opensuse-i 18n\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2019-05-21 15:55+0000\n"
 "Last-Translator: Mohammad Rezaei Seresht <m_rezaei_seresht@hotmail.com>\n"
 "Language-Team: Persian <https://l10n.opensuse.org/projects/libzypp/master/fa/"
@@ -16,12 +16,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 3.3\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "مورد مشکوک '%s' برای %u بایت checksum '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "کشور ناشناخته: "
@@ -1290,71 +1284,21 @@ msgstr "بالا میبرد"
 msgid "Supplements"
 msgstr "تکمیل میکند"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "نمیتوان pty (%s) را باز کرد."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "نمیتوان pipe (%s) را باز کرد."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "نمیتوان chroot کرد به '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "نمیتوان chdir کرد به '%s'  درون chroot '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "نمیتوان chdir کرد به '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "'%s' (%s) را نمیتوان اجرا کرد."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "نمیتوان fork کرد (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "دستور با وضعیت %d خارج شد."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "دستور با سیگنال %d (%s) کشته شد."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "دستور با خطای ناشناخته خارج شد."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "برای وارد کردن کلید ناموجود %s در دسته کلید %s تلاش شد"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "ناموفق در وارد کردن کلید."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "در حذف کلید ناموفق بود."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "پرونده ی امضای %s  یافت نشد"
@@ -3760,52 +3704,52 @@ msgstr[2] "(در %d منقضی می شود)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "در جستجوی کلید gpg %1%  در کش %2% ."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "در جستجوی شناسه کلید gpg %1% در مخزن %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "نمیتوان فهرست مخزن '%1%' را خواند: دسترسی غیرمجاز است"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "ناموفق در خواندن مسیر '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "نمیتوان پرونده ی مخزن  '%1%' را خواند: دسترسی غیرمجاز است"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "نام مستعار مخزن نمیتواند با نقطه شروع شود."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "نام مستعار سرویس نمیتواند با نقطه شروع شود."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "نمیتوان پرونده ی '%s' را برای نوشتن باز کرد."
@@ -3813,44 +3757,44 @@ msgstr "نمیتوان پرونده ی '%s' را برای نوشتن باز کر
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "سرویس ناشناخته '%1%': در حال حذف مخزن سرویس جدا افتاده '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "شبه داده ی معتبر  در آدرس تعیین شده یافت نشد"
 msgstr[1] "شبه داده ی معتبر در آدرسهای تعیین شده یافت نشد"
 msgstr[2] "شبه داده ی معتبر در آدرسهای تعیین شده یافت نشد"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "نمیتوان %s را ساخت"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "نمیتوان فهرست کش شبه داده را ساخت."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "در حال ساخت کش مخزن '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "نمیتوان کش را در %s ساخت - دسترسی نوشتن نیست."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "ناموفق در کش مخزن (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "نوع مخزن کنترل نشده"
 
@@ -3860,68 +3804,47 @@ msgstr "نوع مخزن کنترل نشده"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "خطا در تلاش برای خواندن از '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "خطای ناشناس در خواندن از  '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "در حال اضافه کردن مخزن '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "نام پرونده ی مخزن نامعتبر در '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "در حال حذف مخزن  '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "نمیتوان کشف کرد که مخزن در کجا ذخیره شده است."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' را نمیتوان حذف کرد"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "نمیتوان کشف کرد سرویس در کجا ذخیره شده است."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "رشته ی پرس و جوی آدرس LDAP نامعتبر"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "پارامتر پرس و جوی آدرس LDAP نامعتبر '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "ناتوان در همزاد سازی آدرس شیء"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "مرجع شیء آدرس خالی نامعتبر"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "ناتوان در تجزیه ی اجزاء آدرس"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "ناشناخته"
@@ -3997,7 +3920,7 @@ msgstr "یک قرارداد اضافی مشتری برای دریافت پشتی
 msgid "Unknown support option. Description not available"
 msgstr "اختیار پشتیبانی ناشناخته. تعاریف در دسترس نیستند"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4006,11 +3929,6 @@ msgstr ""
 "مدیریت سیستم توسط نرم افزار با pid %d (%s) قفل شده است.\n"
 "این نرم افزار را قبل از تلاش مجدد ببندید."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "تاریخچه:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4032,20 +3950,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "عبارت عادی نامعتبر '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "احراز هویت برای '%s' مورد نیاز است"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4074,7 +3993,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "رسانه در هنگام تلاش برای انجام عمل '%s' باز نشده است."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "پرونده ی '%s' در رسانه ی '%s' یافت نشد"
@@ -4180,7 +4099,7 @@ msgid "Permission to access '%s' denied."
 msgstr "اجازه برای دسترسی به '%s' داده نشد."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "مهلت زمانی در هنگام دسترسی به '%s' به اتمام رسید."
@@ -4191,7 +4110,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "مکان '%s' به صورت موقتی غیر قابل دسترسی است."
@@ -4208,7 +4127,7 @@ msgid ""
 msgstr ""
 "ساخت نقطه ی اتصال: نمیتوان یک فهرست قابل نوشتن را برای ساخت نقطه ی اتصال یافت"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "حالت احراز هویت پشتیبانی نشده '%s'"
@@ -4270,7 +4189,7 @@ msgid "No url in repository."
 msgstr "هیچ آدرسی در مخزن نیست."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4435,7 +4354,7 @@ msgstr "شکستن %s با نادیده گرفتن برخی از وابستگی
 msgid "generally ignore of some dependencies"
 msgstr "نادیده گرفته برخی وابستگیها به صورت عمومی"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4443,161 +4362,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "درخواستهای متداخل"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "برخی مشکلات وابستگی"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "درخواست پشتیبانی نشده"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "ارائه دهنده های حذف شده: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4605,122 +4514,106 @@ msgstr ""
 "\n"
 "ارائه دهندگان غیر قابل نصب: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "ارائه دهندگان غیر قابل نصب: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "این درخواست سیستم شما را خواهد شکست!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "نادیده گرفتن هشدار سیستم شکسته شده"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4729,209 +4622,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s مربوط به یک مخزن distupgrade نیست"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s دارای معماری نامرغوب است"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "ایراد در بسته ی نصب شده ی %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "هیچ چیز %s درخواستی را مهیا نمیکند"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "آیا شما تمامی مخازن درخواستی را فعال کرده اید؟"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "بسته ی %s وجود ندارد"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s توسط سیستم مهیا شده است و نمیتواند حذف شود"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s قابل نصب نیست"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "هیچ چیز %s که توسط %s مورد نیاز است را مهیا نمیکند"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "نمیتوان هردو %s و %s را نصب کرد"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s با %s که توسط %s مهیا شده است متداخل است"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s منسوخ میکند %s را که توسط %s مهیا شده است"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s نصب شده منسوخ میکند %s را که توسط %s مهیا شده است"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "حل شونده ی %s با %s مهیا شده توسط خودش متداخل است"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s میخواهد %s را، اما این نیازمندی قابل مهیا شدن نیست"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "قفل را جهت حذف %s پاک کنید"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s را نصب نکن"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s را نگه دار"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "قفل را جهت نصب %s حذف کن"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "درباره ی نصب یک حل شونده که %s را ارائه میدهد سوال نکن"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "درباره ی حذف تمامی حل شونده ها که %s را ارائه میدهند سوال نکن"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "نسخه های جدیدتر %s را نصب نکن"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "نگهداری %s با وجود اینکه معماری نامرغوب دارد"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "نصب %s با وجود اینکه معماری نامرغوب دارد"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "نگهداری %s منسوخ شده"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "نصب %s از مخزن مستثنی"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "تنزل درجه ی %s به %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "تغییر معماری %s به %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"نصب %s (با تغییر فروشنده) \n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "جایگزینی %s با %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "از نصب خارج کردن %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4949,74 +4653,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "نصب انصراف داده شد و یا جهتدار شد."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " اجرا شده"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " اجرا ناموفق بود"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s در حال حاظر اجرا شده به عنوان %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " اجرا در هنگام انصراف پرش شد"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "خطا در ارسال اعلام پیغام بروزرسانی."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "پیغام بروزرسانی جدید"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM شکست خورد: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "ناموفق در وارد کردن کلید عمومی از پرونده ی %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "ناموفق در حذف کلید عمومی %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "بسته مورد تایید نیست!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "پرونده های پیکربندی تغییر کرده برای %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ذخیره شد %s به عنوان %s، اما تعیین اختلاف امکانپذیر نبود"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5026,13 +4734,13 @@ msgstr ""
 "اینها 25 خط اولیه ی اختلاف ها هستند:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ساخته شد %s به عنوان %s، اما تعیین اختلاف امکانپذیر نبود"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5043,146 +4751,355 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "خروجی rpm اضافی"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "پشتیبان ساخته شد %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "امضا خوب است"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "نوع امضا ناشناخته است"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "امضا قابل تایید نیست"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "امضا خوب است، اما کلید اعتمادسازی نشده است"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "کلید عمومی امضاها موجود نیست"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "پرونده موجود نیست و یا امضاها قابل بررسی نیستند"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "فایل تایید نشده"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "مورد مشکوک '%s' برای %u بایت checksum '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "نمیتوان pty (%s) را باز کرد."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "نمیتوان pipe (%s) را باز کرد."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "رشته ی پرس و جوی آدرس LDAP نامعتبر"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "پارامتر پرس و جوی آدرس LDAP نامعتبر '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "ناتوان در همزاد سازی آدرس شیء"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "مرجع شیء آدرس خالی نامعتبر"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "ناتوان در تجزیه ی اجزاء آدرس"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "تاریخچه:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "شکل آدرس یک %s را مجاز نمیکند"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "%s نامعتبر جزء %s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "جزء %s نامعتبر"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "تجزیه ی پرس و جوی رشته برای این آدرس پشتیبانی نمیشود"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "شکل آدرس یک جزء درخواستی است"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "شکل آدرس نامعتبر '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "شکل آدرس، نام کاربری را مجاز نمیکند"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "شکل آدرس، رمز عبور را مجاز نمیکند"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "شکل آدرس یک جزء میزبان را میخواهد"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "شکل آدرس یک جزء میزبان را اجازه نمیدهد"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "جزء میزبان نامعتبر  '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "شکل آدس یک درگاه را مجاز نمیکند"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "جزء درگاه نامعتبر  '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "شکل آدرس یک نام مسیر را میخواهد"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "مسیر نسبی در صورت وجود مرجع مجاز نیست"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "رشته ی رمزی حاوی بایت NUL است"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "پارامتر کاراکتر جداکننده ی تقسیمگر آرایه نامعتبر"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "پارامتر کاراکتر جداکننده ی تقسیمگر نقشه نامعتبر"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "پارامتر کاراکتر جداکننده ی پیوند آرایه نامعتبر"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "دستور با وضعیت %d خارج شد."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "دستور با سیگنال %d (%s) کشته شد."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "دستور با خطای ناشناخته خارج شد."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "نمیتوان chroot کرد به '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "نمیتوان chdir کرد به '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "نمیتوان chdir کرد به '%s'  درون chroot '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "'%s' (%s) را نمیتوان اجرا کرد."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "نمیتوان fork کرد (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s مربوط به یک مخزن distupgrade نیست"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s دارای معماری نامرغوب است"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "ایراد در بسته ی نصب شده ی %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "هیچ چیز %s درخواستی را مهیا نمیکند"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "آیا شما تمامی مخازن درخواستی را فعال کرده اید؟"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "بسته ی %s وجود ندارد"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s توسط سیستم مهیا شده است و نمیتواند حذف شود"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s قابل نصب نیست"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "هیچ چیز %s که توسط %s مورد نیاز است را مهیا نمیکند"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "نمیتوان هردو %s و %s را نصب کرد"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s با %s که توسط %s مهیا شده است متداخل است"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s منسوخ میکند %s را که توسط %s مهیا شده است"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s نصب شده منسوخ میکند %s را که توسط %s مهیا شده است"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "حل شونده ی %s با %s مهیا شده توسط خودش متداخل است"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s میخواهد %s را، اما این نیازمندی قابل مهیا شدن نیست"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "قفل را جهت حذف %s پاک کنید"
+
+#~ msgid "do not install %s"
+#~ msgstr "%s را نصب نکن"
+
+#~ msgid "keep %s"
+#~ msgstr "%s را نگه دار"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "قفل را جهت نصب %s حذف کن"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "درباره ی نصب یک حل شونده که %s را ارائه میدهد سوال نکن"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "درباره ی حذف تمامی حل شونده ها که %s را ارائه میدهند سوال نکن"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "نسخه های جدیدتر %s را نصب نکن"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "نگهداری %s با وجود اینکه معماری نامرغوب دارد"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "نصب %s با وجود اینکه معماری نامرغوب دارد"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "نگهداری %s منسوخ شده"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "نصب %s از مخزن مستثنی"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "تنزل درجه ی %s به %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "تغییر معماری %s به %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "نصب %s (با تغییر فروشنده) \n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "جایگزینی %s با %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "از نصب خارج کردن %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "نمیتوان فایل قفل را باز کرد: %s"
 
index fa747a2..8a8642e 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -19,7 +19,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.fi\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-03-15 11:56+0000\n"
 "Last-Translator: Tommi Nieminen <software@legisign.org>\n"
 "Language-Team: Finnish <https://l10n.opensuse.org/projects/libzypp/master/fi/"
@@ -31,12 +31,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Virheellinen tyyppi \"%s\" tavulle %u, tarkistussumma: \"%s\""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Tuntematon maa: "
@@ -1428,72 +1422,22 @@ msgstr "Parannukset"
 msgid "Supplements"
 msgstr "Täydentää"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "pty:n (%s) avaaminen ei onnistu."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Putken (%s) avaaminen ei onnistu."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Hakemistorajoitus (chroot) ei onnistu hakemistoon \"%s\" (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "chdir '%s' ei onnistu chroot '%s' sisällä (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "chdir  '%s' ei onnistu (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "\"%s\" (%s) suorittaminen ei onnistu."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Haarauttaminen (fork) ei onnistu (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Komento päättyi tilaan %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Komento lopetettiin signaalilla %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Komento päättyi tuntemattomaan virheeseen."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 "Yritettiin lisätä avain %s avainrenkaaseen %s, mutta tiedostoa ei löydetty"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Avaimen tuonti epäonnistui."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Avaimen poisto epäonnistui."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Allekirjoitustiedostoa %s ei löydetty"
@@ -3974,52 +3918,52 @@ msgstr[1] "(vanhenee %d päivässä)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Etsitään GPG-avainta %1% välimuistista %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Etsitään GPG-avainta %1% asennuslähteestä %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Asennuslähde %1% ei ole asettanut ”gpgkey=”-lisäverkko-osoitteita."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "repo hakemiston lukeminen ei onnistu '%1%': Pääsy estetty"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Hakemiston \"%s\" lukeminen ei onnistu"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "repo-tiedostoa '%1%' ei voitu lukea: Pääsy estetty"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Asennuslähteen alias ei voi alkaa pisteellä."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Palvelun alias ei voi alkaa pisteellä."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Tiedostoa \"%s\" ei voida avata kirjoitusta varten."
@@ -4027,43 +3971,43 @@ msgstr "Tiedostoa \"%s\" ei voida avata kirjoitusta varten."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Tuntematon palvelu '%1%': Poistetaan orpo palvelulähde '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Annetusta verkko-osoitteesta ei löytynyt kelvollista metatietoa"
 msgstr[1] "Annetuista verkko-osoitteista ei löytynyt kelvollista metatietoa"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ei voi luoda %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Metatiedon välimuistihakemistoa ei voi luoda."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Rakennetaan asennuslähteen \"%s\" välimuistia"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Välimuistia %s ei voida luoda - ei kirjoitusoikeuksia."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Virhe asennuslähteen puskuroinnissa (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Virheellinen asennuslähteen tyyppi"
 
@@ -4073,68 +4017,47 @@ msgstr "Virheellinen asennuslähteen tyyppi"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Virhe luettaessa \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Tuntematon virhe luettaessa \"%s\""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Lisätään asennuslähdettä \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Virheellinen asennuslähteen tiedostonimi \"%s\""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Poistetaan asennuslähdettä \"%s\""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Asennuslähteen sijaintia ei voida päätellä."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "\"%s\" poistaminen ei onnistu"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Palvelun sijaintia ei voida päätellä."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Virheellinen LDAP URL -kysely"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Virheellinen LDAP URL -parametri: \"%s\""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Verkko-osoite-objektin kahdentaminen ei onnistunut"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Virheellinen viittaus tyhjään URL-objektiin"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Verkko-osoitteen jäsentäminen ei onnistu"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "tuntematon"
@@ -4211,7 +4134,7 @@ msgstr "Tuen saamiseksi edellytetään erillinen asiakassopimus."
 msgid "Unknown support option. Description not available"
 msgstr "Tuntematon tukivaihtoehto. Kuvausta ei ole saatavilla"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4220,11 +4143,6 @@ msgstr ""
 "Prosessi %d (%s) on lukinnut järjestelmänhallinnan. \n"
 "Sulje ohjelma ennen uutta yritystä."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historia:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4246,21 +4164,22 @@ msgid "Invalid regular expression '%s'"
 msgstr "Virhe säännöllisessä lausekkeessa \"%s\""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "\"%s\" vaatii tunnistautumisen"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 "Tarkista SUSEn asiakaskeskuksessa käymällä, onko rekisteröitymisesi voimassa."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4289,7 +4208,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Tietolähdettä ei avattu suoritettaessa \"%s\"."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Tiedostoa \"%s\" ei löydy tietovälineeltä \"%s\""
@@ -4395,7 +4314,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Pääsy evätty kohteeseen \"%s\"."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Aikakatkaisu avattaessa \"%s\"."
@@ -4406,7 +4325,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Ladattu tieto ylittää odotetun tiedostokoon ”%s”/”%s”."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "\"%s\" ei ole hetkellisesti saatavilla."
@@ -4424,7 +4343,7 @@ msgstr ""
 "Luo liitospiste: Kirjoitettavissa olevaa kansiota ei löydy liitospisteen "
 "luomiseksi"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "HTTP-tunnistautumistapa \"%s\" ei ole tuettu"
@@ -4483,7 +4402,7 @@ msgid "No url in repository."
 msgstr "Asennuslähteen verkko-osoite puuttuu."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4648,7 +4567,7 @@ msgstr "jätä %s riippuvuuksia huomioimatta"
 msgid "generally ignore of some dependencies"
 msgstr "jätä joitakin riippuvuuksia huomiotta"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4656,93 +4575,87 @@ msgid ""
 msgstr "asennettu %1% ei kuulu jakelupäivityslähteeseen ja on korvattava"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "asennettava %1% ei kuulu jakelupäivityslähteeseen"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "asennetulla paketilla %1% on heikompi arkkitehtuuri"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "asennettavalla paketilla %1% on heikompi arkkitehtuuri"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "ongelma asennetussa paketissa %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "ristiriitaiset kyselyt"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "jokin riippuvuusongelma"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "mikään ei tarjoa pyydettyä pakettia ”%1%”"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Onko kaikki vaaditut asennuslähteet otettu käyttöön?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "pyydettyä pakettia %1% ei ole olemassa"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "pyyntöä ei tueta"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "paketin ”%1%” tarjoaa järjestelmä eikä sitä voi poistaa"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% ei ole asennettavissa"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "asennetun paketin %2% vaatimaa pakettia \"%1%” ei tarjoa mikään lähde"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "asennettavan paketin %2% vaatimaa pakettia ”%1%” ei tarjoa mikään lähde"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "ei voida asentaa sekä %1% että %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "asennettu %1% on ristiriidassa asennetun paketin %3% tarjoaman paketin ”%2%” "
 "kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4750,7 +4663,7 @@ msgstr ""
 "asennettu paketti %1% on ristiriidassa asennettavan paketin %3% tarjoaman "
 "paketin ”%2%” kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4758,7 +4671,7 @@ msgstr ""
 "asennettava paketti %1% on ristiriidassa asennetun paketin %3% tarjoaman "
 "paketin ”%2%” kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4767,28 +4680,28 @@ msgstr ""
 "asennettava paketti %1% on ristiriidassa toisen asennettavan paketin %3% "
 "tarjoaman paketin ”%2%” kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "asennettu paketti %1% vanhentaa toisen asennetun paketin %3% tarjoaman "
 "paketin ”%2%”"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "asennettu paketti %1% vanhentaa asennettavan paketin %3% tarjoaman paketin "
 "”%2%”"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "asennettava paketti %1% vanhentaa asennetun paketin %3% tarjoaman paketin "
 "”%2%”"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4796,27 +4709,27 @@ msgstr ""
 "asennettava paketti %1% vanhentaa toisen asennettavan paketin %3% tarjoaman "
 "paketin ”%2%”"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "asennettu paketti %1% on ristiriidassa itse tarjoamansa paketin ”%2“ kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "asennettava paketti %1% on ristiriidassa itsensä tarjoaman paketin ”%2%” "
 "kanssa"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "asennettu paketti %1% vaatii paketin ”%2%” mutta vaatimusta ei voi täyttää"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4824,15 +4737,11 @@ msgid ""
 msgstr ""
 "asennettava paketti %1% vaatii paketin ”%2%” mutta vaatimusta ei voi täyttää"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "poistetut tarjoajat: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4840,122 +4749,106 @@ msgstr ""
 "\n"
 "Poistettavissa olevat tarjoajat: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "poistetut tarjoajat: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "avaa lukitus paketin %1% poistamiseksi"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "älä asenna pakettia %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "pidä %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "avaa lukitus paketin %1% asentamiseksi"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Tämä pyyntö rikkoo järjestelmän!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ohita varoitus rikkinäisestä järjestelmästä"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "älä kysy, asennetaanko paketin %1% tarjoavaa ratkaisua"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "älä kysy, poistetaanko paketin %1% tarjoavia ratkaisuja"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "älä asenna paketin %1% uusinta versiota"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "pidä %1% heikommasta arkkitehtuurista huolimatta"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "asenna %1% heikommasta arkkitehtuurista huolimatta"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "pidä vanhentunut %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "asenna %1% pois suljetusta asennuslähteestä"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "asenna %1%, vaikka se on vedetty takaisin"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "salli asentaa PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "asenna %1%, vaikka se on mustalistattu"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "päivitä alaspäin %1% -> %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "arkkitehtuurin muutos %1% -> %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4966,210 +4859,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "korvataan %1% -> %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "poistetaan asennus: %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s ei kuulu jakeluversion päivitysasennuslähteeseen"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s on alempaa arkkitehtuuria"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "virhe asennettaessa pakettia %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "Mikään ei tarjoa pyydettyä %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Oletko ottanut käyttöön kaikki pyydetyt asennuslähteet?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "pakettia %s ei ole olemassa"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s on järjestelmän tarjoama ja sitä ei voi poistaa"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s ei ole asennettavissa"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "mikään ei tarjoa %s, jota %s tarvitsee"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Ei voida asentaa molempia %s ja %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s on ristiriidassa %s (%s) kanssa"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s vanhentaa %s (%s)"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "asennettu %s vanhentaa %s (%s)"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s on ristiriidassa itsensä kanssa (%s)"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s tarvitsee %s, mutta sen asentaminen ei onnistu"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "poista lukitus salliaksesi %s poiston"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "älä asenna %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "pidä %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "poista lukitus asentaaksesi: %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "älä kysy asennettaessa paketteja, jotka tuo %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "älä kysy poistettaessa paketteja, jotka tuo %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "älä asenna uusinta %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "Pidä %s vaikka se on alempaa arkkitehtuuria"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "asenna %s vaikka se on alempaa arkkitehtuuria"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "pidä vanhentunut %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "Asennetaan %s poisjätetystä asennuslähteestä"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "päivitetään vanhempaan %s -> %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "arkkitehtuurin vaihto %s -> %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"asenna %s (vaihtaa tarjoajaa)\n"
-"  %s --> %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "Korvataan %s -> %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "poista %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5186,75 +4890,79 @@ msgstr "Suoritetaan %posttrans-skriptejä"
 msgid "Installation has been aborted as directed."
 msgstr "Asennus keskeytettiin."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " suoritettu"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " suoritus epäonnistui"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s on jo suoritettu nimellä %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " suoritus ohitettiin keskeytettäessä"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Virhe lähetettäessä päivityshuomautusta."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Uusi päivitysviesti"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM-virhe: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Avaimen tuonti tiedostosta %1% epäonnistui"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Julkisen avaimen %1% poisto epäonnistui"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Pakettia ei ole allekirjoitettu!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Muunnettiin paketin %s asetustiedostoja:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm tallensi tiedoston %s nimellä %s. Erojen selvittäminen ei onnistunut"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5264,13 +4972,13 @@ msgstr ""
 "Tässä ensimmäiset 25 muuttunutta riviä:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm loi tiedoston %s nimellä %s, erojen selvittäminen ei onnistunut"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5281,151 +4989,360 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "rpm-lisätuloste"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "luotiin varmuuskopio %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Allekirjoitus kelpaa"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Tuntematon allekirjoituksen tyyppi"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Allekirjoitusta ei voida todentaa"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Allekirjoitus kelpaa, mutta avain ei ole luotettu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Allekirjoituksen julkinen avain ei ole saatavilla"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Tiedostoa ei ole tai allekirjoitusta ei voi tarkistaa"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Tiedosto on allekirjoittamaton"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Latausvirhe (curl) kohteelle ”%s”:\n"
+"Virhekoodi: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Latausvirhe (curl) kohteelle ”%s”:\n"
+"HTTP-vastausta ei saatu\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Virheellinen tyyppi \"%s\" tavulle %u, tarkistussumma: \"%s\""
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "pty:n (%s) avaaminen ei onnistu."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Putken (%s) avaaminen ei onnistu."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Virheellinen LDAP URL -kysely"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Virheellinen LDAP URL -parametri: \"%s\""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Verkko-osoite-objektin kahdentaminen ei onnistunut"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Virheellinen viittaus tyhjään URL-objektiin"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Verkko-osoitteen jäsentäminen ei onnistu"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historia:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Ei sallittu verkko-osoite: %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Virheellinen %s-komponentti \"%s\""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Virheellinen %s-komponentti"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Tämän verkko-osoitteen jäsentäminen kyselyksi ei ole tuettu"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Verkko-osoite on pakollinen"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Virheellinen verkko-osoite: \"%s\""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Verkko-osoite ei salli käyttäjänimeä"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Verkko-osoite ei salli salasanaa"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Verkko-osoite edellyttää konenimen"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Verkko-osoite ei salli konenimeä"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Virheellinen konenimi: \"%s\""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Verkko-osoite ei salli portin määritystä"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Virheellinen porttimääritys: \"%s\""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Verkko-osoite edellyttää polun määrittämistä"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 "Suhteellisen polun määrittäminen ei ole sallittua, jos valtuuttaja on "
 "määritetty"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Koodattu merkkijono sisältää NUL-tavun"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Virheellinen parametritaulukon jaon erotin"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Virheellinen parametrikartan jaon erotin"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Virheellinen parametritaulukon liitoksen erotin"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Komento päättyi tilaan %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Komento lopetettiin signaalilla %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Komento päättyi tuntemattomaan virheeseen."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Latausvirhe (curl) kohteelle ”%s”:\n"
-"Virhekoodi: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Hakemistorajoitus (chroot) ei onnistu hakemistoon \"%s\" (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "chdir  '%s' ei onnistu (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "chdir '%s' ei onnistu chroot '%s' sisällä (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "\"%s\" (%s) suorittaminen ei onnistu."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Haarauttaminen (fork) ei onnistu (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Latausvirhe (curl) kohteelle ”%s”:\n"
-"HTTP-vastausta ei saatu\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s ei kuulu jakeluversion päivitysasennuslähteeseen"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s on alempaa arkkitehtuuria"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "virhe asennettaessa pakettia %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "Mikään ei tarjoa pyydettyä %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Oletko ottanut käyttöön kaikki pyydetyt asennuslähteet?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "pakettia %s ei ole olemassa"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s on järjestelmän tarjoama ja sitä ei voi poistaa"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s ei ole asennettavissa"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "mikään ei tarjoa %s, jota %s tarvitsee"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Ei voida asentaa molempia %s ja %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s on ristiriidassa %s (%s) kanssa"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s vanhentaa %s (%s)"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "asennettu %s vanhentaa %s (%s)"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s on ristiriidassa itsensä kanssa (%s)"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s tarvitsee %s, mutta sen asentaminen ei onnistu"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "poista lukitus salliaksesi %s poiston"
+
+#~ msgid "do not install %s"
+#~ msgstr "älä asenna %s"
+
+#~ msgid "keep %s"
+#~ msgstr "pidä %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "poista lukitus asentaaksesi: %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "älä kysy asennettaessa paketteja, jotka tuo %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "älä kysy poistettaessa paketteja, jotka tuo %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "älä asenna uusinta %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "Pidä %s vaikka se on alempaa arkkitehtuuria"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "asenna %s vaikka se on alempaa arkkitehtuuria"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "pidä vanhentunut %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "Asennetaan %s poisjätetystä asennuslähteestä"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "päivitetään vanhempaan %s -> %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "arkkitehtuurin vaihto %s -> %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "asenna %s (vaihtaa tarjoajaa)\n"
+#~ "  %s --> %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "Korvataan %s -> %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "poista %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Lukitustiedoston avaaminen ei onnistu: %s"
index 89f7883..a431024 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -19,11 +19,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.fr\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-04-30 14:57+0000\n"
 "Last-Translator: Guillaume GARDET <guillaume.gardet@opensuse.org>\n"
-"Language-Team: French <https://l10n.opensuse.org/projects/libzypp/master/fr/>"
-"\n"
+"Language-Team: French <https://l10n.opensuse.org/projects/libzypp/master/fr/"
+">\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -31,12 +31,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 4.6\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Type '%s' douteux pour %u octet(s) sur la somme de contrôle '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Pays inconnu : "
@@ -1305,76 +1299,23 @@ msgstr "Améliore"
 msgid "Supplements"
 msgstr "Complète"
 
-# TLABEL backup_2002_03_14_2340__125
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Impossible d'ouvrir pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Impossible d'ouvrir le pipe (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Impossible d'effectuer une commande chroot vers '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-"Impossible d'appliquer la commande chdir vers '%s' dans le chroot '%s' ('%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Impossible d'appliquer la commande chdir vers '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Impossible d'exécuter '%s' (%s)."
-
-# TLABEL printconf_2002_03_14_2340__110
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Impossible d'exécuter une commande fork (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "La commande s'est terminée avec l'état %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "La commande a été supprimée par le signal %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "La commande s'est terminée à cause d'une erreur inconnue."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Tentative d'importation de la clé inexistante %s dans le porte-clé %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Impossible d'importer la clé."
 
 # TLABEL restore_2002_08_07_0216__88
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Impossible de supprimer la clé."
 
 # TLABEL linuxrc_2002_03_29_0036__117
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Fichier de signature %s introuvable"
@@ -3780,54 +3721,54 @@ msgstr[1] "(expire dans %d jours)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Recherche de la clé gpg %1% dans le cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Recherche de la clé gpg %1% dans le dépôt %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Le dépôt %1% ne définie pas d'URL 'gpgkey=' additionnelles."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Impossible de lire le répertoire de dépôt '%1%' : permission refusée"
 
 # TLABEL restore_2002_08_07_0216__88
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Impossible de lire le dossier '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Impossible de lire le fichier de dépôt '%1%' : permission refusée"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "L'alias d'un dépôt ne peut pas commencer par un point."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "L'alias d'un service ne peut pas commencer par un point."
 
 # TLABEL kinternet_2002_02_20_2255__39
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Impossible d'ouvrir le fichier '%s' en écriture."
@@ -3835,44 +3776,44 @@ msgstr "Impossible d'ouvrir le fichier '%s' en écriture."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Service '%1%' inconnu : suppression du dépôt de service orphelin '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Aucune métadonnée valide trouvée à l'URL spécifiée"
 msgstr[1] "Aucune métadonnée valide trouvée aux URL spécifiées"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Impossible de créer %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Impossible de créer le répertoire de cache des métadonnées."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construction du cache du dépôt '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Impossible de créer le cache dans %s - pas d'autorisation en écriture."
 
 # TLABEL restore_2002_08_07_0216__88
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Échec de la mise en cache du dépôt (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Type de dépôt non pris en charge"
 
@@ -3882,68 +3823,47 @@ msgstr "Type de dépôt non pris en charge"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Erreur lors de la tentative de lecture depuis '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Erreur de lecture inconnue depuis '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Ajout du dépôt '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nom du fichier de dépôt non valide sur '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Suppression du dépôt '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Impossible de déterminer l'emplacement de stockage du dépôt."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Impossible de supprimer '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Impossible de déterminer l'emplacement de stockage du service."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Chaîne de requête d'URL LDAP non valide"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Paramètre de requête d'URL LDAP '%s' non valide"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Impossible de cloner l'objet d'URL"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Référence d'objet d'URL vide non valide"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Impossible d'analyser les composants de l'URL"
-
 # TLABEL printer_2002_08_07_0216__54
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
@@ -4022,7 +3942,7 @@ msgstr "Un contrat client additionel est nécessaire pour obtenir du support."
 msgid "Unknown support option. Description not available"
 msgstr "Option de support inconnue. La description n'est pas disponible"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4032,11 +3952,6 @@ msgstr ""
 "(%s).\n"
 "Fermez cette application avant de réessayer."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historique :"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4058,13 +3973,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expression régulière '%s' invalide"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Authentification requise pour '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4072,8 +3988,8 @@ msgstr ""
 "Visitez SUSE Customer Center pour vérifier si votre enregistrement est "
 "valide et n'a pas expiré."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4104,7 +4020,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Le medium ne s'est pas ouvert lors de l'action '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Fichier '%s' introuvable sur le medium '%s'"
@@ -4213,7 +4129,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Autorisation d'accès à '%s' refusée."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Temps maximal dépassé lors de l'accès à '%s'."
@@ -4226,7 +4142,7 @@ msgstr ""
 "'%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "L'emplacement '%s' est temporairement inaccessible."
@@ -4245,7 +4161,7 @@ msgstr ""
 "Création d'un point d'attache : Impossible de trouver un répertoire pour "
 "créer un point d'attache"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Méthode d'authentification HTTP '%s' non prise en charge"
@@ -4308,7 +4224,7 @@ msgid "No url in repository."
 msgstr "Pas d'URL dans le dépôt."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4474,7 +4390,7 @@ msgstr "casser %s en ignorant certaines de ses dépendances"
 msgid "generally ignore of some dependencies"
 msgstr "Ignorer généralement certaines dépendances"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4484,95 +4400,89 @@ msgstr ""
 "distribution et doit être remplacé(e)"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "le/la %1% à installer n'appartient à aucun dépôt de mise à niveau de la "
 "distribution"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "le/la %1% installé(e) présente une architecture inférieure"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "le/la %1% à installer présente une architecture inférieure"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problème avec le/la %1% installé(e)"
 
 # TLABEL kinternet_2002_02_20_2255__29
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "requêtes conflictuelles"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "Problèmes de dépendance"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "rien ne fourni le/la '%1%' demandé(e)"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Avez-vous activé tous les dépôts requis ?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "le paquet demandé %1% n'existe pas"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "Requête non supportée"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' est fourni par le système et ne peut pas être effacé"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% n'est pas installable"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "rien ne fournit '%1%' qui est nécessaire pour le/la %2% installé(e)"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "rien ne fournit '%1%' qui est nécessaire pour le/la %2% à installer"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "impossible d'installer à la fois %1% et %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "le/la %1% installé(e) est en conflit avec '%2%' fourni par le/la %3% "
 "installé(e)"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4580,7 +4490,7 @@ msgstr ""
 "le/la %1% installé(e) est en conflit avec '%2%' fourni par le/la %3% à "
 "installer"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4588,7 +4498,7 @@ msgstr ""
 "le/la %1% à installer est en conflit avec '%2%' fourni par le/la %3% "
 "installé(e)"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4597,44 +4507,44 @@ msgstr ""
 "le/la %1% à installer est en conflit avec '%2%' fourni par le/la %3% à "
 "installer"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "le/la %1% installé(e) rend obsolète '%2%' fourni par le/la %3% installé(e)"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "le/la %1% installé(e) rend obsolète '%2%' fourni par le/la %3% à installer"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "le/la %1% à installer rend obsolète '%2%' fourni par le/la %3% installé(e)"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "le/la %1% à installer rend obsolète '%2%' fourni par le/la %3% à installer"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "le/la %1% installé(e) est en conflit avec '%2%' fourni par lui/elle-même"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "le/la %1% à installer est en conflit avec '%2%' fourni par lui/elle-même"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4642,7 +4552,7 @@ msgstr ""
 "le/la %1% installé(e) nécessite '%2%', mais cette condition ne peut pas être "
 "remplie"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4651,15 +4561,11 @@ msgstr ""
 "le/la %1% à installer nécessite '%2%', mais cette condition ne peut pas être "
 "remplie"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "fournisseurs supprimés : "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4667,123 +4573,107 @@ msgstr ""
 "\n"
 "fournisseurs non installables : "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "fournisseurs non installables : "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "supprimer le verrouillage pour permettre la suppression de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "ne pas installer %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "conserver %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "supprimer le verrouillage pour autoriser l'installation de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Cette requête va casser votre système !"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignorer l'avertissement d'un système cassé"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "ne pas demander d'installer un élément résoluble fournissant %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 "ne pas demander de supprimer tous les éléments résolubles fournissant %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "ne pas installer la dernière version de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "conserver %1% malgré l'architecture inférieure"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "installer %1% malgré l'architecture inférieure"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "conserver l'élément %1% obsolète"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "installer %1% à partir du dépôt exclu"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "installer %1% bien qu'il ait été retiré"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "autoriser l'installation du PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "installer %1% bien qu'il ait été placé en liste noire"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "rétrogradation de %1% à %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "modification de l'architecture de %1% vers %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4794,214 +4684,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "remplacement de %1% par %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "désinstallation de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s n'appartient à aucun dépôt de mise à niveau de la distribution"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s a une architecture inférieure"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problème avec le paquet installé %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "rien ne fournit %s qui est requis"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Avez-vous activé tous les dépôts requis ?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Le paquet %s n'existe pas"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s est fourni par le système et ne peut être supprimé"
-
-# TLABEL partitioning_2002_01_04_0147__180
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s n'est pas installable"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "rien ne fournit %s, qui est requis par %s"
-
-# TLABEL partitioning_2002_01_04_0147__180
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "impossible d'installer simultanément %s et %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s est en conflit avec %s fourni par %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s rend obsolète %s fourni par %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s installé rend obsolète %s fourni par %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "L'élément %s est en conflit avec %s fourni par lui même"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s requiert %s, mais cette dépendance ne peut pas être fournie"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "enlever le verrou pour permettre la suppression de %s"
-
-# TLABEL partitioning_2002_01_04_0147__180
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "ne pas installer %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "conserver %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "enlever le verrou pour permettre l'installation de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "ne pas demander d'installer un élément résoluble fournissant %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-"ne pas demander de supprimer tous les éléments résolubles fournissant %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "ne pas installer une version plus récente de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "conserver %s en dépit de l'architecture inférieure"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "installer %s en dépit de l'architecture inférieure"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "conserver %s obsolète"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "installer %s depuis le dépôt exclu"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "installation d'une version moins récente de %s vers %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "changement de l'architecture %s à %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"installer %s (avec changement de fournisseur)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "remplacement de %s par %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "désinstallation de %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5019,69 +4716,73 @@ msgid "Installation has been aborted as directed."
 msgstr "L'installation a été abandonnée comme demandé."
 
 # TLABEL online_update_2002_01_04_0147__113
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " exécuté"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " échec de l'exécution"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s déjà exécuté en tant que %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " exécution annulée lors de l'abandon"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Erreur lors de l'envoi de la notification de mise à jour par message."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nouveau message de mise à jour"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "Échec RPM : "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Impossible d'importer la clé publique %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Impossible de supprimer la clé publique %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Le paquet n'est pas signé !"
 
 # TLABEL sw_single_2002_01_04_0147__11
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Fichiers de configuration modifiés pour %s :"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5089,7 +4790,7 @@ msgstr ""
 "déterminer la différence"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5099,7 +4800,7 @@ msgstr ""
 "Voici les 25 premières lignes qui diffèrent :\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5107,7 +4808,7 @@ msgstr ""
 "différence"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5119,154 +4820,370 @@ msgstr ""
 # TLABEL firewall_2002_03_14_2340__51
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Sortie rpm supplémentaire"
 
 # TLABEL backup_2002_03_14_2340__102
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "sauvegarde %s créée"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "La signature est correcte"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Type de signature inconnu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "La signature n'est pas vérifiée"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "La signature est correcte mais la clé n'est pas certifiée"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "La clé publique des signatures n'est pas disponible"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Le fichier n'existe pas ou la signature ne peut pas être vérifiée"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Le fichier n'est pas signé"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Erreur de téléchargement (curl) pour « %s » :\n"
+"Code d'erreur : %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Erreur de téléchargement (curl) pour « %s » :\n"
+"Impossible d'obtenir une réponse HTTP\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Type '%s' douteux pour %u octet(s) sur la somme de contrôle '%s'"
+
+# TLABEL backup_2002_03_14_2340__125
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Impossible d'ouvrir pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Impossible d'ouvrir le pipe (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Chaîne de requête d'URL LDAP non valide"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Paramètre de requête d'URL LDAP '%s' non valide"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Impossible de cloner l'objet d'URL"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Référence d'objet d'URL vide non valide"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Impossible d'analyser les composants de l'URL"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historique :"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Le schéma d'URL n'autorise pas de %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Composant '%s' non valide '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Composant %s non valide"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Analyse de la chaîne de requête non prise en charge pour cette URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Le schéma d'URL est un composant requis"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Schéma d'URL '%s' non valide"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Le schéma d'URL n'autorise pas de nom d'utilisateur"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Le schéma d'URL n'autorise pas de mot de passe"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Le schéma d'URL nécessite un composant d'hôte"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Le schéma d'URL n'autorise pas de composant d'hôte"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Composant d'hôte non valide '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Le schéma d'URL n'autorise pas de port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Composant de port non valide '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Le schéma d'URL requiert un nom de chemin"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Chemin relatif non autorisé en présence d'une autorité"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "La chaîne codée contient un octet NUL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 "Caractère séparateur de division non valide pour l'ensemble de paramètres"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 "Caractère séparateur de division non valide pour le mappage de paramètres"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 "Caractère séparateur de catégorie de jonction non valide pour l'ensemble de "
 "paramètres"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "La commande s'est terminée avec l'état %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "La commande a été supprimée par le signal %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "La commande s'est terminée à cause d'une erreur inconnue."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Erreur de téléchargement (curl) pour « %s » :\n"
-"Code d'erreur : %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Impossible d'effectuer une commande chroot vers '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Impossible d'appliquer la commande chdir vers '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
-"Erreur de téléchargement (curl) pour « %s » :\n"
-"Impossible d'obtenir une réponse HTTP\n"
+"Impossible d'appliquer la commande chdir vers '%s' dans le chroot '%s' ('%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Impossible d'exécuter '%s' (%s)."
+
+# TLABEL printconf_2002_03_14_2340__110
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Impossible d'exécuter une commande fork (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s n'appartient à aucun dépôt de mise à niveau de la distribution"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s a une architecture inférieure"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problème avec le paquet installé %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "rien ne fournit %s qui est requis"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Avez-vous activé tous les dépôts requis ?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "Le paquet %s n'existe pas"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s est fourni par le système et ne peut être supprimé"
+
+# TLABEL partitioning_2002_01_04_0147__180
+#~ msgid "%s is not installable"
+#~ msgstr "%s n'est pas installable"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "rien ne fournit %s, qui est requis par %s"
+
+# TLABEL partitioning_2002_01_04_0147__180
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "impossible d'installer simultanément %s et %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s est en conflit avec %s fourni par %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s rend obsolète %s fourni par %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s installé rend obsolète %s fourni par %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "L'élément %s est en conflit avec %s fourni par lui même"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s requiert %s, mais cette dépendance ne peut pas être fournie"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "enlever le verrou pour permettre la suppression de %s"
+
+# TLABEL partitioning_2002_01_04_0147__180
+#~ msgid "do not install %s"
+#~ msgstr "ne pas installer %s"
+
+#~ msgid "keep %s"
+#~ msgstr "conserver %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "enlever le verrou pour permettre l'installation de %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "ne pas demander d'installer un élément résoluble fournissant %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr ""
+#~ "ne pas demander de supprimer tous les éléments résolubles fournissant %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "ne pas installer une version plus récente de %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "conserver %s en dépit de l'architecture inférieure"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "installer %s en dépit de l'architecture inférieure"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "conserver %s obsolète"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "installer %s depuis le dépôt exclu"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "installation d'une version moins récente de %s vers %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "changement de l'architecture %s à %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "installer %s (avec changement de fournisseur)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "remplacement de %s par %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "désinstallation de %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Impossible d'ouvrir le fichier verrouillé : %s"
index d613e72..de09035 100644 (file)
--- a/po/gl.po
+++ b/po/gl.po
@@ -14,7 +14,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2020-06-29 19:45+0000\n"
 "Last-Translator: Manuel Vazquez <xixirei@yahoo.es>\n"
 "Language-Team: Galician <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -26,12 +26,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tipo dubidoso '%s' para o byte %u suma de verificación '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "País descoñecido: "
@@ -1478,71 +1472,21 @@ msgstr "Mellora"
 msgid "Supplements"
 msgstr "Suplementos"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Non se pode abrir pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Non se pode abrir a canalización (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Non se pode facer chroot a '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Non foi posíbel executar chdir '%s' dentro de '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Non foi posíbel executar '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Non se pode executar  '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "No se pode facer fork (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "A orde rematou co estado %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "O sinal %d (%s) matou a orde."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "A orde rematou cun erro descoñecido."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Tentouse importar unha chave que non existe %s para o chaveiro %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Erro ao importar a chave."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Fallo ao eliminar a chave."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Non se atopou o ficheiro da sinatura %s"
@@ -4100,52 +4044,52 @@ msgstr[1] "(caduca dentro de %d días)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Buscando a chave gpg coa ID %1% no caché %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Buscando a chave gpg coa ID %1% no repositorio %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "O repositorio %1% non ten definida URLs adicionais nos 'gpgkey='."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Non foi posíbel ler o directorio do repositorio %1%: permiso denegado"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Erro ao ler o directorio '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Non foi posíbel ler o ficheiro de repositorio '%1%': permiso denegado"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "O alias do repositorio non pode comezar cun punto."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "O alias do servizo non pode comezar cun punto."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Non se puido abrir '%s' para escribir."
@@ -4153,44 +4097,44 @@ msgstr "Non se puido abrir '%s' para escribir."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Servizo descoñecido de '%1%': eliminando o servizo orfo do repositorio '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Metadatos válidos non atopados no URL especificado"
 msgstr[1] "Metadatos válidos non atopados nos URLs especificados"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Non se pode crear '%s'"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Non se pode crear o directorio da caché de metadatos."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construíndo a caché do repositorio '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Non se pode crear a caché en %s - non hai permisos de escritura."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Fallo na caché do repositorio (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Repositorio"
 
@@ -4200,68 +4144,47 @@ msgstr "Repositorio"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Erro ao ler desde '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Erro descoñecido ao ler desde '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Engadindo o repositorio '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nome de ficheiro do repositorio incorrecto en '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Eliminando o repositorio '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Non se pode saber onde se atopa almacenado o repositorio."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Non se pode borrar '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Non se pode saber onde se atopa almacenado o servizo."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Cadea de consulta URL LDAP incorrecta"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Parámetro de consulta URL LDAP '%s' incorrecto"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Non se pode clonar o obxecto URL"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Referencia de obxecto de URL baleiro incorrecto"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Non se poden analizar os compoñentes de URL"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "descoñecido"
@@ -4338,7 +4261,7 @@ msgstr "Un contrato adicional co cliente é necesario para recibir soporte."
 msgid "Unknown support option. Description not available"
 msgstr "Opción de soporte descoñecida. Descrición non dispoñible"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4347,11 +4270,6 @@ msgstr ""
 "A xestión do sistema está bloqueada polo aplicativo con pid %d (%s).\n"
 "Peche este aplicativo antes de tentalo de novo."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historial:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4373,13 +4291,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expresión regular '%s' incorrecta"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autenticación necesaria para '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4387,8 +4306,8 @@ msgstr ""
 "Visite o Centro de servizos ao cliente de SUSE para comprobar se o seu "
 "rexistro é correcto e non caducou."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4417,7 +4336,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "O medio non se abriu cando se tentaba realizar a acción '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Non se atopa o ficheiro '%s' no medio '%s'"
@@ -4523,7 +4442,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Permiso de acceso a '%s' denegado."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Tempo de espera excedido ao acceder a '%s'."
@@ -4535,7 +4454,7 @@ msgstr ""
 "Os datos descargados superan o tamaño de ficheiro '%s' esperado para '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "A localización '%s' está neste intre inaccesible."
@@ -4555,7 +4474,7 @@ msgstr ""
 "Crear punto de inserción: non se atopa un directorio non que se poida "
 "escribir e anexar o punto"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Método de autenticación HTTP non soportado '%s'"
@@ -4616,7 +4535,7 @@ msgid "No url in repository."
 msgstr "Non hai ningún enderezo url no repositorio."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4781,7 +4700,7 @@ msgstr "quebrar %s ao ignorar algunhas das dependencias"
 msgid "generally ignore of some dependencies"
 msgstr "polo xeral ignorar algunhas dependencias"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4789,161 +4708,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "peticións en conflito"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "algúns problemas de dependencias"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "petición sen soporte"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "fornecedores eliminados: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4951,122 +4860,106 @@ msgstr ""
 "\n"
 "provedores non instalables: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "provedores non instalables: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Esta solicitude danará o seu sistema!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignorar o aviso de sistema danado"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "permitir a instalación de PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instalar %1% aínda que estea na lista negra"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -5075,209 +4968,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s non pertence ao repositorio de actualización da distribución"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s ten unha arquitectura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "houbo un problema co paquete instalado %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "no hai nada que forneza o solicitado %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Activou todos os repositorios solicitados?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "o paquete %s non existe"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s ofréceo o sistema e non se pode eliminar"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s non é instalable"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "no hai nada que forneza %s e que o necesita %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "non se puido instalar %s e %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s ten un conflito con %s, fornecido por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s está obsoleto %s fornecido por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s instalado, deixa obsoleto a %s fornecido por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "a solución %s ten conflitos con %s fornecida por esta mesma"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s require %s, pero este requirimento non pode ser fornecido"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "retirar os bloqueos para poder eliminar a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "non instalar %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "Manter %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "retirar os bloqueos para poder instalar a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "non preguntar en caso de instalar algún elemento que forneza %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "non preguntar en caso de eliminar todos os elementos que fornecen %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "non instalar a versión máis recente de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "manter %s sen importar que sexa dunha arquitectura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "instalar %s aínda que cambie a arquitectura"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "manter o antigo %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "instalar %s desde os repositorios excluídos"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "desactualizar de %s a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "modificación de arquitectura de %s para %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"instalar %s (con cambio de provedor)\n"
-"  %s -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "substitución de %s con %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "desinstalación de %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -5295,74 +4999,78 @@ msgstr "Executando scripts de %posttrans"
 msgid "Installation has been aborted as directed."
 msgstr "Abortouse a instalación seguindo as indicacións."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " executado"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " fallou a execución"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s xa executado como %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " ignorada a execución ao abortar"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Erro ao enviar a notificación da mensaxe de actualización."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nova mensaxe de actualización"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "Fallou RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Erro ao importar a chave pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Erro ao eliminar a chave pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "O paquete non está asinado!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Modificados os ficheiros de configuración para %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm gardou %s como %s, pero non se pode determinar a diferenza"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5372,13 +5080,13 @@ msgstr ""
 "A continuación amósanse as primeiras 25 liñas de diferenza:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm creou %s como %s, pero no se pode determinar a diferenza"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5389,149 +5097,359 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Saída rpm adicional"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "copia de seguridade %s creada"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "A sinatura é correcta"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Tipo de sinatura descoñecido"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "A sinatura non se dou verificado"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "A sinatura está correcta, mais non se confía na chave"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Non hai dispoñible unha sinatura pública da chave"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Ou o ficheiro non existe ou ou a sinatura non se pode verificar"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "O ficheiro está sen asinar"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tipo dubidoso '%s' para o byte %u suma de verificación '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Non se pode abrir pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Non se pode abrir a canalización (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Cadea de consulta URL LDAP incorrecta"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Parámetro de consulta URL LDAP '%s' incorrecto"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Non se pode clonar o obxecto URL"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Referencia de obxecto de URL baleiro incorrecto"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Non se poden analizar os compoñentes de URL"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historial:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "O esquema de Url non permite un elemento %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Compoñente '%s' incorrecto %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Compoñente %s incorrecto"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "A análise de cadeas de consulta non é compatible con este enderezo URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "O esquema de Url é un compoñente obrigatorio"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Esquema '%s' de URL incorrecto"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "O esquema de Url non permite un nome de usuario"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "O esquema de Url non permite un contrasinal"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "O esquema de Url require un compoñente de host"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "O esquema de Url non permite un compoñente host"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Compoñente de host incorrecto '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "O esquema de Url non permite un porto"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Compoñente de porto incorrecto '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "O esquema de Url require un nome de ruta"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Non se permiten rutas alternativas se existe unha autoridade"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "A cadea codificada inclúe un byte NULO"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 "Parámetro de carácter de separación para a división de matrices incorrecto"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 "Parámetro de carácter de separación para a división de mapas incorrecto"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 "Parámetro de carácter de separación para a unión de matrices incorrecto"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "A orde rematou co estado %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "O sinal %d (%s) matou a orde."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "A orde rematou cun erro descoñecido."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Non se pode facer chroot a '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Non foi posíbel executar '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Non foi posíbel executar chdir '%s' dentro de '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Non se pode executar  '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "No se pode facer fork (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s non pertence ao repositorio de actualización da distribución"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s ten unha arquitectura inferior"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "houbo un problema co paquete instalado %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "no hai nada que forneza o solicitado %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Activou todos os repositorios solicitados?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "o paquete %s non existe"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s ofréceo o sistema e non se pode eliminar"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s non é instalable"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "no hai nada que forneza %s e que o necesita %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "non se puido instalar %s e %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s ten un conflito con %s, fornecido por %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s está obsoleto %s fornecido por %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s instalado, deixa obsoleto a %s fornecido por %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "a solución %s ten conflitos con %s fornecida por esta mesma"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s require %s, pero este requirimento non pode ser fornecido"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "retirar os bloqueos para poder eliminar a %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "non instalar %s"
+
+#~ msgid "keep %s"
+#~ msgstr "Manter %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "retirar os bloqueos para poder instalar a %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "non preguntar en caso de instalar algún elemento que forneza %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr ""
+#~ "non preguntar en caso de eliminar todos os elementos que fornecen %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "non instalar a versión máis recente de %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "manter %s sen importar que sexa dunha arquitectura inferior"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "instalar %s aínda que cambie a arquitectura"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "manter o antigo %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "instalar %s desde os repositorios excluídos"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "desactualizar de %s a %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "modificación de arquitectura de %s para %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "instalar %s (con cambio de provedor)\n"
+#~ "  %s -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "substitución de %s con %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "desinstalación de %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Non se pode abrir o ficheiro de bloqueo: %s"
 
index 40dd4c3..2eb8c27 100644 (file)
--- a/po/gu.po
+++ b/po/gu.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: nis\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2006-11-11 18:41+0530\n"
 "Last-Translator: Priyavert Sharma<priyavert.sharma@agreeya.com>\n"
 "Language-Team: AgreeYa Solutions<linux_team@agreeya.com>\n"
@@ -12,12 +12,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.10.2\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "અજાણ્યો દેશ:"
@@ -1291,74 +1285,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "ફાઈલ ખુલી શકતી નથી: %1."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "ફાઈલ ખુલી શકતી નથી: %1."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "%s શોધાઈ શકતો નથી."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "%s શોધાઈ શકતો નથી."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "જોડાય ત્યારે કમાન્ડ અમલમાં મૂકવો"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "VM શરૂ કરવામાં નિષ્ફળ."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "VM શરૂ કરવામાં નિષ્ફળ."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "એન્ટ્રી મળી નહીં."
@@ -3765,54 +3708,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "VM નું નામ આંકડાથી શરૂ થઇ શકે નહીં."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "VM નું નામ આંકડાથી શરૂ થઇ શકે નહીં."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "લખવા માટે ફાઇલ ખોલી શકાતી નથી."
@@ -3820,44 +3763,44 @@ msgstr "લખવા માટે ફાઇલ ખોલી શકાતી ન
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s ડેસ્કટોપ આઈટમ ખોલી શકાશે નહીં"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "ડિરેક્ટરી %1 બનાવી શકાતી નથી: %2."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3867,68 +3810,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ફ્લોપી ડિસ્કમાંથી વાંચવામાં ભૂલ."
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "સાધનો ઉમેરાય છે"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "એક્સપોર્ટ ફાઈલ નું નામ અમાન્ય છે."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "સાધનો ઉમેરાય છે"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "%s ડેસ્કટોપ આઈટમ ખોલી શકાશે નહીં"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "અમાન્ય LDAP URL ક્વેરિ સ્ટ્રીંગ"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "અમાન્ય LDAP URL ક્વેરિ પારમિતિ '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Url વસ્તુને ક્લોન કરવામાં અક્ષમ"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "અમાન્ય ખાલી Url વસ્તુ સંદર્ભ"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Url ઘટકોને પાર્સ કરવામાં અક્ષમ"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "અપરિચિત"
@@ -3996,19 +3918,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-#, fuzzy
-msgid "History:"
-msgstr "XF86History "
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4030,20 +3946,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "અમાન્ય Url યોજના '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4070,7 +3987,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "રિપોસીટરીમાં ફાઈલ %1 મળી નહીં."
@@ -4174,7 +4091,7 @@ msgid "Permission to access '%s' denied."
 msgstr " મંજૂરીઓ નકારાઇ "
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4185,7 +4102,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4201,7 +4118,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4267,7 +4184,7 @@ msgid "No url in repository."
 msgstr "રિપોસીટરીમાં ફાઈલ %1 મળી નહીં."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4386,7 +4303,7 @@ msgstr "આ જરૂરિયાત અહીં માત્ર અવગણ
 msgid "generally ignore of some dependencies"
 msgstr "આ જરૂરિયાત અહીં માત્ર અવગણો"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4394,288 +4311,262 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "ને જોડાણ માટે વિનંતી કરો:"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "પરાધિનતા મૂશ્કેલીઓને કારણે %s સ્થાપિ શકાયું નથી"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "%s કોઇ આપતું નથી"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%s ના કોઇ સ્થાપવાનું પૂરું પાડનાર નથી"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%s ના કોઇ સ્થાપવાનું પૂરું પાડનાર નથી"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "રિક્વેસ્ટ અસ્તિત્વમાં છે જ."
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4684,208 +4575,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s, %s પૂરું પાડે છે, પરંતુ તેની પાસે બીજી સંરચના છે."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "પેકેજીસનું સ્થાપન દૂર કરવાનો આદેશ"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "%s કોઇ આપતું નથી"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "ડિસ્ક અસ્તિત્વ ધરાવતી નથી."
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s લોક છે અને અસ્થાપિત થઇ શકશે નહીં"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "સ્થાપેલ નથી"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s દ્વારા %s જરૂરી હતું"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%s સ્થાપિ શકાશે નહીં"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s, %s સાથે વિસંગત છે"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s અલગ પાડવું %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s અલગ પાડવું %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s, %s સાથે વિસંગત છે"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s સ્થાપશો નહીં"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s રાખો"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "%s સ્થાપશો નહીં"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "%s ના કોઇ સ્થાપવાનું પૂરું પાડનાર નથી"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "સંબંધિત રિઝોલ્વેબલ્સ સ્થાપો કે કાઢો નહીં"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s, %s પૂરું પાડે છે, પરંતુ તેની પાસે બીજી સંરચના છે."
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "%s સ્થાપો જો કે તે સંરચના બદલી શકે"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s અલગ પાડવું %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "%s માંથી %s ડાઉનલોડ થયું"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "સ્થાપન"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4902,12 +4606,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "સૂચના પ્રમાણે સ્થાપન અટકાવેલું હતું."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "ચલાવો"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4915,65 +4619,69 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "કી એન્ક્રીપ્ટશન દરમિયાન ભૂલ."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "નિષ્ફળ થયું"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s માટે કન્ફિગ્યુરેશન ફાઈલો બદલાઇ:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "%s તરીકે rpm એ %s સાચવ્યું પરંતુ તફાવત જુદો પાડવા તે અશક્ય હતું"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4983,13 +4691,13 @@ msgstr ""
 "અહીં તફાવતોના પ્રથમ 25 લાઇનો છે: \n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "%s તરીકે rpm એ %s રચ્યું પરંતુ તફાવત જુદો પાડવા તેઅશક્ય હતું"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5000,150 +4708,350 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "વધારાનું rpm આઉટપુટ:"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s નું બેકઅપ રચાયું"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "એન્ટ્રી મળી નહીં."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "એન્ટ્રી મળી નહીં."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "એન્ટ્રી મળી નહીં."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "ફાઈલ ખુલી શકતી નથી: %1."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "ફાઈલ ખુલી શકતી નથી: %1."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "અમાન્ય LDAP URL ક્વેરિ સ્ટ્રીંગ"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "અમાન્ય LDAP URL ક્વેરિ પારમિતિ '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Url વસ્તુને ક્લોન કરવામાં અક્ષમ"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "અમાન્ય ખાલી Url વસ્તુ સંદર્ભ"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Url ઘટકોને પાર્સ કરવામાં અક્ષમ"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+#, fuzzy
+msgid "History:"
+msgstr "XF86History "
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Url યોજના %s ને મંજૂરી આપતી નથી"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "અમાન્ય %s ઘટક '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "અમાન્ય %s ઘટક"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "આ URL માટે ક્વેરિ સ્ટ્રીંગ પાર્સિંગ સહાયિત નથી"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Url યોજનાને ઘટક જરૂરી છે"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "અમાન્ય Url યોજના '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url યોજના વપરાશકર્તાને મંજૂરી આપતું નથી"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url યોજના પાસવર્ડને મંજૂરી આપતું નથી"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url યોજનાને હોસ્ટ ઘટક જરૂરી છે"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Url યોજના હોસ્ટ ઘટકને મંજૂરી આપતું નથી"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "અમાન્ય હોસ્ટ ઘટક '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Url યોજનાને પોર્ટને મંજૂરી આપતું નથી"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "અમાન્ય પોર્ટ ઘટક '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url યોજનાને માર્ગ નામ જરૂરી છે"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "હો અધિકૃતિ હાજર હોય તો રિલેટિવ માર્ગની મંજૂરી નથી"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "એનકોડેડ સ્ટ્રીંગમાં NUL બાઇટ સમાવિષ્ટ છે"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "અમાન્ય પારમિતિ એરે સ્પ્લિટ સેપરેટર કેરેક્ટર"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "અમાન્ય પારમિતિ મેપ  સ્પ્લિટ સેપરેટર કેરેક્ટર"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "અમાન્ય પારમિતિ એરે જોઇન સ્પ્લિટ સેપરેટર કેરેક્ટર"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "જોડાય ત્યારે કમાન્ડ અમલમાં મૂકવો"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "%s શોધાઈ શકતો નથી."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "%s શોધાઈ શકતો નથી."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ તેની પાસે બીજી સંરચના છે."
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "પેકેજીસનું સ્થાપન દૂર કરવાનો આદેશ"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "%s કોઇ આપતું નથી"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "ડિસ્ક અસ્તિત્વ ધરાવતી નથી."
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s લોક છે અને અસ્થાપિત થઇ શકશે નહીં"
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "સ્થાપેલ નથી"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s દ્વારા %s જરૂરી હતું"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%s સ્થાપિ શકાશે નહીં"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s, %s સાથે વિસંગત છે"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s અલગ પાડવું %s"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s અલગ પાડવું %s"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s, %s સાથે વિસંગત છે"
+
+#~ msgid "do not install %s"
+#~ msgstr "%s સ્થાપશો નહીં"
+
+#~ msgid "keep %s"
+#~ msgstr "%s રાખો"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "%s સ્થાપશો નહીં"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "%s ના કોઇ સ્થાપવાનું પૂરું પાડનાર નથી"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "સંબંધિત રિઝોલ્વેબલ્સ સ્થાપો કે કાઢો નહીં"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ તેની પાસે બીજી સંરચના છે."
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "%s સ્થાપો જો કે તે સંરચના બદલી શકે"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s અલગ પાડવું %s"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "%s માંથી %s ડાઉનલોડ થયું"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "સ્થાપન"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "ફાઈલ ખુલી શકતી નથી: %1."
index 225ad0b..406e7b0 100644 (file)
--- a/po/he.po
+++ b/po/he.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2004-08-09 10:24+0200\n"
 "Last-Translator: xxx <yyy@example.org>\n"
 "Language-Team: Hebrew <i18n@suse.de>\n"
@@ -16,12 +16,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1462,74 +1456,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Couldn't open file: %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "פקודה לביצוע כאשר מתחברים"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -4250,52 +4193,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -4303,44 +4246,44 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
 #  Frame title for installation target hard disk / partition(s)
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "מתקין על:"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4350,69 +4293,48 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #  Frame title for installation target hard disk / partition(s)
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "מתקין על:"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #  column description, if disk space is not known
 #  label text
 #: zypp/VendorSupportOptions.cc:14
@@ -4483,18 +4405,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4516,20 +4433,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4556,7 +4474,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4661,7 +4579,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4672,7 +4590,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4688,7 +4606,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4748,7 +4666,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4865,7 +4783,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4873,284 +4791,258 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
 # IT
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "התקן"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -5159,213 +5051,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "ארכיטקטורה:"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "התקנה נכשלה"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#  Frame title for installation target hard disk / partition(s)
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "מתקין על:"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#  Frame title for installation target hard disk / partition(s)
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, fuzzy, c-format, boost-format
-msgid "do not install %s"
-msgstr "מתקין על:"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#  Frame title for installation target hard disk / partition(s)
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "מתקין על:"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "מתקין דריבר..."
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#  main dialog: Button Delete partition
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "&מחק"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#  Frame title for installation target hard disk / partition(s)
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "מתקין על:"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5382,11 +5082,11 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -5394,64 +5094,68 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #  Commandline help title
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "קורא קובץ הגדרות"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5459,13 +5163,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5474,147 +5178,297 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "מידע נוסף"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, fuzzy, c-format, boost-format
 msgid "created backup %s"
 msgstr "אל תיצור גיבויים"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "פקודה לביצוע כאשר מתחברים"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "ארכיטקטורה:"
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "התקנה נכשלה"
+
+#  Frame title for installation target hard disk / partition(s)
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "מתקין על:"
+
+#  Frame title for installation target hard disk / partition(s)
+#, fuzzy
+#~ msgid "do not install %s"
+#~ msgstr "מתקין על:"
+
+#  Frame title for installation target hard disk / partition(s)
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "מתקין על:"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "מתקין דריבר..."
+
+#  main dialog: Button Delete partition
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "&מחק"
+
+#  Frame title for installation target hard disk / partition(s)
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "מתקין על:"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Couldn't open file: %s."
index 83c6211..9d7f6d5 100644 (file)
--- a/po/hi.po
+++ b/po/hi.po
@@ -4,7 +4,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.hi\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-04-08 15:57+0000\n"
 "Last-Translator: Panwar <caspian7pena@gmail.com>\n"
 "Language-Team: Hindi <https://l10n.opensuse.org/projects/libzypp/master/hi/"
@@ -16,12 +16,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "अज्ञात देश : "
@@ -1295,74 +1289,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "फाइल %1 को नहीं खोल सकता है।"
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "%s को नहीं ढूंढ सकता।"
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "%s को नहीं ढूंढ सकता।"
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "जब कनेक्ट हो रहे हों तब चलाया जाने वाला कमांड"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "%s %s नहीं मिला"
@@ -3769,52 +3712,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "लेखन के लिए फाइल नहीं खोल सकता है।"
@@ -3822,44 +3765,44 @@ msgstr "लेखन के लिए फाइल नहीं खोल सक
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "डेस्कटॉप आइटम '%s'"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "डायरेक्टरी को सृजित नहीं कर सकता %1 : %2"
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3869,68 +3812,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "फ्लोपी डिस्क पढ़ने में त्रुटि।"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "संसाधन जोड़ रहा"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "अमान्य निर्यात फाइलनाम।"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "संसाधन जोड़ रहा"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "डेस्कटॉप आइटम '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "अमान्य LDAP URL क्वेरी स्ट्रिंग"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "अमान्य LDAP URL क्वेरी मानक '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Url ऑब्जेक्ट क्लोन करने में अक्षम"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "अमान्य रिक्त Url ऑब्जेक्ट संदर्भ"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Url अवयवों को पार्ज करने में अक्षम"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "अन्जान"
@@ -3997,18 +3919,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "इतिहास:"
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4030,20 +3947,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "अमान्य Url स्कीम '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4070,7 +3988,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "कोष में फाइल %1 नहीं प्राप्त हुई।"
@@ -4174,7 +4092,7 @@ msgid "Permission to access '%s' denied."
 msgstr "अनुमति अस्वीकृत"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4185,7 +4103,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4201,7 +4119,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4267,7 +4185,7 @@ msgid "No url in repository."
 msgstr "कोष में फाइल %1 नहीं प्राप्त हुई।"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4386,7 +4304,7 @@ msgstr "सिर्फ यहां पर इस आवश्यकता क
 msgid "generally ignore of some dependencies"
 msgstr "सिर्फ यहां पर इस आवश्यकता की अनदेखी कर दें"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4394,288 +4312,262 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "के लिए कनेक्शन आवेदन : "
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "निर्भरता समस्याओं के कारण %s का संस्थापन नहीं कर सकता"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "कोई नहीं %s प्रदान करता"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%s का कोई संस्थापनयोग्य प्रदाता नहीं है"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%s का कोई संस्थापनयोग्य प्रदाता नहीं है"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "अनुरोध पहले से ही मौजूद है।"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4684,208 +4576,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s ही %s प्रदान करता है, लेकिन इसके पास कोई और स्थापत्य है।"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "पैकेजों को असंस्थापित करने का कमांड"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "कोई नहीं %s प्रदान करता"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "प्रमाण पत्र %1 मौजूद नहीं है।"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s लॉक हो गया है और इसे असंस्थापित नहीं किया जा सकता।"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "इंस्टाल नहीं हुआ"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s को %s की आवश्यकता है"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%s का संस्थापन नहीं कर सकता"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s का %s से टकराव है "
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s को %s पुराना कर देता है"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s को %s पुराना कर देता है"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s का %s से टकराव है "
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s संस्थापित न करें"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s रखें"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "%s संस्थापित न करें"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "%s का कोई संस्थापनयोग्य प्रदाता नहीं है"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "संबंधित रिजॉल्वेबल को संस्थापित या मिटाएं नहीं"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s ही %s प्रदान करता है, लेकिन इसके पास कोई और स्थापत्य है।"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "%s को संस्थापित करें यद्यपि यह स्थापत्य को बदल देगा"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s को %s पुराना कर देता है"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "%s से %s तक अपडेट कर रहा है"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "अधिष्ठापन"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4902,12 +4607,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "जैसा निर्देशित था, संस्थापन छोड़ दिया गया।"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "निष्‍पादन"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4915,65 +4620,69 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "कुंजी एन्क्रिप्शन के दौरान त्रुटि।"
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "विफल"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s हेतु विन्यास फ़ाइलें जिन्हें बदला गया :"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ने %s के  रूप में %s सहेजा लेकिन अंतर निर्धारित करना असंभव था "
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4983,13 +4692,13 @@ msgstr ""
 "यहां अंतर की पहली 25 पंक्तियां हैं :\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ने %s के  रूप में %s सृजित किया लेकिन अंतर निर्धारित करना असंभव था"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5000,150 +4709,349 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "अतिरिक्त rpm आउटपुट :"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "बैकअप %s सृजित"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "%s %s नहीं मिला"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "%s %s नहीं मिला"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "%s %s नहीं मिला"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "फाइल %1 को नहीं खोल सकता है।"
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "अमान्य LDAP URL क्वेरी स्ट्रिंग"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "अमान्य LDAP URL क्वेरी मानक '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Url ऑब्जेक्ट क्लोन करने में अक्षम"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "अमान्य रिक्त Url ऑब्जेक्ट संदर्भ"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Url अवयवों को पार्ज करने में अक्षम"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "इतिहास:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Url स्कीम किसी %s को अनुमति नहीं देती है"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "अमान्य %s अवयव '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "अमान्य %s अवयव"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "इस URL के लिए क्वेरी स्ट्रिंग पार्जिंग समर्थित नहीं है"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Url स्कीम एक आवश्यक अवयव है"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "अमान्य Url स्कीम '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url स्कीम किसी उपयोगकर्ता नाम को अनुमति नहीं देती है"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url स्कीम किसी पासवर्ड को अनुमति नहीं देती है"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url स्कीम को एक होस्ट अवयव की आवश्यकता है"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "यूआरएल व्यवस्था द्वारा होस्ट अनुभाग स्वीकार्य नहीं है"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "अमान्य होस्ट अवयव '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "यूआरएल व्यवस्था द्वारा पोर्ट स्वीकार्य नहीं है"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "अमान्य पोर्ट अवयव '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url स्कीम को पथ नाम की आवश्यकता है"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "यदि प्राधिकरण मौजूद है तो सापेक्ष पथ को अनुमति नहीं है"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "एनकोडेड स्ट्रिंग में एक NUL बाइट समाविष्ट है"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "अमान्य मानक क्रमविन्यास सेपरेटर वर्ण पृथक करें"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "अमान्य मानक मानचित्र सेपरेटर वर्ण पृथक करें"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "अमान्य मानक क्रमविन्यास सेपरेटर वर्ण जोड़ें"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "जब कनेक्ट हो रहे हों तब चलाया जाने वाला कमांड"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "%s को नहीं ढूंढ सकता।"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "%s को नहीं ढूंढ सकता।"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s ही %s प्रदान करता है, लेकिन इसके पास कोई और स्थापत्य है।"
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "पैकेजों को असंस्थापित करने का कमांड"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "कोई नहीं %s प्रदान करता"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "प्रमाण पत्र %1 मौजूद नहीं है।"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s लॉक हो गया है और इसे असंस्थापित नहीं किया जा सकता।"
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "इंस्टाल नहीं हुआ"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s को %s की आवश्यकता है"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%s का संस्थापन नहीं कर सकता"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s का %s से टकराव है "
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s को %s पुराना कर देता है"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s को %s पुराना कर देता है"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s का %s से टकराव है "
+
+#~ msgid "do not install %s"
+#~ msgstr "%s संस्थापित न करें"
+
+#~ msgid "keep %s"
+#~ msgstr "%s रखें"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "%s संस्थापित न करें"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "%s का कोई संस्थापनयोग्य प्रदाता नहीं है"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "संबंधित रिजॉल्वेबल को संस्थापित या मिटाएं नहीं"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s ही %s प्रदान करता है, लेकिन इसके पास कोई और स्थापत्य है।"
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "%s को संस्थापित करें यद्यपि यह स्थापत्य को बदल देगा"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s को %s पुराना कर देता है"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "%s से %s तक अपडेट कर रहा है"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "अधिष्ठापन"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "फाइल %1 को नहीं खोल सकता है।"
index c118ad2..97fc241 100644 (file)
--- a/po/hr.po
+++ b/po/hr.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.hr\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2011-04-03 12:05+0200\n"
 "Last-Translator: Krešimir Jozić <kjozic@gmail.com>\n"
 "Language-Team: Croatian <kde-i18n-doc@kde.org>\n"
@@ -22,12 +22,6 @@ msgstr ""
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Lokalize 1.0\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1387,71 +1381,21 @@ msgstr "Poboljšava"
 msgid "Supplements"
 msgstr "Dopunjava"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Ne mogu obrisati '%s'"
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr ""
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr ""
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr ""
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -3912,52 +3856,52 @@ msgstr[2] "(istječe unutar 24 sata)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Alias repozitorija ne može započeti s točkom."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr ""
@@ -3965,45 +3909,45 @@ msgstr ""
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ne mogu napraviti %s: %m\n"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Ne mogu napraviti datoteku."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4013,68 +3957,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Ne mogu obrisati '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "nepoznato"
@@ -4141,18 +4064,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4174,20 +4092,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Neispravan regularni izraz '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4214,7 +4133,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4317,7 +4236,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Dozvola za pristup '%s' je odbijena."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4328,7 +4247,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4344,7 +4263,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4404,7 +4323,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4521,7 +4440,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4529,283 +4448,257 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 #, fuzzy
 msgid "unsupported request"
 msgstr "nije podržano"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4814,208 +4707,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problem s instaliranim paketom %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Disk ne postoji."
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr ""
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "nemoj instalirati %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "zadrži %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "deinstalacija %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "deinstalacija %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5032,74 +4738,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr "izvršeno"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr "izvršavanje nije uspjelo"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5107,13 +4817,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5122,146 +4832,278 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr ""
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URL shema je obavezna komponenta"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Neispravna Url shema '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Relativna putanja nije dozvoljena ako postoji autoritet"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Ne mogu obrisati '%s'"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problem s instaliranim paketom %s"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "Disk ne postoji."
+
+#~ msgid "do not install %s"
+#~ msgstr "nemoj instalirati %s"
+
+#~ msgid "keep %s"
+#~ msgstr "zadrži %s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "deinstalacija %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "deinstalacija %s"
+
 #, fuzzy
 #~ msgid "Hal Exception"
 #~ msgstr "Šifriranje"
index 37bb223..3032930 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -18,7 +18,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.hu\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2019-03-23 20:19+0000\n"
 "Last-Translator: Robert Taisz <robert.taisz@emerald.hu>\n"
 "Language-Team: Hungarian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -30,12 +30,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.3\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "'%s' bizonytalan típus %u byte, ellenőrzőösszeg '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Ismeretlen ország: "
@@ -1454,72 +1448,21 @@ msgstr "A következőket javítja:"
 msgid "Supplements"
 msgstr "A következőket egészíti ki:"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "A pty nem nyitható meg (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "A cső nem nyitható meg (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "A chroot sikertelen ide: '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-"Sikertelen chdir a(z) '%s' könyvtárra a következő gyökéren belül: '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Sikertelen chdir a(z) '%s' könyvtárra (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "'%s' végrehajtása sikertelen (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "A forkolás sikertelen (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "A parancs a következő állapottal lépett ki: %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "A parancs végrehajtását a(z) %d szignál megszakította (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "A parancs végrehajtása ismeretlen hibával leállt."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Kísérlet nem létező kulcs (%s) importálására a(z) %s kulcstárban"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Nem sikerült importálni a kulcsot."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "A kulcs törlése sikertelen."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "A(z) %s aláírás-fájl nem található"
@@ -4046,25 +3989,25 @@ msgstr[1] "(%d napon belül lejár)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "%1% azonosítójú gpg-kulcs keresése a gyorsítótárban (%2%)."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "%1% azonosítójú gpg-kulcs keresése a telepítési forrásban (%2%)."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "A(z) %1% telepítési forrás nem definiál további 'gpgkey=' URL-címeket."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
@@ -4072,30 +4015,30 @@ msgstr ""
 "megtagadta az engedélyt"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Nem sikerült a(z) '%s' könyvtár beolvasása."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 "A következő telepítésiforrás-fájl nem olvasható: '%1%': A rendszer "
 "megtagadta az engedélyt"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "A telepítési forrás álneve nem kezdődhet ponttal."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "A szolgáltatás álneve nem kezdődhet ponttal."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "A '%s' fájl nem nyitható meg írásra."
@@ -4103,45 +4046,45 @@ msgstr "A '%s' fájl nem nyitható meg írásra."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Ismeretlen '%1%' szolgáltatás: az árva '%2%' szolgáltatástároló eltávolítása"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "A megadott URL-címen nem találhatók érvényes metaadatok"
 msgstr[1] "A megadott URL-címeken nem találhatók érvényes metaadatok"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "A(z) %s nem hozható létre"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Nem hozható létre a metaadat gyorsítótár-könyvtára."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "A(z) '%s' telepítési forrás gyorsítótárának felépítése"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "Írási engedélyek hiányában nem hozható létre gyorsítótár a(z) %s helyen."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Nem sikerült a tároló gyorsítótárazása (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Nem kezelt tárolótípus"
 
@@ -4151,68 +4094,47 @@ msgstr "Nem kezelt tárolótípus"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Hiba történt a következőből való olvasás során: \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Ismeretlen hiba a '%s' beolvasása közben"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "A(z) '%s' telepítési forrás hozzáadása"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Érvénytelen tárolónév: '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "A(z) '%s' telepítési forrás eltávolítása"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Nem sikerült a tároló felismerése."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "A(z) '%s' törlése sikertelen"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Nem sikerült a szolgáltatás felismerése."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Érvénytelen LDAP URL lekérdezési karakterlánc"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Érvénytelen LDAP URL lekérdezési paraméter: '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Az URL-objektum másolása sikertelen"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Érvénytelen üres URL-objektum hivatkozás"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Az URL-komponensek elemzése sikertelen"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "ismeretlen"
@@ -4288,7 +4210,7 @@ msgstr "További ügyfélszerződés szükséges a támogatáshoz."
 msgid "Unknown support option. Description not available"
 msgstr "Ismeretlen támogatási opció. Leírás nem található"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4297,11 +4219,6 @@ msgstr ""
 "A rendszerkezelőt a %d (%s) pid-del rendelkező folyamat zárolta.\n"
 "Kérem, zárja be az alkalmazást, majd próbálja újra."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Előzmények:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4323,13 +4240,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Érvénytelen reguláris kifejezés '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Felhasználóhitelesítés szükséges ehhez: '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4337,8 +4255,8 @@ msgstr ""
 "Keresse fel a SUSE Ügyfélközpontot, és ellenőrizze, hogy a regisztrációja "
 "érvényes-e, illetve nem járt-e le."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4368,7 +4286,7 @@ msgstr ""
 "Az adathordozó elérése a(z) '%s' művelet végrehajtása közben nem sikerült."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "A(z) '%s' fájl nem található a(z) '%s' adathordozón"
@@ -4474,7 +4392,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Hozzáférés megtagadva: '%s'."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Időtúllépés a '%s' elérése közben."
@@ -4487,7 +4405,7 @@ msgstr ""
 "'%s')."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "A '%s' hely ideiglenesen nem elérhető."
@@ -4507,7 +4425,7 @@ msgstr ""
 "Csatlakoztatási pont létrehozása: Nem található írható könyvtár "
 "csatlakoztatási pont létrehozásához"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Nem támogatott HTTP hitelesítési metódus: '%s'"
@@ -4567,7 +4485,7 @@ msgid "No url in repository."
 msgstr "A telepítés forrás nem tartalmaz url-t."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4732,7 +4650,7 @@ msgstr "%s csomag megtörése néhány függőség figyelmen kívül hagyásáva
 msgid "generally ignore of some dependencies"
 msgstr "egyes függőségek általános mellőzése"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4740,161 +4658,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "ütköző kérelmek"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "bizonyos függőségi probléma"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "nem támogatott kérelem"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "törölt csomagok: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4902,122 +4810,106 @@ msgstr ""
 "\n"
 "nem telepíthető szolgáltatók: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "nem telepíthető szolgáltatók: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "A kért módosítás a rendszer meghibásodásához vezet!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "a hibás rendszer figyelmeztetésének figyelmen kívül hagyása"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -5026,214 +4918,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s nem tartozik a distupgrade telepítési forráshoz"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s alacsonyabb szintű architektúrával rendelkezik"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "probléma a telepített csomaggal: %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "semmi nem biztosítja a(z) %s csomagot"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Minden szükséges telepítési forrást engedélyezett?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "a(z) %s csomag nem létezik"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "A(z) %s a rendszertől származik, ezért törlése nem lehetséges."
-
-# modules/inst_target_part.ycp:676
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s nem telepíthető"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
-"semmi sem biztosítja a(z) %s csomagot,\n"
-"amely szükséges a(z) %s csomag telepítéséhez"
-
-# modules/inst_target_part.ycp:676
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "nem telepíthető %s és %s is"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s ütközik a(z) %s csomaggal, amit a(z) %s csomag biztosít"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s elavulttá teszi a(z) %s csomagot, amit a(z) %s csomag biztosít"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s elavulttá teszi a(z) %s csomagot, amit a(z) %s csomag biztosít"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s ütközik a(z) %s csomaggal, amit saját maga biztosít"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s csomagnak a következőre van szüksége: %s, de ez nem teljesíthető"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "távolítsa el a zárolást a(z) %s eltávolításának engedélyezéséhez"
-
-# modules/inst_target_part.ycp:676
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "Ne telepítse a(z) %s csomagot"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s megtartása"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "távolítsa el a zárolást a(z) %s telepítésének engedélyezéséhez"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "ne kérdezzen rá a %s-t biztosító feloldható telepítésére"
 
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "ne kérdezzen rá a %s-t biztosító feloldhatók eltávolítására"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "Ne telepítse a(z) %s csomag legújabb verzióját"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s megtartása az alacsonyabb rendű architektúra ellenére"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "%s telepítése az alacsonyabb architektúra ellenére"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "az elavult %s megtartása"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "%s telepítése a figyelmen kívül hagyott tárolóból"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "A(z) %s csomag visszafejlesztése a(z) %s csomagra"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "A(z) %s csomag helyett a(z) %s architektúrájú csomag telepítése"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"%s telepítése (gyártó megváltoztatásával)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "%s cseréje erre: %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "%s eltávolítása"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -5251,56 +4949,60 @@ msgstr "%posttrans parancsfájlok végrehajtása"
 msgid "Installation has been aborted as directed."
 msgstr "A kérésnek megfelelően a telepítés megszakad."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " végrehajtva"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " végrehajtás sikertelen"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s már futtatva volt mint %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " megszakítás közben a végrehajtás átugorva"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Hiba történt a frissítési értesítés küldésekor."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Új frissítési üzenet"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM sikertelen: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nem sikerült a(z) %1% fájlból importálni a publikus kulcsot"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "A(z) %1% publikus kulcs eltávolítása sikertelen"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "A csomag nincs aláírva."
 
@@ -5309,13 +5011,13 @@ msgstr "A csomag nincs aláírva."
 # menuentries/menuentry_lan_sendmail.ycp:14
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s módosított konfigurációs fájljai:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5323,7 +5025,7 @@ msgstr ""
 "különbséget"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5333,7 +5035,7 @@ msgstr ""
 "A különbség első 25 sora:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5341,7 +5043,7 @@ msgstr ""
 "különbséget"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5352,149 +5054,364 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "További rpm kimenet"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s másolata létrehozva"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Az aláírás rendben van"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Ismeretlen típusú aláírás"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Az aláírás nem felelt meg az ellenőrzésen"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Az aláírás rendben van, de a kulcs nem megbízható"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Az aláírások nyilvános kulcsa nem érhető el"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "A fájl nem létezik, vagy nem ellenőrizhető az aláírása"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "A fájl nincs aláírva"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "'%s' bizonytalan típus %u byte, ellenőrzőösszeg '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "A pty nem nyitható meg (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "A cső nem nyitható meg (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Érvénytelen LDAP URL lekérdezési karakterlánc"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Érvénytelen LDAP URL lekérdezési paraméter: '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Az URL-objektum másolása sikertelen"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Érvénytelen üres URL-objektum hivatkozás"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Az URL-komponensek elemzése sikertelen"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Előzmények:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Az Url séma nem engedélyezi a(z) %s használatát"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Érvénytelen %s-komponens: '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Érvénytelen %s-komponens"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 "A lekérdezési karakterlánc feldolgozása ehhez az URL-hez nem támogatott"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Az URL-séma megadása szükséges"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Érvénytelen URL-séma: '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Az URL-séma nem engedélyezi a felhasználónevet"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Az URL-séma nem engedélyezi a jelszót"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Az URL-sémában a gépkomponens (host) megadása kötelező"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Az Url séma megadása nem engedélyezi a gépkomponenst (host)"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Hibás gépkomponens (host): '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Az Url séma nem engedélyezi a portot"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Érvénytelen port komponens: '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Az Url sémában az elérési útvonal megadása szükséges"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 "Megadott hitelesítő esetén a relatív elérési útvonal megadása nem támogatott"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "A kódolt karakterlánc NUL byte-ot tartalmaz"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 "Érvénytelen tömbszétválasztás-elválasztó (array split separator) karakter"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 "Érvénytelen leképezésszétválasztás-elválasztó (map split separator) karakter"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Érvénytelen tömbösszefűzés-elválasztó (array join separator) karakter"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "A parancs a következő állapottal lépett ki: %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "A parancs végrehajtását a(z) %d szignál megszakította (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "A parancs végrehajtása ismeretlen hibával leállt."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "A chroot sikertelen ide: '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Sikertelen chdir a(z) '%s' könyvtárra (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
+"Sikertelen chdir a(z) '%s' könyvtárra a következő gyökéren belül: '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "'%s' végrehajtása sikertelen (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "A forkolás sikertelen (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s nem tartozik a distupgrade telepítési forráshoz"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s alacsonyabb szintű architektúrával rendelkezik"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "probléma a telepített csomaggal: %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "semmi nem biztosítja a(z) %s csomagot"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Minden szükséges telepítési forrást engedélyezett?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "a(z) %s csomag nem létezik"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "A(z) %s a rendszertől származik, ezért törlése nem lehetséges."
+
+# modules/inst_target_part.ycp:676
+#~ msgid "%s is not installable"
+#~ msgstr "%s nem telepíthető"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr ""
+#~ "semmi sem biztosítja a(z) %s csomagot,\n"
+#~ "amely szükséges a(z) %s csomag telepítéséhez"
+
+# modules/inst_target_part.ycp:676
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "nem telepíthető %s és %s is"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s ütközik a(z) %s csomaggal, amit a(z) %s csomag biztosít"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s elavulttá teszi a(z) %s csomagot, amit a(z) %s csomag biztosít"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s elavulttá teszi a(z) %s csomagot, amit a(z) %s csomag biztosít"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s ütközik a(z) %s csomaggal, amit saját maga biztosít"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s csomagnak a következőre van szüksége: %s, de ez nem teljesíthető"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "távolítsa el a zárolást a(z) %s eltávolításának engedélyezéséhez"
+
+# modules/inst_target_part.ycp:676
+#~ msgid "do not install %s"
+#~ msgstr "Ne telepítse a(z) %s csomagot"
+
+#~ msgid "keep %s"
+#~ msgstr "%s megtartása"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "távolítsa el a zárolást a(z) %s telepítésének engedélyezéséhez"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "ne kérdezzen rá a %s-t biztosító feloldható telepítésére"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "ne kérdezzen rá a %s-t biztosító feloldhatók eltávolítására"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "Ne telepítse a(z) %s csomag legújabb verzióját"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s megtartása az alacsonyabb rendű architektúra ellenére"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "%s telepítése az alacsonyabb architektúra ellenére"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "az elavult %s megtartása"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "%s telepítése a figyelmen kívül hagyott tárolóból"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "A(z) %s csomag visszafejlesztése a(z) %s csomagra"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "A(z) %s csomag helyett a(z) %s architektúrájú csomag telepítése"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "%s telepítése (gyártó megváltoztatásával)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "%s cseréje erre: %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "%s eltávolítása"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "A zárolt fájl nem nyitható meg: %s"
index 222b454..6c2305d 100644 (file)
--- a/po/id.po
+++ b/po/id.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
-"PO-Revision-Date: 2021-03-18 14:56+0000\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
+"PO-Revision-Date: 2021-06-17 15:58+0000\n"
 "Last-Translator: Kukuh Syafaat <syafaatkukuh@gmail.com>\n"
 "Language-Team: Indonesian <https://l10n.opensuse.org/projects/libzypp/master/"
 "id/>\n"
@@ -18,13 +18,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.6.1\n"
-
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tipe ambigu '%s' untuk '%u' byte checksum '%s'"
+"X-Generator: Weblate 4.6.2\n"
 
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
@@ -1557,71 +1551,21 @@ msgstr "Meningkatkan"
 msgid "Supplements"
 msgstr "Suplemen"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Tidak dapat membuka pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Tidak dapat membuka pipe (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Tidak dapat chroot untuk '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Tidak dapat chdir ke '%s' dalam chroot '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Tidak dapat membuka ke '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Tidak dapat mengeksekusi '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Tidak dapat melakukan fork (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Perintah berhenti dengan status %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Perintah terhenti oleh sinyal %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Perintah berhenti dengan galat yang tidak diketahui."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Mencoba untuk mengimpor kunci %s tidak ada ke keyring %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Gagal mengimpor kunci."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Gagal menghapus kunci."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Berkas tanda tangan %s tidak ditemukan"
@@ -4202,52 +4146,52 @@ msgstr[0] "(Kedaluwarsa dalam %d hari)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Mencari kunci gpg ID %1% dalam singgahan %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Mencari kunci gpg ID %1% dalam repositori %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repositori %1% tidak mendefinisikan 'gpgkey=' URL tambahan."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Tidak dapat membaca direktori repo '%1%': Izin ditolak"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Gagal membaca direktori '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Tidak dapat membaca berkas repo '%1%': Izin ditolak"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Alias repositori tidak dapat dimulai dengan titik."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Alias layanan tidak dapat dimulai dengan titik."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Tidak dapat membuka berkas '%s' untuk menulis."
@@ -4255,7 +4199,7 @@ msgstr "Tidak dapat membuka berkas '%s' untuk menulis."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
@@ -4263,36 +4207,36 @@ msgstr ""
 "terpakai '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Metadata yang valid tidak ditemukan pada URL yang ditentukan"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Tidak dapat membuat %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Tidak dapat membuat metadata direktori singgahan."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Membangun repositori singgahan '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Tidak dapat membuat singgahan di %s - tidak ada izin untuk menulis."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Gagal untuk membuat repo singgahan (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Jenis repositori yang tidak tertangani"
 
@@ -4302,68 +4246,47 @@ msgstr "Jenis repositori yang tidak tertangani"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Galat saat membaca dari '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Galat tidak diketahui dari '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Menambah repositori '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nama berkas repo tidak valid di '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Menghapus reposotori '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Tidak dapat mengetahui di mana repo disimpan."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Tidak dapat menghapus '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Tidak dapat mengetahui di mana layanan disimpan."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "String kueri URL LDAP tidak valid"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Parameter kueri LDAP URL '%s’  tidak valid"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Tidak dapat mengkloning objek Url"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Referensi objek URL kosong tidak valid"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Tidak dapat mengurai komponen Url"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "tidak dikenal"
@@ -4441,7 +4364,7 @@ msgstr "Kontrak pelanggan tambahan diperlukan untuk mendapatkan dukungan."
 msgid "Unknown support option. Description not available"
 msgstr "Opsi dukungan tidak diketahui. Deskripsi tidak ditemukan"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4450,11 +4373,6 @@ msgstr ""
 "Manajemen sistem dikunci oleh aplikasi dengan pid %d (%s).\n"
 "Tutup aplikasi ini sebelum mengulang kembali."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Riwayat:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4476,13 +4394,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ekspresi reguler '%s' tidak valid"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autentikasi dibutuhkan untuk '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4490,8 +4409,8 @@ msgstr ""
 "Kunjungi Pusat Pelanggan SUSE untuk memeriksa apakah pendaftaran Anda valid "
 "dan belum kedaluwarsa."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4520,7 +4439,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Medium tidak dibuka ketika mencoba untuk melakukan tindakan '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Berkas '%s' tidak ditemukan pada medium '%s'"
@@ -4626,7 +4545,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Izin untuk mengakses '%s' ditolak."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Batas waktu terlampaui saat mengakses '%s'."
@@ -4637,7 +4556,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Data yang diunduh melebihi ukuran yang diharapkan '%s' dari '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Lokasi '%s' tidak dapat diakses sementara waktu."
@@ -4655,7 +4574,7 @@ msgstr ""
 "Buat point lampiran: Tidak dapat menemukan direktori yang dapat ditulis "
 "untuk membuat point lampiran"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Metode autentikasi HTTP '%s' tidak didukung"
@@ -4717,10 +4636,11 @@ msgid "No url in repository."
 msgstr "Tidak ada url pada repositori."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
+"Media yang diharapkan %1%/%2% diidentifikasi oleh berkas '%3%' dengan konten:"
 
 #. [lhs][rhs] 0 = installed; 1 = to be installed
 #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
@@ -4882,7 +4802,7 @@ msgstr "patahkan %s dengan mengabaikan beberapa dependensi"
 msgid "generally ignore of some dependencies"
 msgstr "umumnya mengabaikan beberapa dependensi"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4890,90 +4810,84 @@ msgid ""
 msgstr "%1% yang dipasang bukan milik repositori distupgrade dan harus diganti"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "yang akan dipasang %1% bukan milik repositori distupgrade"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "%1% yang terpasang memiliki arsitektur yang lebih rendah"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "yang akan dipasang %1% memiliki arsitektur yang lebih rendah"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "masalah dengan %1% yang terpasang"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "permintaan konflik"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "beberapa dependensi bermasalah"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "tidak ada yang menyediakan '%1%' yang diminta"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Apakah Anda mengaktifkan semua repositori yang diperlukan?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "paket yang diminta %1% tidak ada"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "permintaan tidak didukung"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' disediakan oleh sistem dan tidak dapat dihapus"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% tidak dapat dipasang"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "tidak ada yang menyediakan '%1%' yang diperlukan oleh %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "tidak ada yang menyediakan '%1%' yang diperlukan untuk dipasang %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "tidak dapat memasang %1% dan %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "konflik %1% yang dipasang dengan '%2%' yang disediakan oleh %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4981,7 +4895,7 @@ msgstr ""
 "%1% yang dipasang bertentangan dengan '%2%' yang disediakan oleh yang akan "
 "dipasang %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4989,7 +4903,7 @@ msgstr ""
 "yang akan dipasang %1% konflik dengan '%2%' yang disediakan oleh %3% yang "
 "terpasang"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4998,40 +4912,40 @@ msgstr ""
 "yang akan dipasang %1% konflik dengan '%2%' disediakan oleh yang akan "
 "dipasang %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "%1% usang yang terpasang '%2%' disediakan oleh %3% yang terpasang"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "%1% usang yang terpasang '%2%' disediakan oleh yang akan dipasang %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "yang akan dipasang %1% usang '%2%' disediakan oleh %3% yang terpasang"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "yang akan dipasang %1% usang '%2%' disediakan oleh yang akan dipasang %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "konflik %1% yang dipasang dengan '%2%' yang disediakan dengan sendirinya"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "yang akan dipasang %1% konflik dengan '%2%' yang disediakan sendiri"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -5039,7 +4953,7 @@ msgstr ""
 "%1% yang dipasang membutuhkan '%2%', tetapi persyaratan ini tidak dapat "
 "disediakan"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -5048,15 +4962,11 @@ msgstr ""
 "yang akan dipasang %1% membutuhkan '%2%', tetapi persyaratan ini tidak dapat "
 "disediakan"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "penyedia dihapus: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -5064,122 +4974,106 @@ msgstr ""
 "\n"
 "penyedia tidak dapat dihapus: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "penyedia tidak dapat dihapus: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "hapus kunci untuk memungkinkan penghapusan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "jangan pasang %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "pertahankan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "hapus kunci untuk memungkinkan pemasangan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Permintaan ini akan merusak sistem anda!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "abaikan peringatan sistem yang rusak"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "jangan meminta untuk memasang solvable yang menyediakan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "jangan meminta untuk menghapus semua solvables yang menyediakan %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "jangan memasang versi terbaru %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "pertahankan %1% meskipun arsitekturnya lebih rendah"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "pasang %1% meskipun arsitekturnya lebih rendah"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "biarkan usang %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "pasang %1% dari repositori yang dikecualikan"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "pasang %1% meskipun telah ditarik kembali"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "memungkinkan untuk memasang PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "pasang %1% meskipun masuk daftar hitam"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "turunkan %1% ke %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "perubahan arsitektur dari %1% menjadi %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -5190,210 +5084,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "penggantian %1% dengan %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "pemasangan ulang %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s bukan milik repositori distupgrade"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s memiliki arsitektur yang lebih rendah"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "masalah dengan paket %s yang telah terpasang"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "tidak ada ketersediaan yang meminta %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Apakah Anda mengaktifkan semua repositori yang diminta?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "paket %s tidak tersedia"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s disediakan oleh sistem dan tidak dapat dihapus"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s tidak dapat dipasang"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "tidak ada dukungan %s dibutuhkan oleh %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "tidak dapat memasang kedua %s dan %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s konflik dengan %s disediakan oleh %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s yang %s disediakan oleh %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "telah dipasang %s usang  %s didukung oleh %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "dapat dipecahkan %s konflik dengan %s didukung dengan sendirinya"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s memerlukan %s, tetapi persyaratan ini tidak dapat disediakan"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "hapus kunci untuk memungkinkan penghapusan %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "jangan memasang %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "simpan %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "hapus kunci untuk memungkinkan pemasangan %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "jangan meminta untuk memasang pemecahan yang didukung %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "jangan meminta untuk menghapus pemecahan yang didukung %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "jangan memasang versi terbaru dari %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "jaga %s meskipun arsitektur rendah"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "pasang %s meskipun arsitektur rendah"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "biarkan usang %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "pasang %s dari repositori pengecualian"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "turunkan dari %s to %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "arsitektur berubah dari %s ke %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"pasang %s (dengan perubahan vendor)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "penggantian %s dengan %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "penghapusan dari %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5410,68 +5115,72 @@ msgstr "Menjalankan skrip %posttrans"
 msgid "Installation has been aborted as directed."
 msgstr "Pemasangan dibatalkan sesuai perintah."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " tereksekusi"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " eksekusi gagal"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s sudah dieksekusi sebagai %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " eksekusi dilewati saat membatalkan"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Galat mengirim pesan notifikasi pemutakhiran."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Pesan baru"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM gagal: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Gagal mengimpor kunci publik %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Gagal menghapus kunci publik %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Paket tidak ditandatangani!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Mengubah berkas konfigurasi untuk %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5479,7 +5188,7 @@ msgstr ""
 "perbedaannya"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5489,7 +5198,7 @@ msgstr ""
 "Ini adalah perbedaan 25 baris pertama:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5497,7 +5206,7 @@ msgstr ""
 "perbedaannya"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5508,149 +5217,358 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Keluaran rpm tambahan"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "membuat cadangan %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Tanda tangan OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Tanda tangan tidak dikenal"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Tanda tangan tidak terverifikasi"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Tanda tangan OK, tetapi kunci tidak terpercaya"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Tanda tangan kunci publik tidak tersedia"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Berkas tidak ada atau tanda tangan tidak dapat diperiksa"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Berkas tidak ditandatangani"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Kesalahan unduhan (curl) untuk '%s':\n"
+"Kode kesalahan: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Kesalahan unduhan (curl) untuk '%s':\n"
+"Tidak dapat mengambil respon HTTP\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tipe ambigu '%s' untuk '%u' byte checksum '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Tidak dapat membuka pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Tidak dapat membuka pipe (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "String kueri URL LDAP tidak valid"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Parameter kueri LDAP URL '%s’  tidak valid"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Tidak dapat mengkloning objek Url"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Referensi objek URL kosong tidak valid"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Tidak dapat mengurai komponen Url"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Riwayat:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Skema Url tidak diizinkan %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Komponen '%s' tidak valid %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Komponen '%s' tidak sah"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Pemrosesan string kueri tidak didukung untuk URL ini"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Skema url merupakan komponen yang diperlukan"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Skema url '%s' tidak valid"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Skema Url tidak memperbolehkan nama pengguna"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Skema Url tidak memperbolehkan kata sandi"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Skema Url membutuhkan komponen host"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Skema Url tidak memperbolehkan komponen host"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Komponen host '%s' tidak valid"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Skema Url tidak memperbolehkan port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Komponen Port '%s' tidak sah"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Skema url membutuhkan nama path"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Path relatif tidak dibolehkan bila otoritas ada"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "String yang dikodekan berisi byte NUL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Karakter pemisah susunan pemecah tidak valid"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Karakter pemisah parameter map tidak valid"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Karakter pemisah susunan join tidak valid"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Perintah berhenti dengan status %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Perintah terhenti oleh sinyal %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Perintah berhenti dengan galat yang tidak diketahui."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Kesalahan unduhan (curl) untuk '%s':\n"
-"Kode kesalahan: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Tidak dapat chroot untuk '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Tidak dapat membuka ke '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Tidak dapat chdir ke '%s' dalam chroot '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Tidak dapat mengeksekusi '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Tidak dapat melakukan fork (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Kesalahan unduhan (curl) untuk '%s':\n"
-"Tidak dapat mengambil respon HTTP\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s bukan milik repositori distupgrade"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s memiliki arsitektur yang lebih rendah"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "masalah dengan paket %s yang telah terpasang"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "tidak ada ketersediaan yang meminta %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Apakah Anda mengaktifkan semua repositori yang diminta?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "paket %s tidak tersedia"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s disediakan oleh sistem dan tidak dapat dihapus"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s tidak dapat dipasang"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "tidak ada dukungan %s dibutuhkan oleh %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "tidak dapat memasang kedua %s dan %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s konflik dengan %s disediakan oleh %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s yang %s disediakan oleh %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "telah dipasang %s usang  %s didukung oleh %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "dapat dipecahkan %s konflik dengan %s didukung dengan sendirinya"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s memerlukan %s, tetapi persyaratan ini tidak dapat disediakan"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "hapus kunci untuk memungkinkan penghapusan %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "jangan memasang %s"
+
+#~ msgid "keep %s"
+#~ msgstr "simpan %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "hapus kunci untuk memungkinkan pemasangan %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "jangan meminta untuk memasang pemecahan yang didukung %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "jangan meminta untuk menghapus pemecahan yang didukung %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "jangan memasang versi terbaru dari %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "jaga %s meskipun arsitektur rendah"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "pasang %s meskipun arsitektur rendah"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "biarkan usang %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "pasang %s dari repositori pengecualian"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "turunkan dari %s to %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "arsitektur berubah dari %s ke %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "pasang %s (dengan perubahan vendor)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "penggantian %s dengan %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "penghapusan dari %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Tidak dapat membuka berkas kunci: %s"
index 5093042..7622395 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -14,9 +14,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
-"PO-Revision-Date: 2021-03-07 08:36+0000\n"
-"Last-Translator: Davide Aiello <davide.aiello@novilingulists.com>\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
+"PO-Revision-Date: 2021-06-11 16:59+0000\n"
+"Last-Translator: Paolo Za <zapaolo@email.it>\n"
 "Language-Team: Italian <https://l10n.opensuse.org/projects/libzypp/master/it/"
 ">\n"
 "Language: it\n"
@@ -24,15 +24,9 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.6.1\n"
+"X-Generator: Weblate 4.6.2\n"
 "X-Poedit-Bookmarks: 370,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tipo '%s' incerto per %u byte del codice di controllo '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Paese sconosciuto: "
@@ -1301,73 +1295,21 @@ msgstr "Migliora"
 msgid "Supplements"
 msgstr "Integra"
 
-# TLABEL modules/sound/sound.ycp:620
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Impossibile aprire pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Impossibile aprire pipe (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Impossibile eseguire il comando chroot in '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Impossibile eseguire chdir verso '%s' dentro la chroot '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Impossibile eseguire chdir verso '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Impossibile eseguire '%s' (%s)."
-
-# TLABEL modules/installation.ycp:287
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Impossibile eseguire il comando fork (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Il comando è terminato con stato %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Il comando è stato terminato dal segnale %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Il comando è terminato con un errore sconosciuto."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Tentativo di importare la chiave inesistente %s nel portachiavi %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Impossibile importare la chiave."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Impossibile eliminare la chiave."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "La firma del file %s non è stata trovata"
@@ -3773,52 +3715,52 @@ msgstr[1] "(scade entro %d giorni)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Ricerca dell'ID %1% della chiave GPG nella cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Ricerca dell'ID %1% della chiave GPG nel repository %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Il repository %1% non definisce URL aggiuntivi 'gpgkey=' ."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Impossibile leggere la directory '%1%' del repository: permesso negato"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Impossibile leggere la directory '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Impossibile leggere il file '%1%' del repository: permesso negato"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "L'alias di un repository non può iniziare con un punto."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "L'alias di un servizio non può iniziare con un punto."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Impossibile aprire il file '%s' in scrittura."
@@ -3826,44 +3768,44 @@ msgstr "Impossibile aprire il file '%s' in scrittura."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Servizio '%1%' sconosciuto: rimozione del repository dei servizi orfani '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Non sono stati trovati metadati validi all'URL specificato"
 msgstr[1] "Non sono stati trovati metadati validi agli URL specificati"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Impossibile creare %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Impossibile creare la directory della cache dei metadati."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Costruzione della cache del repository '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Impossibile creare la cache in %s - permessi di scrittura mancanti."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Impossibile creare la cache del repo (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Tipo di repository non gestito"
 
@@ -3873,68 +3815,47 @@ msgstr "Tipo di repository non gestito"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Errore durante il tentativo di lettura da '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Errore sconosciuto durante la lettura da '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Aggiunta del repository '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nome file del repository non valido a '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Rimozione del repository '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Impossibile trovare ubicazione di memorizzazione del repository."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Impossibile eliminare '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Impossibile trovare ubicazione di memorizzazione del servizio."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Stringa di interrogazione URL LDAP non valida"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Parametro di interrogazione URL LDAP '%s' non valido"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Impossibile clonare l'oggetto url"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Riferimento a oggetto url vuoto non valido"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Impossibile analizzare i componenti dell'url"
-
 # TLABEL modules/inst_user.ycp:71
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
@@ -4013,7 +3934,7 @@ msgstr "È necessario un contratto cliente aggiuntivo per ottenere supporto."
 msgid "Unknown support option. Description not available"
 msgstr "Opzione di supporto sconosciuta. Descrizione non disponibile"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4022,11 +3943,6 @@ msgstr ""
 "La gestione di sistemi è bloccata dall'applicazione con pid %d (%s).\n"
 "Chiudere l'applicazione prima di riprovare."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Cronologia:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4048,13 +3964,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Espressione regolare '%s' non valida"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "È richiesta l'autenticazione per '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4062,8 +3979,8 @@ msgstr ""
 "Visitare SUSE Customer Center per verificare se la registrazione è valida e "
 "che non sia scaduta."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4092,7 +4009,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Supporto non aperto durante il tentativo di esecuzione di '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "File '%s' non trovato sul supporto '%s'"
@@ -4199,7 +4116,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Autorizzazione per accedere a '%s' rifiutata."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Timeout superato durante l'accesso a '%s'."
@@ -4210,7 +4127,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "I dati scaricati eccedono la dimensione attesa '%s' di '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "L'ubicazione '%s' è temporaneamente inaccessibile."
@@ -4230,7 +4147,7 @@ msgstr ""
 "Creazione del punto di collegamento: impossibile trovare una directory "
 "scrivibile per creare un punto di collegamento"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Metodo di autenticazione HTTP '%s' non supportato"
@@ -4291,10 +4208,10 @@ msgid "No url in repository."
 msgstr "Nessun URL nel repository."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
-msgstr ""
+msgstr "Supporto previsto %1%/%2% identificato dal file '%3%' con contenuto:"
 
 #. [lhs][rhs] 0 = installed; 1 = to be installed
 #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
@@ -4456,7 +4373,7 @@ msgstr "installa comunque %s ignorando alcune delle sue dipendenze"
 msgid "generally ignore of some dependencies"
 msgstr "generalmente ignora alcune dipendenze"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4466,104 +4383,98 @@ msgstr ""
 "distribuzione e deve essere sostituito"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "%1% da installare non appartiene a un repository di aggiornamento della "
 "distribuzione"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "%1% installato presenta un'architettura inferiore"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "%1% da installare presenta un'architettura inferiore"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problema con %1% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "richieste in conflitto"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "alcuni problemi di dipendenze"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nessun elemento fornisce '%1%' obbligatorio"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Sono stati abilitati tutti i repository richiesti?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "il pacchetto richiesto %1% non esiste"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "richiesta non supportata"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' viene fornito dal sistema e non può essere cancellato"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% non è installabile"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nessun elemento fornisce '%1%' obbligatorio per %2% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "nessun elemento fornisce '%1%' obbligatorio per %2% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "impossibile installare %1% e %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "%1% installato è in conflitto con '%2%' fornito da %3% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr "%1% installato è in conflitto con '%2%' fornito da %3% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "%1% da installare è in conflitto con '%2%' fornito da %3% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4571,45 +4482,45 @@ msgid ""
 msgstr ""
 "%1% da installare è in conflitto con '%2%' fornito da %3% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "%1% installato rende obsoleto '%2%' fornito da %3% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "%1% installato rende obsoleto '%2%' fornito da %3% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "%1% da installare rende obsoleto '%2%' fornito da %3% installato"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "%1% da installare rende obsoleto '%2%' fornito da %3% da installare"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "%1% installato è in conflitto con '%2%' fornito da se stesso"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "%1% da installare è in conflitto con '%2%' fornito da se stesso"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "%1% installato richiede '%2%', ma non è possibile fornire questo requisito"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4617,15 +4528,11 @@ msgid ""
 msgstr ""
 "%1% da installare richiede '%2%', ma non è possibile fornire questo requisito"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "provider cancellati: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4633,122 +4540,106 @@ msgstr ""
 "\n"
 "impossibile installare i provider: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "provider non installabili: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "rimuovi il blocco per consentire la rimozione di %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "non installare %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "mantieni %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "rimuovi il blocco per consentire l'installazione di %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Questa richiesta potrebbe danneggiare il sistema!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignora avviso di sistema malfunzionante"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "non chiedere di installare un risolubile che fornisce %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "non chiedere di eliminare tutti i risolubili che forniscono %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "non installare la versione più recente di %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "mantieni %1% nonostante l'architettura inferiore"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "installa %1% nonostante l'architettura inferiore"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "mantieni %1% obsoleto"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "installa %1% dal repository escluso"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "installare %1% anche se è stato ritirato"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "consentire installazione di PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "Installare %1% anche se è nella black list"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "downgrade di %1% a %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "modifica di architettura di %1% in %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4759,214 +4650,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "sostituzione di %1% con %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "disinstallazione di %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s non appartiene a un repository di aggiornamento della distribuzione"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s presenta un'architettura inferiore"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problema con il pacchetto installato %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "nessun elemento fornisce %s obbligatorio"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Sono stati abilitati tutti i repository richiesti?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "il pacchetto %s non esiste"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s è fornito dal sistema e non può essere cancellato"
-
-# TLABEL modules/inst_target_part.ycp:680
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "impossibile installare %s"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "nessun elemento fornisce %s obbligatorio per %s"
-
-# TLABEL modules/inst_target_part.ycp:680
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "impossibile installare sia %s, sia %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s in conflitto con %s fornito da %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s rende obsoleto %s fornito da %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "l'installazione di %s rende obsoleto %s fornito da %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "il risolubile %s è in conflitto con %s fornito da se stesso"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s richiede %s, ma non è possibile fornire questa richiesta"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "rimuovi il blocco per consentire la rimozione di %s"
-
-# TLABEL modules/inst_target_part.ycp:680
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "non installare %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "mantieni %s"
-
-# TLABEL modules/inst_target_part.ycp:680
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "rimuovi il blocco per consentire l'installazione di %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "non chiedere di installare un risolvibile che fornisce %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "non chiedere di eliminare tutti i risolvibili che forniscono %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "non installare la versione più recente di %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "mantieni %s nonostante l'architettura inferiore"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "installa %s nonostante l'architettura inferiore"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "mantieni %s obsoleto"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "installa %s da repository escluso"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "downgrade di %s a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "modifica dell'architettura di %s in %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"installa %s (con cambio di fornitore)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "sostituzione di %s con %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "disinstallazione di %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4984,68 +4682,72 @@ msgid "Installation has been aborted as directed."
 msgstr "L'installazione è stata interrotta come indicato."
 
 # TLABEL modules/inst_config_x11.ycp:578
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " eseguito"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " esecuzione non riuscita"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s già eseguito come %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " esecuzione saltata durante l'annullamento"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Errore nell'invio della notifica del messaggio di aggiornamento."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nuovo messaggio di aggiornamento"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM non riuscito: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Errore importazione della chiave pubblica %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Errore rimozione della chiave pubblica %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Il pacchetto non è firmato!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "File di configurazione modificati per %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5053,7 +4755,7 @@ msgstr ""
 "differenza"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5063,7 +4765,7 @@ msgstr ""
 "Di seguito sono riportate le prime 25 righe di differenza:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5071,7 +4773,7 @@ msgstr ""
 "differenza"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5082,150 +4784,366 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Output aggiuntivo di rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "creata copia di backup di %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "La firma è corretta"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Tipo di firma sconosciuto"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "La firma non è verificabile"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "La firma è corretta, ma non è attendibile"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "La chiave pubblica delle firme non è disponibile"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Il file non esiste o la firma non può essere verificata"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "File non firmato"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Errore di download (curl) per '%s':\n"
+"Codice di errore %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Errore di download (curl) per '%s':\n"
+"Impossibile recuperare la risposta HTTP\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tipo '%s' incerto per %u byte del codice di controllo '%s'"
+
+# TLABEL modules/sound/sound.ycp:620
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Impossibile aprire pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Impossibile aprire pipe (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Stringa di interrogazione URL LDAP non valida"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Parametro di interrogazione URL LDAP '%s' non valido"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Impossibile clonare l'oggetto url"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Riferimento a oggetto url vuoto non valido"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Impossibile analizzare i componenti dell'url"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Cronologia:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Lo schema url non consente un %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "%s componente '%s' non valido"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Componente %s non valido"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Analisi della stringa di interrogazione non supportata per questo URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Lo schema url è un componente obbligatorio"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Schema url '%s' non valido"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Lo schema url non consente un nome utente"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Lo schema url non consente una password"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Lo schema url richiede un componente host"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Lo schema url non consente un componente host"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Componente host '%s' non valido"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Lo schema url non consente una porta"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Componente porta '%s' non valido"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Lo schema url richiede un nome di percorso"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Percorso relativo non consentito se l'autorità esiste"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "La stringa codificata contiene un byte NULL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 "Carattere di separazione di divisione della matrice di parametri non valido"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Carattere di separazione di divisione mappa di parametri non valido"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Carattere di separazione unione della matrice di parametri non valido"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Il comando è terminato con stato %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Il comando è stato terminato dal segnale %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Il comando è terminato con un errore sconosciuto."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Errore di download (curl) per '%s':\n"
-"Codice di errore %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Impossibile eseguire il comando chroot in '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Impossibile eseguire chdir verso '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Impossibile eseguire chdir verso '%s' dentro la chroot '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Impossibile eseguire '%s' (%s)."
+
+# TLABEL modules/installation.ycp:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Impossibile eseguire il comando fork (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Errore di download (curl) per '%s':\n"
-"Impossibile recuperare la risposta HTTP\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr ""
+#~ "%s non appartiene a un repository di aggiornamento della distribuzione"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s presenta un'architettura inferiore"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problema con il pacchetto installato %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "nessun elemento fornisce %s obbligatorio"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Sono stati abilitati tutti i repository richiesti?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "il pacchetto %s non esiste"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s è fornito dal sistema e non può essere cancellato"
+
+# TLABEL modules/inst_target_part.ycp:680
+#~ msgid "%s is not installable"
+#~ msgstr "impossibile installare %s"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "nessun elemento fornisce %s obbligatorio per %s"
+
+# TLABEL modules/inst_target_part.ycp:680
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "impossibile installare sia %s, sia %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s in conflitto con %s fornito da %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s rende obsoleto %s fornito da %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "l'installazione di %s rende obsoleto %s fornito da %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "il risolubile %s è in conflitto con %s fornito da se stesso"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s richiede %s, ma non è possibile fornire questa richiesta"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "rimuovi il blocco per consentire la rimozione di %s"
+
+# TLABEL modules/inst_target_part.ycp:680
+#~ msgid "do not install %s"
+#~ msgstr "non installare %s"
+
+#~ msgid "keep %s"
+#~ msgstr "mantieni %s"
+
+# TLABEL modules/inst_target_part.ycp:680
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "rimuovi il blocco per consentire l'installazione di %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "non chiedere di installare un risolvibile che fornisce %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "non chiedere di eliminare tutti i risolvibili che forniscono %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "non installare la versione più recente di %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "mantieni %s nonostante l'architettura inferiore"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "installa %s nonostante l'architettura inferiore"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "mantieni %s obsoleto"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "installa %s da repository escluso"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "downgrade di %s a %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "modifica dell'architettura di %s in %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "installa %s (con cambio di fornitore)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "sostituzione di %s con %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "disinstallazione di %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Impossibile aprire file bloccato: %s"
index 6b2fb16..05d1a02 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-06-07 11:00+0000\n"
 "Last-Translator: Yasuhiko Kamata <belphegor@belbel.or.jp>\n"
 "Language-Team: Japanese <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -22,13 +22,6 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Weblate 4.6.2\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-"%2$u バイトのチェックサム '%3$s' は '%1$s' と思われますが、疑わしいタイプです"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "不明な国: "
@@ -1297,72 +1290,21 @@ msgstr "拡張"
 msgid "Supplements"
 msgstr "補足"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "擬似端末(%s)を開くことができません。"
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "パイプ(%s)を開くことができません。"
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "'%s' (%s)にchrootすることができません。"
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-"chroot '%s' (%s)の実行中にディレクトリを '%s' に変更することはできません。"
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "ディレクトリを '%s' (%s)に変更できません。"
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "'%s' (%s)を実行することができません。"
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "fork (%s)することができません。"
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "コマンドは状態 %d で終了しました。"
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "コマンドはシグナル %d (%s)で終了しました。"
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "コマンドは不明なエラーで終了しました。"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "存在しない鍵 %s をキーリング %s にインポートしようとしました"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "鍵のインポートに失敗しました。"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "キーの削除に失敗しました。"
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "署名ファイル %s が見つかりません"
@@ -3766,54 +3708,54 @@ msgstr[0] "(あと %d 日で期限切れ)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "キャッシュ %2% 内で gpg 鍵 ID %1% を検索しています。"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "リポジトリ %2% 内で gpg 鍵 ID %1% を検索しています。"
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "リポジトリ %1% は 'gpgkey=' で追加の URL を指定していません。"
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 "リポジトリのディレクトリ '%1%' を読み込むことができません: 許可がありません"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "ディレクトリ '%s' の読み込みに失敗しました"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 "リポジトリのファイル '%1%' を読み込むことができません: 許可がありません"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "リポジトリの別名をドットから始めることはできません。"
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "サービスの別名をドットから始めることはできません。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "ファイル '%s' を書き込み用に開くことができません。"
@@ -3821,43 +3763,43 @@ msgstr "ファイル '%s' を書き込み用に開くことができません。
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "不明なサービス '%1%' です: 孤立したサービスリポジトリ '%2%' を削除しています"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "指定した URL には正しいメタデータがありません"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s を作成できません"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "メタデータのキャッシュディレクトリを作成できません。"
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "リポジトリ '%s' のキャッシュを構築しています"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "%s にキャッシュを作成できません - 書き込み許可がありません。"
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "リポジトリ (%d) のキャッシュに失敗しました。"
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "未処理のリポジトリタイプ"
 
@@ -3867,68 +3809,47 @@ msgstr "未処理のリポジトリタイプ"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "'%s' から読み取り時にエラーが発生しました"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "'%s' からの読み取り時に不明なエラーが発生しました"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "リポジトリ '%s' を追加しています"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "'%s' にあるリポジトリのファイル名が正しくありません"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "リポジトリ '%s' を削除しています"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "リポジトリがどこに保存されたのかがわかりません。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' を削除することができません"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "サービスの保管場所がわかりません。"
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "無効なLDAP URLのクエリ文字列"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "無効なLDAP URLクエリパラメータ '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "URLオブジェクトを複製できません"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "無効な空のURLオブジェクト参照"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "URLコンポーネントを解析できません"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "不明"
@@ -4002,7 +3923,7 @@ msgstr "サポートを得るには、追加の顧客契約が必要です。"
 msgid "Unknown support option. Description not available"
 msgstr "不明なサポートオプションです。説明は利用できません"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4011,11 +3932,6 @@ msgstr ""
 "システム管理はpid %d (%s)のアプリケーションによってロックされています。\n"
 "再試行する前にこのアプリケーションを終了してください。"
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "履歴:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4037,13 +3953,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "正規表現 '%s' が正しくありません"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' にアクセスするにはユーザ認証が必要です"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4051,8 +3968,8 @@ msgstr ""
 "SUSE カスタマーセンターを開いて、お使いの登録が有効であること、および期限切れ"
 "になっていないことをご確認ください。"
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4081,7 +3998,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "アクション '%s' を実行しようとした際にメディアが開きませんでした。"
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "ファイル「%s」がメディア「%s」に見つかりません"
@@ -4187,7 +4104,7 @@ msgid "Permission to access '%s' denied."
 msgstr "'%s' へのアクセスが拒否されました。"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "'%s' にアクセスする際にタイムアウトになりました。"
@@ -4200,7 +4117,7 @@ msgstr ""
 "%s, 実際のサイズ=%s) 。"
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "場所「%s」は一時的にアクセスできなくなっています。"
@@ -4220,7 +4137,7 @@ msgstr ""
 "接続点の作成: 接続点を作成するための書き込み可能なディレクトリが見つかりませ"
 "ん"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "未対応のHTTP認証方式 '%s'"
@@ -4279,10 +4196,12 @@ msgid "No url in repository."
 msgstr "リポジトリにURLが設定されていません。"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
-msgstr "必要なメディア %1%/%2% は '%3%' と記されているメディアで、下記のような内容が含まれています:"
+msgstr ""
+"必要なメディア %1%/%2% は '%3%' と記されているメディアで、下記のような内容が"
+"含まれています:"
 
 #. [lhs][rhs] 0 = installed; 1 = to be installed
 #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2)
@@ -4444,7 +4363,7 @@ msgstr "いくつかの依存関係を無視することによって %s を壊
 msgid "generally ignore of some dependencies"
 msgstr "いくつかの依存関係をおおよそ無視する"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4454,96 +4373,90 @@ msgstr ""
 "ればならないものです"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "これからインストールする %1% は distupgrade リポジトリに属していません"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "インストール済みの %1% は下位のアーキテクチャに属しています"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "これからインストールする %1% は下位のアーキテクチャに属しています"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "インストール済みの %1% に問題があります"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "要求が矛盾しています"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "何らかの依存関係の問題"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "要求された '%1%' を提供するものがありません"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "必要なリポジトリを全て有効化しているかどうかご確認ください。"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "要求されたパッケージ %1% は存在していません"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "サポートされていない要求"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' はシステム側で提供されているものであり、消去できません"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% はインストールできません"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 "インストール済みの %2% によって必要とされている '%1%' を提供するものがありま"
 "せん"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "これからインストールする %2% によって必要とされている '%1%' を提供するものが"
 "ありません"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "%1% と %2% を同時にインストールすることはできません"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "インストール済みの %1% は、インストール済みの %3% によって提供される '%2%' と"
 "矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4551,7 +4464,7 @@ msgstr ""
 "インストール済みの %1% は、これからインストールする %3% によって提供される "
 "'%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4559,7 +4472,7 @@ msgstr ""
 "これからインストールする %1% は、インストール済みの %3% によって提供される "
 "'%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4568,28 +4481,28 @@ msgstr ""
 "これからインストールする %1% は、これからインストールする %3% によって提供さ"
 "れる '%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "インストール済みの %1% は、インストール済みの %3% によって提供される '%2%' を"
 "廃止します"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "インストール済みの %1% は、インストール済みの %3% によって提供される '%2%' を"
 "廃止します"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "これからインストールする %1% は、インストール済みの %3% によって提供される "
 "'%2%' を廃止します"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4597,17 +4510,17 @@ msgstr ""
 "これからインストールする %1% は、これからインストールする %2% によって提供さ"
 "れる '%2%' を廃止します"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "インストール済みの %1% は、それ自身が提供する '%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "これからインストールする %1% は、それ自身が提供する '%2%' と矛盾します"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4615,7 +4528,7 @@ msgstr ""
 "インストール済みの %1% は '%2%' を必要としていますが、この要件を満たすものが"
 "ありません"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4624,15 +4537,11 @@ msgstr ""
 "これからインストールする %1% は '%2%' を必要としていますが、この要件を満たす"
 "ものがありません"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "削除したプロバイダ: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4640,122 +4549,106 @@ msgstr ""
 "\n"
 "インストール不可能なプロバイダ: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "インストール不可能なプロバイダ: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "%1% を削除できるようにするには、ロックを解除してください"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "%1% をインストールしません"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "%1% を維持します"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "%1% をインストールできるようにするには、ロックを解除してください"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "この要求はシステムを壊してしまいます!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "システムが破壊される警告を無視する"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "%1% を提供する解決方法のインストールについて確認を行いません"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "%1% を提供する全ての解決方法の削除について確認を行いません"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "%1% の最新バージョンをインストールしません"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "下位のアーキテクチャですが、 %1% を維持します"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "下位のアーキテクチャですが、 %1% を維持します"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "古い %1% を維持します"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "除外されたリポジトリから %1% をインストールします"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "撤回済みの %1% をインストールする"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "PTF %1% のインストールを許可する"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "ブラックリスト設定されている %1% をインストールする"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "%1% を %2% にダウングレードします"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "%1% のアーキテクチャを %2% に変更します"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4766,212 +4659,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "%1% を %2% で置き換えます"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "%1% をアンインストールします"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s はdistupgradeのリポジトリに属していません"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s は下位のアーキテクチャです"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "インストール済みのパッケージ %s に問題が発生しました"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "要求した %s はどこからも提供されていません"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "すべての必要なリポジトリを有効化しましたか?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "パッケージ %s は存在しません"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s はシステムが提供するもので、削除できません"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s はインストールできません"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s (%s で必要)はどこからも提供されていません"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%s と %s の両方をインストールすることはできません"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s は %s (%s から提供されている)と競合します"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s は %s (%s から提供されている)を古いものとして廃棄します"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-"インストール済みの %s は、%s (%s から提供されている)を古いものとして廃棄しま"
-"す"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "解決方法 %s は自分自身で提供している %s と競合しています"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s は %s を必要としていますが、この要求を解決する方法がありません"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "%s の削除を許可するためにロックを削除する"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s をインストールしない"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s を維持"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "%s のインストールを許可するためにロックを削除する"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "%s を提供する解決方法のインストールについて問い合わせない"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "%s を提供するすべての解決方法の削除について問い合わせない"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "%s の最新バージョンをインストールしない"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "下位のアーキテクチャである %s を維持する"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "下位のアーキテクチャである %s をインストールする"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "古い %s を維持する"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "除外されたリポジトリから %s をインストールする"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "%s を %s にダウングレードする"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "アーキテクチャを %s から %s に変更する"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"%s をインストールする(ベンダを変更する)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "%s を %s で置き換える"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "%s をアンインストールする"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4988,74 +4690,78 @@ msgstr "%postrans スクリプトを実行しています"
 msgid "Installation has been aborted as directed."
 msgstr "指示通りにインストールが中止されました。"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " 実行済み"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " 実行失敗"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s は %s として実行済みです)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " 中止しているため実行をスキップ"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "更新メッセージ通知の送信時にエラーが発生しました。"
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "新しい更新メッセージ"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPMの失敗: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "公開鍵をファイル %1% からインポートすることができませんでした"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "公開鍵 %1% を削除することができませんでした"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "パッケージに署名がありません!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s 向けに変更された設定ファイル:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpmは %s を %s として保存しましたが、差異を判別できませんでした"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5065,13 +4771,13 @@ msgstr ""
 "以下は差異のある最初の25行です。\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpmは %s を %s として作成しましたが、差異を判別できませんでした"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5082,149 +4788,362 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "追加のrpm出力"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "バックアップ %s が作成されました"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "署名に問題はありません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "不明な種類の署名です"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "署名は正しくありません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "署名に問題はありませんが、鍵を信頼していません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "署名の公開鍵がありません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "ファイルが存在しないか、署名を確認できません"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "ファイルに署名がありません"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"'%s' のダウンロード (curl) でエラーが発生しました:\n"
+"エラーコード: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"'%s' のダウンロード (curl) でエラーが発生しました:\n"
+"HTTP レスポンスの取得ができませんでした\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+"%2$u バイトのチェックサム '%3$s' は '%1$s' と思われますが、疑わしいタイプです"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "擬似端末(%s)を開くことができません。"
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "パイプ(%s)を開くことができません。"
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "無効なLDAP URLのクエリ文字列"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "無効なLDAP URLクエリパラメータ '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "URLオブジェクトを複製できません"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "無効な空のURLオブジェクト参照"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "URLコンポーネントを解析できません"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "履歴:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "URLスキームでは %s を許可していません"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "無効な %s コンポーネント '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "無効な %s コンポーネント"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "このURLに対して、クエリ文字列解析はサポートされていません"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URLスキームは必須のコンポーネントです"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "無効なURLスキーム '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "URLスキームではユーザ名を指定することは許されていません"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "URLスキームではパスワードを指定することは許されていません"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "URLスキームにはホスト部分が必要です"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "URLスキームではホスト部分を指定することは許されていません"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "無効なホスト部分 '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "URLスキームではポートの指定は許されていません"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "無効なポート部分 '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "URLスキームにはパス名が必要です"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "権限部分が存在する場合相対パスは許可されません"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "エンコードされた文字列にNULLバイトがあります"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "無効なパラメータ配列区切り文字"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "無効なパラメータマップ区切り文字"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "無効なパラメータ配列結合文字"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "コマンドは状態 %d で終了しました。"
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "コマンドはシグナル %d (%s)で終了しました。"
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "コマンドは不明なエラーで終了しました。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"'%s' のダウンロード (curl) でエラーが発生しました:\n"
-"エラーコード: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "'%s' (%s)にchrootすることができません。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "ディレクトリを '%s' (%s)に変更できません。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
-"'%s' のダウンロード (curl) でエラーが発生しました:\n"
-"HTTP レスポンスの取得ができませんでした\n"
+"chroot '%s' (%s)の実行中にディレクトリを '%s' に変更することはできません。"
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "'%s' (%s)を実行することができません。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "fork (%s)することができません。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s はdistupgradeのリポジトリに属していません"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s は下位のアーキテクチャです"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "インストール済みのパッケージ %s に問題が発生しました"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "要求した %s はどこからも提供されていません"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "すべての必要なリポジトリを有効化しましたか?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "パッケージ %s は存在しません"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s はシステムが提供するもので、削除できません"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s はインストールできません"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s (%s で必要)はどこからも提供されていません"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%s と %s の両方をインストールすることはできません"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s は %s (%s から提供されている)と競合します"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s は %s (%s から提供されている)を古いものとして廃棄します"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr ""
+#~ "インストール済みの %s は、%s (%s から提供されている)を古いものとして廃棄し"
+#~ "ます"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "解決方法 %s は自分自身で提供している %s と競合しています"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s は %s を必要としていますが、この要求を解決する方法がありません"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "%s の削除を許可するためにロックを削除する"
+
+#~ msgid "do not install %s"
+#~ msgstr "%s をインストールしない"
+
+#~ msgid "keep %s"
+#~ msgstr "%s を維持"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "%s のインストールを許可するためにロックを削除する"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "%s を提供する解決方法のインストールについて問い合わせない"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "%s を提供するすべての解決方法の削除について問い合わせない"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "%s の最新バージョンをインストールしない"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "下位のアーキテクチャである %s を維持する"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "下位のアーキテクチャである %s をインストールする"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "古い %s を維持する"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "除外されたリポジトリから %s をインストールする"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "%s を %s にダウングレードする"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "アーキテクチャを %s から %s に変更する"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "%s をインストールする(ベンダを変更する)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "%s を %s で置き換える"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "%s をアンインストールする"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "ロックファイルを開けません:%s"
index 9cbbee7..4fd869c 100644 (file)
--- a/po/ka.po
+++ b/po/ka.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2009-03-06 01:28+0400\n"
 "Last-Translator: George Machitidze <giomac@gmail.com>\n"
 "Language-Team: Georgian <>\n"
@@ -19,12 +19,6 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Lokalize 0.2\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1295,71 +1289,21 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr ""
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr ""
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr ""
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr ""
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -3763,52 +3707,52 @@ msgstr[0] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -3816,43 +3760,43 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "بيانات التعريف غير صحيحة لم يتم العثور عليها في المسار(s)"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr ""
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3862,68 +3806,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr ""
@@ -3990,18 +3913,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4023,20 +3941,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4063,7 +3982,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4166,7 +4085,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4177,7 +4096,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4193,7 +4112,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4252,7 +4171,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4369,7 +4288,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4377,282 +4296,256 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4661,206 +4554,19 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1509
-#, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr ""
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
 msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
 #. strip tmp file suffix
@@ -4879,74 +4585,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr ""
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4954,13 +4664,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4969,145 +4679,257 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "დამატებითი კოდი"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr ""
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
 #~ msgid "Cannot create public key %s from %s keyring to file %s"
index c137408..081f8b1 100644 (file)
--- a/po/km.po
+++ b/po/km.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.km\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2010-06-03 08:04+0700\n"
 "Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
 "Language-Team: Khmer <support@khmeros.info>\n"
@@ -21,12 +21,6 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 "X-Language: km-KH\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "ប្រភេទ​មិនច្បាស់ '%s' សម្រាប់ %u បៃ ឆេកសាំ '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "ប្រទេស​ដែល​មិន​ស្គាល់ ៖ "
@@ -1296,72 +1290,22 @@ msgstr "ធ្វើ​ឲ្យ​ប្រសើរ​ឡើង"
 msgid "Supplements"
 msgstr "ការ​បន្ថែម"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "មិនអាច​បើក pty (%s) ។"
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "មិនអាច​បើក​បំពង់ (%s) ។"
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "មិនអាច chroot ទៅ '%s' (%s) បានទេ ។"
-
-#: zypp/ExternalProgram.cc:375
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "មិនអាច chdir ទៅ '/' ក្នុង chroot (%s) បានទេ ។"
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "មិនអាច chroot ទៅ '%s' (%s) បានទេ ។"
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "មិនអាច​ប្រតិបត្តិ '%s' (%s) ។"
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "មិនអាច​បែងចែក (%s) បានទេ ។"
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "ពាក្យ​បញ្ជា​បាន​ចេញ​ដោយ​ស្ថានភាព %d ។"
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "ពាក្យ​បញ្ជា​ត្រូវ​បាន​ផ្ដាច់​ដោយ​សញ្ញា %d (%s) ។"
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "ពាក្យ​បញ្ជា​បាន​ចេញ ដោយ​មាន​កំហុស​មិន​ស្គាល់ ។"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, fuzzy, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "នាំចូល​សោ %s ដែល​មិនមាន​ទៅ​ក្នុង keyring %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "បរាជ័យក្នុង​ការ​នាំចូល​សោ​សាធារណៈ​ពី​ឯកសារ %1%"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "បរាជ័យ​ក្នុង​ការ​លុប​សោ ។"
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ"
@@ -3766,52 +3710,52 @@ msgstr[0] "(ផុត​កំណត់​ក្នុង​រយៈពេល 
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "បាន​បរាជ័យ​ក្នុង​ការ​អាន​ថត '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "ឈ្មោះ​ក្លែងក្លាយ​ឃ្លាំង​មិន​អាច​ចាប់​ផ្តើម​ជា​មួយ​ចំណុច (.)បាន​ទេ ។"
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "ឈ្មោះ​ក្លែងក្លាយ​សេវាមិន​អាច​​ចាប់​ផ្តើម​​ជាមួយចំណុច ​(.)​បាន​ទេ ។"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "មិន​អាច​បើក​ឯកសារ '%s' ដើម្បី​សរសេរ​បានទេ ។"
@@ -3819,43 +3763,43 @@ msgstr "មិន​អាច​បើក​ឯកសារ '%s' ដើម្ប
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "រក​មិន​ឃើញ​ទិន្នន័យ​មេតា​ដែល​ត្រឹមត្រូវ​នៅ URL ដែល​បាន​បញ្ជាក់"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "មិន​អាច​បង្កើត​ %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "មិន​អាច​បង្កើត​ថត​ឃ្លាំង​សម្ងាត់​របស់​ទិន្នន័យ​មេតា ។"
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "កំពុង​ស្ថាបនា​ឃ្លាំង '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "មិន​អាច​បង្កើត​ឃ្លាំង​សម្ងាត់​នៅ​ត្រង់​ %s - គ្មាន​សិទ្ធិ​ក្នុង​ការ​សរសេរ ។"
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ឃ្លាំង​ជា​ឃ្លាំង​សម្ងាត់ (%d) ។"
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "ប្រភេទ​ឃ្លាំង​ដែល​មិន​បាន​ដោះស្រាយ"
 
@@ -3865,70 +3809,47 @@ msgstr "ប្រភេទ​ឃ្លាំង​ដែល​មិន​បា
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "កំហុស​ក្នុង​ការ​ព្យាយាម​អាន​ពី '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "មាន​កំហុស​ដែល​មិន​ស្គាល់​ក្នុង​ការ​អាន​ពី '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "កំពុង​បន្ថែម​ឃ្លាំង '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "ឈ្មោះ​ឯកសារ​ឃ្លាំង​មិន​ត្រឹមត្រូវ​នៅ '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "យក​ឃ្លាំង '%s' ចេញ"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "មិន​អាច​ដោះស្រាយ​កន្លែង​ដែល​ឃ្លាំង​ត្រូវ​បាន​ទុក​បានទេ ។"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "មិនអាច​លុប '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "មិនអាច​​ដោះស្រាយ​កន្លែង​ដែល​សេវា​ត្រូវ​បានផ្ទុក​បានទេ ។"
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "ខ្សែអក្សរ​សំណួរ LDAP URL មិន​ត្រឹមត្រូវ"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "ប៉ារ៉ាម៉ែត្រ​សំណួរ LDAP URL មិន​ត្រឹមត្រូវ '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "មិនអាច​ក្លូន​វត្ថុ Url បាន​ឡើយ"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "សេចក្ដី​យោង​វត្ថុ Url ទទេ មិន​ត្រឹមត្រូវ"
-
-# ###############################################################################
-# Old yast2-agents.po
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "មិនអាច​ញែក​សមាសភាគ Url បាន​ឡើយ"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "មិន​ស្គាល់"
@@ -4002,7 +3923,7 @@ msgstr "កិច្ចសន្យា​អតិថិជន​បន្ថែ
 msgid "Unknown support option. Description not available"
 msgstr "មិន​ស្គាល់​ជម្រើស​គាំទ្រ ។ មិនមាន​សេចក្ដីអធិប្បាយ"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4011,11 +3932,6 @@ msgstr ""
 "កា​រគ្រប់គ្រង​ប្រព័ន្ធ​ត្រូវ​បានចាក់​សោ​ដោយ​កម្មវិធី​ដែល​មាន pid %d (%s) ។\n"
 "សូម​បិទ​កម្មវិធី​នេះ​មុន​នឹង​ព្យាយាម​ម្ដង​ទៀត ។"
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "ប្រវត្តិ ៖"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4037,20 +3953,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "កន្សោម​ធម្មតា​មិន​ត្រឹមត្រូវ '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "បាន​ទាមទារ​ការ​ផ្ទៀងផ្ទាត់​ភាព​ត្រឹមត្រូវ​សម្រាប់ '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4078,7 +3995,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "ឧបករណ៍​ផ្ទុក​មិនបាន​បើក នៅពេល​ធ្វើ​អំពើ '%s' ។"
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "រក​មិនឃើញ​ឯកសារ '%s' នៅ​លើ​ឧបករណ៍​ផ្ទុក​ទេ '%s'"
@@ -4184,7 +4101,7 @@ msgid "Permission to access '%s' denied."
 msgstr "សិទ្ធិ​ចូល​ដំណើរការ​ទៅ '%s' បាន​បដិសេធ ។"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "អស់​ពេល​លើល​ពេល​ចូល​ដំណើរការ '%s' ។"
@@ -4195,7 +4112,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "ទីតាំង '%s' មិន​ដំណើរការ​ជា​បណ្ដោះអាសន្ន ។"
@@ -4211,7 +4128,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "មិនបាន​គាំទ្រ​វិធីសាស្ត្រ​ផ្ទៀងផ្ទាត់​ភាពត្រឹមត្រូវ HTTP '%s' ឡើយ"
@@ -4272,7 +4189,7 @@ msgid "No url in repository."
 msgstr "គ្មាន url នៅ​ក្នុង​ឃ្លាំង ។"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4390,7 +4307,7 @@ msgstr "បំបែក %s ដោយ​មិនអើពើ​ភាព​អ
 msgid "generally ignore of some dependencies"
 msgstr "ជា​ទូទៅ​មិនអើពើ​នឹង​ភាព​អាស្រ័យ​មួយ​ចំនួន"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4398,162 +4315,152 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "សំណើ​ការ​ប៉ះទង្គិច"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "បញ្ហា​ភាព​អាស្រ័យ​មួយ​ចំនួន"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 #, fuzzy
 msgid "unsupported request"
 msgstr "មិន​បានគាំទ្រ"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "ក្រុមហ៊ុន​ផ្ដល់​ដែល​បាន​លុប ៖ "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4561,122 +4468,106 @@ msgstr ""
 "\n"
 "លុបក្រុមហ៊ុនផ្ដល់ ៖ "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "ក្រុមហ៊ុន​លក់​ដែល​អាច​លុបបាន ៖ "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "សំណើ​នេះ​នឹង​ធ្វើ​ឲ្យ​ប្រព័ន្ធ​របស់​អ្នក​ខូច !"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "មិនអើពើ​នឹង​ការ​ព្រមាន​របស់​ប្រព័ន្ធ​ដែល​ខូច"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4685,209 +4576,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s មិនមែនជា​របស់​ឃ្លាំង distupgrade នោះ​ទេ"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s មាន​​​ស្ថាបត្យកម្ម​ទាប​ជាង"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "បញ្ហា​ជាមួយ​កញ្ចប់​ដែល​បាន​ដំឡើង %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "គ្មាន​អ្វី​ផ្ដល់ %s ដែលបាន​ស្នើ​ទេ"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "តើ​អ្នក​បាន​បើក​ឃ្លាំង​ដែល​បាន​ស្នើ​ទាំងអស់​ហើយឬនៅ ?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "មិនមាន​ព័ត៌មាន​បម្រុង​ទុក​ទេ"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s ជាប់សោ និង​មិន​អាច​លុប​បាន​ឡើយ ។"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s មិនអាច​ដំឡើងបាន"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "គ្មាន​អ្វី​ផ្ដល់ %s ដែល​ត្រូវការ​ដោយ %s ទេ"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "មិនអាច​ដំឡើង​ទាំង %s និង %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s ប៉ះទង្គិច​ជាមួយ %s ដែល​បាន​ផ្ដល់​ដោយ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s លែងប្រើ %s ដែល​ផ្ដល់ដោយ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s ដែល​បាន​ដំឡើង​លែង​ប្រើ %s ដែល​ផ្ដល់​ដោយ %s ហើយ"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "ការ​ប៉ះទង្គិច %s ដែល​អាច​ដោះស្រាយ​បាន​ជា​មួយ %s ដែល​បាន​ផ្ដល់​ដោយ​ខ្លួន​វា​ផ្ទាល់"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s ត្រូវការ %s ប៉ុន្តែ​តម្រូវការ​នេះ​មិនអាច​ផ្ដល់​បានទេ"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "កុំ​ដំឡើង %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "រក្សា %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "កុំ​ហាម​ការ​ដំឡើង​នៃ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "កុំ​ស្នើ​ឲ្យ​ដំឡើង​កញ្ចប់​ដោះស្រាយ​ដោយ​ផ្ដល់ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "កុំ​ស្នើ​ឲ្យ​លុប​កញ្ចប់​ដោះស្រាយ​ទាំងអស់​ដោយ​ផ្ដល់ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "កុំ​ដំឡើង​កំណែ​ថ្មីរបស់ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "ទុក %s ទោះ​បី​ជា​ស្ថាបត្យកម្ម​ទាប​ក៏​ដោយ"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "ដំឡើង %s ទោះ​បីជា​ស្ថាបត្យកម្ម​ទាប​ក៏​ដោយ"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "លែង​ប្រើ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "ដំឡើង %s ពី​ឃ្លាំង​ដែល​បាន​ដក​ចេញ"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "បន្ទាប %s ទៅ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "ការ​ផ្លាស់ប្ដូរ​ស្ថាបត្យកម្ម​នៃ %s ទៅ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"ដំឡើង %s (ដោយ​មានការ​ផ្លាស់ប្ដូរ​របស់​អ្នក​លក់)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "ការ​ជំនួស %s ជាមួយ %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "ការ​លុប​នៃ %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4905,74 +4607,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "ការ​ដំឡើង ត្រូវបាន​បោះបង់​ដោយ​ផ្ទាល់ ។"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " បាន​ប្រតិបត្តិ"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " បាន​បរាជ័យ​ក្នុងកា​រប្រតិបត្តិ"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " ការ​ប្រតិបត្តិ​បាន​រំលង​ខណៈពេល​បោះបង់"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "កំហុស​ក្នុង​ការ​ផ្ញើ​ការ​ជូនដំណឹង​សារបច្ចុប្បន្នភាព​ ។"
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "សារ​បច្ចុប្បន្នភាព​ថ្មី"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM បាន​បរាជ័យ ៖ "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "បរាជ័យក្នុង​ការ​នាំចូល​សោ​សាធារណៈ​ពី​ឯកសារ %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "បរាជ័យ​ក្នុងការ​យក​សោ​សាធារណៈ %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "បាន​ប្ដូរ​ឯកសារ​កំណត់​រចនាសម្ព័ន្ធ​សម្រាប់ %s ៖"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm បានរ​ក្សា​ទុក %s ជា %s ប៉ុន្តែ​វា​អាច​កំណត់​ភាព​ខុស​គ្នា"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4982,13 +4688,13 @@ msgstr ""
 "នេះ​ជា​បន្ទាត់ ២៥ ជួរ​ដំបូង​ខុសគ្នា៖\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm បាន​បង្កើត %s ជា %s ប៉ុន្តែ​វា​មិន​អាច​កំណត់​ភាព​ខុស​គ្នា"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4999,149 +4705,360 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "លទ្ធផល rpm បន្ថែម"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "បាន​បង្កើត​ព័ត៌មាន​បម្រុង %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "ប្រភេទ​មិនច្បាស់ '%s' សម្រាប់ %u បៃ ឆេកសាំ '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "មិនអាច​បើក pty (%s) ។"
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "មិនអាច​បើក​បំពង់ (%s) ។"
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "ខ្សែអក្សរ​សំណួរ LDAP URL មិន​ត្រឹមត្រូវ"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "ប៉ារ៉ាម៉ែត្រ​សំណួរ LDAP URL មិន​ត្រឹមត្រូវ '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "មិនអាច​ក្លូន​វត្ថុ Url បាន​ឡើយ"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "សេចក្ដី​យោង​វត្ថុ Url ទទេ មិន​ត្រឹមត្រូវ"
+
+# ###############################################################################
+# Old yast2-agents.po
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "មិនអាច​ញែក​សមាសភាគ Url បាន​ឡើយ"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "ប្រវត្តិ ៖"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "គ្រោងការណ៍ Url មិន​អនុញ្ញាត %s ទេ"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "សមាសភាគ %s មិន​ត្រឹមត្រូវ '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "សមាសភាគ %s មិន​ត្រឹមត្រូវ"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "មិនបាន​គាំទ្រ​ការញែក​ខ្សែអក្សរ​សំណួរ​សម្រាប់ URL នេះ​ឡើយ"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "គ្រោងការណ៍ Url មិនមែន​ជា​សមាសភាគ​ដែល​បាន​ទាមទារ​ឡើយ"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "គ្រោងការណ៍ Url មិន​ត្រឹមត្រូវ '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "គ្រោងការណ៍ Url មិន​អនុញ្ញាត​ឈ្មោះ​អ្នកប្រើ​ឡើយ"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "គ្រោងការណ៍ Url មិន​អនុញ្ញាត​ពាក្យ​សម្ងាត់​ឡើយ"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "គ្រោងការណ៍ Url ទាមទារ​សមាសភាគ​របស់​ម៉ាស៊ីន"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "គ្រោងការណ៍ Url មិនអនុញ្ញាត​សមាសភាគ​របស់​ម៉ាស៊ីន​ឡើយ"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "សមាសភាគ​របស់​ម៉ាស៊ីន​មិន​ត្រឹមត្រូវ '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "គ្រោងការណ៍ Url មិន​អនុញ្ញាត​ច្រក​ឡើយ"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "សមាសភាគ​ច្រក​មិន​ត្រឹមត្រូវ '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "គ្រោងការណ៍ Url ទាមទារ​ឈ្មោះ​ផ្លូវ"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "មិនបាន​អនុញ្ញាត​ផ្លូវ​ដែល​ទាក់ទង​ទេ ប្រសិន​បើ​មាន​អាជ្ញាធរ"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "ខ្សែអក្សរ​ដែល​បាន​អ៊ិនកូដ មាន NUL បៃ"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "តួអក្សរ​បំបែក​សម្រាប់​ពុះ​អារេ​ប៉ារ៉ាម៉ែត្រ មិន​ត្រឹមត្រូវ"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "តួអក្សរ​បំបែក​សម្រាប់​ពុះ​ផែនទី​ប៉ារ៉ាម៉ែត្រ មិន​ត្រឹមត្រូវ"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "តួអក្សរ​បំបែក​សម្រាប់​ត​អារេ​ប៉ារ៉ាម៉ែត្រ មិន​ត្រឹមត្រូវ"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "ពាក្យ​បញ្ជា​បាន​ចេញ​ដោយ​ស្ថានភាព %d ។"
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "ពាក្យ​បញ្ជា​ត្រូវ​បាន​ផ្ដាច់​ដោយ​សញ្ញា %d (%s) ។"
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "ពាក្យ​បញ្ជា​បាន​ចេញ ដោយ​មាន​កំហុស​មិន​ស្គាល់ ។"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "មិនអាច chroot ទៅ '%s' (%s) បានទេ ។"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "មិនអាច chroot ទៅ '%s' (%s) បានទេ ។"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "មិនអាច chdir ទៅ '/' ក្នុង chroot (%s) បានទេ ។"
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "មិនអាច​ប្រតិបត្តិ '%s' (%s) ។"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "មិនអាច​បែងចែក (%s) បានទេ ។"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s មិនមែនជា​របស់​ឃ្លាំង distupgrade នោះ​ទេ"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s មាន​​​ស្ថាបត្យកម្ម​ទាប​ជាង"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "បញ្ហា​ជាមួយ​កញ្ចប់​ដែល​បាន​ដំឡើង %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "គ្មាន​អ្វី​ផ្ដល់ %s ដែលបាន​ស្នើ​ទេ"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "តើ​អ្នក​បាន​បើក​ឃ្លាំង​ដែល​បាន​ស្នើ​ទាំងអស់​ហើយឬនៅ ?"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "មិនមាន​ព័ត៌មាន​បម្រុង​ទុក​ទេ"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s ជាប់សោ និង​មិន​អាច​លុប​បាន​ឡើយ ។"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s មិនអាច​ដំឡើងបាន"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "គ្មាន​អ្វី​ផ្ដល់ %s ដែល​ត្រូវការ​ដោយ %s ទេ"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "មិនអាច​ដំឡើង​ទាំង %s និង %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s ប៉ះទង្គិច​ជាមួយ %s ដែល​បាន​ផ្ដល់​ដោយ %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s លែងប្រើ %s ដែល​ផ្ដល់ដោយ %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s ដែល​បាន​ដំឡើង​លែង​ប្រើ %s ដែល​ផ្ដល់​ដោយ %s ហើយ"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "ការ​ប៉ះទង្គិច %s ដែល​អាច​ដោះស្រាយ​បាន​ជា​មួយ %s ដែល​បាន​ផ្ដល់​ដោយ​ខ្លួន​វា​ផ្ទាល់"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s ត្រូវការ %s ប៉ុន្តែ​តម្រូវការ​នេះ​មិនអាច​ផ្ដល់​បានទេ"
+
+#~ msgid "do not install %s"
+#~ msgstr "កុំ​ដំឡើង %s"
+
+#~ msgid "keep %s"
+#~ msgstr "រក្សា %s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "កុំ​ហាម​ការ​ដំឡើង​នៃ %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "កុំ​ស្នើ​ឲ្យ​ដំឡើង​កញ្ចប់​ដោះស្រាយ​ដោយ​ផ្ដល់ %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "កុំ​ស្នើ​ឲ្យ​លុប​កញ្ចប់​ដោះស្រាយ​ទាំងអស់​ដោយ​ផ្ដល់ %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "កុំ​ដំឡើង​កំណែ​ថ្មីរបស់ %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "ទុក %s ទោះ​បី​ជា​ស្ថាបត្យកម្ម​ទាប​ក៏​ដោយ"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "ដំឡើង %s ទោះ​បីជា​ស្ថាបត្យកម្ម​ទាប​ក៏​ដោយ"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "លែង​ប្រើ %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "ដំឡើង %s ពី​ឃ្លាំង​ដែល​បាន​ដក​ចេញ"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "បន្ទាប %s ទៅ %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "ការ​ផ្លាស់ប្ដូរ​ស្ថាបត្យកម្ម​នៃ %s ទៅ %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "ដំឡើង %s (ដោយ​មានការ​ផ្លាស់ប្ដូរ​របស់​អ្នក​លក់)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "ការ​ជំនួស %s ជាមួយ %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "ការ​លុប​នៃ %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "មិនអាច​បើក​ឯកសារ​សោ ៖ %s"
 
index a937f4e..3701659 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.ko\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2019-03-23 20:19+0000\n"
 "Last-Translator: Hwajin Kim <hwajin.kim@e4net.net>\n"
 "Language-Team: Korean <https://l10n.opensuse.org/projects/libzypp/master/ko/"
@@ -21,12 +21,6 @@ msgstr ""
 "X-Generator: Weblate 3.3\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "모호한 유형 '%s'(%u바이트 체크섬 '%s'에 대해)"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "알 수 없는 국가: "
@@ -1375,71 +1369,21 @@ msgstr "기능 향상"
 msgid "Supplements"
 msgstr "보충"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "pty(%s)를 열 수 없습니다."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "파이프(%s)를 열 수 없습니다."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "'%s'(%s)에 대해 chroot할 수 없습니다."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "'%s'(chroot '%s' 내부)(%s)(으)로 chdir할 수 없습니다."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "'%s'(%s)(으)로 chdir할 수 없습니다."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "'%s'(%s)을(를) 실행할 수 없습니다."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "fork(%s)할 수 없습니다."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "상태 %d(으)로 명령이 종료되었습니다."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "명령이 신호 %d(%s)에 의해 종료되었습니다."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "알 수 없는 오류와 함께 명령이 종료되었습니다."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "기존 키 %s을(를) 키링 %s(으)로 임포트하려고 했습니다."
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "키를 임포트하지 못했습니다."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "키를 삭제하지 못했습니다."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "서명 파일 %s을(를) 찾을 수 없습니다."
@@ -3954,52 +3898,52 @@ msgstr[0] "%d(24시간 내 만료)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "%2% 캐시에서 gpg 키 ID %1%을(를) 검색합니다."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "%2% 리포지토리에서 gpg 키 ID %1%을(를) 검색합니다."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "%1% 리포지토리에서 추가 'gpgkey=' URL을 정의하지 않습니다."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "리포지토리 디렉토리 '%1%'을(를) 읽을 수 없음: 사용 권한 거부됨"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "디렉토리 '%s'을(를) 읽지 못했습니다."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "리포지토리 파일 '%1%'을(를) 읽을 수 없음: 사용 권한 거부됨"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "리포지토리 별칭은 점(.)으로 시작할 수 없습니다."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "서비스 별칭은 점(.)으로 시작할 수 없습니다."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "쓰기 위한 파일 '%s'을(를) 열 수 없습니다."
@@ -4007,42 +3951,42 @@ msgstr "쓰기 위한 파일 '%s'을(를) 열 수 없습니다."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "알 수 없는 서비스 '%1%': 독립 서비스 리포지토리 '%2%' 제거 중"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "지정한 URL에는 유효한 메타데이터가 없음"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s을(를) 생성할 수 없음"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "메타 데이터 캐시 디렉토리를 생성할 수 없습니다."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "리포지토리 '%s' 캐시 빌드 중"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "%s에서 캐시를 생성할 수 없음 - 쓰기 권한이 없습니다."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "리포지토리(%d)를 캐시하지 못했습니다."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "리포지토리 유형이 처리되지 않았습니다."
 
@@ -4052,69 +3996,48 @@ msgstr "리포지토리 유형이 처리되지 않았습니다."
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "'%s'에서 읽기를 시도하는 중에 오류가 발생했습니다."
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "'%s'에서 읽는 중에 알 수 없는 오류가 발생했습니다."
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "'%s' 리포지토리 추가 중"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "'%s'에서 리포지토리 파일 이름이 잘못되었습니다."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "'%s' 리포지토리 제거 중"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "리포지토리가 저장된 위치를 알 수 없습니다."
 
 #  Frame title for installation target hard disk / partition(s)
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s'을(를) 삭제할 수 없습니다."
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "서비스가 저장된 위치를 알 수 없습니다."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "잘못된 LDAP URL 쿼리 스트링"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "LDAP URL 쿼리 파라미터 '%s'이(가) 잘못되었습니다."
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "URL 객체를 복제할 수 없습니다."
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "빈 URL 객체 참조는 잘못되었습니다."
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "URL 구성요소를 구문 분석할 수 없습니다."
-
 #  translators: fallback name for a module at command line
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
@@ -4191,7 +4114,7 @@ msgstr "지원을 받으려면 추가 고객 계약이 필요합니다."
 msgid "Unknown support option. Description not available"
 msgstr "알 수 없는 지원 옵션입니다. 설명을 사용할 수 없습니다."
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4200,11 +4123,6 @@ msgstr ""
 "시스템 관리가 응용 프로그램에서 pid %d(%s)과(와) 함께 잠겼습니다.\n"
 "다시 시도하기 전에 이 응용 프로그램을 닫으십시오."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "이력:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4226,13 +4144,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "잘못된 정규식 '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s'에 대한 인증 필요"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4240,8 +4159,8 @@ msgstr ""
 "SUSE 고객 센터를 방문하여 등록이 올바른지, 등록이 만료되지 않았는지 확인합니"
 "다."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4269,7 +4188,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "'%s' 작업을 수행할 때 미디어를 열 수 없습니다."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "'%s' 파일을 '%s' 미디어에서 찾을 수 없습니다."
@@ -4377,7 +4296,7 @@ msgid "Permission to access '%s' denied."
 msgstr "'%s' 액세스 권한이 거부되었습니다."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "'%s'에 액세스할 때 제한 시간이 초과되었습니다."
@@ -4388,7 +4307,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "다운로드한 데이터가 예상 파일 크기 '%s'/'%s'을(를) 초과했습니다."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "위치 '%s'에 일시적으로 액세스할 수 없습니다."
@@ -4404,7 +4323,7 @@ msgid ""
 "point"
 msgstr "연결점 생성: 연결점을 생성할 쓰기 가능한 디렉토리를 찾을 수 없습니다."
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "지원하지 않는 HTTP 인증 방법 '%s'"
@@ -4463,7 +4382,7 @@ msgid "No url in repository."
 msgstr "리포지토리에 URL이 없습니다."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4629,7 +4548,7 @@ msgstr "일부 종속성을 무시하여 %s을(를) 구분합니다."
 msgid "generally ignore of some dependencies"
 msgstr "일부 종속을 일반적으로 무시"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4637,161 +4556,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "요청 충돌"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "일부 종속성 문제"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "지원되지 않는 요청"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "삭제된 공급자: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4799,122 +4708,106 @@ msgstr ""
 "\n"
 "설치 불가능한 공급자: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "설치할 수 없는 공급자: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "이 요청은 시스템을 손상시킵니다!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "손상된 시스템에 대한 경고를 무시합니다."
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4923,211 +4816,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s이(가) 배포 업그레이드 리포지토리에 속해 있지 않습니다."
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s에 하위 아키텍처가 있습니다."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "설치된 패키지 %s에 문제가 발생했습니다."
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "요청한 %s이(가) 제공되지 않습니다."
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "요청한 모든 리포지토리를 활성화했습니까?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "%s 패키지가 존재하지 않습니다."
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s은(는) 시스템에서 제공되며 지울 수 없습니다."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s을(를) 설치할 수 없습니다."
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s(%s에서 필요)이(가) 제공되지 않습니다."
-
-#  Frame title for installation target hard disk / partition(s)
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%s과(와) %s을(를) 모두 설치할 수 없습니다."
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s이(가) %s(%s에서 제공)과(와) 충돌합니다."
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s이(가) %s(%s에서 제공)을(를) 폐기합니다."
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "설치된 %s이(가) %s(%s에서 제공)을(를) 제거합니다."
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "Solvable %s이(가) 자체적으로 제공된 %s과(와) 충돌합니다."
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s에 %s이(가) 필요하지만, 이 요구사항을 제공할 수 없습니다."
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "잠금 해제로 %s 제거 허용"
-
-#  Frame title for installation target hard disk / partition(s)
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s 설치 안 함"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s 유지"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "잠금 해제로 %s 설치 허용"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "%s을(를) 제공하는 solvable 설치를 묻지 않음"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "%s을(를) 제공하는 모든 solvable 삭제를 묻지 않음"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "%s의 최신 버전을 설치하지 않음"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "하위 아키텍처인 경우에도 %s 유지"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "하위 아키텍처인 경우에도 %s 설치"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "구식 %s 유지"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "제외된 리포지토리에서 %s 설치"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "%s을(를) %s(으)로 다운그레이드"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "%s에서 %s(으)로 아키텍처 변경"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"%s 설치(벤더 변경)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "%s을(를) %s(으)로 대체"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "%s 설치 제거"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -5145,75 +4847,79 @@ msgstr "%posttrans 스크립트 실행 중"
 msgid "Installation has been aborted as directed."
 msgstr "설치가 지시된 대로 중단되었습니다."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " 실행됨"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " 실행 실패됨"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s이(가) 이미 %s(으)로 실행되었습니다."
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " 중단하는 중 실행 건너뜀"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "업데이트 메시지 알림을 보내는 중에 오류가 발생했습니다."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "새 업데이트 메시지"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM 실패: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "%1% 파일에서 공용 키를 임포트하지 못했습니다."
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "%1% 공용 키를 제거하지 못했습니다."
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "패키지가 서명되지 않았습니다!"
 
 #  progress stage
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s에 대한 구성 파일을 변경함:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "RPM은 %s을(를) %s(으)로 저장했지만, 차이점을 구분할 수 없습니다."
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5223,13 +4929,13 @@ msgstr ""
 "다음은 차이에 대한 처음 25개 행입니다.\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "RPM은 %s을(를) %s(으)로 생성했지만, 차이점을 구분할 수 없습니다."
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5241,146 +4947,357 @@ msgstr ""
 #  dialog caption
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "추가 RPM 출력"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "백업 %s을(를) 만들었음"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "서명 정상"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "알 수 없는 서명 유형"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "서명을 확인할 수 없음"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "서명이 정상이지만 키를 신뢰할 수 없음"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "서명 공용 키 사용 불가"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "파일이 존재하지 않거나 서명을 확인할 수 없음"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "파일이 서명되지 않음"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "모호한 유형 '%s'(%u바이트 체크섬 '%s'에 대해)"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "pty(%s)를 열 수 없습니다."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "파이프(%s)를 열 수 없습니다."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "잘못된 LDAP URL 쿼리 스트링"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "LDAP URL 쿼리 파라미터 '%s'이(가) 잘못되었습니다."
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "URL 객체를 복제할 수 없습니다."
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "빈 URL 객체 참조는 잘못되었습니다."
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "URL 구성요소를 구문 분석할 수 없습니다."
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "이력:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "URL 구성표는 %s을(를) 허용하지 않습니다."
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "%s 구성요소 '%s'이(가) 잘못되었습니다."
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "%s 구성요소가 잘못되었습니다."
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "이 URL에 대해 쿼리 스트링 구문 분석이 지원되지 않습니다."
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URL 구성표는 필수 구성요소입니다."
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "URL 구성표 '%s'이(가) 잘못되었습니다."
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "URL 구성표가 사용자 이름을 허용하지 않습니다."
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "URL 구성표가 비밀번호를 허용하지 않습니다."
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "URL 구성표에 호스트 구성요소가 필요합니다."
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "URL 구성표가 호스트 구성요소를 허용하지 않습니다."
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "호스트 구성요소 '%s'이(가) 잘못되었습니다."
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "URL 구성표가 포트를 허용하지 않습니다."
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "포트 구성요소 '%s'이(가) 잘못되었습니다."
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "URL 구성표에 경로 이름이 필요합니다."
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "기관이 있는 경우 상대 경로는 허용되지 않습니다."
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "인코드 스트링에 NUL 바이트가 포함되어 있습니다."
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "파라미터 배열 분할 구분 문자가 잘못되었습니다."
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "파라미터 맵 분할 구분 문자가 잘못되었습니다."
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "파라미터 배열 조인 구분 문자가 잘못되었습니다."
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "상태 %d(으)로 명령이 종료되었습니다."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "명령이 신호 %d(%s)에 의해 종료되었습니다."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "알 수 없는 오류와 함께 명령이 종료되었습니다."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "'%s'(%s)에 대해 chroot할 수 없습니다."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "'%s'(%s)(으)로 chdir할 수 없습니다."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "'%s'(chroot '%s' 내부)(%s)(으)로 chdir할 수 없습니다."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "'%s'(%s)을(를) 실행할 수 없습니다."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "fork(%s)할 수 없습니다."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s이(가) 배포 업그레이드 리포지토리에 속해 있지 않습니다."
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s에 하위 아키텍처가 있습니다."
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "설치된 패키지 %s에 문제가 발생했습니다."
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "요청한 %s이(가) 제공되지 않습니다."
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "요청한 모든 리포지토리를 활성화했습니까?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "%s 패키지가 존재하지 않습니다."
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s은(는) 시스템에서 제공되며 지울 수 없습니다."
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s을(를) 설치할 수 없습니다."
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s(%s에서 필요)이(가) 제공되지 않습니다."
+
+#  Frame title for installation target hard disk / partition(s)
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%s과(와) %s을(를) 모두 설치할 수 없습니다."
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s이(가) %s(%s에서 제공)과(와) 충돌합니다."
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s이(가) %s(%s에서 제공)을(를) 폐기합니다."
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "설치된 %s이(가) %s(%s에서 제공)을(를) 제거합니다."
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "Solvable %s이(가) 자체적으로 제공된 %s과(와) 충돌합니다."
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s에 %s이(가) 필요하지만, 이 요구사항을 제공할 수 없습니다."
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "잠금 해제로 %s 제거 허용"
+
+#  Frame title for installation target hard disk / partition(s)
+#~ msgid "do not install %s"
+#~ msgstr "%s 설치 안 함"
+
+#~ msgid "keep %s"
+#~ msgstr "%s 유지"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "잠금 해제로 %s 설치 허용"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "%s을(를) 제공하는 solvable 설치를 묻지 않음"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "%s을(를) 제공하는 모든 solvable 삭제를 묻지 않음"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "%s의 최신 버전을 설치하지 않음"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "하위 아키텍처인 경우에도 %s 유지"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "하위 아키텍처인 경우에도 %s 설치"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "구식 %s 유지"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "제외된 리포지토리에서 %s 설치"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "%s을(를) %s(으)로 다운그레이드"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "%s에서 %s(으)로 아키텍처 변경"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "%s 설치(벤더 변경)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "%s을(를) %s(으)로 대체"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "%s 설치 제거"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "잠금 파일 %s을(를) 열 수 없습니다."
 
index fab9e06..6e44bb0 100644 (file)
--- a/po/ku.po
+++ b/po/ku.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: memory.ku.po\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2005-09-23 00:15+0200\n"
 "Last-Translator: Kurdish Team <i18n@suse.de>\n"
 "Language-Team: Kurdish Team <i18n@suse.de>\n"
@@ -15,12 +15,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: Plural-Forms: nplurals=2; plural=n != 1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 #, fuzzy
 msgid "Unknown country: "
@@ -1334,73 +1328,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "%s nehat vebûn."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Pela %1 nayê vekirin"
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "%s nehat vebûn."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr ""
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Sepandina delta RPM têk çû"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Sepandina delta RPM têk çû"
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Pel nehat dîtin."
@@ -3839,53 +3783,53 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Nekarî pelrêça '%1' biafirîne."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "Arşîv nederbasdar e."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Pela '%1' nayê vekirin"
@@ -3893,44 +3837,44 @@ msgstr "Pela '%1' nayê vekirin"
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%1$s Biafirîne"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Pelrêç nayê afirandin"
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "Çavkaniyê &Çalak Bike"
@@ -3941,70 +3885,47 @@ msgstr "Çavkaniyê &Çalak Bike"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, fuzzy, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Di nivîsandina pela '%1' de çewtî çêbû"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Arşîva %1 tê Afirandin"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Arşîvan Rake"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Bi rastî bila '%1' jê bibe?"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-#, fuzzy
-msgid "Unable to clone Url object"
-msgstr "&Venebû"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-#, fuzzy
-msgid "Unable to parse Url components"
-msgstr "&Venebû"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "nenas"
@@ -4074,19 +3995,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "tu rave tuneye "
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-#, fuzzy
-msgid "History:"
-msgstr "Pelrêça Mal:"
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4108,20 +4023,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Derbirîna bi Pergal(an)"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4148,7 +4064,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Pakêta %1 derdorê nehat dîtin."
@@ -4252,7 +4168,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4263,7 +4179,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4279,7 +4195,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4340,7 +4256,7 @@ msgid "No url in repository."
 msgstr "Çavkanî hilbijêre."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4458,7 +4374,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4466,284 +4382,258 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Pakêtên nakokiyên wan hene"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 #, fuzzy
 msgid "unsupported request"
 msgstr "Piştgirî"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4752,208 +4642,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "Sazkirina pakêtên hewce pêk nehat."
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Pela %1 tune ye. "
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "Saz neke"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, fuzzy, c-format, boost-format
-msgid "do not install %s"
-msgstr "Saz neke"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "Sazkirina nivîsbariyê"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, fuzzy, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "Ji bo nû ve sazkirina guhertoya cuda"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "kêmkirin"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Moda Sazkirinê"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4971,12 +4674,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Sazkirina di nav Pelrêç de"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "Bixebitîne"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "Nivîsandina mîhengan têk çû"
@@ -4984,63 +4687,67 @@ msgstr "Nivîsandina mîhengan têk çû"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Veavakirina IrDA biguherîne"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5048,13 +4755,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5063,151 +4770,298 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Zêdetir vebijark"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Pel nehat dîtin."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Pel nehat dîtin."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Pel nehat dîtin."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "%s nehat vebûn."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Pela %1 nayê vekirin"
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+#, fuzzy
+msgid "Unable to clone Url object"
+msgstr "&Venebû"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+#, fuzzy
+msgid "Unable to parse Url components"
+msgstr "&Venebû"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+#, fuzzy
+msgid "History:"
+msgstr "Pelrêça Mal:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, fuzzy, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Vebijêrka nederbasdar: %1"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, fuzzy, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Vebijêrka nederbasdar: %1"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 #, fuzzy
 msgid "Url scheme is a required component"
 msgstr "Navê bikarhêner pêwist e"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, fuzzy, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Vebijêrka nederbasdar: %1"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, fuzzy, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Vebijêrka nederbasdar: %1"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "%s nehat vebûn."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "Sazkirina pakêtên hewce pêk nehat."
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "Pela %1 tune ye. "
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "Saz neke"
+
+#, fuzzy
+#~ msgid "do not install %s"
+#~ msgstr "Saz neke"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "Sazkirina nivîsbariyê"
+
+#, fuzzy
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "Ji bo nû ve sazkirina guhertoya cuda"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "kêmkirin"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Moda Sazkirinê"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Pela %1 nayê vekirin"
index 18b17fa..bdfee24 100644 (file)
--- a/po/lt.po
+++ b/po/lt.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2017-06-02 18:02+0000\n"
 "Last-Translator: Mindaugas Baranauskas <opensuse.lietuviu.kalba@gmail.com>\n"
 "Language-Team: Lithuanian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -24,12 +24,6 @@ msgstr ""
 "%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3);\n"
 "X-Generator: Weblate 2.6\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Abejotinas tipas „%s“, skirtas %u bitų kontrolinei santraukai „%s“"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Nežinoma šalis: "
@@ -1381,72 +1375,22 @@ msgstr "Pagerina"
 msgid "Supplements"
 msgstr "Papildo"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Nepavyksta atverti pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Nepavyksta atverti kanalo (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Nepavyksta keisti pakeisti aplanko į „%s“ (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Nepavyksta įvykdyti „%s“ (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Komanda baigta būsenoje %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Komanda nutraukta naudojant signalą %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Komanda pasibaigė su nežinoma klaida."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Mėginta importuoti neegzistuojantį raktą %s į raktinę %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Nepavyko įkelti viešojo rakto %1%"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Rakto nepavyko pašalinti."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Parašo rinkmena %s nerasta"
@@ -3864,52 +3808,52 @@ msgstr[3] "(baigsis po %d d.)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Nepavyko perskaityti katalogo „%1%“: nepakanka leidimų"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Nepavyko nuskaityti katalogo „%s“"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Nepavyko perskaityti rinkmenos „%1%“: nepakanka leidimų"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Saugyklos pseudonimas negali prasidėti tašku."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Paslaugos pseudonimas negali prasidėti tašku."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nepavyksta atverti rinkmenos „%s“ įrašymui."
@@ -3917,14 +3861,14 @@ msgstr "Nepavyksta atverti rinkmenos „%s“ įrašymui."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Nežinoma paslauga „%1%“: pašalinama nebereikalinga paslaugų saugykla „%2%“"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Nurodytu URL nerasta tinkamų meta duomenų"
@@ -3932,31 +3876,31 @@ msgstr[1] "Nurodytuose URL nerasta tinkamų meta duomenų"
 msgstr[2] "Nurodytuose URL nerasta tinkamų meta duomenų"
 msgstr[3] "Nurodytuose URL nerasta tinkamų meta duomenų"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nepavyksta sukurti %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Nepavyko sukurti metaduomenų podėlio katalogo."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Kuriamas saugyklos „%s“ podėlis"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Nepavyksta sukurti podėlio ties %s - nepakanka teisių."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Nepavyko įkelti į saugyklų podėlį (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Nesutvarkytas saugyklos tipas"
 
@@ -3966,68 +3910,47 @@ msgstr "Nesutvarkytas saugyklos tipas"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Klaida bandant nuskaityti „%s“"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Nežinoma klaida skaitant iš „%s“"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Pridedama saugykla „%s“"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Netinkamas saugyklos pavadinimas „%s“"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Pašalinama saugykla „%s“"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Nepavyksta nustatyti, kur patalpinta ši saugykla"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nepavyksta pašalinti „%s“"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Nepavyksta nustatyti, kur patalpinta ši paslauga"
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Netinkama LDAP URL užklausos eilutė"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Netinkamas LDAP URL užklausos parametras „%s“"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Nepavyksta klonuoti Url objekto"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Nepavyksta išnagrinėti Url komponentų"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "nežinoma"
@@ -4104,7 +4027,7 @@ msgstr "Norint gauti palaikymą, reikalinga papildoma kliento sutartis."
 msgid "Unknown support option. Description not available"
 msgstr "Nežinomo palaikymo parinktis. Aprašas neprieinamasq"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4113,11 +4036,6 @@ msgstr ""
 "Sistemos tvarkytuvę užrakino programa, kurios pid %d (%s).\n"
 "Užverkite šią programą ir bandykite iš naujo."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Istorija:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4139,20 +4057,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Netinkamas reguliarusis reiškinys „%s“"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "%s reikalauja autentifikacijos"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4181,7 +4100,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Laikmena nebuvo atidaryta, kai bandyta atlikti veiksmą „%s“."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Rinkmena „%s“ nerasta laikmenoje „%s“"
@@ -4287,7 +4206,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Priėjimas prie „%s“ uždraustas."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Per ilgai jungiamasi prie „%s“."
@@ -4298,7 +4217,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Vieta „%s“ laikinai nepasiekiama."
@@ -4315,7 +4234,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Nepalaikomas HTTP tapatybės nustatymo būdas „%s“"
@@ -4376,7 +4295,7 @@ msgid "No url in repository."
 msgstr "Saugykloje nėra url."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4541,7 +4460,7 @@ msgstr "nepaisyti kai kurių priklausomybių ir taip sugadinti %s "
 msgid "generally ignore of some dependencies"
 msgstr "apskritai ignoruoti kai kurias priklausomybes"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4549,161 +4468,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "konfliktuojantys reikalavimai"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "kai kurių priklausomybių problema"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "nepalaikoma užklausa"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "pašalinti galimi pasiūlymai: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4711,122 +4620,106 @@ msgstr ""
 "\n"
 "netinkami įdiegti pasiūlymai: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "netinkami diegimui pasiūlymai: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Šis veiksmas sugadins jūsų sistemą!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "nepaisyti perspėjimų apie riziką sugadinti sistemą"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4835,209 +4728,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s nepriklauso platinamojo paketo naujovinimo (distupgrade) saugyklai"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s yra kitos architektūros"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problema su įdiegtu paketu %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "niekas nepateikia reikalaujamo %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Ar įgalinote visas reikiamas saugyklas?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "paketo %s nėra"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s pateikia sistema, jo negalima pašalinti"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s neįdiegiamas"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "niekas nepateikia %s, kurio reikalauja %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "negalima įdiegti ir %s, ir %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s konfliktuoja su %s, kurį pateikia %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s pakeičia %s, kurį pateikė %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "įdiegtas %s pakeičia %s, kurį pateikė %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "sprendinys %s konfliktuoja su %s, kurį pats siūlo"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s reikalauja „%s“, bet reikalavimo negalima išpildyti"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "nedrausti pašalinti %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "neįdiegti %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "išlaikyti %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "nedrausti įdiegti %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "neprašyti įdiegti sprendinių, kuriuos siūlo %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "neprašyti pašalinti visų sprendinių, kuriuos siūlo %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "neįdiegti pačios naujausios %s versijos"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "išlaikyti %s, nors yra kitos architektūros"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "įdiegti %s, nors yra kitos architektūros"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "išlaikyti pasenusį %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "įdiegti %s iš neįtrauktos saugyklos"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "pasendinti nuo %s iki %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "pakeisti architektūrą iš %s į %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"įdiegti %s (keičiant gamintoją)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "%s pakeisti į %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "pašalinti %s "
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -5055,74 +4759,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Diegimas buvo nutrauktas pagal nurodymą."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " įvykdyta"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " įvykdyti nepavyko"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s jau įvykdytas kaip %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " nutraukiant vykdymas sustabdytas"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Siunčiant atnaujinimo pranešimą įvyko klaida."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Naujas atnaujinimo pranešimas"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM klaida:"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nepavyko įkelti viešojo rakto %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Nepavyko pašalinti viešojo rakto %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Pakeistos %s konfigūracijos rinkmenos:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm išsaugojo %s kaip %s, bet neįmanoma nustatyti skirtumo"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5132,13 +4840,13 @@ msgstr ""
 "Pateikiamos pirmosios 25 skirtumų eilutės:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm sukūrė %s kaip %s, bet neįmanoma nustatyti skirtumo"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5149,146 +4857,356 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Papildoma rpm išvestis"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "padaryta %s atsarginė kopija"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Parašas geras"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Nežinomo tipo parašas"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Parašas nepatikrinamas. "
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Parašas geras, bet raktas nepatikimas"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Paašo viešasis raktas neprieinamas"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Nėra rinkmenos arba negalima patikrinti parašo"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Abejotinas tipas „%s“, skirtas %u bitų kontrolinei santraukai „%s“"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Nepavyksta atverti pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Nepavyksta atverti kanalo (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Netinkama LDAP URL užklausos eilutė"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Netinkamas LDAP URL užklausos parametras „%s“"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Nepavyksta klonuoti Url objekto"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Nepavyksta išnagrinėti Url komponentų"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Istorija:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Url schema neleidžia %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Netinkamas %s komponentas „%s“"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Netinkamas %s komponentas"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Užklausos eilutės nagrinėjimas nepalaikomas šiam URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Url schema yra reikalingas komponentas"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Netinkama Url schema „%s“"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url schema neleidžia naudotojo vardo"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url schema neleidžia slaptažodžio"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url schemai reikia kompiuterio komponento"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Url schema neleidžia kompiuterio komponento"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Netinkamas kompiuterio komponentas „%s“."
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Url schema neleidžia prievado"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Netinkamas prievado komponentas „%s“"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url schema reikalauja kelio pavadinimo"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Santykinis kelias neleidžiamas, jei naudojamas tapatybės nustatymas"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Komanda baigta būsenoje %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Komanda nutraukta naudojant signalą %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Komanda pasibaigė su nežinoma klaida."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Nepavyksta keisti pakeisti aplanko į „%s“ (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Nepavyksta įvykdyti „%s“ (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr ""
+#~ "%s nepriklauso platinamojo paketo naujovinimo (distupgrade) saugyklai"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s yra kitos architektūros"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problema su įdiegtu paketu %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "niekas nepateikia reikalaujamo %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Ar įgalinote visas reikiamas saugyklas?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "paketo %s nėra"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s pateikia sistema, jo negalima pašalinti"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s neįdiegiamas"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "niekas nepateikia %s, kurio reikalauja %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "negalima įdiegti ir %s, ir %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s konfliktuoja su %s, kurį pateikia %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s pakeičia %s, kurį pateikė %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "įdiegtas %s pakeičia %s, kurį pateikė %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "sprendinys %s konfliktuoja su %s, kurį pats siūlo"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s reikalauja „%s“, bet reikalavimo negalima išpildyti"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "nedrausti pašalinti %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "neįdiegti %s"
+
+#~ msgid "keep %s"
+#~ msgstr "išlaikyti %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "nedrausti įdiegti %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "neprašyti įdiegti sprendinių, kuriuos siūlo %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "neprašyti pašalinti visų sprendinių, kuriuos siūlo %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "neįdiegti pačios naujausios %s versijos"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "išlaikyti %s, nors yra kitos architektūros"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "įdiegti %s, nors yra kitos architektūros"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "išlaikyti pasenusį %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "įdiegti %s iš neįtrauktos saugyklos"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "pasendinti nuo %s iki %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "pakeisti architektūrą iš %s į %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "įdiegti %s (keičiant gamintoją)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "%s pakeisti į %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "pašalinti %s "
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Nepavyksta atverti užrakintos rinkmenos: %s"
 
index 9173bd6..efdbd51 100644 (file)
--- a/po/mk.po
+++ b/po/mk.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2001-07-17 16:12+0200\n"
 "Last-Translator: Зоран Димовски <zoki.dimovski@gmail.com>\n"
 "Language-Team: Macedonian <i18n@suse.de>\n"
@@ -16,12 +16,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1515,73 +1509,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Couldn't open file: %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr ""
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -4132,52 +4076,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -4185,43 +4129,43 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Couldn't open file: %s."
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4231,68 +4175,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Couldn't open file: %s."
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr ""
@@ -4359,18 +4282,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4392,20 +4310,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4432,7 +4351,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4535,7 +4454,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4546,7 +4465,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4562,7 +4481,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4622,7 +4541,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4739,7 +4658,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4747,282 +4666,256 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -5031,206 +4924,19 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1509
-#, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr ""
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
 msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
 #. strip tmp file suffix
@@ -5249,11 +4955,11 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -5261,63 +4967,67 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5325,13 +5035,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5340,144 +5050,256 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
 #, fuzzy
index 3324886..4a68727 100644 (file)
--- a/po/mr.po
+++ b/po/mr.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Check hardware-2.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2006-11-13 12:55+0530\n"
 "Last-Translator: Priyavert Sharma <priyavert.sharma@agreeya.com>\n"
 "Language-Team: AgreeYa Solutions <linux_team@agreeya.com>\n"
@@ -13,12 +13,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: KBabel 1.10.2\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "अज्ञात देश:"
@@ -1292,74 +1286,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "फाईल उघडता येत नाही %1."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "फाईल उघडता येत नाही %1."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "%s आढळत नाही."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "%s आढळत नाही."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr " कनेक्ट करतांना आदेश वापरला "
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "VM सुरू करण्यात अयशस्वी."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "VM सुरू करण्यात अयशस्वी."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "नोंद आढळली नाही"
@@ -3766,54 +3709,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr " VM चे नाव आकड्याने सुरू होता कामा नये. "
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr " VM चे नाव आकड्याने सुरू होता कामा नये. "
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "फाईलरायटिंगसाठी उघडू शकत नाही."
@@ -3821,44 +3764,44 @@ msgstr "फाईलरायटिंगसाठी उघडू शकत न
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr " डेस्कटॉप आयटेम'%s' उघडू शकत नाही"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "डिरेक्टर %1: %2 निर्माण करता आली नाही."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3868,68 +3811,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "फ्लॉपी डिस्कवरुन एरर वाचत आहे."
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "पाठवल्याच्या फाईलचे अवैध नांव"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "रिसोर्सेस जतन करत आहे"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr " डेस्कटॉप आयटेम'%s' उघडू शकत नाही"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "अवैध LDAP URL क्वेरी स्ट्रिंग"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "अवैध LDAP URL क्वेरी पॅरामीटर %s"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Url ऑब्जेक्ट क्लोन करण्यात असमर्थ"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "अवैध रिक्त Url ऑब्जेक्ट संदर्भ"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Url भागांचा संबंध जोडण्यात असमर्थ"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "अनोळखी"
@@ -3997,18 +3919,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4030,20 +3947,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "अवैध Url स्कीम %s"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4070,7 +3988,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "भांडारात फाईल %1 आढळली नाही"
@@ -4174,7 +4092,7 @@ msgid "Permission to access '%s' denied."
 msgstr "परवानगी नाकारली"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4185,7 +4103,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4201,7 +4119,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4265,7 +4183,7 @@ msgid "No url in repository."
 msgstr "भांडारात फाईल %1 आढळली नाही"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4384,7 +4302,7 @@ msgstr "या गरजेकडे येथेच दुर्लक्ष 
 msgid "generally ignore of some dependencies"
 msgstr "या गरजेकडे येथेच दुर्लक्ष करा"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4392,288 +4310,262 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "यांच्याशी कनेक्शनची रिक्वेस्ट :"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "अवलंबून असण्याच्या (डिपेन्डन्सी) समस्येमुळे %s स्थापित करु शकत नाही"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "कोणतीही गोष्ट %s पुरवत नाही"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%s चे स्थापित करता येण्याजोगे प्रदाता नाहीत"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%s चे स्थापित करता येण्याजोगे प्रदाता नाहीत"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "विनंती आधीपासूनच आहे."
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4682,208 +4574,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s %s पुरवते, परंतु त्याचे दुसरे स्थापत्य आहे."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "पॅकेजेस अस्थापित करण्याचा आदेश"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "कोणतीही गोष्ट %s पुरवत नाही"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "डिस्क अस्तित्वात नाही"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s ला कुलुप आहे व अस्थापित होऊ शकत नाही"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "स्थापित नसलेली"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s ला %s ची गरज आहे"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%s स्थापित करु शकत नाही"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s चे %s शी पटत नाही"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s %s ला बाजूला टाकते"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s %s ला बाजूला टाकते"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s चे %s शी पटत नाही"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s स्थापित करु नका"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s ठेवा"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "%s स्थापित करु नका"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "%s चे स्थापित करता येण्याजोगे प्रदाता नाहीत"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "संबंधित रिझॉल्व्हेबल्स स्थापित किंवा पुसून टाकू नका"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s %s पुरवते, परंतु त्याचे दुसरे स्थापत्य आहे."
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "%s स्थापित करा, जरी ते स्थापत्य बदलत असेल"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s %s ला बाजूला टाकते"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "% वरून % डाऊनलोड करत आहे"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "स्थापना (इन्स्टॉलेशन)"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4900,12 +4605,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "निर्देशानुसार स्थापना मधेच सोडली"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "अमलात आणा"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4913,65 +4618,69 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "की च्या सांकेतिकीकरणादरम्यान चूक आली"
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "अयशस्वी"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s साठी बदललेल्या आकृतीबंध फाईल्स"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ने %s हे %s म्हणन जतन केले, परंतु फरक सांगणे अशक्य"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4979,13 +4688,13 @@ msgid ""
 msgstr "rpm ने %s हे %s म्हणून जतन केले/nफरकाच्या या पहिल्या 25 ओळी\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm ने %s  हे %s म्हणून जतन केले फरकाच्या या पहिल्या"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4994,150 +4703,349 @@ msgstr "rpm ने %s हे %s म्हणून जतन केले/nफ
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "अतिरिक्त rpm आऊटपुट"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "बॅकअप %s  निर्माण केले"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "नोंद आढळली नाही"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "नोंद आढळली नाही"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "नोंद आढळली नाही"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "फाईल उघडता येत नाही %1."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "फाईल उघडता येत नाही %1."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "अवैध LDAP URL क्वेरी स्ट्रिंग"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "अवैध LDAP URL क्वेरी पॅरामीटर %s"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Url ऑब्जेक्ट क्लोन करण्यात असमर्थ"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "अवैध रिक्त Url ऑब्जेक्ट संदर्भ"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Url भागांचा संबंध जोडण्यात असमर्थ"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Url स्कीम %sला अनुमती देत नाही"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "अवैध %s कॉम्पोनन्ट %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "अवैध %s कॉम्पोनन्ट"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "या URL साठी क्वेरी स्ट्रिंग पार्सिंगचे समर्थन नाही"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URL स्कीम हा एक आवश्यक भाग आहे"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "अवैध Url स्कीम %s"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url स्कीम उपभोक्त्याच्या नावाला अनुमती देत नाही"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url स्कीम पासवर्डला अनुमती देत नाही"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url स्कीमला मुख्य भागाची गरज असते"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Url स्कीम मुख्य भागाला अनुमती देत नाही"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "अवैध मुख्य भाग %s"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Url स्कीम पोर्टला अनुमती देत नाही"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "अवैध पोर्ट भाग %s"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url स्कीमला पाथच्या नावाची गरज असते"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "अथॉरिटी उपस्थित असेल तर सापेक्ष पाथला अनुमती नाही"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "एनकोडेड स्ट्रिंगमधे NUL बाईटचा समावेश आहे"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "अवैध पॅरामीटर अरे स्प्लिट सेपरेटर कॅरॅक्टर"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "अवैध पॅरामीटर मॅप स्प्लिट सेपरेटर कॅरॅक्टर"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "अवैध पॅरामीटर अरे जॉईन सेपरेटर कॅरॅक्टर "
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr " कनेक्ट करतांना आदेश वापरला "
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "%s आढळत नाही."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "%s आढळत नाही."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s %s पुरवते, परंतु त्याचे दुसरे स्थापत्य आहे."
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "पॅकेजेस अस्थापित करण्याचा आदेश"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "कोणतीही गोष्ट %s पुरवत नाही"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "डिस्क अस्तित्वात नाही"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s ला कुलुप आहे व अस्थापित होऊ शकत नाही"
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "स्थापित नसलेली"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s ला %s ची गरज आहे"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%s स्थापित करु शकत नाही"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s चे %s शी पटत नाही"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s %s ला बाजूला टाकते"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s %s ला बाजूला टाकते"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s चे %s शी पटत नाही"
+
+#~ msgid "do not install %s"
+#~ msgstr "%s स्थापित करु नका"
+
+#~ msgid "keep %s"
+#~ msgstr "%s ठेवा"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "%s स्थापित करु नका"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "%s चे स्थापित करता येण्याजोगे प्रदाता नाहीत"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "संबंधित रिझॉल्व्हेबल्स स्थापित किंवा पुसून टाकू नका"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s %s पुरवते, परंतु त्याचे दुसरे स्थापत्य आहे."
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "%s स्थापित करा, जरी ते स्थापत्य बदलत असेल"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s %s ला बाजूला टाकते"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "% वरून % डाऊनलोड करत आहे"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "स्थापना (इन्स्टॉलेशन)"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "फाईल उघडता येत नाही %1."
index 976f2d9..b2b32d5 100644 (file)
--- a/po/nb.po
+++ b/po/nb.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2020-09-15 11:48+0000\n"
 "Last-Translator: Alexander Johansen <alej0hio2007@gmail.com>\n"
 "Language-Team: Norwegian Bokmål <https://l10n.opensuse.org/projects/libzypp/"
@@ -24,12 +24,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tvilsom type '%s' for %u byte-kontrollsum '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Ukjent land: "
@@ -1391,72 +1385,22 @@ msgstr "Forbedringer"
 msgid "Supplements"
 msgstr "Tillegg"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Kunne ikke åpne pty: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Kan ikke åpne pipe (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Kan ikke kjøre chroot til '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Kan ikke kjøre chdir til «%s» fra chroot «%s» (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Kan ikke kjøre chdir til «%s» (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Kan ikke kjøre '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Kan ikke splitte (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Kommandoen ble avsluttet med status %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Kommandoen ble drept av signalet %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Kommandoen ble avsluttet med en ukjent feil."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Forsøkte å importere ikke-eksisterende nøkkel %s til nøkkelring %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Kunne ikke importere offentlig nøkkel %1%"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Kunne ikke slette nøkkel."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Signaturfilen %s ikke funnet"
@@ -3902,52 +3846,52 @@ msgstr[1] "(utløper innen 24 t)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Kunnne ikke lese katalogen: '%s'."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Et pakkebrønnalias kan ikke begynne med punktum."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Tjenestealiaset kan ikke begynne med punktum."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan ikke åpne filen '%s' for å skrive til den."
@@ -3955,44 +3899,44 @@ msgstr "Kan ikke åpne filen '%s' for å skrive til den."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Ingen gyldige metadata funnet på spesifisert(e) nettadresse(r)"
 msgstr[1] "Ingen gyldige metadata funnet på spesifisert(e) nettadresse(r)"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan ikke opprette %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Kan ikke opprette katalog for metadatamellomlager."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Bygger pakkebrønnmellomlager '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Kan ikke opprette mellomlager på %s - skrivebeskyttet."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Kunne ikke mellomlagre pakkebrønn (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Pakkebrønntypen er ugyldig"
 
@@ -4002,68 +3946,47 @@ msgstr "Pakkebrønntypen er ugyldig"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Feil under lesing fra '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Ukjent feil ved lesing fra '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Legger til pakkebrønn '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ugyldig pakkebrønnfilnavn på '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Fjerner pakkebrønnen '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Finner ikke ut hvor pakkebrønnen er lagret."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Kan ikke slette '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Finner ikke ut hvor tjenesten er lagret."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Ugyldig LDAP URL-spørringsstreng"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Ugyldig LDAP URL-spørringsparameter %s"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Kan ikke klone URL-objekt"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Ugyldig referanse til tomt URL-objekt"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Kan ikke analysere URL-komponenter"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "ukjent"
@@ -4140,7 +4063,7 @@ msgstr "Brukerstøtte krever en tilleggskundekontrakt."
 msgid "Unknown support option. Description not available"
 msgstr "Ukjent brukerstøttevalg. Ingen beskrivelse tilgjengelig"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4149,11 +4072,6 @@ msgstr ""
 "Systemadministrasjonen er låst av programmet med pid %d (%s).\n"
 "Lukk dette programmet før du forsøker igjen."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historie:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4175,20 +4093,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ugyldig regulært uttrykk '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autentisering kreves for '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4217,7 +4136,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Mediet ble ikke åpnet da handlingen ble forsøkt utført '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Filen '%s' ikke funnet på medium '%s'"
@@ -4323,7 +4242,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Tilgang til '%s' avvist."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Tidsavbrudd under tilgang '%s'."
@@ -4334,7 +4253,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Plasseringen '%s' er midlertidig utilgjengelig."
@@ -4350,7 +4269,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "HTTP-autentiseringsmetode '%s' er ikke støttet"
@@ -4413,7 +4332,7 @@ msgid "No url in repository."
 msgstr "Ingen nettadresse i pakkebrønn."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4531,7 +4450,7 @@ msgstr "ignorer noen avhengigheter selv om %s ikke vil fungere"
 msgid "generally ignore of some dependencies"
 msgstr "ignorer generelt noen avhengigheter"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4539,161 +4458,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "kommandokonflikter"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "en konflikt"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "forespørselen støttes ikke"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "slettede leverandører: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4701,122 +4610,106 @@ msgstr ""
 "\n"
 "uinstallerbare nødvendige pakker: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "uinstallerbare nødvendige pakker: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Denne kommandoen vil skade systemet!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignorer advarsel om skadet system"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4825,209 +4718,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s tilhører ikke en pakkebrønn for distribusjonsoppgradering"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s har foreldet arkitektur"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problem med den installerte pakken %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "ingenting inneholder den nødvendige %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Har du aktivert alle nødvendige pakkebrønner?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "pakken %s finnes ikke"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s er beskyttet av systemet, og kan ikke slettes."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s kan ikke installeres"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "ingenting inneholder %s som kreves av %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "kan ikke installere både %s og %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s er i konflikt med %s fra %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s foreldede pakker %s fra %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "installert %s foreldede %s fra %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "løsningen %s er i konflikt med %s som den selv inneholder"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s krever %s, men denne nødvendige filen finnes ikke"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "Ikke installer %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "behold %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "ikke forby installasjon av %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "ikke be om å installere en nødvendig pakke som gir %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "ikke be om å slette alle nødvendige pakker som gir %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "ikke installer nyeste versjon av %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "behold %s selv om arkitekturen er feil"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "installer %s selv om arkitekturen ikke er riktig"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "behold den foreldede pakken %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "installer %s fra deaktivert pakkebrønn"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "nedgradering av %s til %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "Arkitekturendring fra %s til %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"installer %s (med produsentendring)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "%s erstattes av %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "avinstallasjon av %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -5045,74 +4749,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Installasjonen er avbrutt som angitt."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " kjørt"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " kjøring mislyktes"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s allerede kjørt som %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " kjøring ikke utført under avbrudd"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Feil ved sending av melding om oppdatering."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Melding om ny oppdatering"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM mislyktes: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Kunne ikke importere offentlig nøkkel %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Kunne ikke fjerne offentlig nøkkel %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Endrede konfigurasjonsfiler for %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm lagret %s som %s, men det var umulig å finne noen forskjell"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5122,13 +4830,13 @@ msgstr ""
 "Her er de 25 første avvikende linjene:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm opprettet %s som %s, men det var umulig å finne noen forskjell"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5139,149 +4847,356 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Flere rpm-resultater"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "opprettet sikkerhetskopi %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Signaturfilen %s ikke funnet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Signaturfilen %s ikke funnet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Signaturfilen %s ikke funnet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Fil er usignert"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tvilsom type '%s' for %u byte-kontrollsum '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Kunne ikke åpne pty: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Kan ikke åpne pipe (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Ugyldig LDAP URL-spørringsstreng"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Ugyldig LDAP URL-spørringsparameter %s"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Kan ikke klone URL-objekt"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Ugyldig referanse til tomt URL-objekt"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Kan ikke analysere URL-komponenter"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historie:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Adressestrategi tillater ikke %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Ugyldig %s komponent %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Ugyldig %s komponent"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Analyse av spørringsstreng støttes ikke for denne URL-en"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Adressestrategi er en obligatorisk komponent"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Ugyldig adressestrategi %s"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Adressestrategi tillater ikke brukernavn"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Adressestrategi tillater ikke passord"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Adressestrategi krever en vertskomponent"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Adressestrategi tillater ikke en vertskomponent"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Ugyldig vertskomponent %s"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Adressestrategi tillater ikke port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Ugyldig portkomponent %s"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Adressestrategi krever banenavn"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Relativ sti ikke tillatt hvis autoritet finnes"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Kodet streng inneholder nullbyte"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Ugyldig skilletegn for deling av parametermatrise"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Ugyldig skilletegn for deling av parametertilordning"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Ugyldig skilletegn for sammenføyning av parametermatrise"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Kommandoen ble avsluttet med status %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Kommandoen ble drept av signalet %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Kommandoen ble avsluttet med en ukjent feil."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Kan ikke kjøre chroot til '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Kan ikke kjøre chdir til «%s» (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Kan ikke kjøre chdir til «%s» fra chroot «%s» (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Kan ikke kjøre '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Kan ikke splitte (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s tilhører ikke en pakkebrønn for distribusjonsoppgradering"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s har foreldet arkitektur"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problem med den installerte pakken %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "ingenting inneholder den nødvendige %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Har du aktivert alle nødvendige pakkebrønner?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "pakken %s finnes ikke"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s er beskyttet av systemet, og kan ikke slettes."
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s kan ikke installeres"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "ingenting inneholder %s som kreves av %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "kan ikke installere både %s og %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s er i konflikt med %s fra %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s foreldede pakker %s fra %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "installert %s foreldede %s fra %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "løsningen %s er i konflikt med %s som den selv inneholder"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s krever %s, men denne nødvendige filen finnes ikke"
+
+#~ msgid "do not install %s"
+#~ msgstr "Ikke installer %s"
+
+#~ msgid "keep %s"
+#~ msgstr "behold %s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "ikke forby installasjon av %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "ikke be om å installere en nødvendig pakke som gir %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "ikke be om å slette alle nødvendige pakker som gir %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "ikke installer nyeste versjon av %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "behold %s selv om arkitekturen er feil"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "installer %s selv om arkitekturen ikke er riktig"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "behold den foreldede pakken %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "installer %s fra deaktivert pakkebrønn"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "nedgradering av %s til %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "Arkitekturendring fra %s til %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "installer %s (med produsentendring)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "%s erstattes av %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "avinstallasjon av %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Kan ikke åpne låsefil: %s"
 
index a4a7497..27fdd35 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -15,11 +15,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.nl\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-05-01 01:58+0000\n"
 "Last-Translator: Freek de Kruijf <freek@opensuse.org>\n"
-"Language-Team: Dutch <https://l10n.opensuse.org/projects/libzypp/master/nl/>"
-"\n"
+"Language-Team: Dutch <https://l10n.opensuse.org/projects/libzypp/master/nl/"
+">\n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -27,12 +27,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.6\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Twijfelachtig type '%s' voor %u bytes controlesom '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Onbekend land: "
@@ -1304,73 +1298,23 @@ msgstr "Verbetert"
 msgid "Supplements"
 msgstr "Vult aan"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Kan pty (%s) niet openen."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Kan pipe (%s) niet openen."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Kan geen chroot doen naar '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Kan geen chdir naar '%s' doen binnen chroot '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Kan geen chdir doen naar '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Kan '%s' niet uitvoeren (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Kan geen fork (%s) uitvoeren."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Opdracht beëindigd met status %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Opdracht is gestopt door signaal %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Opdracht beëindigd met onbekende fout."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 "Er is een poging gedaan om een niet-bestaande sleutel %s te importeren in "
 "sleutelring %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Importeren van sleutel is mislukt."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Verwijderen van sleutel is mislukt."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Handtekeningbestand %s niet gevonden"
@@ -3777,52 +3721,52 @@ msgstr[1] "(verloopt binnen %d dagen)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Zoeken naar gpg-sleutel-ID %1% in cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Zoeken naar gpg-sleutel-ID %1% in opslagruimte %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Opslagruimte %1% definieert geen extra URL's met 'gpgkey='."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Kan map '%1%' van opslagruimte niet lezen: Toegang geweigerd"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Het lezen van map '%s' is mislukt"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Kan opslagruimtebestand '%1%' niet lezen: Toegang geweigerd"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "De alias van een opslagruimte mag niet met een punt (.) beginnen."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "De alias van een service mag niet met een punt (.) beginnen."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan bestand '%s' niet openen voor schrijven."
@@ -3830,43 +3774,43 @@ msgstr "Kan bestand '%s' niet openen voor schrijven."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Onbekende service '%1%': Verweesde opslagruimte '%2%' verwijderen"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Geen geldige metagegevens op de gespecificeerde URL gevonden"
 msgstr[1] "Geen geldige metagegevens op de gespecificeerde URL's gevonden"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan %s niet aanmaken"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Kan map voor metadata-cache niet aanmaken."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Cache van opslagruimte '%s' wordt gebouwd"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Kan cache in %s niet aanmaken - geen toegangsrechten."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Kan opslagruimte (%d) niet opslaan in de cache."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Niet behandeld type opslagruimte"
 
@@ -3876,68 +3820,47 @@ msgstr "Niet behandeld type opslagruimte"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Fout bij het lezen van '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Onbekende fout bij lezen van '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Opslagruimte '%s' wordt toegevoegd"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ongeldige naam van opslagruimtebestand bij '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Opslagruimte '%s' wordt verwijderd"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Kan niet achterhalen waar opslagruimte is opgeslagen."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Kan '%s' niet verwijderen"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Kan er niet achter komen waar de service is opgeslagen."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Ongeldige LDAP-URL-querytekenreeks"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Ongeldige LDAP-URL-queryparameter '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Kan URL-object niet klonen"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Ongeldige lege URL-objectverwijzing"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Kan URL-componenten niet analyseren"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "onbekend"
@@ -4017,7 +3940,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Onbekende ondersteuningsoptie. Beschrijving niet beschikbaar"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4026,11 +3949,6 @@ msgstr ""
 "Systeembeheer is geblokkeerd door de toepassing met pid %d (%s).\n"
 "Sluit deze toepassing voordat u het opnieuw probeert."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Geschiedenis:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4052,13 +3970,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ongeldige reguliere expressie '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Authenticatie vereist voor '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4066,8 +3985,8 @@ msgstr ""
 "Het SUSE Customer Center bezoeken om te controleren of uw registratie geldig "
 "is en niet is verlopen."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4096,7 +4015,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Medium kan niet worden geopend wanneer '%s' wordt uitgevoerd."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Bestand '%s' niet gevonden op medium '%s'"
@@ -4202,7 +4121,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Toegang tot '%s' geweigerd."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Time-out overschreden bij toegang tot '%s'."
@@ -4214,7 +4133,7 @@ msgstr ""
 "Gedownloade gegevens overtreffen de verwachte bestandsgrootte '%s' van '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Locatie '%s' is tijdelijk niet toegankelijk."
@@ -4232,7 +4151,7 @@ msgstr ""
 "Aanknooppunt aanmaken: Kan geen beschrijfbare map vinden om een aanknooppunt "
 "aan te maken"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Niet-ondersteunde HTTP-authenticatiemethode '%s'"
@@ -4293,7 +4212,7 @@ msgid "No url in repository."
 msgstr "Geen URL in opslagruimte."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Verwacht medium %1%/%2% geïdentificeerd door bestand '%3%' met inhoud:"
@@ -4458,7 +4377,7 @@ msgstr "%s afbreken door enige van zijn afhankelijkheden te negeren"
 msgid "generally ignore of some dependencies"
 msgstr "negeer normaliter enige afhankelijkheden"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4468,94 +4387,88 @@ msgstr ""
 "opwaardering van de distributie en moet vervangen worden"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "de te installeren %1% behoort niet tot een opslagruimte voor opwaarderen van "
 "een distributie"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "de geïnstalleerde %1% heeft een inferieure architectuur"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "de te installeren %1% heeft een inferieure architectuur"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "probleem met de geïnstalleerde %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "conflicterende verzoeken"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "een afhankelijkheidsprobleem"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "niets levert de gevraagde '%1%'"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Hebt u alle vereiste opslagruimten ingeschakeld?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "het gevraagde pakket %1% bestaat niet"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "niet-ondersteund verzoek"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' wordt geleverd door het systeem en kan niet gewist worden"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% is niet te installeren"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "niets levert '%1%' nodig door het geïnstalleerde %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "niets levert '%1%' nodig door het te installeren %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "kan niet zowel %1% als %2% installeren"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "het geïnstalleerde %1% is in conflict met '%2%' geleverd door het "
 "geïnstalleerde %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4563,7 +4476,7 @@ msgstr ""
 "het geïnstalleerde %1% is in conflict met '%2%' geleverd door het te "
 "installeren %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4571,7 +4484,7 @@ msgstr ""
 "het te installeren %1% is in conflict met '%2%' geleverd door het "
 "geïnstalleerde %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4580,28 +4493,28 @@ msgstr ""
 "het te installeren %1% is in conflict met '%2%' geleverd door het te "
 "installeren %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "het geïnstalleerde %1% maakt '%2%' verouderd geleverd door het "
 "geïnstalleerde %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "het geïnstalleerde %1% maakt '%2%' verouderd geleverd door het te "
 "installeren %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "het te installeren %1% maakt '%2%' verouderd geleverd door het "
 "geïnstalleerde %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4609,17 +4522,17 @@ msgstr ""
 "het te installeren %1% maakt '%2%' verouderd geleverd door het te "
 "installeren %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "het geïnstalleerde %1% is in conflict met '%2%' geleverd door hemzelf"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "het te installeren %1% is in conflict met '%2%' geleverd door hemzelf"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
@@ -4627,7 +4540,7 @@ msgstr ""
 "het geïnstalleerde %1% vereist '%2%', maar dit vereiste kan niet geleverd "
 "worden"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4636,15 +4549,11 @@ msgstr ""
 "het te installeren %1% vereist '%2%', maar dit vereiste kan niet geleverd "
 "worden"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "verwijderde providers: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4652,122 +4561,106 @@ msgstr ""
 "\n"
 "niet-installeerbare providers: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "niet-installeerbare providers: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "vergrendeling verwijderen om verwijdering van %1% toe te staan"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "%1% niet installeren"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "%1% behouden"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "vergrendeling verwijderen om installatie van %1% toe te staan"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Dit verzoek zal het systeem laten crashen!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "sla geen acht op de waarschuwing voor een gebroken systeem"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "niet vragen om een oplosbare te installeren die %1% levert"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "niet vragen om alle oplosbaren te verwijderen die %1% levert"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "niet de meest recente versie van %1% installeren"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "%1% behouden ondanks de inferieure architectuur"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "%1% installeren ondanks de inferieure architectuur"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "verouderde %1% behouden"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "%1% installeren uit uitgesloten opslagruimte"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "%1% installeren hoewel het is ingetrokken"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "toestaan de PTF %1% te installeren"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "%1% installeren hoewel het op de zwarte lijst staat"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "afwaarderen van %1% naar %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "wijziging van architectuur van %1% naar %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4778,210 +4671,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "vervanging van %1% door %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "installatie van %1% ongedaan maken"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s behoort niet tot een opslagruimte voor distributie-upgrade"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s heeft een slechtere architectuur"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "probleem met geïnstalleerd pakket %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "Niets levert het gevraagde %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Hebt u alle vereiste opslagruimtes ingeschakeld?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "pakket %s bestaat niet"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s wordt door het systeem geleverd en kan niet gewist worden"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s is niet geïnstalleerd"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "niets levert %s nodig door %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "kan %s en %s niet beide installeren"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s is in conflict met %s die geleverd is door %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s maakt %s verouderd en is geleverd door %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "geïnstalleerd %s maakt %s verouderd en is geleverd door %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "oplosser %s is in conflict met %s die geleverd is door zichzelf"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s vereist %s, maar aan deze eis kan niet voldaan worden"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "verwijder de vergrendeling om de verwijdering van %s toe te staan"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s niet installeren"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s behouden"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "verwijder de vergrendeling om de installatie van %s toe te staan"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "vraag niet om een oplossingspakket die %s levert te installeren"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "vraag niet om alle oplossingspakketten die %s leveren te verwijderen"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "installeer de meest recente versie van %s niet"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s behouden ondanks de slechtere architectuur"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "%s installeren ondanks de slechtere architectuur"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "verouderde %s handhaven"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "%s installeren uit een uitgesloten opslagruimte"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "downgrade %s tot %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "architectuurverandering van %s naar %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"%s installeren (met wijziging van leverancier)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "vervanging van %s door %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "verwijderen van %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4998,68 +4702,72 @@ msgstr "%posttrans scripts zijn uitgevoerd"
 msgid "Installation has been aborted as directed."
 msgstr "Installatie is afgebroken volgens de instructies."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " uitgevoerd"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " uitvoeren is mislukt"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s is al uitgevoerd als %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " uitvoeren is overgeslagen tijdens afbreken"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Fout bij het zenden van een melding over een bijwerkbericht."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Bericht over een nieuw element voor bijwerken"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM is mislukt: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Importeren van publieke sleutel %1% is mislukt"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Verwijderen van publieke sleutel %1% is mislukt"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Pakket is niet ondertekend!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Configuratiebestanden gewijzigd voor %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5067,7 +4775,7 @@ msgstr ""
 "te bepalen"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5077,7 +4785,7 @@ msgstr ""
 "Dit zijn de eerste 25 regels die verschillend zijn:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
@@ -5085,7 +4793,7 @@ msgstr ""
 "achterhalen"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5097,149 +4805,359 @@ msgstr ""
 # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:162
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Aanvullende rpm-uitvoer"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "reservekopie %s aangemaakt"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Ondertekening is OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Onbekend type ondertekening"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Ondertekening klopt niet"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Ondertekening is OK, maar sleutel kan niet worden vertrouwd"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Handtekeningen van publieke sleutel zijn niet beschikbaar"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Bestand bestaat niet of ondertekening kan niet gecontroleerd worden"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Bestand heeft geen ondertekening"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Fout bij download (curl) voor '%s':\n"
+"Foutcode: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Fout bij downloaden (curl) voor '%s':\n"
+"Kan HTTP-respons niet ophalen\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Twijfelachtig type '%s' voor %u bytes controlesom '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Kan pty (%s) niet openen."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Kan pipe (%s) niet openen."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Ongeldige LDAP-URL-querytekenreeks"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Ongeldige LDAP-URL-queryparameter '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Kan URL-object niet klonen"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Ongeldige lege URL-objectverwijzing"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Kan URL-componenten niet analyseren"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Geschiedenis:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "%s is niet toegestaan in URL-schema"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Ongeldige %s-component '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Ongeldige %s-component"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Parseren van queryreeks wordt niet ondersteund voor deze URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URL-schema is een vereiste component"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Ongeldig URL-schema '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Gebruikersnaam is niet toegestaan in URL-schema"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Wachtwoord is niet toegestaan in URL-schema"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "URL-schema vereist hostcomponent"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Hostcomponent is niet toegestaan in URL-schema"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Ongeldige hostcomponent '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Poort is niet toegestaan in URL-schema"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Ongeldige poortcomponent '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "URL-schema vereist padnaam"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Relatief pad is niet toegestaan als authority bestaat"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Gecodeerde reeks bevat een NUL byte"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Ongeldig scheidingsteken voor splitsen parametermatrix"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Ongeldig scheidingsteken voor splitsen parametertoewijzing"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Ongeldig scheidingsteken voor samenvoegen parametermatrix"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Opdracht beëindigd met status %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Opdracht is gestopt door signaal %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Opdracht beëindigd met onbekende fout."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Fout bij download (curl) voor '%s':\n"
-"Foutcode: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Kan geen chroot doen naar '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Kan geen chdir doen naar '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Kan geen chdir naar '%s' doen binnen chroot '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Kan '%s' niet uitvoeren (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Kan geen fork (%s) uitvoeren."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Fout bij downloaden (curl) voor '%s':\n"
-"Kan HTTP-respons niet ophalen\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s behoort niet tot een opslagruimte voor distributie-upgrade"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s heeft een slechtere architectuur"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "probleem met geïnstalleerd pakket %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "Niets levert het gevraagde %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Hebt u alle vereiste opslagruimtes ingeschakeld?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "pakket %s bestaat niet"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s wordt door het systeem geleverd en kan niet gewist worden"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s is niet geïnstalleerd"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "niets levert %s nodig door %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "kan %s en %s niet beide installeren"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s is in conflict met %s die geleverd is door %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s maakt %s verouderd en is geleverd door %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "geïnstalleerd %s maakt %s verouderd en is geleverd door %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "oplosser %s is in conflict met %s die geleverd is door zichzelf"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s vereist %s, maar aan deze eis kan niet voldaan worden"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "verwijder de vergrendeling om de verwijdering van %s toe te staan"
+
+#~ msgid "do not install %s"
+#~ msgstr "%s niet installeren"
+
+#~ msgid "keep %s"
+#~ msgstr "%s behouden"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "verwijder de vergrendeling om de installatie van %s toe te staan"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "vraag niet om een oplossingspakket die %s levert te installeren"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr ""
+#~ "vraag niet om alle oplossingspakketten die %s leveren te verwijderen"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "installeer de meest recente versie van %s niet"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s behouden ondanks de slechtere architectuur"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "%s installeren ondanks de slechtere architectuur"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "verouderde %s handhaven"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "%s installeren uit een uitgesloten opslagruimte"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "downgrade %s tot %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "architectuurverandering van %s naar %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "%s installeren (met wijziging van leverancier)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "vervanging van %s door %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "verwijderen van %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Kan het blokkeringsbestand niet openen: %s"
index c93ff32..351b5bf 100644 (file)
--- a/po/nn.po
+++ b/po/nn.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: @PACKAGE@\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2018-03-09 22:04+0000\n"
 "Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
 "Language-Team: Norwegian Nynorsk <https://l10n.opensuse.org/projects/libzypp/"
@@ -18,12 +18,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 2.18\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Ukjent land: "
@@ -1292,71 +1286,21 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr ""
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr ""
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr ""
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr ""
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -3761,52 +3705,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr ""
@@ -3814,43 +3758,43 @@ msgstr ""
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr ""
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Byggjer mellomlager for pakkebrønnen «%s»"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3860,68 +3804,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Fjernar pakkebrønnen «%s»"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr ""
@@ -3988,18 +3911,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4021,20 +3939,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4061,7 +3980,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Fann ikkje fila «%s» på mediet «%s»"
@@ -4164,7 +4083,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4175,7 +4094,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4191,7 +4110,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4250,7 +4169,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4415,7 +4334,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4423,282 +4342,256 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Denne kommandoen vil skada systemet!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4707,206 +4600,19 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1509
-#, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr ""
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s er i konflikt med %s frå %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "løysbare %s konfliktar med %s tilgjengeleg frå seg sjølv"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
 msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
 #. strip tmp file suffix
@@ -4925,74 +4631,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr ""
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Melding om ny oppdatering"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5000,13 +4710,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5015,145 +4725,263 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr ""
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s er i konflikt med %s frå %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "løysbare %s konfliktar med %s tilgjengeleg frå seg sjølv"
+
 #~ msgid "Hal Exception"
 #~ msgstr "Hal-unntak"
index 9a93b0d..ff7b7e8 100644 (file)
--- a/po/pa.po
+++ b/po/pa.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.pa\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2007-08-23 19:28+0530\n"
 "Last-Translator: A S Alam <aalam@users.sf.net>\n"
 "Language-Team: Panjabi <punjabi-l10n@lists.sf.net>\n"
@@ -21,12 +21,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: KBabel 1.11.4\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "ਅਣਜਾਣ ਦੇਸ਼: "
@@ -1299,74 +1293,23 @@ msgstr "ਇੰਹੈਂਸ"
 msgid "Supplements"
 msgstr "ਸਪਲੀਮੈਂਟ"
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "ਫਾਇਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "ਫਾਇਲ %1 ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।"
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr ""
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "%s ਨਹੀਂ ਲੱਭਿਆ।"
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "ਕੁਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਚੱਲਦੀ ਕਮਾਂਡ"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "VM ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ।"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "VM ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ।"
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "ਸੋਰਸ ਪੈਕੇਜ '%s' ਨਹੀਂ ਲੱਭਿਆ।"
@@ -3772,54 +3715,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਫੇਲ੍ਹ: %s।"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "VM ਦਾ ਨਾਂ ਇੱਕ ਅੰਕ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "VM ਦਾ ਨਾਂ ਇੱਕ ਅੰਕ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "ਲਿਖਣ ਲਈ ਫਾਇਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।"
@@ -3827,45 +3770,45 @@ msgstr "ਲਿਖਣ ਲਈ ਫਾਇਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "بيانات التعريف غير صحيحة لم يتم العثور عليها في المسار(s)"
 msgstr[1] "بيانات التعريف غير صحيحة لم يتم العثور عليها في المسار(s)"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %m\n"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "%1 ਡਾਇਰੈਕਟਰੀ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ: %2"
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਕੈਚੇ ਬਿਲਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਫੇਲ੍ਹ: %s।"
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "%s ਰਿਪੋਜ਼ਟਰੀ ਲਈ ਅੱਪਲੋਡ ਕੀਤਾ।"
@@ -3876,68 +3819,47 @@ msgstr "%s ਰਿਪੋਜ਼ਟਰੀ ਲਈ ਅੱਪਲੋਡ ਕੀਤਾ।
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, fuzzy, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਤੋਂ ਮੇਟਾ-ਡਾਟਾ ਪਾਰਸਿੰਗ ਦੌਰਾਨ ਗਲਤੀ:"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ਅਣਜਾਣ ਕਮਾਂਡ '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਸ਼ਾਮਲ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "ਗਲਤ ਐਕਸਪੋਰਟ ਫਾਇਲ ਨਾਂ ਹੈ।"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਹਟਾਈ ਜਾ ਰਹੀ ਹੈ।"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "ਡੈਸਕਟਾਪ ਆਈਟਮ '%s' ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "ਗਲਤ LDAP URL ਕਿਊਰੀ ਸਤਰ"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Url ਆਬਜੈਕਟ ਕਲੋਨ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "ਗਲਤ ਖਾਲੀ Url ਆਬਜੈਕਟ ਰੈਫਰੈਂਸ"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Url ਭਾਗ ਪਾਰਸ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "ਅਣਜਾਣ"
@@ -4006,18 +3928,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "ਅਤੀਤ:"
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4039,20 +3956,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "ਗਲਤ Url ਸਕੀਮ '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' ਲਈ ਪਰਮਾਣਿਕਤ ਲੋੜੀਦੀ ਹੈ"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4079,7 +3997,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "ਫਾਇਲ %1 ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।"
@@ -4185,7 +4103,7 @@ msgid "Permission to access '%s' denied."
 msgstr "ਅਧਿਕਾਰ ਪਾਬੰਦੀ ਹੈ"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4196,7 +4114,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4212,7 +4130,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4271,7 +4189,7 @@ msgid "No url in repository."
 msgstr "ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਕੋਈ URL ਨਹੀਂ ਹੈ।"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4389,7 +4307,7 @@ msgstr "ਆਮ ਤੌਰ ਉੱਤੇ ਇਹ ਲੋੜ ਅਣਡਿੱਠੀ ਕ
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4397,287 +4315,261 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "ਕੁਨੈਕਸ਼ਨ ਮੰਗ:"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "ਨਿਰਭਰਤਾ ਸਮੱਸਿਆਵਾਂ ਕਰਕੇ %s ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "%s ਕੋਈ ਨਹੀਂ ਦਿੰਦਾ ਹੈ"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "ਉਪਲੱਬਧ ਪਰੋਫਾਇਲ"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "ਮੰਗ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4686,209 +4578,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਆਰਕੀਟੈਕਚਰ ਹੋਰ ਹੈ।"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "ਸੋਰਸ ਪੈਕੇਜ %s-%s ਇੰਸਟਾਲ ਕਰਨ ਦੌਰਾਨ ਸਮੱਸਿਆ:"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "%s ਕੋਈ ਨਹੀਂ ਦਿੰਦਾ ਹੈ"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "ਇੰਸਟਾਲ ਨਹੀਂ ਹਨ"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s %s ਰਾਹੀਂ ਚਾਹੀਦਾ ਹੈ"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%s ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s ਦਾ %s ਨਾਲ ਅਪਵਾਦ ਹੈ"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s %s ਰਾਹੀਂ ਚਾਹੀਦਾ ਹੈ"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s %s ਰਾਹੀਂ ਚਾਹੀਦਾ ਹੈ"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s ਦਾ %s ਨਾਲ ਅਪਵਾਦ ਹੈ"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s ਨੂੰ ਨਾ ਹਟਾਓ"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%s ਰੱਖੋ"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਆਰਕੀਟੈਕਚਰ ਹੋਰ ਹੈ।"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s ਹਟਾਓ"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "%s ਨੂੰ %s ਲਈ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-# %s is either BOOTP or DHCP
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "%s ਦੀ ਇੰਸਟਾਲੇਸ਼ਨ ਫੇਲ੍ਹ ਹੋਈ:"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4905,13 +4609,13 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "ਇੰਸਟਾਲੇਸ਼ਨ ਹਦਾਇਤਾਂ ਮੁਤਾਬਕ ਅਧੂਰੀ ਛੱਡੀ ਗਈ ਹੈ।"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "ਚਲਾਓ"
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI ਚਲਾਉਣਾ ਫੇਲ੍ਹ: %s"
@@ -4919,65 +4623,69 @@ msgstr "DBI ਚਲਾਉਣਾ ਫੇਲ੍ਹ: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "ਕੁੰਜੀ ਇੰਕ੍ਰਿਪਸ਼ਨ ਦੌਰਾਨ ਗਲਤੀ ਹੈ।"
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "ਫੇਲ੍ਹ"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s ਲਈ ਸੰਰਚਨਾ ਫਾਇਲਾਂ ਬਦਲੀਆਂ:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4985,13 +4693,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5000,147 +4708,323 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "ਹੋਰ rpm ਆਉਟਪੁੱਟ:"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s ਦਾ ਬੈਕਅੱਪ ਬਣਿਆ"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "ਫਾਇਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "ਫਾਇਲ %1 ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।"
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "ਗਲਤ LDAP URL ਕਿਊਰੀ ਸਤਰ"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Url ਆਬਜੈਕਟ ਕਲੋਨ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "ਗਲਤ ਖਾਲੀ Url ਆਬਜੈਕਟ ਰੈਫਰੈਂਸ"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Url ਭਾਗ ਪਾਰਸ ਕਰਨ ਲਈ ਅਸਮਰੱਥ"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "ਅਤੀਤ:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Url ਸਕੀਮ ਲਈ %s ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "ਗਲਤ %s ਭਾਗ '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "ਗਲਤ %s ਭਾਗ"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Url ਸਕੀਮ ਲਈ ਇੱਕ ਲੋੜੀਦਾ ਭਾਗ ਹੈ"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "ਗਲਤ Url ਸਕੀਮ '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url ਸਕੀਮ ਲਈ ਇੱਕ ਯੂਜ਼ਰ-ਨਾਂ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url ਸਕੀਮ ਲਈ ਇੱਕ ਪਾਸਵਰਪ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url ਲਈ ਇੱਕ ਹੋਸਟ ਭਾਗ ਲੋੜੀਦਾ ਹੈ"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Url ਸਕੀਮ ਲਈ ਇੱਕ ਹੋਸਟ ਭਾਗ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ।"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "ਗਲਤ ਹੋਸਟ ਭਾਗ '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Url ਸਕੀਮ ਇੱਕ ਪੋਰਟ ਨਹੀਂ ਦਿੰਦੀ ਹੈ।"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "ਗਲਤ ਪੋਰਟ ਭਾਗ '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url ਸਕੀਮ ਲਈ ਮਾਰਗ ਨਾਂ ਲੋੜੀਦਾ ਹੈ"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "ਕੁਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਚੱਲਦੀ ਕਮਾਂਡ"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "%s ਨਹੀਂ ਲੱਭਿਆ।"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਆਰਕੀਟੈਕਚਰ ਹੋਰ ਹੈ।"
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "ਸੋਰਸ ਪੈਕੇਜ %s-%s ਇੰਸਟਾਲ ਕਰਨ ਦੌਰਾਨ ਸਮੱਸਿਆ:"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "%s ਕੋਈ ਨਹੀਂ ਦਿੰਦਾ ਹੈ"
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "ਇੰਸਟਾਲ ਨਹੀਂ ਹਨ"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s %s ਰਾਹੀਂ ਚਾਹੀਦਾ ਹੈ"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%s ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s ਦਾ %s ਨਾਲ ਅਪਵਾਦ ਹੈ"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s %s ਰਾਹੀਂ ਚਾਹੀਦਾ ਹੈ"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s %s ਰਾਹੀਂ ਚਾਹੀਦਾ ਹੈ"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s ਦਾ %s ਨਾਲ ਅਪਵਾਦ ਹੈ"
+
+#~ msgid "do not install %s"
+#~ msgstr "%s ਨੂੰ ਨਾ ਹਟਾਓ"
+
+#~ msgid "keep %s"
+#~ msgstr "%s ਰੱਖੋ"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਆਰਕੀਟੈਕਚਰ ਹੋਰ ਹੈ।"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s ਹਟਾਓ"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "%s ਨੂੰ %s ਲਈ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"
+
+# %s is either BOOTP or DHCP
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "%s ਦੀ ਇੰਸਟਾਲੇਸ਼ਨ ਫੇਲ੍ਹ ਹੋਈ:"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "ਫਾਇਲ %1 ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।"
index d856e1a..e174cab 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2019-03-14 18:32+0000\n"
 "Last-Translator: Ewelina Michalowska <ewelina.michalowska@stgambit.com>\n"
 "Language-Team: Polish <https://l10n.opensuse.org/projects/libzypp/master/pl/"
@@ -20,12 +20,6 @@ msgstr ""
 "|| n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 3.3\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Niepewny typ '%s' dla %u-bajtowej sumy kontrolnej '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Nieznane państwo: "
@@ -1294,73 +1288,21 @@ msgstr "Ulepsza"
 msgid "Supplements"
 msgstr "Uzupełnia"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Nie można otworzyć pseudoterminala (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Nie można otworzyć potoku (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Nie można wykonać polecenia chroot dla '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-"Nie można wykonać polecenia chdir dla elementu %s w zmienionym katalogu "
-"głównym chroot %s (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Nie można wykonać polecenia chdir dla elementu '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Nie można wykonać '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Nie można wykonać fork (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Polecenie zakończone statusem %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Polecenie zakończone przez sygnał %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Polecenie zakończone nieznanym błędem."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Próbowano zaimportować nieistniejący klucz %s do bazy kluczy %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Nie udało się zaimportować klucza."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Usunięcie klucza nie powiodło się."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Nie znaleziono pliku sygnatury %s"
@@ -3766,52 +3708,52 @@ msgstr[2] "(wygasa w ciągu %d dni)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Wyszukiwanie identyfikatora %1% klucza gpg w pamięci podręcznej %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Wyszukiwanie identyfikatora %1% klucza gpg w repozytorium %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repozytorium %1% nie definiuje dodatkowych adresów URL 'gpgkey='."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Nie można odczytać katalogu repozytorium '%1%': odmowa dostępu"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Odczyt katalogu '%s' nie powiódł się"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Nie można odczytać pliku repozytorium '%1%': odmowa dostępu"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Alias repozytorium nie może rozpoczynać się od kropki."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Alias usługi nie może rozpoczynać się od kropki."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nie można otworzyć pliku '%s' do zapisu."
@@ -3819,44 +3761,44 @@ msgstr "Nie można otworzyć pliku '%s' do zapisu."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Nieznana usługa '%1%': usuwanie osieroconego repozytorium usługi '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Pod podanym adresem URL nie znaleziono prawidłowych metadanych"
 msgstr[1] "Pod podanymi adresami URL nie znaleziono prawidłowych metadanych"
 msgstr[2] "Pod podanymi adresami URL nie znaleziono prawidłowych metadanych"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nie można utworzyć %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Nie można utworzyć katalogu pamięci podręcznej metadanych."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Budowanie pamięci podręcznej repozytorium '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Nie można utworzyć pamięci podręcznej w %s - brak uprawnień do zapisu."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Tworzenie pamięci podręcznej repozytorium nie powiodło się (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Nieobsługiwany typ repozytorium"
 
@@ -3866,68 +3808,47 @@ msgstr "Nieobsługiwany typ repozytorium"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Błąd podczas próby odczytu z '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Nieznany błąd podczas odczytu z '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Dodawanie repozytorium '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nieprawidłowa nazwa pliku repozytorium pod adresem '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Usuwanie repozytorium '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Nie można określić miejsca przechowywania repozytorium."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nie można usunąć '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Nie można określić, gdzie jest przechowywana usługa."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Nieprawidłowy ciąg zapytania adresu URL LDAP"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Nieprawidłowy parametr zapytania URL LDAP '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Nie można sklonować obiektu URL"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Nieprawidłowe odwołanie do pustego obiektu adresu URL"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Analiza komponentów URL nie powiodła się"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "nieznany"
@@ -4005,7 +3926,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Nieznana opcja wsparcia. Brak opisu"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4015,11 +3936,6 @@ msgstr ""
 "(%s).\n"
 "Proszę zamknąć ten program i spróbować ponownie."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historia:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4041,13 +3957,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Nieprawidłowe wyrażenie regularne '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Wymagane uwierzytelnienie dla '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4055,8 +3972,8 @@ msgstr ""
 "Proszę odwiedzić SUSE Customer Center, aby sprawdzić, czy rejestracja jest "
 "ważna i czy nie wygasła."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4085,7 +4002,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Nieotwarty nośnik podczas próby wykonania akcji '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Pliku '%s' nie znaleziono na nośniku '%s'"
@@ -4191,7 +4108,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Dostęp do '%s' zabroniony."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Przekroczono limit czasu podczas dostępu do '%s'."
@@ -4202,7 +4119,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Pobrane dane przekroczyły oczekiwany rozmiar pliku '%s' z '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Położenie '%s' jest tymczasowo niedostępne."
@@ -4222,7 +4139,7 @@ msgstr ""
 "Tworzenie punktu dołączenia: nie można znaleźć katalogu z możliwością zapisu "
 "w celu utworzenia punktu dołączenia"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Nieobsługiwana metoda uwierzytelniania HTTP: '%s'"
@@ -4283,7 +4200,7 @@ msgid "No url in repository."
 msgstr "Brak adresu URL w repozytorium."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4449,7 +4366,7 @@ msgstr "zainstaluj %s, ignorując niektóre z zależności"
 msgid "generally ignore of some dependencies"
 msgstr "zazwyczaj ignoruje pewne zależności"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4457,161 +4374,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "sprzeczne żądania"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "problem z kilkoma zależnościami"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "nieobsługiwane żądanie"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "usunięci dostawcy: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4619,122 +4526,106 @@ msgstr ""
 "\n"
 "dostawcy, których nie można zainstalować: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "dostawcy, których nie można zainstalować: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "To żądanie uszkodzi system!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignoruj ostrzeżenie o uszkodzeniu systemu"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4743,215 +4634,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s nie należy do repozytorium uaktualniania dystrybucji"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s jest przewidziany dla niższej architektury"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problem z zainstalowanym pakietem %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "żaden pakiet nie dostarcza żądanego %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Czy włączono wszystkie wymagane repozytoria?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "pakiet %s nie istnieje"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "Element %s jest dostarczany przez system i nie można go usunąć"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s nie można zainstalować"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "żaden pakiet nie dostarcza %s wymaganego przez %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "nie można jednocześnie zainstalować %s i %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s jest w konflikcie z %s dostarczonym przez %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s dezaktualizuje %s, dostarczony przez %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s dezaktualizuje %s, dostarczony przez %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-"Element rozwiązywalny %s jest w konflikcie z %s, dostarczonym przez samego "
-"siebie"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s wymaga %s, lecz nie można spełnić tego wymagania"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "usuń blokadę, aby umożliwić usunięcie %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "nie instaluj %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "zachowaj %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "usuń blokadę, aby umożliwić instalację %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-"nie pytaj o instalację wszystkich elementów rozwiązywalnych, dostarczających "
-"%s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
-"nie pytaj o usunięcie wszystkich elementów rozwiązywalnych, dostarczających "
-"%s"
 
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "nie instaluj najnowszej wersji %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "zachowaj %s, mimo niższej architektury"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "zainstaluj %s, mimo niższej architektury"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "zachowaj starszą wersję %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "zainstaluj %s z wyłączonego repozytorium"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "przywróć %s do %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "zmiana architektury z %s na %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"zainstaluj %s (ze zmianą dostawcy)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "zamiana %s na %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "usunięcie %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4969,74 +4665,78 @@ msgstr "Wykonywanie skryptów %posttrans"
 msgid "Installation has been aborted as directed."
 msgstr "Instalacja przerwana zgodnie z życzeniem."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " wykonano"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " wykonanie nie powiodło się"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s został już wykonany jako %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " nie wykonano w wyniku przerwania"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Błąd podczas wysyłania powiadomienia o aktualizacji."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nowy komunikat o aktualizacji"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "Wystąpił błąd RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nie udało się zaimportować klucza publicznego z pliku %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Usunięcie klucza publicznego nie powiodło się %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Pakiet nie jest podpisany!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Zmienione pliki konfiguracyjne dla %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm zapisał %s jako %s, ale nie można było określić różnicy"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5046,13 +4746,13 @@ msgstr ""
 "Oto pierwszych 25 linii różnicy:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm utworzył %s jako %s, ale nie można było określić różnicy"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5063,145 +4763,362 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Dodatkowe wyjście rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "utworzono zapasowy %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Podpis jest OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Nieznany rodzaj podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Nie można sprawdzić podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Podpis jest OK, ale klucz nie jest zaufany"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Klucz publiczny podpisów nie jest dostępny"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Plik nie istnieje lub nie można sprawdzić podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Plik jest niepodpisany"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Niepewny typ '%s' dla %u-bajtowej sumy kontrolnej '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Nie można otworzyć pseudoterminala (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Nie można otworzyć potoku (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Nieprawidłowy ciąg zapytania adresu URL LDAP"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Nieprawidłowy parametr zapytania URL LDAP '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Nie można sklonować obiektu URL"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Nieprawidłowe odwołanie do pustego obiektu adresu URL"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Analiza komponentów URL nie powiodła się"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historia:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Schemat URL nie zezwala na %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Nieprawidłowe: %s, komponent: '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Komponent — nieprawidłowe: %s"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Analiza zapytania nie jest obsługiwana dla tego adresu URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Schemat URL to wymagany komponent"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Nieprawidłowy schemat URL '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Schemat URL nie zezwala na nazwę użytkownika"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Schemat URL nie zezwala na hasło"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Schemat URL wymaga komponentu hosta"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Schemat URL nie zezwala na komponent hosta"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Nieprawidłowy komponent hosta '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Schemat URL nie zezwala na port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Nieprawidłowy komponent portu '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Schemat URL wymaga nazwy ścieżki"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Względna ścieżka nie jest dozwolona, jeśli usługa istnieje"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Zakodowany łańcuch znaków zawiera bajt NUL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Nieprawidłowy znak parametru podziału tablicy"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Nieprawidłowy znak parametru podziału mapy"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Nieprawidłowy znak parametru połączenia tablicy"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Polecenie zakończone statusem %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Polecenie zakończone przez sygnał %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Polecenie zakończone nieznanym błędem."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Nie można wykonać polecenia chroot dla '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Nie można wykonać polecenia chdir dla elementu '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
 msgstr ""
+"Nie można wykonać polecenia chdir dla elementu %s w zmienionym katalogu "
+"głównym chroot %s (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Nie można wykonać '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Nie można wykonać fork (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s nie należy do repozytorium uaktualniania dystrybucji"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s jest przewidziany dla niższej architektury"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problem z zainstalowanym pakietem %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "żaden pakiet nie dostarcza żądanego %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Czy włączono wszystkie wymagane repozytoria?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "pakiet %s nie istnieje"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "Element %s jest dostarczany przez system i nie można go usunąć"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s nie można zainstalować"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "żaden pakiet nie dostarcza %s wymaganego przez %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "nie można jednocześnie zainstalować %s i %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s jest w konflikcie z %s dostarczonym przez %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s dezaktualizuje %s, dostarczony przez %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s dezaktualizuje %s, dostarczony przez %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr ""
+#~ "Element rozwiązywalny %s jest w konflikcie z %s, dostarczonym przez "
+#~ "samego siebie"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s wymaga %s, lecz nie można spełnić tego wymagania"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "usuń blokadę, aby umożliwić usunięcie %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "nie instaluj %s"
+
+#~ msgid "keep %s"
+#~ msgstr "zachowaj %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "usuń blokadę, aby umożliwić instalację %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr ""
+#~ "nie pytaj o instalację wszystkich elementów rozwiązywalnych, "
+#~ "dostarczających %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr ""
+#~ "nie pytaj o usunięcie wszystkich elementów rozwiązywalnych, "
+#~ "dostarczających %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "nie instaluj najnowszej wersji %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "zachowaj %s, mimo niższej architektury"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "zainstaluj %s, mimo niższej architektury"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "zachowaj starszą wersję %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "zainstaluj %s z wyłączonego repozytorium"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "przywróć %s do %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "zmiana architektury z %s na %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "zainstaluj %s (ze zmianą dostawcy)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "zamiana %s na %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "usunięcie %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Nie można otworzyć pliku blokady : %s"
index 009b648..dea316a 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.pt\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2020-12-06 18:26+0000\n"
 "Last-Translator: Luís Tiago Favas <al62006@utad.eu>\n"
 "Language-Team: Portuguese <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -24,12 +24,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tipo '%s' dúbio para soma de verificação de %u byte '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "País desconhecido: "
@@ -1442,72 +1436,22 @@ msgstr "Melhorar"
 msgid "Supplements"
 msgstr "Suplementos"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Não foi possível abrir o pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Não é possível abrir o pipe (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Não é possível fazer chroot para '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Não foi possível fazer chdir a  '%s' dentro de chroot '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Não foi possível fazer chdir a '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Não é possível executar '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Não é possível bifurcar (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Comando terminou com estado %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Comando foi morto pelo sinal %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Comando terminou com erro desconhecido."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Falha ao importar a chave pública %1%"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Falha ao apagar chave."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Ficheiro de assinatura %s não encontrado"
@@ -3991,54 +3935,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Falha na interpretação de %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "O nome da MV não pode iniciar com um dígito."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "O nome da MV não pode iniciar com um dígito."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Não é possível abrir ficheiro para escrita."
@@ -4046,45 +3990,45 @@ msgstr "Não é possível abrir ficheiro para escrita."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Não foi encontrada uma metadata válida no(s) URL(s) especificado(s)"
 msgstr[1] "Não foi encontrada uma metadata válida no(s) URL(s) especificado(s)"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Não é possível criar %s: %m\n"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "A limpar a cache dos metadados raw de '%s'."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "A construir a cache do repositório '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Falha na interpretação de %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "Repositório activado"
@@ -4095,68 +4039,47 @@ msgstr "Repositório activado"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, fuzzy, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Erro ao interpretar a metadata de '%s':"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Comando '%s' desconhecido"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "A Adicionar repositório '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ficheiro de exportação inválido."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "A remover o repositório '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Não é possível ejectar o suporte '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Cadeia de interrogação URL de LDAP inválida"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Parâmetro '%s' de interrogação URL de LDAP inválido"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Não é possível clonar o objecto Url"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Referência para objecto Url vazia é inválida"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Não é possível interpretar os componentes Url"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "desconhecido"
@@ -4225,7 +4148,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, fuzzy, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4234,11 +4157,6 @@ msgstr ""
 "A gestão do sistema está bloqueada pela aplicação com pid %d. Por favor "
 "encerre esta aplicação antes de tentar novamente."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Histórico:"
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4260,20 +4178,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expressão regular inválida '%s': regcomp devolveu %d"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autenticação requerida para '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4300,7 +4219,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Ficheiro '%s' não foi encontrado no suporte '%s'"
@@ -4407,7 +4326,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Foi negada a autorização para aceder a '%s'."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, fuzzy, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Tempo limite excedido quando acedia a '%s'."
@@ -4418,7 +4337,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4436,7 +4355,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Método '%s' de autenticação HTTP não suportado"
@@ -4497,7 +4416,7 @@ msgid "No url in repository."
 msgstr "Nenhum url no repositório."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4614,7 +4533,7 @@ msgstr "Ignorar de uma forma geral algumas dependências"
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4622,162 +4541,152 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "pedidos em conflito"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Não foi possível instalar %s devido a problemas de dependências"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "fornecedores apagados: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4785,122 +4694,106 @@ msgstr ""
 "\n"
 "fornecedores não instaláveis: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "fornecedores não instaláveis: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4909,211 +4802,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s fornece %s, mas tem outra arquitectura."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problema com o pacote %s instalado"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "nada fornece %s solicitado"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s não é instalável"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "nada fornece %s necessário por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "não é possível instalar tanto %s como %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s conflitua com %s fornecido por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s torna obsoleto %s fornecido por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s torna obsoleto %s fornecido por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "Resolúvel %s conflitua com %s fornecido por ele próprio"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s requer %s, mas este requisito não pode ser fornecido"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "não instalar %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "manter %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "não perguntar para instalar um resolúvel que fornece %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "não perguntar para apagar todos os resolúveis que fornecem %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "não instalar a versão mais recente de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s fornece %s, mas tem outra arquitectura."
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "instalar %s apesar de alterar a arquitectura"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s obsoleto %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, fuzzy, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "Repositório activado"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "desactualização de %s para %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "alteração de arquitectura de %s para %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, fuzzy, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"instalar %s (com alteração do vendedor)\n"
-"  %s\n"
-"-->\n"
-"  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "substituição de %s por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "desinstalação de %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -5131,12 +4833,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "A instalação foi interrompida conforme indicado."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "Executar"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "Falhou a Execução DBI: %s"
@@ -5144,64 +4846,68 @@ msgstr "Falhou a Execução DBI: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "falha no RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Falha ao importar a chave pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Falha ao remover a chave pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Ficheiros de configuração modificados para %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "o rpm %s foi guardado como %s, mas foi impossível determinar a diferença"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5211,13 +4917,13 @@ msgstr ""
 "Tem as primeiras 25 linhas diferentes:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "o rpm %s foi criado como %s, mas foi impossível determinar a diferença"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5228,147 +4934,348 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Resultado adicional do rpm:"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "cópia de segurança %s criada"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tipo '%s' dúbio para soma de verificação de %u byte '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Não foi possível abrir o pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Não é possível abrir o pipe (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Cadeia de interrogação URL de LDAP inválida"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Parâmetro '%s' de interrogação URL de LDAP inválido"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Não é possível clonar o objecto Url"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Referência para objecto Url vazia é inválida"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Não é possível interpretar os componentes Url"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Histórico:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "O esquema url não permite um %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "componente %s inválido '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Componente %s inválido"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Interpretação da cadeia de interrogação não é suportado para este URL."
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "O esquema de url é um componente requerido"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Esquema de Url inválido '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "O esquema do Url não permite um nome de utilizador"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "O esquema do Url não permite uma palavra passe"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "O esquema de Url requer um componente de computador (host)"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "O esquema do Url não permite um componente de computador (host)"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Componente de computador inválido '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "O esquema de Url não permite um porto"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Componente de porto inválido '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "O esquema de Url requer um nome de caminho"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Caminho relativo não é permitido se a autoridade existe"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "A cadeia codificada contém um byte NUL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Parâmetro do caracter do separador de dívisão da lista inválido"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Parâmetro do caracter do separador de divisão do mapa inválido"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Parâmetro do caracter do separador de junção da lista inválido"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Comando terminou com estado %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Comando foi morto pelo sinal %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Comando terminou com erro desconhecido."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Não é possível fazer chroot para '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Não foi possível fazer chdir a '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Não foi possível fazer chdir a  '%s' dentro de chroot '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Não é possível executar '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Não é possível bifurcar (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s fornece %s, mas tem outra arquitectura."
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problema com o pacote %s instalado"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "nada fornece %s solicitado"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s não é instalável"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "nada fornece %s necessário por %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "não é possível instalar tanto %s como %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s conflitua com %s fornecido por %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s torna obsoleto %s fornecido por %s"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s torna obsoleto %s fornecido por %s"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "Resolúvel %s conflitua com %s fornecido por ele próprio"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s requer %s, mas este requisito não pode ser fornecido"
+
+#~ msgid "do not install %s"
+#~ msgstr "não instalar %s"
+
+#~ msgid "keep %s"
+#~ msgstr "manter %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "não perguntar para instalar um resolúvel que fornece %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "não perguntar para apagar todos os resolúveis que fornecem %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "não instalar a versão mais recente de %s"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s fornece %s, mas tem outra arquitectura."
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "instalar %s apesar de alterar a arquitectura"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s obsoleto %s"
+
+#, fuzzy
+#~ msgid "install %s from excluded repository"
+#~ msgstr "Repositório activado"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "desactualização de %s para %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "alteração de arquitectura de %s para %s"
+
+#, fuzzy
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "instalar %s (com alteração do vendedor)\n"
+#~ "  %s\n"
+#~ "-->\n"
+#~ "  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "substituição de %s por %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "desinstalação de %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Não é possível abrir ficheiro de bloqueio: %s"
 
index ae6a5cf..68a98ec 100644 (file)
@@ -13,7 +13,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-05-03 16:57+0000\n"
 "Last-Translator: Luiz Fernando Ranghetti <elchevive68@gmail.com>\n"
 "Language-Team: Portuguese (Brazil) <https://l10n.opensuse.org/projects/"
@@ -28,12 +28,6 @@ msgstr ""
 "X-Poedit-Country: BRAZIL\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tipo '%s' duvidoso da soma de verificação de bytes %u ('%s')"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "País desconhecido: "
@@ -1302,71 +1296,21 @@ msgstr "Aprimora"
 msgid "Supplements"
 msgstr "Complementa"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Não foi possível abrir o pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Não foi possível abrir o pipe (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Não foi possível executar o chroot em '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Não foi possível executar chdir para '%s' dentro do chroot '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Não foi possível executar chdir para '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Não foi possível executar '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Não foi possível dividir (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "O comando encerrou com status %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Comando eliminado pelo sinal %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "O comando encerrou com erro desconhecido."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Tentativa de importar a chave não existente %s para o chaveiro %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Falha ao importar chave."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Falha ao remover chave."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "O arquivo de assinatura %s não foi encontrado"
@@ -3773,53 +3717,53 @@ msgstr[1] "(expira em %d dias)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Procurando por ID da chave gpg 1% no cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Procurando por ID da chave gpg %1% no repositório %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repositório 1% não define URLs 'gpgkey' adicionais."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 "Não foi possível ler o diretório de repositório '%1%': Permissão negada"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Falha ao ler o diretório '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Não foi possível ler o arquivo de repositório '%1%': Permissão negada"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "O apelido do repositório não pode começar com ponto."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "O apelido do serviço não pode começar com ponto."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Não foi possível abrir o arquivo '%s' para gravação."
@@ -3827,44 +3771,44 @@ msgstr "Não foi possível abrir o arquivo '%s' para gravação."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 "Serviço '%1%' desconhecido: removendo o repositório de serviço órfão '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Metadados válidos não encontrados na URL especificada"
 msgstr[1] "Metadados válidos não encontrados nas URLs especificadas"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Não foi possível criar %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Não foi possível criar o diretório do cache de metadados."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construindo o cache do repositório '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Não foi possível criar o cache em %s - sem permissão de gravação."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Falha ao armazenar .repo (%d) em cache."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Tipo de repositório não identificado"
 
@@ -3874,68 +3818,47 @@ msgstr "Tipo de repositório não identificado"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Erro ao tentar ler de '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Erro desconhecido ao ler de '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Adicionando o repositório '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nome de arquivo de repositório inválido em '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Removendo o repositório '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Não foi possível descobrir onde o repositório está armazenado."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Não foi possível remover '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Não foi possível descobrir onde o serviço está armazenado."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "String de consulta de URL de LDAP inválida"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Parâmetro de consulta '%s' de URL de LDAP inválido"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Não foi possível clonar o objeto URL"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Referência a objeto URL vazio inválida"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Não foi possível analisar os componentes da URL"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "desconhecido"
@@ -4013,7 +3936,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Opção de suporte desconhecida. A descrição não está disponível"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4023,11 +3946,6 @@ msgstr ""
 "(%s).\n"
 "Feche esse aplicativo antes de tentar novamente."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Histórico:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4049,13 +3967,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expressão regular inválida '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autenticação necessária para '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4063,8 +3982,8 @@ msgstr ""
 "Visite o SUSE Customer Center para verificar se seu registro é válido e não "
 "expirou."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4093,7 +4012,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Mídia não aberta ao tentar realizar a ação '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Arquivo '%s' não encontrado na mídia '%s'"
@@ -4199,7 +4118,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Permissão para acessar '%s' negada."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Tempo de espera excedido ao acessar '%s'."
@@ -4212,7 +4131,7 @@ msgstr ""
 "'%s' of '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "O local '%s' está temporariamente inacessível."
@@ -4232,7 +4151,7 @@ msgstr ""
 "Criar ponto para anexar: Não foi possível localizar um diretório gravável "
 "para criar um ponto de anexar"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Método de autenticação HTTP '%s' não suportado"
@@ -4293,7 +4212,7 @@ msgid "No url in repository."
 msgstr "Nenhuma URL no repositório."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Mídia esperada %1%/%2% identificada pelo arquivo '%3%' com o conteúdo:"
@@ -4458,7 +4377,7 @@ msgstr "quebrar %s ao ignorar algumas das dependências"
 msgid "generally ignore of some dependencies"
 msgstr "geralmente ignorar algumas dependências"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4468,91 +4387,85 @@ msgstr ""
 "substituído"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "o %1% a ser instalado não pertence a um repositório distupgrade"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "o %1% instalado tem uma arquitetura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "o %1% a ser instalado tem uma arquitetura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problema com o instalado %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "solicitações conflitantes"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "algum problema de dependência"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nada fornece o '%1%' solicitado"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Você habilitou todos os repositórios necessários?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "o pacote solicitado %1% não existe"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "solicitação não suportada"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' é fornecido pelo sistema e não pode ser apagado"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% não é instalável"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nada fornece '%1%' necessário para o %2% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "nada fornece '%1%' necessário para o %2% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "não pode instalar %1% e %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "o %1% instalado está em conflito com '%2%' fornecido pelo %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4560,14 +4473,14 @@ msgstr ""
 "o %1% instalado está em conflito com o '%2%' fornecido pelo a ser instalado "
 "%3%"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "o %1% a ser instalado está em conflito com '%2%' fornecido pelo %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4576,49 +4489,49 @@ msgstr ""
 "o %1% a ser instalado está em conflito com '%2%' fornecido pelo a ser "
 "instalado %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "o %1% instalado torna obsoleto '%2%' fornecido pelo %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "o %1% instalado torna obsoleto '%2%' fornecido pelo a ser instalado %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "o %1% a ser instalado torna obsoleto '%2%' fornecido pelo %3% instalado"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "o %1% a ser instalado torna obsoleto '%2%' fornecido pelo a ser instalado %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "o %1% instalado está em conflito com o '%2%' fornecido por ele mesmo"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "o %1% a ser instalado está em conflito com o '%2%' fornecido por ele mesmo"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "o %1% instalado requer '%2%', mas este requisito não pode ser fornecido"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4626,15 +4539,11 @@ msgid ""
 msgstr ""
 "o %1% a ser instalado requer '%2%', mas este requisito não pode ser fornecido"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "fornecedores removidos: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4642,122 +4551,106 @@ msgstr ""
 "\n"
 "fornecedores não instaláveis: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "fornecedores não instaláveis: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "remova o bloqueio para permitir a remoção de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "não instale %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "manter %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "remova o bloqueio para permitir a instalação de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Esta solicitação travará o seu sistema!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "igorar o aviso de um sistema travado"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "não peça para instalar um solucionável fornecendo %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "não peça para apagar todos os solucionáveis fornecendo %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "não instale a versão mais recente de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "mantenha %1% apesar da arquitetura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "instale %1% apesar da arquitetura inferior"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "mantenha obsoleto %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "instale %1% do repositório excluído"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "instale %1% apesar de ter sido recolhido"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "permitir instalar o PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "instale %1%, embora esteja na lista negra"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "rebaixamento de %1% para %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "mudança de arquitetura de %1% a %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4768,210 +4661,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "substituição de %1% por %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "desinstalação de %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s não pertence a um repositório de atualização da distribuição"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s tem uma arquitetura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problema com o pacote instalado %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "nada fornece o pacote solicitado %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Você habilitou todos os repositórios solicitados?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "o pacote %s não existe"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s é fornecido pelo sistema e não pode ser apagado"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s não pode ser instalado"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "nada fornece %s que é necessário a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Não foi possível instalar ambos (%s e %s)"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s conflita com %s, fornecido por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s torna obsoleto %s, fornecido por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s instalado torna obsoleto %s fornecido por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "resolvível %s conflita com %s fornecido por ele mesmo"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s requer %s, mas este requisito não pode ser fornecido"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "remover bloqueio para permitir a remoção de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "não instalar %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "manter %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "remover bloqueio para permitir a instalação de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "não perguntar ao instalar um resolvível que fornece %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "não perguntar ao remover todos os resolvíveis que fornecem %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "não instalar a versão mais recente de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "manter %s apesar da arquitetura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "instalar %s apesar da arquitetura inferior"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "manter o obsoleto %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "instalar %s do repositório excluído"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "desatualização de %s para %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "alteração de arquitetura de %s para %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"instalar %s (com alteração do fornecedor)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "substituição de %s por %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "desinstalação de %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4988,74 +4692,78 @@ msgstr "Executando scripts %posttrans"
 msgid "Installation has been aborted as directed."
 msgstr "A instalação foi cancelada conforme instruções."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " executado"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " falha na execução"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s já executado como %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " execução ignorada durante o cancelamento"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Erro ao enviar a notificação de mensagem de atualização."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nova mensagem de atualização"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "Falha no RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Falha ao importar chave pública %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Falha ao remover chave pública %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "O pacote não está assinado!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Arquivos de configuração alterados para %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "o RPM salvou %s como %s, mas não foi possível determinar a diferença"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5065,13 +4773,13 @@ msgstr ""
 "Aqui estão as 25 primeiras linhas de diferença:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "o rpm criou %s como %s, mas não foi possível determinar a diferença"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5082,149 +4790,358 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Saída adicional do rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "backup %s criado"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "A assinatura está OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Tipo de assinatura desconhecido"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Assinatura não verificada"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "A assinatura está OK, mas a chave não é confiável"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Chave pública das assinaturas não disponível"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "O arquivo não existe ou a assinatura não pode ser verificada"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "O arquivo não está assinado"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Erro de download (curl) para '%s':\n"
+"Código do erro: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Erro de download (curl) para '%s':\n"
+"Não foi possível obter a resposta HTTP\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tipo '%s' duvidoso da soma de verificação de bytes %u ('%s')"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Não foi possível abrir o pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Não foi possível abrir o pipe (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "String de consulta de URL de LDAP inválida"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Parâmetro de consulta '%s' de URL de LDAP inválido"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Não foi possível clonar o objeto URL"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Referência a objeto URL vazio inválida"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Não foi possível analisar os componentes da URL"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Histórico:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "O esquema de URL não permite %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Componente '%s' inválido %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Componente inválido %s"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "A análise de strings de consulta não é suportada para este URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "O esquema de URL é um componente obrigatório"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Esquema de URL '%s' inválido"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "O esquema de URL não permite nome de usuário"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "O esquema de URL não permite senha"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "O esquema de URL requer um componente de host"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "O esquema de URL não permite componente de host"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Componente de host inválido '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "O esquema de URL não permite porta"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Componente de porta inválido '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "O esquema de URL requer nome de caminho"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Caminho relativo não permitido se existir autoridade"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "A string codificada contém um byte NUL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Caractere separador de divisão de matriz de parâmetros inválido"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Caractere separador de divisão de mapa de parâmetros inválido"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Caractere separador de integração de matriz de parâmetros inválido"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "O comando encerrou com status %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Comando eliminado pelo sinal %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "O comando encerrou com erro desconhecido."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Erro de download (curl) para '%s':\n"
-"Código do erro: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Não foi possível executar o chroot em '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Não foi possível executar chdir para '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Não foi possível executar chdir para '%s' dentro do chroot '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Não foi possível executar '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Não foi possível dividir (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Erro de download (curl) para '%s':\n"
-"Não foi possível obter a resposta HTTP\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s não pertence a um repositório de atualização da distribuição"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s tem uma arquitetura inferior"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problema com o pacote instalado %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "nada fornece o pacote solicitado %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Você habilitou todos os repositórios solicitados?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "o pacote %s não existe"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s é fornecido pelo sistema e não pode ser apagado"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s não pode ser instalado"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "nada fornece %s que é necessário a %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Não foi possível instalar ambos (%s e %s)"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s conflita com %s, fornecido por %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s torna obsoleto %s, fornecido por %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s instalado torna obsoleto %s fornecido por %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "resolvível %s conflita com %s fornecido por ele mesmo"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s requer %s, mas este requisito não pode ser fornecido"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "remover bloqueio para permitir a remoção de %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "não instalar %s"
+
+#~ msgid "keep %s"
+#~ msgstr "manter %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "remover bloqueio para permitir a instalação de %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "não perguntar ao instalar um resolvível que fornece %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "não perguntar ao remover todos os resolvíveis que fornecem %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "não instalar a versão mais recente de %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "manter %s apesar da arquitetura inferior"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "instalar %s apesar da arquitetura inferior"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "manter o obsoleto %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "instalar %s do repositório excluído"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "desatualização de %s para %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "alteração de arquitetura de %s para %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "instalar %s (com alteração do fornecedor)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "substituição de %s por %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "desinstalação de %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Não foi possível abrir o arquivo de bloqueio: %s"
index 46d9471..a0c0c8c 100644 (file)
--- a/po/ro.po
+++ b/po/ro.po
@@ -24,7 +24,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: OpenSUSE\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2012-11-19 14:59+0200\n"
 "Last-Translator: Lucian Oprea <oprea.luci@gmail.com>\n"
 "Language-Team: Romanian <LL@li.org>\n"
@@ -37,12 +37,6 @@ msgstr ""
 "20)) ? 1 : 2;\n"
 "X-Generator: Narro 2.0 on http://tradu.softwareliber.ro\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Tip dubios '%s' pentru byte-ul %u, suma de control '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Țară necunoscută: "
@@ -1312,72 +1306,22 @@ msgstr "Îmbunătățește"
 msgid "Supplements"
 msgstr "Suplimentează"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Nu pot deschide pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Nu pot deschide pipe-ul (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Nu se poate face chroot la '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Nu pot efectua chdir spre '/' în chroot (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Nu se poate face chroot la '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Nu pot executa '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Nu pot crea un proces nou (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Comandă finalizată cu starea %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Comanda a fost oprită de semnalul %d(%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Comandă finalizată cu eroare necunoscută."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, fuzzy, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Am încercat să import cheia inexistentă %s în colecția de chei %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Importul cheii publice %1% a eșuat"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Ștergerea cheii a eșuat."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Fișierul semnătură %s nu a fost găsit"
@@ -3784,52 +3728,52 @@ msgstr[2] "(expiră în 24h)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Citirea directorului '%s' a eșuat"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Aliasul sursei de instalare nu poate începe cu punct."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Aliasul serviciului nu poate începe cu punct."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nu se poate deschide fișierul '%s' pentru scriere."
@@ -3837,13 +3781,13 @@ msgstr "Nu se poate deschide fișierul '%s' pentru scriere."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
@@ -3851,31 +3795,31 @@ msgstr[0] "La URL-ul (URL-urile) specificate nu au fost găsite metadate valide"
 msgstr[1] "La URL-ul (URL-urile) specificate nu au fost găsite metadate valide"
 msgstr[2] "La URL-ul (URL-urile) specificate nu au fost găsite metadate valide"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nu se poate crea %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Nu se poate crea directorul pentru cache-ul de metadate."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Construirea cache-ului sursei de instalare '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Nu se poate crea memoria cache la %s - lipsește dreptul de scriere."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Sursa de instalare (%d) nu a putut fi încărcată în cache."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Tip de sursă de instalare netratat"
 
@@ -3885,68 +3829,47 @@ msgstr "Tip de sursă de instalare netratat"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Eroare la încercarea de a citi din '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Eroare necunoscută la citirea de la '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Adaug sursa de instalare '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nume de fișier sursă de instalare invalid la '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Îndepărtez sursa de instalare '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Nu pot determina unde este stocată sursa de instalare."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nu pot șterge '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Nu pot determina unde este stocat serviciul."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Șir de interogare URL LDAP invalid"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Parametru șir de interogare URL LDAP invalid '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Nu pot clona obiectul Url"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Referință vidă invalidă la obiect Url"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Nu pot parcurge componentele Url"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "necunoscut"
@@ -4024,7 +3947,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Opțiune de suport necunoscută. Descrierea nu este disponibilă"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4033,11 +3956,6 @@ msgstr ""
 "Gestiunea sistemului a fost blocată de aplicația cu pid %d (%s).\n"
 "Închideți această aplicație înainte de a încerca din nou."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Istoric:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4059,20 +3977,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Expresie regulată invalidă '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Pentru '%s' este necesară autentificarea"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4102,7 +4021,7 @@ msgstr ""
 "Mediul nu a fost deschis în timp ce se încerca efectuarea acțiunii '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Fișierul '%s' nu a fost găsit pe mediul '%s'"
@@ -4209,7 +4128,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Accesul la '%s' a fost interzis."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Timp depășit în timpul accesării '%s'."
@@ -4220,7 +4139,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Locația '%s' este temporar inaccesibilă."
@@ -4238,7 +4157,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Metodă de autentificare HTTP nesuportată '%s'"
@@ -4305,7 +4224,7 @@ msgid "No url in repository."
 msgstr "Nici un url în sursa de instalare."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4423,7 +4342,7 @@ msgstr "întrerupe pachetul %s ignorând o parte din dependențele lui"
 msgid "generally ignore of some dependencies"
 msgstr "în general se ignoră unele dependințe"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4431,162 +4350,152 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "cereri ce intră în conflict"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "o problemă de dependențe"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 #, fuzzy
 msgid "unsupported request"
 msgstr "nesuportat"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "pachete șterse: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4594,122 +4503,106 @@ msgstr ""
 "\n"
 "pachete care pot fi dezinstalate: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "furnizori dezinstalabili: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Această cerere vă va afecta sistemul!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignoră avertismentul privitor la stricarea sistemului"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4718,211 +4611,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s nu aparține de o sursă de instalare de actualizare distribuție"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s are arhitectură inferioară"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problemă cu pachetul instalat %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "nimic nu oferă %s necesar"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Ați activat toate sursele cerute?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "nu există backup"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s este blocat şi nu poate fi deinstalat."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s nu este instalabil"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "Nimic nu oferă %s necesar pentru %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "nu pot instala %s și %s împreună"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s intră în conflict cu %s pus la dispoziție de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s înlocuiește %s oferit de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "versiuni vechi %s instalate %s furnizate de %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "dependența %s intră în conflict cu %s furnizat de ea însăși"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s necesită %s, dar această cerință nu este îndeplinită"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "nu instala %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "păstrează %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "nu interzice instalarea %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "nu cere instalarea unui pachet ce oferă %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "nu cere stergerea tuturor pachetelor ce oferă %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "nu instala cea mai recentă versiune a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "păstrează %s chiar dacă arhitectura este inferioară"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "instalează %s chiar dacă arhitectura este inferioară"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "păstrează pachetul vechi %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "instalează %s de la o sursă de instalare exclusă"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "downgrade %s la %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "modificare de arhitectură a %s în %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"instalează %s (cu modificarea vânzătorului)\n"
-" %s\n"
-"-->\n"
-" %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "înlocuirea %s cu %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "deinstalarea %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4940,74 +4642,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Instalarea a fost anulată la cerere."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " executat"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " execuție eșuată"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, fuzzy, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%1 este deja decriptat!"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " execuție sărită în timpul anulării"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Eroare trimitere notificare mesaj de actualizare."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nou mesaj de actualizare"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM a eșuat:"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Importul cheii publice %1% a eșuat"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Îndepărtarea cheii publice %1% a eșuat"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Fișiere de configurare modificate pentru %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm a salvat %s ca %s, dar nu a putut determina diferențele"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5017,13 +4723,13 @@ msgstr ""
 "Acestea sunt primele 25 de linii diferite:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm a creat %s ca %s, dar nu a putut determina diferențele"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5034,149 +4740,360 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Ieșire rpm suplimentară"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "backup %s creat"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Fișierul semnătură %s nu a fost găsit"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Fișierul semnătură %s nu a fost găsit"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Fișierul semnătură %s nu a fost găsit"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Tip dubios '%s' pentru byte-ul %u, suma de control '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Nu pot deschide pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Nu pot deschide pipe-ul (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Șir de interogare URL LDAP invalid"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Parametru șir de interogare URL LDAP invalid '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Nu pot clona obiectul Url"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Referință vidă invalidă la obiect Url"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Nu pot parcurge componentele Url"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Istoric:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Schema url nu permite %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Componentă %s invalidă '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Componentă invalidă %s"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Pentru acest URL nu este suportată parcurgerea unui șir de interogare"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Schema url este o componentă obligatorie"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Schemă ulr invalidă '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Schema url nu permite un nume de utilizator"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Schema url nu permite parolă"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Schema url necesită o componentă gazdă"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Schema url nu permite componentă gazdă"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Componentă gazdă invalidă '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Schema url nu permite port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Componentă port invalidă '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Schema url necesită o cale"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Calea relativă nu este permisă dacă autoritatea există"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Șirul codat conține un byte NUL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Parametru invalid caracter de separare împărțire matrici"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Parametru de hartă invalid pentru separarea caracterelor"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Parametru invalid caracter de separare uniune matrici"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Comandă finalizată cu starea %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Comanda a fost oprită de semnalul %d(%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Comandă finalizată cu eroare necunoscută."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Nu se poate face chroot la '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Nu se poate face chroot la '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Nu pot efectua chdir spre '/' în chroot (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Nu pot executa '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Nu pot crea un proces nou (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s nu aparține de o sursă de instalare de actualizare distribuție"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s are arhitectură inferioară"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problemă cu pachetul instalat %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "nimic nu oferă %s necesar"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Ați activat toate sursele cerute?"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "nu există backup"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s este blocat şi nu poate fi deinstalat."
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s nu este instalabil"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "Nimic nu oferă %s necesar pentru %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "nu pot instala %s și %s împreună"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s intră în conflict cu %s pus la dispoziție de %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s înlocuiește %s oferit de %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "versiuni vechi %s instalate %s furnizate de %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "dependența %s intră în conflict cu %s furnizat de ea însăși"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s necesită %s, dar această cerință nu este îndeplinită"
+
+#~ msgid "do not install %s"
+#~ msgstr "nu instala %s"
+
+#~ msgid "keep %s"
+#~ msgstr "păstrează %s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "nu interzice instalarea %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "nu cere instalarea unui pachet ce oferă %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "nu cere stergerea tuturor pachetelor ce oferă %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "nu instala cea mai recentă versiune a %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "păstrează %s chiar dacă arhitectura este inferioară"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "instalează %s chiar dacă arhitectura este inferioară"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "păstrează pachetul vechi %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "instalează %s de la o sursă de instalare exclusă"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "downgrade %s la %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "modificare de arhitectură a %s în %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "instalează %s (cu modificarea vânzătorului)\n"
+#~ " %s\n"
+#~ "-->\n"
+#~ " %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "înlocuirea %s cu %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "deinstalarea %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Nu pot deschide fișierul zăvor: %s"
 
index 93b3fa8..66f5ff2 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -13,7 +13,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.ru\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-01-04 16:37+0000\n"
 "Last-Translator: Alex Minton <alex239@gmail.com>\n"
 "Language-Team: Russian <https://l10n.opensuse.org/projects/libzypp/master/ru/"
@@ -26,12 +26,6 @@ msgstr ""
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Подозрительный тип \"%s\" %u-байтовой контрольной суммы \"%s\""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Неизвестная страна: "
@@ -1300,71 +1294,21 @@ msgstr "Улучшает"
 msgid "Supplements"
 msgstr "Дополняет"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Невозможно открыть псевдотерминал (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Невозможно открыть канал (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Невозможно выполнить chroot в \"%s\" (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Невозможно сменить каталог на \"%s\" внутри среды chroot \"%s\" (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Невозможно сменить каталог на \"%s\" (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Невозможно выполнить exec \"%s\" (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Невозможно выполнить fork (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Команда завершилась с кодом %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Команда была прекращена сигналом %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Команда завершилась с неизвестной ошибкой."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Попытка импорта несуществующего ключа %s в хранилище ключей %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Не удалось импортировать ключ %1%."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Не удалось удалить ключ."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Не найден файл подписи %s"
@@ -3770,52 +3714,52 @@ msgstr[2] "(истекает через %d дней)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Поиск ID gpg-ключа %1% в кэше %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Поиск ID gpg-ключа %1% в репозитории %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Репозиторий %1% не определяет дополнительных URL вида «gpgkey=»."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Невозможно прочитать каталог репозитория \"%1%\": доступ запрещен"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Не удалось прочитать каталог \"%s\""
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Невозможно прочитать файл репозитория \"%1%\": доступ запрещен"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Псевдоним репозитория не может начинаться с точки."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Псевдоним сервис не может начинаться с точки."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Невозможно открыть файл \"%s\" для записи."
@@ -3823,7 +3767,7 @@ msgstr "Невозможно открыть файл \"%s\" для записи.
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
@@ -3831,38 +3775,38 @@ msgstr ""
 "нарушенными ассоциациями"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "По указанному URL-адресу не найдено допустимых метаданных"
 msgstr[1] "По указанным URL-адресам не найдено допустимых метаданных"
 msgstr[2] "По указанным URL адресам не найдено допустимых метаданных"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Не удалось создать %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Невозможно создать каталог кэша метаданных."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Сбор кэша репозитория \"%s\""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Не удалось создать кэш в %s — нет прав на запись."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Ошибка при кэшировании репозитория (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Необрабатываемый тип репозитория"
 
@@ -3872,68 +3816,47 @@ msgstr "Необрабатываемый тип репозитория"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Ошибка при попытке чтения из \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Неизвестная ошибка при чтении из \"%s\""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Добавление репозитория \"%s\""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Недопустимое имя файла репозитория в \"%s\""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Удаление репозитория \"%s\""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Невозможно выяснить, где хранится репозиторий."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Не удается удалить \"%s\""
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Невозможно определить, где хранится сервис."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Недопустимая строка запроса LDAP в URL-адресе"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Недопустимый параметр запроса LDAP в URL-адресе: \"%s\""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Не удалось создать клон объекта URL"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Недопустимая ссылка на пустой объект URL"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Не удалось выполнить анализ синтаксиса компонентов URL-адреса"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "неизвестно"
@@ -4011,7 +3934,7 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "Неизвестный вариант поддержки. Описание недоступно"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4020,11 +3943,6 @@ msgstr ""
 "Управление системой заблокировано приложением с pid %d (%s).\n"
 "Закройте это приложение перед следующей попыткой."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "История:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4046,13 +3964,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Недопустимое регулярное выражение \"%s\""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Необходима аутентификация для \"%s\""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4060,8 +3979,8 @@ msgstr ""
 "Убедитесь, что ваша регистрация действительна и срок ее действия не истек, в "
 "центре SUSE Customer Center."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4090,7 +4009,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "При попытке произведения действия \"%s\" не был открыт носитель."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Файл \"%s\" не найден на носителе \"%s\""
@@ -4196,7 +4115,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Доступ к \"%s\" запрещен."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Превышено время ожидания при попытке доступа к \"%s\"."
@@ -4207,7 +4126,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Размер загруженных данных превысил ожидаемый '%s' из '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Расположение \"%s\" временно недоступно."
@@ -4227,7 +4146,7 @@ msgstr ""
 "Создание точки присоединения: не могу найти катлог с возможностью записи для "
 "создания точки присоединения"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Неподдерживаемый метод HTTP-аутентификации \"%s\""
@@ -4287,7 +4206,7 @@ msgid "No url in repository."
 msgstr "В репозитории нет URL-адреса."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4452,7 +4371,7 @@ msgstr "повредить %s, игнорируя некоторые из его
 msgid "generally ignore of some dependencies"
 msgstr "вообще игнорировать некоторые зависимости"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4460,161 +4379,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "конфликтующие запросы"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "проблема с некоторыми зависимостями"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "запрос не поддерживается"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "удаленные поставщики: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4622,122 +4531,106 @@ msgstr ""
 "\n"
 "неустанавливаемые поставщики: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "поставщики, не подлежащие установке: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Этот запрос повредит вашу систему!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "игнорировать предупреждение о повреждении системы"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "установить %1%, хоть он и был отозван"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "разрешить установку PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "установить %1%, хоть он и в чёрном списке"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4746,213 +4639,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s не принадлежит репозиторию обновления дистрибутива"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s имеет худшую архитектуру"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "проблема в установленном пакете %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "ничто не предоставляет запрошенный %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Включили ли вы все требуемые репозитории?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "пакет %s не существует"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s предоставляется системой и не может быть удален"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s недоступен для установки"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "ничто не предоставляет %s, необходимый для %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Не удается установить оба %s и %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s конфликтует с %s, который предоставляется %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s делает устаревшим %s, предоставляемый %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "установленный пакет %s делает устаревшим %s, предоставляемый %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-"объект разрешения зависимостей %s конфликтует с %s, который предоставляется "
-"им самим"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s требует %s, но это требование не может быть удовлетворено"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "удалить блокировку для удаления %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "не устанавливать %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "оставить %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "удалить блокировку для установки %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-"не просить установить объект разрешения зависимостей, предоставляющий %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
-"не просить удалить все объекты разрешения зависимостей, предоставляющие %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "не устанавливать самую последнюю версию %s"
 
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "оставить %s, несмотря на смену архитектуры"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "установить %s, несмотря на смену архитектуры"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "оставить устаревший %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "установить %s из исключенного репозитория"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "обновить %s до более старой версии %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "изменение архитектуры %s на %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"установить %s (со сменой поставщика)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "замена %s на %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "удаление %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4970,74 +4670,78 @@ msgstr "Выполнение скриптов %posttrans"
 msgid "Installation has been aborted as directed."
 msgstr "Установка прервана согласно указаниям."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " выполнено"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " сбой при выполнении"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s уже выполнен как %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " выполнение пропущено во время прерывания работы"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Ошибка при отправке сообщения об обновлении."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Новое сообщение об обновлении"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "Сбой RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Не удалось импортировать открытый ключ %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Не удалось удалить открытый ключ %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Пакет не подписан!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Измененные конфигурационные файлы для %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm сохранил %s как %s, но было невозможно определить различия"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5047,13 +4751,13 @@ msgstr ""
 "Первые 25 строк различий:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm создал %s как %s, но было невозможно определить различия"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5064,150 +4768,363 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Дополнительный вывод rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "создана резервная копия %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Подпись в порядке"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Неизвестный тип подписи"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Подпись не проверена"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Подпись в порядке, но ключ не является доверенным"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Открытый ключ подписей недоступен"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Файл не существует, или невозможно проверить подпись"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Файл не подписан"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Ошибка скачивания (curl) для '%s':\n"
+"Код ошибки: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Ошибка скачивания (curl) для '%s':\n"
+"Не могу получить ответ по HTTP\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Подозрительный тип \"%s\" %u-байтовой контрольной суммы \"%s\""
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Невозможно открыть псевдотерминал (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Невозможно открыть канал (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Недопустимая строка запроса LDAP в URL-адресе"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Недопустимый параметр запроса LDAP в URL-адресе: \"%s\""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Не удалось создать клон объекта URL"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Недопустимая ссылка на пустой объект URL"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Не удалось выполнить анализ синтаксиса компонентов URL-адреса"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "История:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Схема URL-адреса не позволяет использовать %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Недопустимый компонент %s: \"%s\""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Недопустимый компонент %s"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Для данного URL-адреса анализ строки запроса не поддерживается"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Схема URL-адреса является необходимым компонентом"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Недопустимая схема URL-адреса \"%s\""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Схема URL-адреса не позволяет использовать имя пользователя"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Схема URL-адреса не позволяет использовать пароль"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Схема URL-адреса требует указания компонента хоста"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Схема URL-адреса не позволяет использовать компонент хоста"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Недопустимый компонент хоста \"%s\""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Схема URL-адреса не позволяет использовать порт"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Недопустимый компонент порта \"%s\""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Схема URL-адреса требует указания пути"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 "При наличии компонентов авторизации относительные пути указывать нельзя"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Зашифрованная строка содержит байт со значением NULL"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Недопустимый символ разделителя для разбиения массива параметров"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Недопустимый символ разделителя для разбиения отображения параметров"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Недопустимый символ разделителя для объединения массива параметров"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Команда завершилась с кодом %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Команда была прекращена сигналом %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Команда завершилась с неизвестной ошибкой."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Ошибка скачивания (curl) для '%s':\n"
-"Код ошибки: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Невозможно выполнить chroot в \"%s\" (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Невозможно сменить каталог на \"%s\" (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Невозможно сменить каталог на \"%s\" внутри среды chroot \"%s\" (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Невозможно выполнить exec \"%s\" (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Невозможно выполнить fork (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Ошибка скачивания (curl) для '%s':\n"
-"Не могу получить ответ по HTTP\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s не принадлежит репозиторию обновления дистрибутива"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s имеет худшую архитектуру"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "проблема в установленном пакете %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "ничто не предоставляет запрошенный %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Включили ли вы все требуемые репозитории?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "пакет %s не существует"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s предоставляется системой и не может быть удален"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s недоступен для установки"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "ничто не предоставляет %s, необходимый для %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Не удается установить оба %s и %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s конфликтует с %s, который предоставляется %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s делает устаревшим %s, предоставляемый %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "установленный пакет %s делает устаревшим %s, предоставляемый %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr ""
+#~ "объект разрешения зависимостей %s конфликтует с %s, который "
+#~ "предоставляется им самим"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s требует %s, но это требование не может быть удовлетворено"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "удалить блокировку для удаления %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "не устанавливать %s"
+
+#~ msgid "keep %s"
+#~ msgstr "оставить %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "удалить блокировку для установки %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr ""
+#~ "не просить установить объект разрешения зависимостей, предоставляющий %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr ""
+#~ "не просить удалить все объекты разрешения зависимостей, предоставляющие %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "не устанавливать самую последнюю версию %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "оставить %s, несмотря на смену архитектуры"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "установить %s, несмотря на смену архитектуры"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "оставить устаревший %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "установить %s из исключенного репозитория"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "обновить %s до более старой версии %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "изменение архитектуры %s на %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "установить %s (со сменой поставщика)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "замена %s на %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "удаление %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Невозможно открыть файл блокировки: %s"
index 7588d5d..90ed97d 100644 (file)
--- a/po/si.po
+++ b/po/si.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2005-07-29 15:37+0530\n"
 "Last-Translator: i18n@suse.de\n"
 "Language-Team: Sinhala <i18n@suse.de>\n"
@@ -15,12 +15,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1302,73 +1296,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Couldn't open file: %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr ""
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -3791,52 +3735,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Couldn't open file: %s."
@@ -3844,43 +3788,43 @@ msgstr "Couldn't open file: %s."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Couldn't open file: %s."
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3890,68 +3834,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Couldn't open file: %s."
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr ""
@@ -4018,18 +3941,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4051,20 +3969,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4091,7 +4010,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4194,7 +4113,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4205,7 +4124,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4221,7 +4140,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4281,7 +4200,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4398,7 +4317,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4406,282 +4325,256 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4690,206 +4583,19 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1509
-#, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr ""
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
 msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
 #. strip tmp file suffix
@@ -4908,11 +4614,11 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4920,63 +4626,67 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4984,13 +4694,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4999,144 +4709,256 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
 #, fuzzy
index c811855..1a5febe 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -5,11 +5,11 @@ msgid ""
 msgstr ""
 "Project-Id-Version: libzypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-04-30 19:57+0000\n"
 "Last-Translator: Ferdinand Galko <galko.ferdinand@gmail.com>\n"
-"Language-Team: Slovak <https://l10n.opensuse.org/projects/libzypp/master/sk/>"
-"\n"
+"Language-Team: Slovak <https://l10n.opensuse.org/projects/libzypp/master/sk/"
+">\n"
 "Language: sk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -17,12 +17,6 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 "X-Generator: Weblate 4.6\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Pochybný typ '%s' pre %u bajtový kontrolný súčet '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Neznáma krajina: "
@@ -1291,71 +1285,21 @@ msgstr "Zlepšuje"
 msgid "Supplements"
 msgstr "Doplnky"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Nie je možné otvoriť pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Nie je možné otvoriť rúru (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Nemôžem spraviť chroot do '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Nie je možné vykonať chdir pre '%s' vo vnútri chroot '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Nie je možné vykonať chroot pre '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Nemôžem spustiť '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Nemôžem spraviť rozdelenie programu (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Stav príkazu po skončení je %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Príkaz bol zabitý signálom %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Príkaz skončil s neznámou chybou."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Pokus o importovanie neexistujúceho kľúča %s do zväzku kľúčov %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Nepodarilo sa importovať kľúč."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Nepodarilo zmazať kľúč."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Súbor podpisu %s nebol nájdený"
@@ -3761,52 +3705,52 @@ msgstr[2] "(vyprší za %d dní)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Hľadanie ID gpg kľúča %1% vo vyrovnávacej pamäti %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Hľadanie ID gpg kľúča %1% v repozitári %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Repozitár %1% nedefinuje dodatočné URL 'gpgkey='."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Nie je možné čítať adresár repozitára '%1%': Prístup zamietnutý"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Zlyhalo čítanie adresára '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Nie je možné čítať súbor repozitára '%1%': Prístup zamietnutý"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Alias repozitára nemôže začínať bodkou."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Alias služby nemôže začínať bodkou."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Nemôžem otvoriť súbor '%s' pre zápis."
@@ -3814,45 +3758,45 @@ msgstr "Nemôžem otvoriť súbor '%s' pre zápis."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Neznámá služba '%1%': Odstraňovanie osirelého repozitára služby '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Na stanovenej adrese URL sa nenašli platné metadáta"
 msgstr[1] "Na stanovených adresách URL sa nenašli platné metadáta"
 msgstr[2] "Na stanovených adresách URL sa nenašli platné metadáta"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nie je možné vytvoriť %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Nie je možné vytvoriť adresár vyrovnávacej pamäte metadát."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Vytváram vyrovnávaciu pamäť repozitára '%s'"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 "Nie je možné vytvoriť vyrovnávaciu pamäť v %s - žiadne práva na zapisovanie."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Zlyhalo ukladanie do vyrovnávacej pamäti pre repozitár (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Nepodporovaný typ repozitára"
 
@@ -3862,68 +3806,47 @@ msgstr "Nepodporovaný typ repozitára"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Chyba pri čítaní z '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Neznáma chyba čítania z '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Pridávam repozitár '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Neplatný názov súboru repozitára v '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Odstraňujem repozitár '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Nie je možné prísť na to, kde je uložený repozitár."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nie je možné vymazať '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Nie je možné prísť na to, kde je uložená služba."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Neplatný query string v URL pre LDAP"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Neplatný parameter dopytu LDAP URL '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Daný URL objekt nie je možne klonovať"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Neplatný odkaz na prázdny URL objekt"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Nie je možné prečítať zložky URL"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "neznámy"
@@ -4000,7 +3923,7 @@ msgstr "Pre poskytovanie podpory je potrebná ďalšia zákaznícka zmluva."
 msgid "Unknown support option. Description not available"
 msgstr "Neznáma voľba podpory. Popis nie je k dispozícii"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4009,11 +3932,6 @@ msgstr ""
 "Správa softvéru je uzamknutá inou aplikáciou s pid %d (%s).\n"
 "Ukončite najprv túto aplikáciu a skúste znova."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "História:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4035,13 +3953,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Neplatný regulárny výraz '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' vyžaduje autentifikáciu"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4049,8 +3968,8 @@ msgstr ""
 "Navštívte SUSE Customer Center, aby ste skontrolovali, či je vaša "
 "registrácia platná a ešte nevypršala."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4079,7 +3998,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Médium sa neotvorilo pri pokuse vykonať '%s'."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Súbor '%s' nebol nájdený na médiu '%s'"
@@ -4186,7 +4105,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Zamietnutý prístup na '%s'."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Vypršal časový limit pri prístupe na '%s'."
@@ -4197,7 +4116,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Stiahnuté dáta prekročili očakávanú veľkosť súboru '%s' z '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Umiestnenie '%s' je dočasne nedostupné."
@@ -4217,7 +4136,7 @@ msgstr ""
 "Vytvoriť prípojný bod: Nie je možné nájsť zapisovateľný adresár pre "
 "vytvorenie prípojného bodu"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "'%s' nie je podporovaná metóda autentifikácie"
@@ -4278,7 +4197,7 @@ msgid "No url in repository."
 msgstr "Pre tento repozitár nie je definovaná žiadna URL adresa."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr "Očakávané médium% 1%/%2% identifikované podľa súboru '%3%' s obsahom:"
@@ -4443,7 +4362,7 @@ msgstr "porušiť %s ignorovaním niektorých závislostí"
 msgid "generally ignore of some dependencies"
 msgstr "všeobecne ignorovať niektoré závislosti"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4453,94 +4372,88 @@ msgstr ""
 "byť nahradený"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 "%1%, ktorý sa má inštalovať, nepatrí do repozitára zvýšenia verzie "
 "distribúcie"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "nainštalovaný %1% má nižšiu architektúru"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "%1%, ktorý sa má inštalovať, má nižšiu architektúru"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "problém s nainštalovaným %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "protichodné požiadavky"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "problém so závislosťami"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "nič neposkytuje požadovaný '%1%'"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Máte povolené všetky požadované repozitáre?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "požadovaný balík %1% neexistuje"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "nepodporovaná požiadavka"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "'%1%' poskytuje systém a nemôže sa vymazať"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% nie je inštalovateľný"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "nič neposkytuje '%1%', ktorý je potrebný pre nainštalovaný %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 "nič neposkytuje '%1%', ktorý je potrebný pre %2%, ktorý sa má inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "nie je možné nainštalovať obidva %1% aj %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 "nainštalovaný %1% je v konflikte s '%2%', ktorý poskytuje nainštalovaný %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
@@ -4548,7 +4461,7 @@ msgstr ""
 "nainštalovaný %1% je v konflikte s '%2%', ktorý poskytuje %3%, ktorý sa má "
 "inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
@@ -4556,7 +4469,7 @@ msgstr ""
 "%1%, ktorý sa má inštalovať, je v konflikte s '%2%', ktorý poskytuje "
 "nainštalovaný %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
@@ -4565,26 +4478,26 @@ msgstr ""
 "%1%, ktorý sa má inštalovať, je v konflikte s '%2%', ktorý poskytuje %3%, "
 "ktorý sa má inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "nainštalovaný %1% zastaráva '%2%', ktorý poskytuje nainštalovaný %3%"
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 "nainštalovaný %1% zastaráva '%2%', ktorý poskytuje %3%, ktorý sa má "
 "inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 "%1%, ktorý sa má inštalovať, zastaráva '%2%', ktorý poskytuje nainštalovaný "
 "%3%"
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
@@ -4592,25 +4505,25 @@ msgstr ""
 "%1%, ktorý sa má inštalovať, zastaráva '%2%', ktorý poskytuje %3%, ktorý sa "
 "má inštalovať"
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "nainštalovaný %1% je v konflikte s '%2%', ktorý poskytuje sám"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 "%1%, ktorý sa má inštalovať, je v konflikte s '%2%', ktorý poskytuje sám"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 "nainštalovaný %1% vyžaduje '%2%', ale túto požiadavku nie je možné splniť"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
@@ -4619,15 +4532,11 @@ msgstr ""
 "%1%, ktorý sa má inštalovať, vyžaduje '%2%', ale túto požiadavku nie je "
 "možné splniť"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "zmazaný poskytovatelia: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4635,122 +4544,106 @@ msgstr ""
 "\n"
 "neinštalovateľní poskytovatelia: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "neinštalovateľní poskytovatelia: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "odstrániť zámok pre umožnenie odstránenia %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "neinštalovať %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "ponechať %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "odstrániť zámok pre umožnenie inštalácie %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Tento požiadavka poruší váš systém!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignorovať varovanie o porušení systému"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "nepožadovať inštaláciu riešenia, ktoré poskytuje %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "nepožadovať zmazanie všetkých riešení, ktoré poskytuje %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "neinštalovať najnovšiu verziu %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "ponechať %1% napriek nižšej architektúre"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "nainštalovať %1% napriek nižšej architektúre"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "ponechať zastaraný %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "inštalovať %1% z vylúčeného repozitára"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "inštalovať %1%, aj keď bol stiahnutý"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "umožniť inštaláciu PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "inštalovať %1%, aj keď je nežiadúci"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "znížiť verziu %1% na %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "zmena architektúry %1% na %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4761,210 +4654,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "nahradenie %1% s %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "odinštalovanie %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s nepatrí do repozitára zvýšenia verzie distribúcie"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s má nižšiu architektúru"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "Problém s nainštalovaným balíkom %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "nič neposkytuje požadovaný %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Máte povolené všetky požadované repozitáre?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "balík %s neexistuje"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s poskytuje systém a nemôže sa vymazať"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s nie je inštalovateľný"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "nič neposkytuje %s, ktorý je potrebný pre %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "nie je možné nainštalovať obidva %s aj %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s je v konflikte s %s poskytovaným %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s zastaráva %s, ktorý poskytuje %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "nainštalovaný %s zastaráva %s, ktorý poskytuje %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "Riešenie %s je v konflikte s %s, ktorý poskytuje sám"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s vyžaduje %s, ale túto požiadavku nie je možné splniť"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "odstrániť zámok pre umožnenie odstránenia %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "neinštalovať %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "ponechať %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "odstrániť zámok pre umožnenie inštalácie %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "nepožadovať inštaláciu riešenia, ktoré poskytuje %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "nepožadovať zmazanie všetkých riešení, ktoré poskytuje %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "neinštalovať najnovšiu verziu %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "ponechať %s napriek nižšej architektúre"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "nainštalovať %s napriek nižšej architektúre"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "ponechať zastaraný %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "inštalovať %s z vylúčeného repozitára"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "znížiť verziu %s na %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "zmena architektúry %s na %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"inštalovať %s (so zmenou dodávateľa)\n"
-"  %s -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "nahradenie %s s %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "odinštalovanie %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4981,74 +4685,78 @@ msgstr "Vykonávanie %p osttrans skriptov"
 msgid "Installation has been aborted as directed."
 msgstr "Inštalácia bola podľa príkazu zrušená."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " spustený"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " spustenie zlyhalo"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s už spustený ako %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " spustenie odložené kvôli prerušeniu programu"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Chyba zasielania oznámenia o aktualizačnej správe."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nová správa aktualizácie"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM zlyhalo: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Nepodarilo sa importovať verejný kľúč %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Nepodarilo zmazať verejný kľúč %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Balík nie je podpísaný!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Zmenené konfiguračné súbory pre '%s':"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "Balík rpm uložil %s ako %s, ale nebolo možné určiť rozdiel"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5058,13 +4766,13 @@ msgstr ""
 "Tu je prvých 25 riadkov rozdielov:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "Balík rpm vytvoril %s as %s, ale nebolo možné určiť rozdiel"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5075,150 +4783,359 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Ďalší výstup z rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "Bola vytvorená záloha %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Podpis je v poriadku"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Neznámy typ podpisu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Podpis neoveruje"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Podpis je v poriadku, ale kľúč nie je dôveryhodný"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Verejný kľúč podpisov nie je k dispozícii"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Súbor neexistuje alebo podpis nie je možné overiť"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Súbor je nepodpísaný"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Chyba sťahovania (curl) pre '%s':\n"
+"Kód chyby: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Chyba sťahovania (curl) pre '%s':\n"
+"Odpoveď HTTP sa nepodarilo načítať\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Pochybný typ '%s' pre %u bajtový kontrolný súčet '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Nie je možné otvoriť pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Nie je možné otvoriť rúru (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Neplatný query string v URL pre LDAP"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Neplatný parameter dopytu LDAP URL '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Daný URL objekt nie je možne klonovať"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Neplatný odkaz na prázdny URL objekt"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Nie je možné prečítať zložky URL"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "História:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Zadaná URL schéma nepovoľuje %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "%s obsahuje neplatnú položku '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "%s obsahuje neplatnú položku"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Query string nie je pre túto URL povolený"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Schéma URL je povinná"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Neplatný názov URL schémy: '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Daná URL schéma nepovoľuje meno používateľa"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Daná URL schéma nepovoľuje heslo"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Daná URL schéma vyžaduje názov hostiteľského počítača (host component)"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 "Daná URL schéma nepovoľuje názov hostiteľského počítača (host component)"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Neplatný názov počítača '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Daná URL schéma nepovoľuje port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Neplatný port '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Daná URL schéma vyžaduje zadanú cestu"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Relatívna cesta nie je povolená v prípade, že je zadaná autorita"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Zakódovaný reťazec obsahuje NUL bajt"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Neplatný oddeľovací znak pre pole parametrov"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Neplatný oddeľovací znak pre mapu parametrov"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Neplatný oddeľovací znak pre spájanie poľa parametrov"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Stav príkazu po skončení je %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Príkaz bol zabitý signálom %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Príkaz skončil s neznámou chybou."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Chyba sťahovania (curl) pre '%s':\n"
-"Kód chyby: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Nemôžem spraviť chroot do '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Nie je možné vykonať chroot pre '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Nie je možné vykonať chdir pre '%s' vo vnútri chroot '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Nemôžem spustiť '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Nemôžem spraviť rozdelenie programu (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Chyba sťahovania (curl) pre '%s':\n"
-"Odpoveď HTTP sa nepodarilo načítať\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s nepatrí do repozitára zvýšenia verzie distribúcie"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s má nižšiu architektúru"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "Problém s nainštalovaným balíkom %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "nič neposkytuje požadovaný %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Máte povolené všetky požadované repozitáre?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "balík %s neexistuje"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s poskytuje systém a nemôže sa vymazať"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s nie je inštalovateľný"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "nič neposkytuje %s, ktorý je potrebný pre %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "nie je možné nainštalovať obidva %s aj %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s je v konflikte s %s poskytovaným %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s zastaráva %s, ktorý poskytuje %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "nainštalovaný %s zastaráva %s, ktorý poskytuje %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "Riešenie %s je v konflikte s %s, ktorý poskytuje sám"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s vyžaduje %s, ale túto požiadavku nie je možné splniť"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "odstrániť zámok pre umožnenie odstránenia %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "neinštalovať %s"
+
+#~ msgid "keep %s"
+#~ msgstr "ponechať %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "odstrániť zámok pre umožnenie inštalácie %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "nepožadovať inštaláciu riešenia, ktoré poskytuje %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "nepožadovať zmazanie všetkých riešení, ktoré poskytuje %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "neinštalovať najnovšiu verziu %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "ponechať %s napriek nižšej architektúre"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "nainštalovať %s napriek nižšej architektúre"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "ponechať zastaraný %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "inštalovať %s z vylúčeného repozitára"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "znížiť verziu %s na %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "zmena architektúry %s na %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "inštalovať %s (so zmenou dodávateľa)\n"
+#~ "  %s -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "nahradenie %s s %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "odinštalovanie %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Nie je možné otvoriť súbor so zámkom: %s"
index 87ce02a..3e196b2 100644 (file)
--- a/po/sl.po
+++ b/po/sl.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2001-10-18 11:02+0200\n"
 "Last-Translator: Janez Krek <janez.krek@euroteh.si>\n"
 "Language-Team: Slovenian\n"
@@ -18,12 +18,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1448,74 +1442,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Couldn't open file: %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Ukaz, ki naj se izvede ob povezovanju"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Napaka pri nalaganju modula \"%s\"."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Napaka pri nalaganju modula \"%s\"."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "KScreensaver-ja ni možno najti."
@@ -4241,52 +4184,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Napaka pri nalaganju modula \"%s\"."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Datoteke ni mogoče odpreti za pisanje."
@@ -4294,43 +4237,43 @@ msgstr "Datoteke ni mogoče odpreti za pisanje."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Nameščam na:"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Neuspešen dostop do media za posodobitev gonilnika."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4340,68 +4283,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Napaka pri branju z disketne enote."
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Nepravilno ime naprave."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Nameščam na:"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "neznano"
@@ -4469,19 +4391,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-#, fuzzy
-msgid "History:"
-msgstr "Preglejte zgodovino"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4503,20 +4419,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4543,7 +4460,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4646,7 +4563,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4657,7 +4574,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4673,7 +4590,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4734,7 +4651,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4852,7 +4769,7 @@ msgstr "ima nerešene zahteve..."
 msgid "generally ignore of some dependencies"
 msgstr "ima nerešene zahteve..."
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4860,284 +4777,258 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Nezadoščene odvisnosti:"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Samodejna namestitev"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -5146,208 +5037,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "Zagonska arhitektura"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Paketi za obnovitev"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "Ta paket ni nameščen in ne bo nameščen."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "Namestitev ni uspela."
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Nameščam na:"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%1 je v sporu s/z %2"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%1 je v sporu s/z %2"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%1 je v sporu s/z %2"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, fuzzy, c-format, boost-format
-msgid "do not install %s"
-msgstr "Nameščam na:"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "Nameščam na:"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "%1 je v sporu s/z %2"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "Zbriši %1"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Namestitev"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5364,12 +5068,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "Prilagoditev %s ni bila uspešna."
@@ -5377,64 +5081,68 @@ msgstr "Prilagoditev %s ni bila uspešna."
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 #, fuzzy
 msgid "Package is not signed!"
 msgstr "Paketi za obnovitev"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Shrani nastavivene datoteke"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5442,13 +5150,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5457,150 +5165,316 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Dodatne nastavitve skupine"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, fuzzy, c-format, boost-format
 msgid "created backup %s"
 msgstr "Ne Kreiraj Varnostnih Kopij"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "KScreensaver-ja ni možno najti."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "KScreensaver-ja ni možno najti."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "KScreensaver-ja ni možno najti."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+#, fuzzy
+msgid "History:"
+msgstr "Preglejte zgodovino"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Ukaz, ki naj se izvede ob povezovanju"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "Zagonska arhitektura"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "Paketi za obnovitev"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "Ta paket ni nameščen in ne bo nameščen."
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "Namestitev ni uspela."
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Nameščam na:"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%1 je v sporu s/z %2"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%1 je v sporu s/z %2"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%1 je v sporu s/z %2"
+
+#, fuzzy
+#~ msgid "do not install %s"
+#~ msgstr "Nameščam na:"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "Nameščam na:"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "%1 je v sporu s/z %2"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "Zbriši %1"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Namestitev"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Couldn't open file: %s."
index 03b94dd..0b686d5 100644 (file)
--- a/po/sr.po
+++ b/po/sr.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST2 (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2004-03-31 11:34+0200\n"
 "Last-Translator: Bojan Jovanovic <bojov@fon.bg.ac.yu>\n"
 "Language-Team: Serbian <i18n@suse.de>\n"
@@ -19,12 +19,6 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : (n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1319,74 +1313,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Couldn't open file: %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Наредба која се извршава при повезивању"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -3882,52 +3825,52 @@ msgstr[2] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Не могу да отворим '%1'."
@@ -3935,44 +3878,44 @@ msgstr "Не могу да отворим '%1'."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 msgstr[2] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Не могу да отворим '%1'."
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3982,68 +3925,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Не могу да отворим '%1'."
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #  translators: fallback name for a module at command line
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
@@ -4113,19 +4035,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-#, fuzzy
-msgid "History:"
-msgstr "XF86History"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4147,20 +4063,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4187,7 +4104,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4290,7 +4207,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4301,7 +4218,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4317,7 +4234,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4377,7 +4294,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4495,7 +4412,7 @@ msgstr "ima neispunjene zahteve..."
 msgid "generally ignore of some dependencies"
 msgstr "ima neispunjene zahteve..."
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4503,285 +4420,259 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Proveravam međuzavisnost..."
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 #, fuzzy
 msgid "unsupported request"
 msgstr " - није подржано"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Automatska Instalacija"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4790,213 +4681,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#  tree node string
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "Boot arhitektura"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#  summary text heading
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Paketi za obnavljanje"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "Ovaj paket nije i neće biti instaliran."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "Instalacioni proces nije uspešno završen."
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#  Frame title for installation target hard disk / partition(s)
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Instaliram na:"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%1 je u konfliktu sa %2"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%1 je u konfliktu sa %2"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%1 je u konfliktu sa %2"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#  Frame title for installation target hard disk / partition(s)
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, fuzzy, c-format, boost-format
-msgid "do not install %s"
-msgstr "Instaliram na:"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#  Frame title for installation target hard disk / partition(s)
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "Instaliram na:"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "%1 je u konfliktu sa %2"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "Obriši %1"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Инсталација"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5013,11 +4712,11 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -5025,46 +4724,50 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
 #  summary text heading
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 #, fuzzy
 msgid "Package is not signed!"
 msgstr "Paketi za obnavljanje"
@@ -5072,19 +4775,19 @@ msgstr "Paketi za obnavljanje"
 #  progress stage
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Snimi konfiguracione fajlove"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5092,13 +4795,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5108,148 +4811,319 @@ msgstr ""
 #  TextEntry label
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "&Dodatne ipppd opcije"
 
 #  Proposal for backup during update
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, fuzzy, c-format, boost-format
 msgid "created backup %s"
 msgstr "Ne pravite sigurnosnu kopiju"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+#, fuzzy
+msgid "History:"
+msgstr "XF86History"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Наредба која се извршава при повезивању"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#  tree node string
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "Boot arhitektura"
+
+#  summary text heading
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "Paketi za obnavljanje"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "Ovaj paket nije i neće biti instaliran."
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "Instalacioni proces nije uspešno završen."
+
+#  Frame title for installation target hard disk / partition(s)
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Instaliram na:"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%1 je u konfliktu sa %2"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%1 je u konfliktu sa %2"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%1 je u konfliktu sa %2"
+
+#  Frame title for installation target hard disk / partition(s)
+#, fuzzy
+#~ msgid "do not install %s"
+#~ msgstr "Instaliram na:"
+
+#  Frame title for installation target hard disk / partition(s)
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "Instaliram na:"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "%1 je u konfliktu sa %2"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "Obriši %1"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Инсталација"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Couldn't open file: %s."
index dc89539..53829af 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -13,7 +13,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.sv\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2020-05-02 19:51+0000\n"
 "Last-Translator: Luna Jernberg <droidbittin@gmail.com>\n"
 "Language-Team: Swedish <https://l10n.opensuse.org/projects/libzypp/master/sv/"
@@ -25,12 +25,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Den tvivelaktiga typen '%s' för %u-bytekontrollsumma '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Okänt land: "
@@ -1405,71 +1399,21 @@ msgstr "Utökar"
 msgid "Supplements"
 msgstr "Kompletterar"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Kan inte öppna pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Det går inte att öppna programkopplingen (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Kan inte ändra roten (chroot) till '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Kan inte ändra katalogen (chdir) till '%s' i chroot '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Kan inte ändra katalogen (chdir) till '%s' (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Kan inte köra '%s' (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Kan inte dela upp (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Kommandot avslutades med statusen %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Kommandot avbröts av signalen %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Kommandot avslutades med ett okänt fel."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Försökte importera icke existerande nyckel %s till nyckelringen %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Det gick inte att importera nyckeln."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Det gick inte att ta bort nyckeln."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Signaturfilen %s hittas inte"
@@ -3937,52 +3881,52 @@ msgstr[1] "(går ut om %d dagar)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Söker efter gpg-nyckel med ID %1% i cache %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Söker efter gpg-nyckel med ID %1% i lager %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Lagringsplatsen %1% definierar inte ytterligare 'gpgkey=' URL."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Kan inte läsa lagringsplatskatalog '%1%': Åtkomst nekad"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Det gick inte att läsa katalogen '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Kan inte läsa lagringsplatsfilen '%1%': Åtkomst nekad"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Aliaset för en lagringsplats kan inte inledas med en punkt."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Ett alias för en tjänst kan inte inledas med en punkt."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Kan inte skriva till filen '%s'."
@@ -3990,43 +3934,43 @@ msgstr "Kan inte skriva till filen '%s'."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Okänd tjänst '%1%': Tar bort övergiven lagringsplats '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Giltig metadata hittades inte på specificerad URL"
 msgstr[1] "Giltig metadata hittades inte på specificerade URL:er"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Kan inte skapa %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Kan inte att skapa cachekatalog för metadata."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Cache för lagringsplatsen '%s' byggs"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Kan inte att skapa cache på %s - ingen skrivrättighet."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Misslyckades att cachelagra lagringsplats (%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Kan inte hantera lagringsplatstypen"
 
@@ -4036,68 +3980,47 @@ msgstr "Kan inte hantera lagringsplatstypen"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Det gick inte att läsa från '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Ett okänt fel uppstod vid läsning från '%s'"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Lägger till förrådet '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Ogiltigt namn på lagringsplats '%s'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Lagringsplatsen '%s' tas bort"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Kan inte identifiera var lagringsplatsen finns."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Kan inte radera '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Det gick inte att identifiera var tjänsten är lagrad."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Ogiltig LDAP URL-frågesträng"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Ogiltig LDAP URL-frågeparameter '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Det går inte att klona URL-objektet"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Den tomma URL-objektreferensen är ogiltig"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Det gick inte att analysera URL-komponenterna"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "okänd"
@@ -4173,7 +4096,7 @@ msgstr "Ytterligare ett kundavtal behövs för att kunna ge support."
 msgid "Unknown support option. Description not available"
 msgstr "Okänt supportalternativ. Beskrivning är inte tillgänglig"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4182,11 +4105,6 @@ msgstr ""
 "Systemhanteringen är låst av programmet med pid %d (%s).\n"
 "Stäng detta program och försök igen."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Historik:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4208,13 +4126,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ogiltigt reguljärt uttryck '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Autentisering krävs för '%s'"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4222,8 +4141,8 @@ msgstr ""
 "Besök SUSE kundcenter för att se om din registrering är giltig och inte har "
 "slutat gälla."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4252,7 +4171,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Mediet öppnades inte när åtgärden '%s' skulle utföras."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Filen '%s' kunde inte hittas på mediet '%s'"
@@ -4359,7 +4278,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Behörighet för åtkomst till '%s' nekad."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Tidsgränsen överskreds vid försök att nå '%s'."
@@ -4370,7 +4289,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Hämtade data överskred förväntad filstorlek '%s' av '%s'."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Platsen '%s' är för tillfället oåtkomlig."
@@ -4386,7 +4305,7 @@ msgid ""
 "point"
 msgstr "Skapa fästpunkt: hittar ingen skrivbar katalog för att skapa fästpunkt"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Det finns inte stöd för HTTP-autentiseringsmetoden '%s'"
@@ -4450,7 +4369,7 @@ msgid "No url in repository."
 msgstr "Det finns ingen URL i förrådet."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4615,7 +4534,7 @@ msgstr "bryt %s genom att ignorera vissa beroenden"
 msgid "generally ignore of some dependencies"
 msgstr "ignorera generellt några beroende"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4623,161 +4542,151 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "begäranden i konflikt"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "vissa beroendeproblem"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "begäran stöds inte"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "borttagna leverantörer: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4785,122 +4694,106 @@ msgstr ""
 "\n"
 "leverantörer som inte går att installera: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "leverantörer som inte går att installera: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Denna begäran kommer att knäcka systemet!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ignorera varningen om ett trasigt system"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4909,209 +4802,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s tillhör inte ett distupgrade-förråd"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s innehåller en underordnad arkitektur"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problem med det installerade paketet %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "inget tillhandahåller begärda %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Har du aktiverat alla begärda lagringsplatser?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "paketet %s finns inte"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s kommer från systemet och kan inte tas bort"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s går inte att installera"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "inget tillhandahåller %s som behövs i %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "kan inte installera både %s och %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s är i konflikt med %s som kommer från %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s gör %s inaktuell som kommer från %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s gör %s som kommer från %s inaktuell"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "lösbara %s är i konflikt med %s som kommer från sig själv"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s behöver %s, men kravet kan inte uppfyllas"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "ta bort lås så att %s kan tas bort"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "installera inte %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "behåll %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "ta bort lås så att %s kan installeras"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "fråga inte om att installera en lösbar med %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "fråga inte om att ta bort alla lösbara med %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "installera inte den senaste versionen av %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "behåll %s trots underordnad arkitektur"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "installera %s trots underordnad arkitektur"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "behåll föråldrad version av %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "installera %s från undantaget arkiv"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "Nedgradera %s till %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "arkitekturändring av %s till %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"installera %s (med ändrad leverantör)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "ersätt %s med %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "avinstallation av %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -5129,75 +4833,79 @@ msgstr "Kör %p 1osttrans-skript"
 msgid "Installation has been aborted as directed."
 msgstr "Installationen har avbrutits enligt instruktionerna."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " körd"
 
 # %s is either BOOTP or DHCP
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " körningen misslyckades"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s redan körd som %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " körningen hoppades över vid avbrottet"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Ett fel inträffade när ett uppdateringsmeddelande skickades."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Nytt uppdateringsmeddelande"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM misslyckades: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Det gick inte att importera den offentliga nyckeln %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Det gick inte att ta bort den offentliga nyckeln %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Paketet är inte signerat!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Konfigurationsfiler har ändrats för %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "RPM sparade %s som %s, men det gick inte att avgöra skillnaden"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5207,13 +4915,13 @@ msgstr ""
 "Här visas de första 25 raderna med skillnader:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "RPM skapade %s som %s, men det gick inte att avgöra skillnaden"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5224,146 +4932,355 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Ytterligare RPM-utdata"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "skapade säkerhetskopian %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "Signaturen är OK"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Okänd signaturtyp"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Signaturen kan inte verifieras"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "Signaturen är OK, men nyckeln är inte betrodd"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Signaturens offentliga nyckel är inte tillgänglig"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Filen finns inte eller signaturen kan inte kontrolleras"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Filen är inte signerad"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Den tvivelaktiga typen '%s' för %u-bytekontrollsumma '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Kan inte öppna pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Det går inte att öppna programkopplingen (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Ogiltig LDAP URL-frågesträng"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Ogiltig LDAP URL-frågeparameter '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Det går inte att klona URL-objektet"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Den tomma URL-objektreferensen är ogiltig"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Det gick inte att analysera URL-komponenterna"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Historik:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "URL-schemat tillåter inte %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "%s-komponenten '%s' är ogiltig"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Ogiltig %s-komponent"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Analysering av frågesträng stöds inte för den här URL-adressen"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URL-schemat är en obligatorisk komponent"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "URL-schemat '%s' är ogiltigt"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "URL-schemat tillåter inte något användarnamn"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "URL-schemat tillåter inte något lösenord"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Det måste finnas en värdkomponent i URL-schemat"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Det får inte finnas någon värdkomponent i URL-schemat"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Värdkomponenten '%s' är ogiltig"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "URL-schemat tillåter inte någon port"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Portkomponenten '%s' är ogiltig"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Det måste finnas ett sökvägsnamn för URL-schemat"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Relativa sökvägar tillåts inte om det finns behörighet"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Den kodade strängen innehåller ett NULL-byte"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Ogiltigt avgränsningstecken för delning av parametermatris"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Ogiltigt avgränsningstecken för delning av parametermappning"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Ogiltigt avgränsningstecken för koppling av parametermatris"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Kommandot avslutades med statusen %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Kommandot avbröts av signalen %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Kommandot avslutades med ett okänt fel."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Kan inte ändra roten (chroot) till '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Kan inte ändra katalogen (chdir) till '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Kan inte ändra katalogen (chdir) till '%s' i chroot '%s' (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Kan inte köra '%s' (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Kan inte dela upp (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s tillhör inte ett distupgrade-förråd"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s innehåller en underordnad arkitektur"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problem med det installerade paketet %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "inget tillhandahåller begärda %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Har du aktiverat alla begärda lagringsplatser?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "paketet %s finns inte"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s kommer från systemet och kan inte tas bort"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s går inte att installera"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "inget tillhandahåller %s som behövs i %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "kan inte installera både %s och %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s är i konflikt med %s som kommer från %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s gör %s inaktuell som kommer från %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s gör %s som kommer från %s inaktuell"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "lösbara %s är i konflikt med %s som kommer från sig själv"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s behöver %s, men kravet kan inte uppfyllas"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "ta bort lås så att %s kan tas bort"
+
+#~ msgid "do not install %s"
+#~ msgstr "installera inte %s"
+
+#~ msgid "keep %s"
+#~ msgstr "behåll %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "ta bort lås så att %s kan installeras"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "fråga inte om att installera en lösbar med %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "fråga inte om att ta bort alla lösbara med %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "installera inte den senaste versionen av %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "behåll %s trots underordnad arkitektur"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "installera %s trots underordnad arkitektur"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "behåll föråldrad version av %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "installera %s från undantaget arkiv"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "Nedgradera %s till %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "arkitekturändring av %s till %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "installera %s (med ändrad leverantör)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "ersätt %s med %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "avinstallation av %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Kan inte öppna låsfilen: %s"
 
index 92e4c5a..97bacd4 100644 (file)
--- a/po/ta.po
+++ b/po/ta.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: NetworkManager-vpnc\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2005-06-26 01:20+0200\n"
 "Last-Translator: Priyavert Sharma <priyavert.sharma@agreeya.com>\n"
 "Language-Team: AgreeYa Solutions <www.agreeya.com>\n"
@@ -12,12 +12,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "அறிந்திராத நாடு:"
@@ -1291,74 +1285,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "கோப்பை %1 திறக்க முடியவில்லை."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "%s கண்பிடிக்க முடியவில்லை."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "%s கண்பிடிக்க முடியவில்லை."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "இணைக்கப்படும் பொழுது கட்டளையை செயல்படுத்து"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "உள்ளீடு காணப்படவில்லை."
@@ -3765,52 +3708,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "எழுதுவதற்கு கோப்பைத் திறக்க முடியவில்லை."
@@ -3818,44 +3761,44 @@ msgstr "எழுதுவதற்கு கோப்பைத் திற
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "டெஸ்க்டாப் பொருளை '%s' திறக்க முடியவில்லை"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "அடைவு %1 உருவாக்க முடியவில்லை: %2."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3865,68 +3808,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ஃப்ளாப்பி வட்டிலிருந்து படிப்பதில் பிழை"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "மூலங்கள் சேர்க்கப்படுகின்றன"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "செல்லாத ஏற்றுமதி கோப்புபெயர்."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "மூலங்கள் சேர்க்கப்படுகின்றன"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "டெஸ்க்டாப் பொருளை '%s' திறக்க முடியவில்லை"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "செல்லாத எல்டிஏபி யூஆர்எல் வினா வரிசை"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "செல்லாத எல்டிஏபி யூஆர்எல் வினா அளவீடு '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "யூஆர்எல் பொருளின் போலிகையை உருவாக்க இயலவில்லை"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "செல்லாத காலி யூஆர்எல் பொருள் குறிப்புரை"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "யூஆர்எல் உறுப்புகளை விளக்க இயலவில்லை"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "அறியப்படாதது"
@@ -3993,18 +3915,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4026,20 +3943,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "செல்லாத யூஆர்எல் திட்டம் '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4066,7 +3984,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "சேமிப்பிடத்தில் கோப்பு %1 காணப்படவில்லை."
@@ -4170,7 +4088,7 @@ msgid "Permission to access '%s' denied."
 msgstr "அனுமதிகள் மறுக்கப்படுகின்றன"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4181,7 +4099,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4197,7 +4115,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4263,7 +4181,7 @@ msgid "No url in repository."
 msgstr "சேமிப்பிடத்தில் கோப்பு %1 காணப்படவில்லை."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4382,7 +4300,7 @@ msgstr "இத்தேவையை இங்கேயே புறக்கண
 msgid "generally ignore of some dependencies"
 msgstr "இத்தேவையை இங்கேயே புறக்கணிக்கவும்"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4390,288 +4308,262 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "இந்த இணைப்புக்கான கோரிக்கை: "
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "சார்புத்தன்மை பிரச்னைகள் காரணமாக %s ஐ நிறுவ இயலவில்லை"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "%s யாரும் அளிப்பதில்லை"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "%sக்கு நிறுவக்கூடிய அளிப்பவர்கள் இல்லை"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "%sக்கு நிறுவக்கூடிய அளிப்பவர்கள் இல்லை"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "கோரிக்கை ஏற்கனவே உள்ளது."
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4680,208 +4572,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அதற்கு வேறொரு கட்டமைப்பு உள்ளது."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "பேக்கேஜ்களின் நிறுவுதலை நீக்குவதற்கான ஆணை"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "%s யாரும் அளிப்பதில்லை"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "சான்றிதழ் %1 இல்லை."
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s பூட்டப்பட்டுள்ளது மற்றும் அதன் நிறுவுதலை நீக்க இயலாது."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "நிறுவப்படவில்லை"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s, %sக்கு தேவைப்படுகிறது"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%sஐ நிறுவ முடியவில்லை"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s %sஉடன் முரண்படுகிறது"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s %sஐ வழக்கற்றதாக்குகிறது"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s %sஐ வழக்கற்றதாக்குகிறது"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s %sஉடன் முரண்படுகிறது"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%sஐ நிறுவ வேண்டாம்"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "%sஐ வைத்துக் கொள்ளவும்"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "%sஐ நிறுவ வேண்டாம்"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "%sக்கு நிறுவக்கூடிய அளிப்பவர்கள் இல்லை"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "தொடர்புள்ள தீர்வுகளை நிறுவவோ அல்லது நீக்கவோ வேண்டாம்"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அதற்கு வேறொரு கட்டமைப்பு உள்ளது."
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "அது கட்டமைப்பை மாற்றக்கூடுமென்றாலும் %sஐ நிறுவவும்"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s %sஐ வழக்கற்றதாக்குகிறது"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "%sலிருந்து %s தகவலிறக்கம் செய்யப்பட்டது"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "நிறுவுதல்"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4898,12 +4603,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "குறிப்பிட்டுள்ளபடி நிறுவுதல் இடையில் நிறுத்தப்பட்டது."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "நிறைவேற்று"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4911,65 +4616,69 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "விசை என்கிரிப்ட் செய்யும்போது பிழை."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "தோல்வியுற்றது"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s:க்காக உள்ளமைத்தல் கோப்புகள் மாற்றப்பட்டுள்ளன"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "%s ஆக ஆர்பிஎம் சேமிக்கப்பட்டுள்ளது, ஆனால் வேறுபாட்டை நிர்ணயிக்க முடியவில்லை"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, fuzzy, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4979,13 +4688,13 @@ msgstr ""
 "வேறுபாடுகளின் முதல் 25 வரிகள் இங்குள்ளன:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "%s ஆக ஆர்பிஎம் உருவாf;கப்பட்டுள்ளது, ஆனால் வேறுபாட்டை நிர்ணயிக்க முடியவில்லை"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, fuzzy, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4996,150 +4705,349 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "கூடுதல் ஆர்பிஎம் அவுட்புட்:"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s மறுபிரதி உருவாக்கப்பட்டது"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "உள்ளீடு காணப்படவில்லை."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "உள்ளீடு காணப்படவில்லை."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "உள்ளீடு காணப்படவில்லை."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "கோப்பை %1 திறக்க முடியவில்லை."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "செல்லாத எல்டிஏபி யூஆர்எல் வினா வரிசை"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "செல்லாத எல்டிஏபி யூஆர்எல் வினா அளவீடு '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "யூஆர்எல் பொருளின் போலிகையை உருவாக்க இயலவில்லை"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "செல்லாத காலி யூஆர்எல் பொருள் குறிப்புரை"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "யூஆர்எல் உறுப்புகளை விளக்க இயலவில்லை"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "யூஆர்எல் திட்டம் %sக்கு அனுமதிப்பதில்லை"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, fuzzy, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "'%s' செல்லாத உறுப்பு"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "செல்லாத %s உறுப்பு"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "இந்த யூஆர்எல்லுக்கு வினா வரிசை விளக்கம் ஆதரவளிக்கப்படவில்லை"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "யூஆர்எல் திட்டம் ஒரு தேவைப்படும் உறுப்பாகும்"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "செல்லாத யூஆர்எல் திட்டம் '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "யூஆர்எல் திட்டம் பயனாளர் பெயரை அனுமதிப்பதில்லை"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "யூஆர்எல் திட்டம் கடவுச்சொல்லை அனுமதிப்பதில்லை"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "யூஆர்எல் திட்டத்திற்கு ஓர் ஆதார உறுப்பு தேவைப்படுகிறது"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "யூஆர்எல் திட்டம் ஓர் ஆதார உறுப்பை அனுமதிப்பதில்லை"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "செல்லாத ஆதார உறுப்பு'%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "யூஆர்எல் திட்டம் ஒரு முணையத்தை அனுமதிப்பதில்லை"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "செல்லாத முணைய உறுப்பு'%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "யூஆர்எல் திட்டத்திற்கு ஒரு பாதை பெயர் தேவைப்படுகிறது"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "அதிகாரம் இருக்குமானால் தொடர்புப் பாதை ஆதரவளிக்கப்படுவதில்லை"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "குறியீடு செய்யப்பட்ட வரிசை, என்யூஎல் பைட் கொண்டுள்ளது"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "செல்லாத அளவீட்டு அடுக்கு பிளவை பிரிக்கும் வடிவம்"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "செல்லாத அளவீட்டு வரைவு பிளவை பிரிக்கும் வடிவம்"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "செல்லாத அளவீட்டு அடுக்கு இணைப்பை பிரிக்கும் வடிவம்"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "இணைக்கப்படும் பொழுது கட்டளையை செயல்படுத்து"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "%s கண்பிடிக்க முடியவில்லை."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "%s கண்பிடிக்க முடியவில்லை."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அதற்கு வேறொரு கட்டமைப்பு உள்ளது."
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "பேக்கேஜ்களின் நிறுவுதலை நீக்குவதற்கான ஆணை"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "%s யாரும் அளிப்பதில்லை"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "சான்றிதழ் %1 இல்லை."
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s பூட்டப்பட்டுள்ளது மற்றும் அதன் நிறுவுதலை நீக்க இயலாது."
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "நிறுவப்படவில்லை"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s, %sக்கு தேவைப்படுகிறது"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%sஐ நிறுவ முடியவில்லை"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s %sஉடன் முரண்படுகிறது"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s %sஐ வழக்கற்றதாக்குகிறது"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s %sஐ வழக்கற்றதாக்குகிறது"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s %sஉடன் முரண்படுகிறது"
+
+#~ msgid "do not install %s"
+#~ msgstr "%sஐ நிறுவ வேண்டாம்"
+
+#~ msgid "keep %s"
+#~ msgstr "%sஐ வைத்துக் கொள்ளவும்"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "%sஐ நிறுவ வேண்டாம்"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "%sக்கு நிறுவக்கூடிய அளிப்பவர்கள் இல்லை"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "தொடர்புள்ள தீர்வுகளை நிறுவவோ அல்லது நீக்கவோ வேண்டாம்"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அதற்கு வேறொரு கட்டமைப்பு உள்ளது."
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "அது கட்டமைப்பை மாற்றக்கூடுமென்றாலும் %sஐ நிறுவவும்"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s %sஐ வழக்கற்றதாக்குகிறது"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "%sலிருந்து %s தகவலிறக்கம் செய்யப்பட்டது"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "நிறுவுதல்"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "கோப்பை %1 திறக்க முடியவில்லை."
index 80ba92a..85015e4 100644 (file)
--- a/po/th.po
+++ b/po/th.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2008-01-04 08:58+0100\n"
 "Last-Translator: i18n@suse.de\n"
 "Language-Team: Thai <i18n@suse.de>\n"
@@ -15,12 +15,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 #, fuzzy
 msgid "Unknown country: "
@@ -1294,73 +1288,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, fuzzy, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "หมดเวลาของคำสั่งหลังจาก %1 วินาที"
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr ""
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "ล้มเหลวในการคืนค่าส่วน MBR ของฮาร์ดดิสก์"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "ล้มเหลวในการคืนค่าส่วน MBR ของฮาร์ดดิสก์"
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง"
@@ -3883,53 +3827,53 @@ msgstr[0] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "ไม่สามารถสร้างไดเรกทอรี '%1' ได้"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "คลังแพกเกจใช้งานไม่ได้"
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
@@ -3937,43 +3881,43 @@ msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "ไม่สามารถเปิดใช้งานบริการ '%1' ได้"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "ไม่สามารถสร้างไดเรกทอรี "
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, fuzzy, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "การเพิ่มคลังแพกเกจ %1 ล้มเหลว"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "ล้มเหลวในการคืนค่าส่วน MBR ของฮาร์ดดิสก์"
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 #, fuzzy
 msgid "Unhandled repository type"
 msgstr "ชื่อของคลังแพกเกจใช้งานไม่ได้"
@@ -3984,69 +3928,48 @@ msgstr "ชื่อของคลังแพกเกจใช้งานไ
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "ไม่รู้จักตัวเลือกสำหรับคำสั่ง '%1': %2"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, fuzzy, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "กำลังเพิ่มคลังแพกเกจ %1"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "ค่าสำหรับตัวเลือก '%1' ไม่ถูกต้อง: %2"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "กำลังตรวจคลังแพกเกจ "
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "ไม่สามารถเปิดใช้งานบริการ '%1' ได้"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 #, fuzzy
 msgid "Can't figure out where the service is stored."
 msgstr "ไม่สามารถลบบริการได้ เนื่องจากมันยังไม่ถูกติดตั้ง"
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "ไม่ทราบ"
@@ -4115,19 +4038,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr "ไม่มีรายละเอียด"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-#, fuzzy
-msgid "History:"
-msgstr "คลังแพกเกจ: "
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4149,20 +4066,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "รูปแบบการค้นหา (RegExp)"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4189,7 +4107,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง"
@@ -4292,7 +4210,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4303,7 +4221,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4319,7 +4237,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4381,7 +4299,7 @@ msgid "No url in repository."
 msgstr "เลือกคลังแพกเกจ"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4500,7 +4418,7 @@ msgstr "การตรวจสอบการขึ้นอยู่แก่
 msgid "generally ignore of some dependencies"
 msgstr "การตรวจสอบการขึ้นอยู่แก่กันของระบบ ไม่พบปัญหา"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4508,287 +4426,261 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "การตรวจสอบการขึ้นอยู่แก่กันของระบบ ไม่พบปัญหา"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "อ่านค่าของผู้ให้บริการ"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "เขียนค่าของผู้ให้บริการ"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "เขียนค่าของผู้ให้บริการ"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "รุ่นนี้ถูกติดตั้งไว้บนระบบของคุณ"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4797,209 +4689,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, fuzzy, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "กำลังเรียกใช้คลังแพกเกจสำหรับปรับรุ่นให้ทันสมัย..."
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "สถาปัตยกรรมพื้นฐาน"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "ผิดพลาด: ไม่สามารถติดตั้งแพกเกจได้"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-#, fuzzy
-msgid "Have you enabled all requested repositories?"
-msgstr "เพิ่มคลังแพกเกจแบบออนไลน์ที่เลือกไว้ทั้งหมด"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "ยังไม่มีบริการ %1 อยู่"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "ไฟร์วอลล์ยังไม่ถูกติดตั้ง"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "ไม่ต้องติดตั้งตัวจัดการการบูตระบบใด ๆ"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, fuzzy, c-format, boost-format
-msgid "do not install %s"
-msgstr "ไม่ต้องติดตั้ง"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "บันทึกการตั้งค่าการติดตั้ง"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "ลบอัตโนมัติ"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "บันทึกการตั้งค่าการติดตั้ง"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5017,11 +4721,11 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "การติดตั้งเสร็จสมบูรณ์เพียงบางส่วนเท่านั้น"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "การสร้างแฟ้มสำรองข้อมูลล้มเหลว"
@@ -5029,63 +4733,67 @@ msgstr "การสร้างแฟ้มสำรองข้อมูลล
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "จัดเก็บแฟ้มการปรับแต่งค่า"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5093,13 +4801,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5108,150 +4816,307 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "ข้อมูลเพิ่มเติม"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+#, fuzzy
+msgid "History:"
+msgstr "คลังแพกเกจ: "
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, fuzzy, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "ค่าสำหรับตัวเลือก '%1' ไม่ถูกต้อง: %2"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, fuzzy, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "ค่าสำหรับตัวเลือก '%1' ไม่ถูกต้อง: %2"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
+#, fuzzy, c-format, boost-format
+msgid "Command exited with status %d."
+msgstr "หมดเวลาของคำสั่งหลังจาก %1 วินาที"
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "กำลังเรียกใช้คลังแพกเกจสำหรับปรับรุ่นให้ทันสมัย..."
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "สถาปัตยกรรมพื้นฐาน"
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "ผิดพลาด: ไม่สามารถติดตั้งแพกเกจได้"
+
+#, fuzzy
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "เพิ่มคลังแพกเกจแบบออนไลน์ที่เลือกไว้ทั้งหมด"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "ยังไม่มีบริการ %1 อยู่"
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "ไฟร์วอลล์ยังไม่ถูกติดตั้ง"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "ไม่ต้องติดตั้งตัวจัดการการบูตระบบใด ๆ"
+
+#, fuzzy
+#~ msgid "do not install %s"
+#~ msgstr "ไม่ต้องติดตั้ง"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "บันทึกการตั้งค่าการติดตั้ง"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "ลบอัตโนมัติ"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "บันทึกการตั้งค่าการติดตั้ง"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้"
index 89bdeda..5a53854 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2018-01-29 14:07+0000\n"
 "Last-Translator: Özgür Ateş Fırat <ozgursebahat@mail.ru>\n"
 "Language-Team: Turkish <https://l10n.opensuse.org/projects/libzypp/master/tr/"
@@ -22,12 +22,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 2.18\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Kararsız '%s' türü için %u bayt sğlama toplamı  '%s'"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Bilinmeyen ülke:"
@@ -1506,73 +1500,22 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Pty açılamıyor (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Veri yolu açılamıyor (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "'%s' e chroot yapılamıyor (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr ""
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "'%s' yürütülemedi (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Ayrıştırılamadı (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Komut %d durumuyla çıkış yaptı."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Komut %d sinyali tarafından durduruldu (%s)."
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Bağlanıken çalıştırılacak komut"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "%1% dosyasından genel anahtar alınamadı"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Anahtar silinirken hata meydana geldi."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "%s imza dosyası bulunamadı"
@@ -4453,52 +4396,52 @@ msgstr[0] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "'%s' dosyası okunamadı"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Depo ismi noktayla başlayamaz."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Servis ismi noktayla başlayamaz."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "'%s' dosyası açılamıyor."
@@ -4506,42 +4449,42 @@ msgstr "'%s' dosyası açılamıyor."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "%s oluşturulamıyor"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Metadata önbellek klasörü oluşturulamadı."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "'%s' depo önbelleği oluşturuluyor"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "%s 'de önbellek oluşturulamıyor - yazma izni yok."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %d."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -4551,70 +4494,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "'%s' okunmaya çalışılırken bir hata meydana geldi"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "'%s' depoya ekleniyor"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Geçersiz yetki '{0}'"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "'%s' deposu siliniyor"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Reponun nerede depolandığı belirlenemedi."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "'%s' silinemiyor"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Servesin nerede depolandığı belirlenemedi."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-#, fuzzy
-msgid "Unable to clone Url object"
-msgstr "çalışma alanı oluşturulamadı\n"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-#, fuzzy
-msgid "Unable to parse Url components"
-msgstr "çalışma alanı oluşturulamadı\n"
-
 # include/cups/ui.ycp:2577 include/cups/ui.ycp:2598
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
@@ -4682,7 +4602,7 @@ msgstr "Destek almak için ek kullanıcı sözleşmesi gerekmektedir."
 msgid "Unknown support option. Description not available"
 msgstr "Bilinmeyen destek seçeneği. Açıklama bulunamadı"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4691,11 +4611,6 @@ msgstr ""
 "Sistem yönetimi uygulama tarafından pid kullanılarak kilitlendi %d (%s). \n"
 "Tekrar denemeden önce bu uygulamayı kapatın."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Tarih:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4717,20 +4632,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Geçersiz düzenli ifade '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' için kimlik doğrulama gerekmektedir"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4759,7 +4675,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "'%s' işlemi gerçekleştirilmeye çalışılırken ortam açılamadı."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "'%s' dosyası '%s' ortamında bulunamadı"
@@ -4868,7 +4784,7 @@ msgid "Permission to access '%s' denied."
 msgstr "İzin verilmedi\n"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4879,7 +4795,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "'%s' konumuna şuan ulaşılamaz. "
@@ -4897,7 +4813,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4958,7 +4874,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -5075,7 +4991,7 @@ msgstr "şu çözülmemiş gereksinimlere sahip:"
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -5083,163 +4999,153 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
 # clients/inst_sw_single.ycp:742
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Yetersiz bağımlılıklar:"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -5247,122 +5153,106 @@ msgstr ""
 "\n"
 "Yüklenemez sağlayıcılar:"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "Yüklenemez sağlayıcılar:"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Bu istek sisteminizi çökertecek!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -5371,212 +5261,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s dağıtım güncelleme deposuna ait değil."
-
-# clients/hwinfo.ycp:66
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s alt mimariye sahip"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "İstenen bütün depoları etkinleştirdiğinizden emin misiniz?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-# clients/online_update_start.ycp:171
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s kurulabilir değil"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "%s ve %s in ikisi birden yüklenemez"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s, %s tarafından sağlanan %s ile çakışıyor."
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s %s tarafından sağlanan %s'in süresini bitirdi."
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%1, %2 ile çakışıyor"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%1, %2 ile çakışıyor"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s, %s'i gerektiriyor, ama bu gereklilik sağlanamıyor."
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "%s yüklenmedi"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "%1, %2 ile çakışıyor"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%1 paketini sil"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Kurulum"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -5593,59 +5292,63 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Yükleme yönlendirildiği şekilde iptal edildi"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr "uygulandı"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr "işletme hatası"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr "İptal etme sırasında uygulama es geçildi."
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 "Güncelleme bilgilendirmesi için mesaj gönderilirken bir hata meydana geldi."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 # clients/online_update_load.ycp:380
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "İndirme işlemi başarısız oldu:"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "%1% dosyasından genel anahtar alınamadı"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "'%1%' genel anahtarı silinemedi"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 #, fuzzy
 msgid "Package is not signed!"
 msgstr "Geri yüklenecek paketler"
@@ -5653,19 +5356,19 @@ msgstr "Geri yüklenecek paketler"
 # clients/sw_single.ycp:310
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, fuzzy, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Yapılandırma dosyalarını kaydet"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5673,13 +5376,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5688,151 +5391,317 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Ek rpm çıktısı"
 
 # clients/inst_sw_backup.ycp:260
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "%s yedeklemesi oluşturuldu"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Kararsız '%s' türü için %u bayt sğlama toplamı  '%s'"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Pty açılamıyor (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Veri yolu açılamıyor (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+#, fuzzy
+msgid "Unable to clone Url object"
+msgstr "çalışma alanı oluşturulamadı\n"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+#, fuzzy
+msgid "Unable to parse Url components"
+msgstr "çalışma alanı oluşturulamadı\n"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Tarih:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
 # include/nfs/routines.ycp:188
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Geçersiz %s bileşeni '%s'"
 
 # include/nfs/routines.ycp:188
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Geçersiz %s bileşeni"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, fuzzy, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Geçersiz yetki '{0}'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
 # include/nfs/routines.ycp:188
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, fuzzy, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Geçersiz özellik '{0}'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
 # include/nfs/routines.ycp:188
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, fuzzy, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Geçersiz özellik '{0}'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Kodlanmış dizi bir NUL baytı içerir"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Geçersiz dizi karakteri ayırma parametresi"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Geçersiz dizi karakteri birleştirme parametresi"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Komut %d durumuyla çıkış yaptı."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Komut %d sinyali tarafından durduruldu (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Bağlanıken çalıştırılacak komut"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "'%s' e chroot yapılamıyor (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "'%s' yürütülemedi (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Ayrıştırılamadı (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s dağıtım güncelleme deposuna ait değil."
+
+# clients/hwinfo.ycp:66
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s alt mimariye sahip"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "İstenen bütün depoları etkinleştirdiğinizden emin misiniz?"
+
+# clients/online_update_start.ycp:171
+#~ msgid "%s is not installable"
+#~ msgstr "%s kurulabilir değil"
+
+# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "%s ve %s in ikisi birden yüklenemez"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s, %s tarafından sağlanan %s ile çakışıyor."
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s %s tarafından sağlanan %s'in süresini bitirdi."
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%1, %2 ile çakışıyor"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%1, %2 ile çakışıyor"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s, %s'i gerektiriyor, ama bu gereklilik sağlanamıyor."
+
+# include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249
+#~ msgid "do not install %s"
+#~ msgstr "%s yüklenmedi"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "%1, %2 ile çakışıyor"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%1 paketini sil"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Kurulum"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Kilitlenmiş dosya açılamıyor: %s"
 
index 31bbe7b..83555cc 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
@@ -13,7 +13,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp.uk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-03-11 21:56+0000\n"
 "Last-Translator: Lesath <4lesath@gmail.com>\n"
 "Language-Team: Ukrainian <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -26,12 +26,6 @@ msgstr ""
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Сумнівний тип «%s» для %u байтів контрольної суми «%s»"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Невідома країна: "
@@ -1418,71 +1412,21 @@ msgstr "Покращує"
 msgid "Supplements"
 msgstr "Доповнює"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Не вдалося відкрити pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Неможливо відкрити канал (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Не вдалося створити chroot для «%s» (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Неможливо зробити chdir «%s» всередині chroot «%s» (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Неможливо змінити директорію на «%s» (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Не вдалося виконати «%s» (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Не вдалося відгалузити (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Команда завершила роботу зі станом %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Команду було вбито за сигналом %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Команда завершила роботу з невідомою помилкою."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Спроба імпорту неіснуючого ключа %s у сховище ключів %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "Не вдалося імпортувати ключ."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Не вдалось вилучити ключ."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Файл підпису «%s» не знайдено"
@@ -3952,52 +3896,52 @@ msgstr[2] "(закінчується через %d днів)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "Пошук ID ключа для gpg %1% у кеші %2%."
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "Пошук ID ключа для gpg %1% у сховищі %2%."
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "Сховище %1% не визначає додаткові мережеві адреси для «gpgkey=»."
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "Неможливо прочитати директорію сховища '%1%': Доступ заборонено"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Не вдалось прочитати директорію «%s»"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "Неможливо прочитати файл сховища '%1%': Доступ заборонений"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "Псевдонім сховища не може починатися з точки."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "Псевдонім служби не може починатися з точки."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Неможливо відкрити файл «%s» для запису."
@@ -4005,44 +3949,44 @@ msgstr "Неможливо відкрити файл «%s» для запису.
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "Невідома служба '%1%': видалення сховища служби '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "У вказаній адресі URL не знайдено чинних метаданих"
 msgstr[1] "У вказаних адресах URL не знайдено чинних метаданих"
 msgstr[2] "У вказаних адресах URL не знайдено чинних метаданих"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Неможливо створити %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Неможливо створити директорію кешу метаданих."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Створення кешу сховища «%s»"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Не вдалося створити кеш %s - немає прав на запис."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Не вдалось скешувати сховище(%d)."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Необроблений тип сховища"
 
@@ -4052,68 +3996,47 @@ msgstr "Необроблений тип сховища"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Помилка спроби читання з «%s»"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Невідома помилка читання з «%s»"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Додавання сховища «%s»"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Не чинна назва файла сховища «%s»"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Вилучення сховища «%s»"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Неможливо визначити, де знаходиться сховище."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Неможливо вилучити «%s»"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Неможливо визначити, де знаходиться служба."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Недійсний рядок запиту URL LDAP"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Недійсний параметр запиту «%s» URL LDAP"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Не вдається клонувати об'єкт URL"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Не чинне порожнє посилання до об'єкта URL"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Неможливо розібрати компоненти URL"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "невідомий"
@@ -4190,7 +4113,7 @@ msgstr "Для отримання підтримки потрібний дода
 msgid "Unknown support option. Description not available"
 msgstr "Невідомий параметр підтримки. Немає опису"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4199,11 +4122,6 @@ msgstr ""
 "Керування системою заблоковано програмою з pid %d (%s).\n"
 "Закрийте цю програму перш ніж спробувати знову."
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Історія:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4225,13 +4143,14 @@ msgid "Invalid regular expression '%s'"
 msgstr "Недійсний формальний вираз «%s»"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "Потрібна автентифікація для «%s»"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4239,8 +4158,8 @@ msgstr ""
 "Відвідайте Центр клієнтів SUSE, щоб перевірити, чи ваша реєстрація дійсна та "
 "чи не закінчився термін дії."
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4268,7 +4187,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Носій не було відкрито під час спроби виконання дії «%s»."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Файл «%s» не знайдено на носії «%s»"
@@ -4375,7 +4294,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Дозвіл на доступ до «%s» заборонено."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "Перевищено час очікування при спробі доступу до «%s»."
@@ -4386,7 +4305,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "Завантажені дані перевищили очікуваний розмір файлу «%s» у «%s»."
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Адреса «%s» тимчасово недоступна."
@@ -4406,7 +4325,7 @@ msgstr ""
 "Створюємо точку монтування: неможливо знайти директорію з можливістю запису "
 "для створення точки монтування"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Метод автентифікації HTTP «%s», який не підтримується"
@@ -4466,7 +4385,7 @@ msgid "No url in repository."
 msgstr "В сховищі немає url."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4631,7 +4550,7 @@ msgstr "зламати %s, ігноруючи деякі залежності"
 msgid "generally ignore of some dependencies"
 msgstr "взагалі нехтувати деякими залежностями"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4640,161 +4559,151 @@ msgstr ""
 "встановлений %1% не належить до оновлюваного сховища та мусить бути замінений"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "%1% який було встановлено не належить до оновлюваного сховища"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "встановлений %1% має неповноцінну архітектуру"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "%1% який було встановлено має неповноцінну архітектуру"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "проблема з встановленим %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "конфлікт запитів"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "якась проблема залежностей"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "ніхто не надає запитуваний «%1%»"
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "Ви ввімкнули всі необхідні сховища?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "запитуваний пакунок %1% не існує"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "непідтримуваний запит"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "вилучені залежності: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4802,122 +4711,106 @@ msgstr ""
 "\n"
 "залежності без можливості встановлення: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "залежності без можливості встановлення: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Цей запит пошкодить вашу систему!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "ігнорувати попередження про пошкодження системи"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "встановити %1% хоч він і був відкладений"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "дозволити встановити PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "встановити %1% хоч він і був у чорному списку"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4926,209 +4819,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s не належить до сховища distupgrade (оновлення дистрибутиву)"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s має слабшу архітектуру"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "проблема з встановленим пакунком %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "жоден з пакунків не надає потрібного %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Чи ви увімкнули всі запитані сховища?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "пакунок %s не існує"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s надано системою і його неможливо прибрати"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s не можливо встановити"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "жоден з пакунків не надає %s, потрібного %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "неможливо встановити одночасно %s і %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s конфліктує з %s, що надається %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s робить застарілим %s, що надається %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "встановлений пакунок %s робить застарілим %s, який надається %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "Розв’язок %s конфліктує з %s, що у ньому міститься"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s потребує %s, але цю залежність неможливо вдовольнити"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "усунути блокування, щоб дозволити вилучення %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "не встановлювати %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "залишити %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "усунути блокування, щоб дозволити встановлення %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "не питати про встановлення розв’язувача, що надає %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "не питати про вилучення всіх розв’язувачів, що надаються %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "не встановлювати ранішу версію %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "Залишити %s, незважаючи на слабшу архітектуру"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "Встановити %s, незважаючи на те, що це змінить архітектуру"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "Залишити застарілі %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "Встановити %s з невключеного сховища"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "повернення замість %s %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "зміна архітектури з %s на %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"встановити %s (зі зміною виробника)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "заміна %s на %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "вилучення %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -5146,74 +4850,78 @@ msgstr "Виконання сценаріїв %posttrans"
 msgid "Installation has been aborted as directed."
 msgstr "Встановлення перервано відповідно до вказівки."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " виконано"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " виконання зазнало невдачі"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s вже виконаний як %s)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " виконання пропущено під час переривання"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Помилка відсилання сповіщення про оновлення."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Нове повідомлення про оновлення"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "Помилка RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "Не вдалося імпортувати відкритий ключ %1%"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Не вдалося вилучити відкрити ключ %1%"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "Пакунок не підписаний!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Змінено конфігураційні файли для %s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm збережено %s як %s, але було неможливо виявити різницю"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5223,13 +4931,13 @@ msgstr ""
 "Ось перші 25 рядків розбіжностей:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm створила %s як %s, але було неможливо виявити різницю"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5240,149 +4948,358 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Додатковий вивід rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "створено резервну копію %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "З підписом усе гаразд"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "Невідомий тип підпису"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "Підпис не перевіряється"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "З підписом усе гаразд, але ключ - ненадійний"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "Публічний ключ підписів - недоступний"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "Файл не існує чи підпис не можна перевірити"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "Файл не підписаний"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"Помилка (curl) завантаження «%s»:\n"
+"Код помилки: %s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"Помилка (curl) завантаження «%s»:\n"
+"Не вдається отримати відповідь HTTP\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Сумнівний тип «%s» для %u байтів контрольної суми «%s»"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Не вдалося відкрити pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Неможливо відкрити канал (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Недійсний рядок запиту URL LDAP"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Недійсний параметр запиту «%s» URL LDAP"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Не вдається клонувати об'єкт URL"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Не чинне порожнє посилання до об'єкта URL"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Неможливо розібрати компоненти URL"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Історія:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Схема Url не дозволяє %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Недійсний %s компонент «%s»"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Недійсний компонент %s"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Розбір рядка запиту не підтримується для цього URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Схема URL - це потрібний компонент"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Недійсна схема URL «%s»"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Схема URL не дозволяє імені користувача"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Схема URL не дозволяє пароля"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Схема URL потребує компонент вузла"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Схема URL не дозволяє компонент вузла"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Недійсний компонент вузла «%s»"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Схема URL не дозволяє порт"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Недійсний компонент порту «%s»"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Схема URL потребує назву шляху"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Відносний шлях не дозволяється при існуванні повноваження"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Закодований рядок містить нульовий байт"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Недійсний символ розділення масиву параметрів"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Недійсний символ розділення карти параметрів"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Недійсний символ сполучення масиву параметрів"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Команда завершила роботу зі станом %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Команду було вбито за сигналом %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Команда завершила роботу з невідомою помилкою."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"Помилка (curl) завантаження «%s»:\n"
-"Код помилки: %s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Не вдалося створити chroot для «%s» (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Неможливо змінити директорію на «%s» (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Неможливо зробити chdir «%s» всередині chroot «%s» (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Не вдалося виконати «%s» (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Не вдалося відгалузити (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"Помилка (curl) завантаження «%s»:\n"
-"Не вдається отримати відповідь HTTP\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s не належить до сховища distupgrade (оновлення дистрибутиву)"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s має слабшу архітектуру"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "проблема з встановленим пакунком %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "жоден з пакунків не надає потрібного %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Чи ви увімкнули всі запитані сховища?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "пакунок %s не існує"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s надано системою і його неможливо прибрати"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s не можливо встановити"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "жоден з пакунків не надає %s, потрібного %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "неможливо встановити одночасно %s і %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s конфліктує з %s, що надається %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s робить застарілим %s, що надається %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "встановлений пакунок %s робить застарілим %s, який надається %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "Розв’язок %s конфліктує з %s, що у ньому міститься"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s потребує %s, але цю залежність неможливо вдовольнити"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "усунути блокування, щоб дозволити вилучення %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "не встановлювати %s"
+
+#~ msgid "keep %s"
+#~ msgstr "залишити %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "усунути блокування, щоб дозволити встановлення %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "не питати про встановлення розв’язувача, що надає %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "не питати про вилучення всіх розв’язувачів, що надаються %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "не встановлювати ранішу версію %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "Залишити %s, незважаючи на слабшу архітектуру"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "Встановити %s, незважаючи на те, що це змінить архітектуру"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "Залишити застарілі %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "Встановити %s з невключеного сховища"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "повернення замість %s %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "зміна архітектури з %s на %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "встановити %s (зі зміною виробника)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "заміна %s на %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "вилучення %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Не вдалося відкрити файл замка: %s"
index bd50cbb..ff97321 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2016-08-25 08:06+0000\n"
 "Last-Translator: Hoàng Phạm <pnhoang96@gmail.com>\n"
 "Language-Team: Vietnamese <https://l10n.opensuse.org/projects/libzypp/master/"
@@ -20,12 +20,6 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Weblate 2.6\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1294,74 +1288,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Couldn't open file: %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Lệnh thực hiện khi kết nối"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Failed to parse: %s."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -3765,52 +3708,52 @@ msgstr[0] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Không thể mở tập tin '%s' để ghi."
@@ -3818,42 +3761,42 @@ msgstr "Không thể mở tập tin '%s' để ghi."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Không thể tạo %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3863,68 +3806,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Lỗi khi đọc từ '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Đang thêm kho '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Đang xoá kho '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Không thể xác định nơi chứa kho phần mềm."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Không thể xoá '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr ""
@@ -3991,18 +3913,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4024,20 +3941,21 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4064,7 +3982,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4167,7 +4085,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4178,7 +4096,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4194,7 +4112,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4254,7 +4172,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4371,7 +4289,7 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4379,282 +4297,256 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4663,206 +4555,19 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1509
-#, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr ""
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
 msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
 #. strip tmp file suffix
@@ -4881,11 +4586,11 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Đã huỷ cài đặt theo yêu cầu."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4893,63 +4598,67 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Thông báo cập nhật mới"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "Lỗi RPM: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4957,13 +4666,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4972,144 +4681,257 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Lệnh thực hiện khi kết nối"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
 
 #, fuzzy
index 9c98c70..73eb2a0 100644 (file)
--- a/po/wa.po
+++ b/po/wa.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lcn memory\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2012-08-24 14:42+0200\n"
 "Last-Translator: Jean Cayron <jean.cayron@base.be>\n"
 "Language-Team: Walloon <linux-wa@walon.org>\n"
@@ -18,12 +18,6 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 "X-Generator: Lokalize 1.4\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "Crombe sôre « %s » po l' octet %u del some di controle « %s »"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Payis nén cnoxhou : "
@@ -1315,72 +1309,22 @@ msgstr "Amidrêye"
 msgid "Supplements"
 msgstr "Rawetes"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Dji n' sai drovi pty (%s)."
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Dji n' sai drovi l' pupe (%s)."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "Dji n' sai fé chroot a « %s » (%s)."
-
-#: zypp/ExternalProgram.cc:375
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "Dji n' sai fé chdir a « / » divins chroot (%s)."
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Dji n' sai fé chroot a « %s » (%s)."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "Dji n' sai enonder « %s » (%s)."
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Dji n' sai fé on fork (%s)."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "Li comande a moussî foû avou l' sitatut %d."
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "Li comande a stî touwêye på signå %d (%s)."
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "Li comande a moussî foû avou ene aroke nén cnoxhowe."
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, fuzzy, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "Dj' a sayî d' abaguer l' clé %s nén egzistante e l' anea d' clés %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "L' abagaedje del clé publike %1% a fwait berwete"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "Li disfaçaedje del clé a fwait berwete."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Sinateure di fitchî %s nén trovêye"
@@ -3786,52 +3730,52 @@ msgstr[1] "(espire divant 24 e)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Li léjhaedje do ridant « %s » a fwait berwete."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "On no metou di siervice ni s' pout cominçî avou on pont."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Dji n' sai nén drovi l' fitchî « %s » pol sicrire."
@@ -3839,44 +3783,44 @@ msgstr "Dji n' sai nén drovi l' fitchî « %s » pol sicrire."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 #, fuzzy
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "Dji n' a trové nole meta-dnêye valåbe al/ås URL sipeciftî(s)"
 msgstr[1] "Dji n' a trové nole meta-dnêye valåbe al/ås URL sipeciftî(s)"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Dji n' sai ahiver %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "Dji n' sai ahiver l' ridant muchete des meta-dnêyes."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "Dji basti l' muchete do depot « %s »"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "Dji n' sai ahiver l' muchete a %s - pont d' droet di scrijhaedje."
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Li metaedje e muchete do depot (%d) a fwait berwete."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "Dji n' sai nén apougnî cisse sôre di depot la"
 
@@ -3886,68 +3830,47 @@ msgstr "Dji n' sai nén apougnî cisse sôre di depot la"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "Åk n' a nén stî come dji sayive di lére a pårti di « %s »"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Åk di nén cnoxhou n' a nén stî come dji léjheu a pårti d' \"%s\""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "Dji radjoute li depot « %s »"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "No do fitchî do depot so « %s » nén valåbe"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "Dji n' sai nén trover ewou ç' kel depot est wårdé."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Dji n' sai disfacer « %s »"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "Dji n' sai nén trover ewou ç' kel siervice est wårdé."
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Tchinne di cweraedje di l' IRL LDAP nén valåbe"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Paramete cweraedje di l' URL LDAP nén valåbe « %s »"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Dji n' sai clôner l' objet Url"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Vude referince d' objet di l' Url nén valåbe"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Dji n' sai analijhî les componints di l' Url"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "nén cnoxhou"
@@ -4018,18 +3941,13 @@ msgstr "I fåt èn ôte contrat cliyint pos awè on sopoirt."
 msgid "Unknown support option. Description not available"
 msgstr "Tchuze di sopoirt nén cnoxhowe. I gn a pont d' discrijhaedje"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "Istwere :"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4051,20 +3969,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Erîlêye ratourneure « %s » nén valåbe"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "I s' fåt otintifyî po « %s »"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4091,7 +4010,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "Media nén drovou cwand dj' a sayî d' fé l' faitindje « %s »."
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Fitchî « %s » nén trové sol media « %s »"
@@ -4199,7 +4118,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Droet di moussî e « %s » rifuzé."
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "L' astådje a stî trop longue po moussî e \"%s\"."
@@ -4210,7 +4129,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "Dji n' sai moussî e l' eplaeçmint « %s » pol moumint."
@@ -4228,7 +4147,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "Metôde d' otintifiaedje HTTP \"%s\" nén sopoirtêye"
@@ -4292,7 +4211,7 @@ msgid "No url in repository."
 msgstr "Pont d' url e depot"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4410,7 +4329,7 @@ msgstr "sketer %s e passant houte sacwantes di ses aloyances"
 msgid "generally ignore of some dependencies"
 msgstr "sketer %s e passant houte sacwantes di ses aloyances"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4418,162 +4337,152 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "dimandes d' afrontmints"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "gn des des problinmes d' aloyances"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 #, fuzzy
 msgid "unsupported request"
 msgstr "nén sopoirté"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "ahesseus disfacé : "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4581,122 +4490,106 @@ msgstr ""
 "\n"
 "ahesseus nén astalåves : "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "ahesseus nén astalåves : "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "Cisse dimande ci va scheter vosse sistinme !"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "passer houte l' adviertixhmint d' on sketé sistinme"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4705,210 +4598,20 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-"%s ni fwait nén pårteye d' on depot d' metaedje a djoû del distribucion"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s a ene årtchitecteure pus basse"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "problinme avou l' pacaedje d' astalé %s"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "rén n' dene li %s dimandé"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "Avoz metou en alaedje tos les depots dmandés ?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "Çou paket n' est nén astalé et n' serè nén astalé."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s n' est nén astalåve"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "rén n' dene %s k' a dandjî %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Dji n' sai nén astaler ambedeus %s eyet %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s s' afronte avou %s ahessî pa %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s rind trop vîs %s ahessî pa %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "astalé %s trop vîs %s dinés pa %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s afrontmints rezoudåves avou %s ahessî pa lyi minme"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s a dandjî d' %s mins cisse dimande ni sait nén esse ahesseye"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "èn nén astaler %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "wårder %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "èn nén espaitchî l' astalaedje di %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "èn nén dmander d' astaler on rezoudaedje dinant %s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "èn nén dmander d' disfacer tos les rezoudaedjes dinant %s"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "èn nén astaler l' pus nouve modêye di %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "wårder %s mågré k' il est d' ene pus basse årtchitecteure"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "astaler %s mågré k' il est d' ene pus basse årtchitecteure"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "wårder l' forpassé %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "astaler %s a pårti do depot schovté evoye"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "dismete a djoû di %s a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "candjmint d' årtchitecteure di %s a %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
-"astaler %s (avou candjmint d' vindeu)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "replaeçmint di %s avou %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "disastalaedje di %s"
 
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
@@ -4926,75 +4629,79 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "L' astalaedje a stî abandné come dimandé."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " enondé"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " a fwait berwete a l' enondaedje"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " a passé l' enondaedje cwand il abandnéve"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "Åk n' a nén stî come dji meteu a djoû l' notifiaedje do messaedje."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "Novea messaedje di metaedje a djoû"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM a fwait berwete :"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "L' abagaedje del clé publike %1% a fwait berwete"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "Li oistaedje del clé publike %1% a fwait berwete"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Les fitchîs d' apontiaedje po %s ont stî candjîs :"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm a schapé %s come %s mins ça n' a nén stî possibe di trover l' diferince"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5004,14 +4711,14 @@ msgstr ""
 "Vos avoz droci les 25 prumirès royes di diferince :\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 "rpm a ahivé %s come %s mins ça n' a nén stî possibe di trover l' diferince"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5022,149 +4729,355 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "Ôtès rexhowes di rpm"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "copeye di såvrité di %s ahivêye"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Sinateure di fitchî %s nén trovêye"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Sinateure di fitchî %s nén trovêye"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Sinateure di fitchî %s nén trovêye"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "Crombe sôre « %s » po l' octet %u del some di controle « %s »"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Dji n' sai drovi pty (%s)."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Dji n' sai drovi l' pupe (%s)."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Tchinne di cweraedje di l' IRL LDAP nén valåbe"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Paramete cweraedje di l' URL LDAP nén valåbe « %s »"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Dji n' sai clôner l' objet Url"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Vude referince d' objet di l' Url nén valåbe"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Dji n' sai analijhî les componints di l' Url"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "Istwere :"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "L' arindjmint di l' Url ni permet pont d' %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Componrint %s nén valåbe « %s »"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Componint %s nén valåbe"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "L' arindjmint di l' URL est on componint reki"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Arindjmint di l' URL nén valåbe « %s »"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "L' arindjmint di l' Url ni permet pont d' no d' uzeu"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "L' arindjmint di l' Url ni permete pont d' sicret"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "I fåt on lodjoe e l' arindjmint di l' URL"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "L' arindjmint URL ni permete nén d' awè on componint lodjoe"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Componint do lodjoe nén valåbe « %s »"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "L' arindjmint di l' Url ni permet pont d' pôrt"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Componint do pôrt « %s » Nén valåbe"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "I fåt on no di tchmin e l' arindjmint di l' URL"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "I gn a èn octet NUL el tchinne ecôdêye."
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "Li comande a moussî foû avou l' sitatut %d."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "Li comande a stî touwêye på signå %d (%s)."
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "Li comande a moussî foû avou ene aroke nén cnoxhowe."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "Dji n' sai fé chroot a « %s » (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Dji n' sai fé chroot a « %s » (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "Dji n' sai fé chdir a « / » divins chroot (%s)."
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "Dji n' sai enonder « %s » (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Dji n' sai fé on fork (%s)."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr ""
+#~ "%s ni fwait nén pårteye d' on depot d' metaedje a djoû del distribucion"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s a ene årtchitecteure pus basse"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "problinme avou l' pacaedje d' astalé %s"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "rén n' dene li %s dimandé"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "Avoz metou en alaedje tos les depots dmandés ?"
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "Çou paket n' est nén astalé et n' serè nén astalé."
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s n' est nén astalåve"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "rén n' dene %s k' a dandjî %s"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Dji n' sai nén astaler ambedeus %s eyet %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s s' afronte avou %s ahessî pa %s"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s rind trop vîs %s ahessî pa %s"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "astalé %s trop vîs %s dinés pa %s"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s afrontmints rezoudåves avou %s ahessî pa lyi minme"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s a dandjî d' %s mins cisse dimande ni sait nén esse ahesseye"
+
+#~ msgid "do not install %s"
+#~ msgstr "èn nén astaler %s"
+
+#~ msgid "keep %s"
+#~ msgstr "wårder %s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "èn nén espaitchî l' astalaedje di %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "èn nén dmander d' astaler on rezoudaedje dinant %s"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "èn nén dmander d' disfacer tos les rezoudaedjes dinant %s"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "èn nén astaler l' pus nouve modêye di %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "wårder %s mågré k' il est d' ene pus basse årtchitecteure"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "astaler %s mågré k' il est d' ene pus basse årtchitecteure"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "wårder l' forpassé %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "astaler %s a pårti do depot schovté evoye"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "dismete a djoû di %s a %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "candjmint d' årtchitecteure di %s a %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "astaler %s (avou candjmint d' vindeu)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "replaeçmint di %s avou %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "disastalaedje di %s"
+
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Dji n' sai nén drovi l' fitchî d' eclawaedje : %s"
 
index 78603cc..6352ff9 100644 (file)
--- a/po/xh.po
+++ b/po/xh.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2006-11-03 12:03\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -14,12 +14,6 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Ilizwe elingaziwa:"
@@ -1293,74 +1287,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Ayikwazi kuvuleka ifayili %1."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Ayikwazi kufumana %s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Ayikwazi kufumana %s."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Umyalelo okhutshwa xa kudityaniswa"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Isilele ukuqalisa i-VM."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Isilele ukuqalisa i-VM."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Ukungenisa akufunyenwanga."
@@ -3767,54 +3710,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "Igama le-VM alikwazi kuqalisa ngomvo."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "Igama le-VM alikwazi kuqalisa ngomvo."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Ayikwazi kuvula ifayili ukuze kubhalwe."
@@ -3822,44 +3765,44 @@ msgstr "Ayikwazi kuvula ifayili ukuze kubhalwe."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ayikwazi kuvuleka into yolwazi olusesikrinini '%s'"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Akakwazi kudaleka uvimba weefayili %1: %2."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3869,68 +3812,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Imposiso xa kufundwa kwidiski ye-floppy."
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Igama lefayili elithathwa ngaphandle elingasebenzisekiyo."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Ibuyisela oovimba"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Ayikwazi kuvuleka into yolwazi olusesikrinini '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Umtya wokubuzisa we-LDAP URL ongasebenzisekiyo"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Umtya wokubuzisa we-LDAP URL ongasebenzisekiyo '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Akukwazeki ukufanisa into ye-Url"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Isalathi sento ye-Url elikhamte nengasebenzisekiyo"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Akukwazeki ukwahlula iinxalenye ze-Url"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "akwaziwa"
@@ -3998,18 +3920,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4031,20 +3948,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Ulungiselelo olusebenzisekayo lwe-Url '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4071,7 +3989,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Ifayili %1 ayifunyenwanga elugcinweni."
@@ -4175,7 +4093,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Iimvume zaliwe"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4186,7 +4104,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4202,7 +4120,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4268,7 +4186,7 @@ msgid "No url in repository."
 msgstr "Ifayili %1 ayifunyenwanga elugcinweni."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4387,7 +4305,7 @@ msgstr "Suhoya le mfuneko apha nje"
 msgid "generally ignore of some dependencies"
 msgstr "Suhoya le mfuneko apha nje"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4395,288 +4313,262 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Uqhagamshelo lucela uku:"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Ayikwazi kuhlohla%s ngenxa yeengxaki zoxhomekeko"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "Akukho nanye ebonelela ngo%s "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "Akukho baboneleli bahlohliweyo baka%s"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Akukho baboneleli bahlohliweyo baka%s"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "Isicelo sesikhona kakade."
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4685,208 +4577,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s ibonelela%s, kodwa inenye inzululwazi ngokwakha."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "umyalelo wokuyeka ukuhlohla imibekelelo"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "Akukho nanye ebonelela ngo%s "
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Idiski ayikho."
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s itshixiwe kwaye ayikwazi kungahlohlwa."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "ayihlohlwanga"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s ifunwa ngu %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Ayikwazi kuhlohla%s "
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s iimpixano ne %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s ziphelelwe lixehsa %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s ziphelelwe lixehsa %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s iimpixano ne %s"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "ungahlohli %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "Gcina%s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "ungahlohli %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "Akukho baboneleli bahlohliweyo baka%s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "Ungahlohli okanye cima izicombululi ezinxulumeneyo"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s ibonelela%s, kodwa inenye inzululwazi ngokwakha."
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "Hlohla%s nangona kuza kutshintsha inzululwazi yokwakha"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s ziphelelwe lixehsa %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "Ikhuphele%s ukusuka ku%s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Ukuhlohla"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4903,12 +4608,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Ukuhlohla kuye kwalahlwa njengoko bekuyalelwe."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "Phumeza"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4916,65 +4621,69 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "Imposiso ngethuba loguqulelo oluntsonkothileyo lweqhosha."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "isilele"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Iifayili zobumbeko ezitshintshileyo zika%s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "i-rpm igcine %s njenge %s kodwa kwakungenzeki ukumisela umahluko"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4984,13 +4693,13 @@ msgstr ""
 "Nantsi imigca eyi-25 yokuqala yomahluko:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "i-rpm idalwe %s njenge %s kodwa kwakungenzeki ukumisela umahluko"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5001,156 +4710,355 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Isivelisi se-rpm Esongezelelweyo:"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "idale ugcino olukhuselekileyo %s "
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Ukungenisa akufunyenwanga."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Ukungenisa akufunyenwanga."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Ukungenisa akufunyenwanga."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Ayikwazi kuvuleka ifayili %1."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Umtya wokubuzisa we-LDAP URL ongasebenzisekiyo"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Umtya wokubuzisa we-LDAP URL ongasebenzisekiyo '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Akukwazeki ukufanisa into ye-Url"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Isalathi sento ye-Url elikhamte nengasebenzisekiyo"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Akukwazeki ukwahlula iinxalenye ze-Url"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Ulungiselelo lwe-Url aluyivumeli i-%s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Ayisebenziseki %s inxalenye '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Ayisebenziseki %s inxalenye"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Ukwahlulwa komtya wokubuzisa awuxhaswa malunga nale-URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Ulungiselelo lwe-Url yinxalenye efunekayo"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Ulungiselelo olusebenzisekayo lwe-Url '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Ulungiselelo lwe-Url akulivumeli igama lomsebenzisi"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Ulungiselelo lwe-Url awulivumeli igama lokugqithisa"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Ulungiselelo lwe-Url lufuna inxalenye yomamkeli"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Ulungiselelo lwe-Url awuyivumeli inxalenye yomamkeli"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Ayisebenziseki inxalenye yomamkeli ye-'%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Ulungiselelo lwe-Url awusivumeli isiqhagamshelanisi"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Ayisebenziseki inxalenye yesiqhagamshelanisi se-'%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Ulungiselelo lwe-Url lufuna igama lendlela yothungelwano"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Indlela yothungelwano ethelekisekayo ayivunyelwa xa lukhona ugunyaziso"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Umtya ofakwe iikhowudi uqhulethe i-byte ENGENANTO"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 "Uphawu oluthatha isithuba somhlukanisi oqhekezayo woludwe lomda wenkcazelo "
 "engasebenzisekiyo"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 "Uphawu oluthatha isithuba somhlukanisi oqhekezayo woludwe lomda wenkcazelo "
 "ongasebenzisekiyo"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 "Uphawu oluthatha isithuba somhlukanisi ohlanganisayo woludwe lomda "
 "wenkcazelo engasebenzisekiyo"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Umyalelo okhutshwa xa kudityaniswa"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Ayikwazi kufumana %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Ayikwazi kufumana %s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s ibonelela%s, kodwa inenye inzululwazi ngokwakha."
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "umyalelo wokuyeka ukuhlohla imibekelelo"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "Akukho nanye ebonelela ngo%s "
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "Idiski ayikho."
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s itshixiwe kwaye ayikwazi kungahlohlwa."
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "ayihlohlwanga"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s ifunwa ngu %s"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Ayikwazi kuhlohla%s "
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s iimpixano ne %s"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s ziphelelwe lixehsa %s"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s ziphelelwe lixehsa %s"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s iimpixano ne %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "ungahlohli %s"
+
+#~ msgid "keep %s"
+#~ msgstr "Gcina%s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "ungahlohli %s"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "Akukho baboneleli bahlohliweyo baka%s"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "Ungahlohli okanye cima izicombululi ezinxulumeneyo"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s ibonelela%s, kodwa inenye inzululwazi ngokwakha."
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "Hlohla%s nangona kuza kutshintsha inzululwazi yokwakha"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s ziphelelwe lixehsa %s"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "Ikhuphele%s ukusuka ku%s"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Ukuhlohla"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Ayikwazi kuvuleka ifayili %1."
index 6cddb51..f2ffa81 100644 (file)
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: YaST (@memory@)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-03-07 01:13+0000\n"
 "Last-Translator: Grace Yu <grace.yu@excel-gits.com>\n"
 "Language-Team: Chinese (China) <https://l10n.opensuse.org/projects/libzypp/"
@@ -23,12 +23,6 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "“%s”对 %u 属于错误类型,字节校验和“%s”"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "未知国家或地区: "
@@ -1297,71 +1291,21 @@ msgstr "增强"
 msgid "Supplements"
 msgstr "补充"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "无法打开 pty (%s)。"
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "无法打开管道 (%s)。"
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "无法 chroot 到 '%s' (%s)。"
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "无法 chdir 到 %s,它在 chroot %s (%s) 中。"
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "无法 chdir 到 '%s' (%s)。"
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "无法执行 '%s' (%s)。"
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "无法派生 (%s)。"
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "命令退出,状态 %d。"
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "命令已被信号 %d (%s) 杀死。"
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "命令退出,未知错误。"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "尝试导入尚不存在的密钥 %s 到密钥环 %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "导入密钥失败。"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "删除密钥失败。"
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "未找到签名文件 %s"
@@ -3765,52 +3709,52 @@ msgstr[0] "(%d 天后过期)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "正在缓存 %2% 中查找 GPG 密钥 ID %1%。"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "正在软件源 %2% 中查找 GPG 密钥 ID %1%。"
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "软件源 %1% 并未定义额外的 'gpgkey=' URL。"
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "无法读取源文件夹 '%1%':权限被拒"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "读取文件夹 '%s' 失败"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "无法读取源文件 '%1%':权限被拒"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "软件源别名不能以点开头。"
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "服务别名不能以点开头。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "无法打开 '%s' 文件进行写入。"
@@ -3818,42 +3762,42 @@ msgstr "无法打开 '%s' 文件进行写入。"
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "未知服务 '%1%':正在移除孤立的服务软件源 '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "在指定 URL 未找到有效元数据"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "无法创建 %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "无法创建元数据缓存文件夹。"
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "正在构建软件源 '%s' 的缓存"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "无法在 %s 创建缓存 - 无写入权限。"
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "缓存软件源 (%d) 失败。"
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "未处理的软件源类型"
 
@@ -3863,68 +3807,47 @@ msgstr "未处理的软件源类型"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "试图读取 '%s' 出错"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "读取 '%s' 遇到未知错误"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "正在添加软件源 '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "'%s' 处的源文件名无效"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "正在移除软件源 '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "不确定软件源的存储位置。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "无法删除 '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "不确定服务的储存位置。"
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "无效的 LDAP URL 查询字符串"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "无效的 LDAP URL 查询参数 '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "无法克隆 URL 对象"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "无效的空 URL 对象引用"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "无法解析 URL 组件"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "未知"
@@ -3997,7 +3920,7 @@ msgstr "签署一份额外的客户合同后才能获得支持。"
 msgid "Unknown support option. Description not available"
 msgstr "未知支持选项。描述不可用"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4006,11 +3929,6 @@ msgstr ""
 "系统管理被进程编号为 %d 的应用程序 %s 锁定。\n"
 "请关闭此应用程序再试。"
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "历史:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4032,20 +3950,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "无效的正则表达式 '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "'%s' 需要认证"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr "访问 SUSE 客户中心检查您的注册码是否有效且未过期。"
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4072,7 +3991,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "当试图执行动作 '%s' 时,介质没有打开。"
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "文件 '%s' 未在介质 '%s' 上找到"
@@ -4178,7 +4097,7 @@ msgid "Permission to access '%s' denied."
 msgstr "访问 '%s' 的准入请求被拒绝。"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "访问 '%s' 时超时。"
@@ -4189,7 +4108,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "下载到的数据超出了预期文件大小 '%s'/'%s'。"
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "位置 '%s' 暂时无法访问。"
@@ -4205,7 +4124,7 @@ msgid ""
 "point"
 msgstr "创建挂接点:找不到可用于创建挂接点的可写目录"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "不支持 HTTP 认证方法 '%s'"
@@ -4264,7 +4183,7 @@ msgid "No url in repository."
 msgstr "软件源中没有 url。"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4437,7 +4356,7 @@ msgstr "通过忽略一些依赖关系来断开 %s"
 msgid "generally ignore of some dependencies"
 msgstr "通常忽略一些依赖关系"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4445,161 +4364,151 @@ msgid ""
 msgstr "安装的 %1% 不属于发行版升级源,必须替换"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "要安装的 %1% 不属于发行版升级源"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "安装的 %1% 的架构较低"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "要安装的 %1% 的架构较低"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "安装的 %1% 有问题"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "冲突的请求"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "一些依赖性问题"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "没有软件源能提供所请求的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "您是否启用了全部所需的软件源?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "请求的软件包 %1% 不存在"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "不支持的请求"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "\"%1%\" 由系统提供,无法擦除"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% 不可安装"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "没有软件源能提供安装的 %2% 所需的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "没有软件源能提供要安装的 %2% 所需的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "无法同时安装 %1% 和 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "安装的 %1% 与安装的 %3% 所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr "安装的 %1% 与要安装的 %3% 所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "要安装的 %1% 与安装的 %3% 所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr "要安装的 %1% 与要安装的 %3% 所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "安装的 %1% 会淘汰安装的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "安装的 %1% 会淘汰要安装的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "要安装的 %1% 会淘汰安装的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "要安装的 %1% 会淘汰要安装的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "安装的 %1% 与其自身所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "要安装的 %1% 与其自身所提供的 \"%2%\" 冲突"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr "安装的 %1% 需要 \"%2%\",但无法满足此要求"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr "要安装的 %1% 需要 \"%2%\",但无法满足此要求"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "已删除提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4607,122 +4516,106 @@ msgstr ""
 "\n"
 "无法安装的提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "无法安装的提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "移除锁定以允许移除 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "不安装 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "保留 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "移除锁定以允许安装 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "此请求将破坏您的系统!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "忽略损坏系统的警告"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "不询问就安装提供 %1% 的一个解析项"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "不询问就删除提供 %1% 的所有解析项"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "不安装最新版本的 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "即使架构较低,仍保留 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "即使架构较低,仍安装 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "保留淘汰的 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "安装来自排除的软件源的 %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "尽管 %1% 已收回,仍予以安装"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "允许安装 PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "尽管 %1% 已列入黑名单,仍予以安装"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "将 %1% 降级到 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "架构从 %1% 变为 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4733,210 +4626,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "将 %1% 用 %2% 取代"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "卸载 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s 不属于发行版升级源"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s 架构不对应"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "已安装的 %s 软件包有问题"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "没有什么能提供所需的 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "您启用了全部请求的软件源了吗?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "软件包 %s 不存在"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s 由系统提供,无法擦除"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s 不可安装"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "没有什么能提供 %s,而它为 %s 所需"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "无法同时安装 %s 和 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s 与 %s 冲突,后者由 %s 提供"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s 淘汰了 %s,后者由 %s 提供"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "已安装的 %s 淘汰了 %s,后者由 %s 提供"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "可解析项 %s 与自身提供的 %s 冲突"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s 需要 %s,但无法满足此需求"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "移除锁定以允许移除 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "不安装 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "保留 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "移除锁定以允许安装 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "不询问就安装一个提供 %s 的解析项"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "不询问就删除全部提供 %s 的解析项"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "不安装最新版本的 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "保留 %s,即使架构不对应"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "尽管架构不对应仍安装 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "保留已淘汰的 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "从排除的软件源安装 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "降级 %s 到 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "架构从 %s 变更到 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"安装 %s(包括厂商变更)\n"
-"  %s --> %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "将 %s 用 %s 取代"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "卸载 %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4953,74 +4657,78 @@ msgstr "正在执行 %p osttrans 脚本"
 msgid "Installation has been aborted as directed."
 msgstr "安装已按指示中止。"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " 已执行"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " 执行失败"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s 早已作为 %s 执行了)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " 中止时跳过执行"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "发送更新消息通知出错。"
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "新更新消息"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM 失败: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "从文件 %1% 中导入公钥失败"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "移除公钥 %1% 失败"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "未签署包!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s 配置文件有变化:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm 已将 %s 另存为 %s,但是无法确定两者的差异"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5030,13 +4738,13 @@ msgstr ""
 "以下是前 25 行差异:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm 已将 %s 创建为 %s,但是无法确定两者的差异"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5047,149 +4755,358 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "额外的 RPM 输出"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "已创建备份 %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "签名正确"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "未知签名类型"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "无法校验签名"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "签名正确,但密钥是非受信的"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "签名公钥不可用"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "文件不存在或无法检查其签名"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "未签署文件"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"下载 (curl) \"%s\" 时发生错误:\n"
+"错误代码:%s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"下载 (curl) \"%s\" 时发生错误:\n"
+"无法检索 HTTP 响应\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "“%s”对 %u 属于错误类型,字节校验和“%s”"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "无法打开 pty (%s)。"
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "无法打开管道 (%s)。"
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "无效的 LDAP URL 查询字符串"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "无效的 LDAP URL 查询参数 '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "无法克隆 URL 对象"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "无效的空 URL 对象引用"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "无法解析 URL 组件"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "历史:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "URL 方案不允许使用 %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "无效的 %s 组件 '%s'"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "无效的 %s 组件"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "不支持解析此 URL 的查询字符串"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "URL 方案是一个必需组件"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "无效的 URL 方案 '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "URL 方案不允许使用用户名"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "URL 方案不允许使用密码"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "URL 方案要求有主机组件"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "URL 方案不允许使用主机组件"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "无效的主机组件 '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "URL 方案不允许使用端口"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "无效的端口组件 '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "URL 方案要求有路径名"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "若存在认证则不允许相对路径"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "编码的字符串包含了一个 NUL 字节"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "无效的参数数组分割的分隔符"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "无效的参数映射分割的分隔符"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "无效的参数数组合并的分隔符"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "命令退出,状态 %d。"
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "命令已被信号 %d (%s) 杀死。"
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "命令退出,未知错误。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"下载 (curl) \"%s\" 时发生错误:\n"
-"错误代码:%s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "无法 chroot 到 '%s' (%s)。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "无法 chdir 到 '%s' (%s)。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "无法 chdir 到 %s,它在 chroot %s (%s) 中。"
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "无法执行 '%s' (%s)。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "无法派生 (%s)。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"下载 (curl) \"%s\" 时发生错误:\n"
-"无法检索 HTTP 响应\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s 不属于发行版升级源"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s 架构不对应"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "已安装的 %s 软件包有问题"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "没有什么能提供所需的 %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "您启用了全部请求的软件源了吗?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "软件包 %s 不存在"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s 由系统提供,无法擦除"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s 不可安装"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "没有什么能提供 %s,而它为 %s 所需"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "无法同时安装 %s 和 %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s 与 %s 冲突,后者由 %s 提供"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s 淘汰了 %s,后者由 %s 提供"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "已安装的 %s 淘汰了 %s,后者由 %s 提供"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "可解析项 %s 与自身提供的 %s 冲突"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s 需要 %s,但无法满足此需求"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "移除锁定以允许移除 %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "不安装 %s"
+
+#~ msgid "keep %s"
+#~ msgstr "保留 %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "移除锁定以允许安装 %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "不询问就安装一个提供 %s 的解析项"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "不询问就删除全部提供 %s 的解析项"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "不安装最新版本的 %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "保留 %s,即使架构不对应"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "尽管架构不对应仍安装 %s"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "保留已淘汰的 %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "从排除的软件源安装 %s"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "降级 %s 到 %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "架构从 %s 变更到 %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "安装 %s(包括厂商变更)\n"
+#~ "  %s --> %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "将 %s 用 %s 取代"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "卸载 %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "无法打开锁定文件:%s"
index 827efe5..5ce7a29 100644 (file)
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2021-03-07 04:25+0000\n"
 "Last-Translator: Grace Yu <grace.yu@excel-gits.com>\n"
 "Language-Team: Chinese (Taiwan) <https://l10n.opensuse.org/projects/libzypp/"
@@ -22,12 +22,6 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Weblate 3.6.1\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr "可疑的類型 '%s' (%u 位元組檢查總數 '%s')"
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "未知國家:"
@@ -1296,71 +1290,21 @@ msgstr "增強"
 msgid "Supplements"
 msgstr "補充"
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "無法開啟 pty (%s)。"
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "無法開啟管線 (%s)。"
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr "無法 chroot 到 '%s' (%s)。"
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr "無法切換目錄到 '%s' (在 chroot '%s' 中) (%s)。"
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "無法切換目錄到 '%s' (%s)。"
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr "無法執行 '%s' (%s)。"
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "無法 fork (%s)。"
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr "指令跳出,狀態 %d。"
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr "指令被信號 %d (%s) 中止。"
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr "因未知錯誤指令跳出。"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr "嘗試將不存在的金鑰 %s 匯入金鑰圈 %s"
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr "輸入金鑰失敗。"
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr "刪除金鑰失敗。"
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "找不到簽章檔 %s"
@@ -3764,52 +3708,52 @@ msgstr[0] "(在 %d 天內過期)"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr "尋找快取 %2% 中的 gpg 金鑰 ID %1%。"
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr "尋找套件庫 %2% 中的 gpg 金鑰 ID %1%。"
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr "套件庫 %1% 未定義額外的 'gpgkey=' URL。"
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr "無法讀取套件庫目錄 '%1%'︰權限遭拒"
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "無法讀取目錄 '%s'"
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr "無法讀取套件庫檔案 '%1%'︰權限遭拒"
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr "套件庫別名不能以點開始。"
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr "服務的別名不能以點開始。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "無法開啟檔案 '%s' 來寫入。"
@@ -3817,42 +3761,42 @@ msgstr "無法開啟檔案 '%s' 來寫入。"
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr "未知的服務 '%1%':正在移除落單的服務儲存庫 '%2%'"
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] "在指定的 URL 中找不到有效的中繼資訊"
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr "無法建立 %s"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr "無法建立中繼資料快取目錄。"
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr "正在建立套件庫 '%s' 的快取"
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr "無法在 %s 建立快取 - 無寫入權限。"
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "快取套件庫失敗 (%d)。"
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr "無法處理的套件庫類型"
 
@@ -3862,68 +3806,47 @@ msgstr "無法處理的套件庫類型"
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr "嘗試自 '%s' 讀取時發生錯誤"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "由 '%s' 讀取時發生未知錯誤"
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr "正在新增套件庫 '%s'"
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "'%s' 處的套件庫檔案名稱無效"
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "正在移除套件庫 '%s'"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr "無法找到套件庫儲存的位置。"
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "無法刪除 '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr "無法找到服務儲存的位置。"
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "無效的 LDAP URL 查詢字串"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "無效的 LDAP URL 查詢參數「%s」"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "無法複製 Url 物件"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "無效的空白 Url 物件參照"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "無法剖析 Url 元件"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "不明的"
@@ -3996,7 +3919,7 @@ msgstr "要取得支援,需要額外的使用者授權。"
 msgid "Unknown support option. Description not available"
 msgstr "未知的支援選項。 描述不適用"
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
@@ -4005,11 +3928,6 @@ msgstr ""
 "系統管理已被 pid 為 %d (%s) 的應用程式鎖定。\n"
 "請關閉此應用程式,然後重試。"
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr "歷史記錄:"
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4031,20 +3949,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "無效的正規表示法 '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr "%s 需要驗證"
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr "造訪 SUSE Customer Center 以檢查您的註冊是否有效以及是否過期。"
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4071,7 +3990,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr "嘗試執行動作 '%s' 時未開啟媒體。"
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "檔案 '%s' 無法在媒體 '%s' 中找到"
@@ -4177,7 +4096,7 @@ msgid "Permission to access '%s' denied."
 msgstr "存取 '%s' 的權限被拒絕。"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr "存取 '%s' 時超出限定時間。"
@@ -4188,7 +4107,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr "下載到的資料超出了預期檔案大小 %s/%s。"
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr "位置 '%s' 暫時無法存取。"
@@ -4204,7 +4123,7 @@ msgid ""
 "point"
 msgstr "建立裝載點:無法找到可寫入的目錄以建立裝載點"
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr "不支援的 HTTP 驗證方式 '%s'"
@@ -4263,7 +4182,7 @@ msgid "No url in repository."
 msgstr "套件庫中沒有 url。"
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4428,7 +4347,7 @@ msgstr "藉由忽略它的某些相依性以破壞 %s"
 msgid "generally ignore of some dependencies"
 msgstr "一般忽略某些相依性"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4436,161 +4355,151 @@ msgid ""
 msgstr "安裝的 %1% 不屬於版本升級套件庫,必須將其取代"
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr "要安裝的 %1% 不屬於版本升級套件庫"
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr "安裝的 %1% 的架構較低"
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr "要安裝的 %1% 的架構較低"
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr "安裝的 %1% 有問題"
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr "衝突的要求"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr "一些相依性問題"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr "沒有套件庫能提供所申請的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr "您是否啟用了全部所需的套件庫?"
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr "申請的套件 %1% 不存在"
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr "不支援的要求"
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr "\"%1%\" 由系統提供,無法去除"
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr "%1% 不可安裝"
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr "沒有套件庫能提供安裝的 %2% 所需的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr "沒有套件庫能提供要安裝的 %2% 所需的 \"%1%\""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr "無法同時安裝 %1% 和 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "安裝的 %1% 與安裝的 %3% 所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr "安裝的 %1% 與要安裝的 %3% 所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr "要安裝的 %1% 與安裝的 %3% 所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr "要安裝的 %1% 與要安裝的 %3% 所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "安裝的 %1% 會汰換安裝的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "安裝的 %1% 會汰換要安裝的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr "要安裝的 %1% 會汰換安裝的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr "要安裝的 %1% 會汰換要安裝的 %3% 所提供的 \"%2%\""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr "安裝的 %1% 與其自身所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr "要安裝的 %1% 與其自身所提供的 \"%2%\" 衝突"
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr "安裝的 %1% 需要 \"%2%\",但無法符合此要求"
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr "要安裝的 %1% 需要 \"%2%\",但無法符合此要求"
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr "已刪除的提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
@@ -4598,122 +4507,106 @@ msgstr ""
 "\n"
 "無法安裝的提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr "無法安裝的提供者: "
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr "移除鎖定以允許移除 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr "不安裝 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr "保留 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr "移除鎖定以允許安裝 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr "此要求將會破壞您的系統!"
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr "忽略損毀系統的警告"
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr "不詢問即安裝提供 %1% 的解決方案"
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr "不詢問即刪除提供 %1% 的所有解決方案"
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr "不安裝最新版本的 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr "即使架構較低,仍保留 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr "即使架構較低,仍安裝 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr "保留汰換的 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr "安裝來自已排除套件庫的 %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr "儘管 %1% 已收回,仍予以安裝"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr "允許安裝 PTF %1%"
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr "儘管 %1% 已列入黑名單,仍予以安裝"
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr "將 %1% 降級到 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr "架構從 %1% 變更為 %2%"
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4724,210 +4617,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
+msgstr ""
+
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
 msgid "replacement of %1% with %2%"
 msgstr "以 %2% 取代 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1518
 #, boost-format
 msgid "deinstallation of %1%"
 msgstr "解除安裝 %1%"
 
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr "%s 不屬於版本升級套件庫"
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s 有次要架構"
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "已安裝的套件 %s 發生問題"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "無法提供所需的 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr "是否已啟用所有需要的套件庫?"
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "套件 %s 不存在"
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s 由系統提供,無法清除"
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr "%s 無法安裝"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "無法提供 %s (%s 需要此項目)"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "無法同時安裝 %s 和 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s 與 %s 衝突 (由 %s 提供)"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s 汰換 %s (由 %s 提供)"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "安裝的 %s 會汰換 %s (由 %s 提供)"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "解決方案 %s 與 %s 衝突 (由其自己提供)"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr "%s 需要 %s,但無法提供此需求"
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr "解除鎖定以允許移除 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "請勿安裝 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "保留 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "解除鎖定以允許安裝 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "請勿要求安裝提供 %s 的解決方案"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "請勿要求刪除所有提供 %s 的解決方案"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr "請勿安裝最新版本的 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "保留 %s,忽略次要架構"
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "安裝 %s,忽略次要架構"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "保留過時的 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr "自排除的套件庫中安裝 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "降級 %s 到 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr "架構由 %s 變更為 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
-msgstr ""
-"安裝 %s (並變更廠商)\n"
-"  %s  -->  %s"
-
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
-msgstr "將 %s 取代為 %s"
-
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "反安裝 %s"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4944,74 +4648,78 @@ msgstr "正在執行 %p osttrans 程序檔"
 msgid "Installation has been aborted as directed."
 msgstr "安裝已如指示中止。"
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr " 已執行"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr " 執行失敗"
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr "%s 已作為 %s 執行)"
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr " 中止時跳過執行"
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr "發送更新訊息提醒失敗。"
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr "新的更新提醒"
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr "RPM 失敗: "
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr "從檔案 %1% 輸入公用金鑰失敗"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr "移除公用金鑰 %1% 失敗"
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr "套件未簽章!"
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "%s 的已變更組態檔:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "rpm 已將 %s 儲存為 %s,但看不出差異"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -5021,13 +4729,13 @@ msgstr ""
 "這是前 25 行差異:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "rpm 已將 %s 建立為 %s,但看不出差異"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5038,149 +4746,358 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr "其他 rpm 輸出"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "已建立備份 %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr "簽章驗證正確"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr "未知的簽章類型"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr "簽章無法驗證"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr "簽章驗證正確,然而金鑰是不被信任的"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr "簽章用的公開金鑰不存在"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr "檔案不存在或是簽章無法驗證"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr "檔案未簽章"
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+"下載 (curl) \"%s\" 時發生錯誤:\n"
+"錯誤代碼:%s\n"
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+"下載 (curl) \"%s\" 時發生錯誤:\n"
+"無法擷取 HTTP 回應\n"
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr "可疑的類型 '%s' (%u 位元組檢查總數 '%s')"
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "無法開啟 pty (%s)。"
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "無法開啟管線 (%s)。"
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "無效的 LDAP URL 查詢字串"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "無效的 LDAP URL 查詢參數「%s」"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "無法複製 Url 物件"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "無效的空白 Url 物件參照"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "無法剖析 Url 元件"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr "歷史記錄:"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Url 規劃不允許 %s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "無效的 %s 元件「%s」"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "無效的 %s 元件"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "此 URL 不支援查詢字串剖析"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Url 規劃為必要元件"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "無效的 Url 規劃「%s」"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Url 規劃不允許使用者名稱"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Url 規劃不允許密碼"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Url 規劃中必須要有主機元件"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Url 規劃不允許主機元件"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "無效的主機元件「%s」"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Url 規劃不允許連接埠"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "無效的連接埠元件 '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Url 規劃必須要有路徑名稱"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "如果授權存在,則不允許相對路徑"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "編碼字串包含 NUL 位元組"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "無效的參數陣列分割分隔符號字元"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "無效的參數映射分割分隔符號字元"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "無效的參數陣列加入分隔符號字元"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
+msgstr "指令跳出,狀態 %d。"
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
+#, c-format, boost-format
+msgid "Command was killed by signal %d (%s)."
+msgstr "指令被信號 %d (%s) 中止。"
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr "因未知錯誤指令跳出。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
 msgstr ""
-"下載 (curl) \"%s\" 時發生錯誤:\n"
-"錯誤代碼:%s\n"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Can't chroot to '%s' (%s)."
+msgstr "無法 chroot 到 '%s' (%s)。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "無法切換目錄到 '%s' (%s)。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr "無法切換目錄到 '%s' (在 chroot '%s' 中) (%s)。"
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr "無法執行 '%s' (%s)。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "無法 fork (%s)。"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
 msgstr ""
-"下載 (curl) \"%s\" 時發生錯誤:\n"
-"無法擷取 HTTP 回應\n"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#~ msgid "%s does not belong to a distupgrade repository"
+#~ msgstr "%s 不屬於版本升級套件庫"
+
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s 有次要架構"
+
+#~ msgid "problem with installed package %s"
+#~ msgstr "已安裝的套件 %s 發生問題"
+
+#~ msgid "nothing provides requested %s"
+#~ msgstr "無法提供所需的 %s"
+
+#~ msgid "Have you enabled all requested repositories?"
+#~ msgstr "是否已啟用所有需要的套件庫?"
+
+#~ msgid "package %s does not exist"
+#~ msgstr "套件 %s 不存在"
+
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s 由系統提供,無法清除"
+
+#~ msgid "%s is not installable"
+#~ msgstr "%s 無法安裝"
+
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "無法提供 %s (%s 需要此項目)"
+
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "無法同時安裝 %s 和 %s"
+
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s 與 %s 衝突 (由 %s 提供)"
+
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s 汰換 %s (由 %s 提供)"
+
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "安裝的 %s 會汰換 %s (由 %s 提供)"
+
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "解決方案 %s 與 %s 衝突 (由其自己提供)"
+
+#~ msgid "%s requires %s, but this requirement cannot be provided"
+#~ msgstr "%s 需要 %s,但無法提供此需求"
+
+#~ msgid "remove lock to allow removal of %s"
+#~ msgstr "解除鎖定以允許移除 %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "請勿安裝 %s"
+
+#~ msgid "keep %s"
+#~ msgstr "保留 %s"
+
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "解除鎖定以允許安裝 %s"
+
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "請勿要求安裝提供 %s 的解決方案"
+
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "請勿要求刪除所有提供 %s 的解決方案"
+
+#~ msgid "do not install most recent version of %s"
+#~ msgstr "請勿安裝最新版本的 %s"
+
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "保留 %s,忽略次要架構"
+
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "安裝 %s,忽略次要架構"
+
+#~ msgid "keep obsolete %s"
+#~ msgstr "保留過時的 %s"
+
+#~ msgid "install %s from excluded repository"
+#~ msgstr "自排除的套件庫中安裝 %s"
+
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "降級 %s 到 %s"
+
+#~ msgid "architecture change of %s to %s"
+#~ msgstr "架構由 %s 變更為 %s"
+
+#~ msgid ""
+#~ "install %s (with vendor change)\n"
+#~ "  %s  -->  %s"
+#~ msgstr ""
+#~ "安裝 %s (並變更廠商)\n"
+#~ "  %s  -->  %s"
+
+#~ msgid "replacement of %s with %s"
+#~ msgstr "將 %s 取代為 %s"
+
+#~ msgid "deinstallation of %s"
+#~ msgstr "反安裝 %s"
 
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "無法開啟鎖定檔案:%s"
index ca987d2..4dc13eb 100644 (file)
--- a/po/zu.po
+++ b/po/zu.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: 2006-11-03 12:03\n"
 "Last-Translator: Novell Language <language@novell.com>\n"
 "Language-Team: Novell Language <language@novell.com>\n"
@@ -14,12 +14,6 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr "Izwe elingaziwa:"
@@ -1293,74 +1287,23 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, fuzzy, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr "Couldn't open file: %s."
-
-#: zypp/ExternalProgram.cc:280
-#, fuzzy, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr "Ayikwazi ukuvula ifayela %1."
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, fuzzy, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr "Ayiyitholi i-%s."
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, fuzzy, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr "Ayiyitholi i-%s."
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-#, fuzzy
-msgid "Command exited with unknown error."
-msgstr "Ikhomandi ekhishwa lapho ixhumeka"
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 #, fuzzy
 msgid "Failed to import key."
 msgstr "Ayikwazanga ukuqala i-VM."
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 #, fuzzy
 msgid "Failed to delete key."
 msgstr "Ayikwazanga ukuqala i-VM."
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, fuzzy, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr "Into ayitholakali."
@@ -3767,54 +3710,54 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, fuzzy, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 #, fuzzy
 msgid "Repository alias cannot start with dot."
 msgstr "Igama le-VM alikwazi ukuqala ngenombolo."
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 #, fuzzy
 msgid "Service alias cannot start with dot."
 msgstr "Igama le-VM alikwazi ukuqala ngenombolo."
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, fuzzy, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr "Ayikwazi ukuvula ifayela ukuze ibhale."
@@ -3822,44 +3765,44 @@ msgstr "Ayikwazi ukuvula ifayela ukuze ibhale."
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, fuzzy, c-format, boost-format
 msgid "Can't create %s"
 msgstr "Ayikwazi ukuvula into esesendlalelweni (desktop) '%s'"
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 #, fuzzy
 msgid "Can't create metadata cache directory."
 msgstr "Ayikwazi ukwakha i-directory '%1'. %2."
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, fuzzy, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr "Failed to parse: %s."
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3869,68 +3812,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, fuzzy, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr "Kwenzeke iphutha lapho ifunda iflophi diski."
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, fuzzy, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr "Igama lefayela yokuthekelisa engekho emthethweni."
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, fuzzy, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr "Ukubuyisela imithombo yokwaziswa"
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, fuzzy, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr "Ayikwazi ukuvula into esesendlalelweni (desktop) '%s'"
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr "Uhlu lombuzo lwe-LDAP URL olunganembile"
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr "Ipharamitha yombuzo ye-LDAP URL enganembile '%s'"
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr "Ayikwazi ukukopisha into ye-Url"
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr "Into engenalutho ye-Url okubhekiselwe kuyo ayinembile"
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr "Ayikwazi ukucaza izingxenyana ze-Url"
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr "akwaziwa"
@@ -3998,19 +3920,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-#, fuzzy
-msgid "History:"
-msgstr "Linganisa Umlando"
-
 #: zypp/base/StrMatcher.cc:152
 #, fuzzy, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4032,20 +3948,21 @@ msgid "Invalid regular expression '%s'"
 msgstr "Uhlelo lwe-Url olungekho emthethweni '%s'"
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid ""
 "Visit the SUSE Customer Center to check whether your registration is valid "
 "and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid ""
 "Visit the Novell Customer Center to check whether your registration is valid "
 "and has not expired."
@@ -4072,7 +3989,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, fuzzy, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr "Ifayela %1 ayitholakali enqolobaneni yamafayela."
@@ -4176,7 +4093,7 @@ msgid "Permission to access '%s' denied."
 msgstr "Izimvume zinqatshiwe"
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4187,7 +4104,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4203,7 +4120,7 @@ msgid ""
 "point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4271,7 +4188,7 @@ msgid "No url in repository."
 msgstr "Ifayela %1 ayitholakali enqolobaneni yamafayela."
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4390,7 +4307,7 @@ msgstr "Sishaye indiva lesi sidingo lapha nje kuphela"
 msgid "generally ignore of some dependencies"
 msgstr "Sishaye indiva lesi sidingo lapha nje kuphela"
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid ""
 "the installed %1% does not belong to a distupgrade repository and must be "
@@ -4398,288 +4315,262 @@ msgid ""
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 #, fuzzy
 msgid "conflicting requests"
 msgstr "Isicelo Sokuxhuma kwi-:"
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 #, fuzzy
 msgid "some dependency problem"
 msgstr "Ayikwazi ukufaka %s ngenxa yezinkinga zohlelo oluncike kwezinye"
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid ""
 "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid ""
 "the to be installed %1% conflicts with '%2%' provided by the to be installed "
 "%3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid ""
 "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid ""
 "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid ""
 "the to be installed %1% requires '%2%', but this requirement cannot be "
 "provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 #, fuzzy
 msgid "deleted providers: "
 msgstr "Akukho okunikeza %s"
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 #, fuzzy
 msgid ""
 "\n"
 "not installable providers: "
 msgstr "Abekho abanye abaphakeli abafakiwe be-%s"
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 #, fuzzy
 msgid "not installable providers: "
 msgstr "Abekho abanye abaphakeli abafakiwe be-%s"
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 #, fuzzy
 msgid "This request will break your system!"
 msgstr "Isicelo sesikhona kakade."
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4688,208 +4579,21 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
+msgid ""
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1509
+#: zypp/solver/detail/SATResolver.cc:1507
 #, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, fuzzy, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr "%s ihlinzeka nge-%s, kodwa inobunye ubuciko bomklamo."
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, fuzzy, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr "ikhomandi yokukhipha amaphakheji"
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, fuzzy, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr "Akukho okunikeza %s"
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, fuzzy, c-format, boost-format
-msgid "package %s does not exist"
-msgstr "Idiski ayikho."
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, fuzzy, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr "%s ihluthulelwe futhi ngeke ikwazi ukukhipheka."
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, fuzzy, c-format, boost-format
-msgid "%s is not installable"
-msgstr "alufakiwe"
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, fuzzy, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr "%s idingwa yi- %s"
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, fuzzy, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr "Ayikwazi ukufaka %s"
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, fuzzy, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr "%s ixabana ne- %s"
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, fuzzy, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr "%s yenza zingasebenzi %s"
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, fuzzy, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr "%s yenza zingasebenzi %s"
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, fuzzy, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr "%s ixabana ne- %s"
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr "ungafaki %s"
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr "Gcina %s"
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, fuzzy, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr "ungafaki %s"
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, fuzzy, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr "Abekho abanye abaphakeli abafakiwe be-%s"
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, fuzzy, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr "Ungafaki noma ususe maqondana nezixazululi"
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, fuzzy, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr "%s ihlinzeka nge-%s, kodwa inobunye ubuciko bomklamo."
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, fuzzy, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr "Faka %s nakuba izoshintsha ubuciko bomklamo"
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, fuzzy, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr "%s yenza zingasebenzi %s"
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, fuzzy, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr "Ilande %s kwi-%s"
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
-msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, fuzzy, c-format, boost-format
-msgid "deinstallation of %s"
-msgstr "Ukufaka uhlelo"
-
 #. strip tmp file suffix
 #: zypp/target/RpmPostTransCollector.cc:105
 #, boost-format
@@ -4906,12 +4610,12 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr "Ukufaka kuyekiwe njengoba kunikezwe isiqondiso."
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 #, fuzzy
 msgid " executed"
 msgstr "Qalisa"
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 #, fuzzy
 msgid " execution failed"
 msgstr "DBI Execution failed: %s"
@@ -4919,65 +4623,69 @@ msgstr "DBI Execution failed: %s"
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 #, fuzzy
 msgid "Error sending update message notification."
 msgstr "Kwenzeke iphutha ngesikhathi kufakwa amakhodi okuphepha."
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 #, fuzzy
 msgid "RPM failed: "
 msgstr "ayiphumelelanga"
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr "Amafayela okuhlela ashintshile e-%s:"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, fuzzy, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr "I-rpm igcine %s njenge-%s kodwa bekungenakwenzeka ukubona umehluko"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4987,13 +4695,13 @@ msgstr ""
 "Nansi imigqa yokuqala engu-25 yomehluko:\n"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, fuzzy, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr "I-rpm yakhe %s njenge-%s kodwa bekungenakwenzeka ukubona umehluko"
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -5004,150 +4712,350 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 #, fuzzy
 msgid "Additional rpm output"
 msgstr "Okunye okukhishiwe kwe-rpm:"
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr "yakhe i-backup %s"
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 #, fuzzy
 msgid "Signature is OK"
 msgstr "Into ayitholakali."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 #, fuzzy
 msgid "Signature does not verify"
 msgstr "Into ayitholakali."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 #, fuzzy
 msgid "Signature is OK, but key is not trusted"
 msgstr "Into ayitholakali."
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, fuzzy, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr "Couldn't open file: %s."
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, fuzzy, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr "Ayikwazi ukuvula ifayela %1."
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr "Uhlu lombuzo lwe-LDAP URL olunganembile"
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr "Ipharamitha yombuzo ye-LDAP URL enganembile '%s'"
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr "Ayikwazi ukukopisha into ye-Url"
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr "Into engenalutho ye-Url okubhekiselwe kuyo ayinembile"
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr "Ayikwazi ukucaza izingxenyana ze-Url"
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+#, fuzzy
+msgid "History:"
+msgstr "Linganisa Umlando"
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr "Uhlelo lwe-URL aluyivumeli i-%s"
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr "Ingxenyana '%s' engekho emthethweni %s"
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr "Ingxenyana engekho emthethweni %s"
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr "Ukucazwa kohlu lwemibuzo akusekelwa kule-URL"
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr "Uhlelo lwe-Url luyingxenyana edingekayo"
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr "Uhlelo lwe-Url olungekho emthethweni '%s'"
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr "Uhlelo lwe-URL alulivumeli igama lomsebenzisi"
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr "Uhlelo lwe-URL aluyivumeli iphasiwedi"
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr "Uhlelo lwe-Url ludinga ingxenyana yesiphakeli"
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr "Uhlelo lwe-URL aluyivumeli ingxenyana yesiphakeli"
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr "Ingxenyana engekho emthethweni '%s'"
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr "Uhlelo lwe-URL aluyivumeli iphasiwedi"
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr "Ingxenyana engekho emthethweni '%s'"
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr "Uhlelo lwe-Url ludinga igama lomgudu"
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr "Umgudu ongaphelele awuvunyelwe uma kunegunya"
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr "Uhlu olufakwe amakhodi okuphepha lune-NUL byte"
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr "Iqoqo lepharamitha elinganembile lihlakaza uhlamvu oluhlukanisayo"
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr "Ibalazwe lepharamitha elinganembile lihlakaza uhlamvu oluhlukanisayo"
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr "Iqoqo lepharamitha elinganembile lihlanganisa uhlamvu oluhlukanisayo"
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+#, fuzzy
+msgid "Command exited with unknown error."
+msgstr "Ikhomandi ekhishwa lapho ixhumeka"
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, fuzzy, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr "Ayiyitholi i-%s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, fuzzy, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr "Ayiyitholi i-%s."
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
 msgstr ""
 
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
+msgstr ""
+
+#, fuzzy
+#~ msgid "%s has inferior architecture"
+#~ msgstr "%s ihlinzeka nge-%s, kodwa inobunye ubuciko bomklamo."
+
+#, fuzzy
+#~ msgid "problem with installed package %s"
+#~ msgstr "ikhomandi yokukhipha amaphakheji"
+
+#, fuzzy
+#~ msgid "nothing provides requested %s"
+#~ msgstr "Akukho okunikeza %s"
+
+#, fuzzy
+#~ msgid "package %s does not exist"
+#~ msgstr "Idiski ayikho."
+
+#, fuzzy
+#~ msgid "%s is provided by the system and cannot be erased"
+#~ msgstr "%s ihluthulelwe futhi ngeke ikwazi ukukhipheka."
+
+#, fuzzy
+#~ msgid "%s is not installable"
+#~ msgstr "alufakiwe"
+
+#, fuzzy
+#~ msgid "nothing provides %s needed by %s"
+#~ msgstr "%s idingwa yi- %s"
+
+#, fuzzy
+#~ msgid "cannot install both %s and %s"
+#~ msgstr "Ayikwazi ukufaka %s"
+
+#, fuzzy
+#~ msgid "%s conflicts with %s provided by %s"
+#~ msgstr "%s ixabana ne- %s"
+
+#, fuzzy
+#~ msgid "%s obsoletes %s provided by %s"
+#~ msgstr "%s yenza zingasebenzi %s"
+
+#, fuzzy
+#~ msgid "installed %s obsoletes %s provided by %s"
+#~ msgstr "%s yenza zingasebenzi %s"
+
+#, fuzzy
+#~ msgid "solvable %s conflicts with %s provided by itself"
+#~ msgstr "%s ixabana ne- %s"
+
+#~ msgid "do not install %s"
+#~ msgstr "ungafaki %s"
+
+#~ msgid "keep %s"
+#~ msgstr "Gcina %s"
+
+#, fuzzy
+#~ msgid "remove lock to allow installation of %s"
+#~ msgstr "ungafaki %s"
+
+#, fuzzy
+#~ msgid "do not ask to install a solvable providing %s"
+#~ msgstr "Abekho abanye abaphakeli abafakiwe be-%s"
+
+#, fuzzy
+#~ msgid "do not ask to delete all solvables providing %s"
+#~ msgstr "Ungafaki noma ususe maqondana nezixazululi"
+
+#, fuzzy
+#~ msgid "keep %s despite the inferior architecture"
+#~ msgstr "%s ihlinzeka nge-%s, kodwa inobunye ubuciko bomklamo."
+
+#, fuzzy
+#~ msgid "install %s despite the inferior architecture"
+#~ msgstr "Faka %s nakuba izoshintsha ubuciko bomklamo"
+
+#, fuzzy
+#~ msgid "keep obsolete %s"
+#~ msgstr "%s yenza zingasebenzi %s"
+
+#, fuzzy
+#~ msgid "downgrade of %s to %s"
+#~ msgstr "Ilande %s kwi-%s"
+
+#, fuzzy
+#~ msgid "deinstallation of %s"
+#~ msgstr "Ukufaka uhlelo"
+
 #, fuzzy
 #~ msgid "Can't open lock file: %s"
 #~ msgstr "Ayikwazi ukuvula ifayela %1."
index a0a0361..81211a9 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: zypp\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-30 14:04+0200\n"
+"POT-Creation-Date: 2021-07-26 11:04+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,12 +18,6 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#. dubious: Throw on malformed known types, otherwise log a warning.
-#: zypp/CheckSum.cc:136
-#, c-format, boost-format
-msgid "Dubious type '%s' for %u byte checksum '%s'"
-msgstr ""
-
 #: zypp/CountryCode.cc:50
 msgid "Unknown country: "
 msgstr ""
@@ -1292,71 +1286,21 @@ msgstr ""
 msgid "Supplements"
 msgstr ""
 
-#: zypp/ExternalProgram.cc:269
-#, c-format, boost-format
-msgid "Can't open pty (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:280
-#, c-format, boost-format
-msgid "Can't open pipe (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:365
-#, c-format, boost-format
-msgid "Can't chroot to '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:375
-#, c-format, boost-format
-msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:376
-#, c-format, boost-format
-msgid "Can't chdir to '%s' (%s)."
-msgstr ""
-
-#. don't want to get here
-#: zypp/ExternalProgram.cc:405
-#, c-format, boost-format
-msgid "Can't exec '%s' (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:413
-#, c-format, boost-format
-msgid "Can't fork (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:543
-#, c-format, boost-format
-msgid "Command exited with status %d."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:563
-#, c-format, boost-format
-msgid "Command was killed by signal %d (%s)."
-msgstr ""
-
-#: zypp/ExternalProgram.cc:568
-msgid "Command exited with unknown error."
-msgstr ""
-
 #. TranslatorExplanation first %s is key name, second is keyring name
-#: zypp/KeyRing.cc:590
+#: zypp/KeyRing.cc:753
 #, c-format, boost-format
 msgid "Tried to import not existent key %s into keyring %s"
 msgstr ""
 
-#: zypp/KeyRing.cc:596
+#: zypp/KeyRing.cc:759
 msgid "Failed to import key."
 msgstr ""
 
-#: zypp/KeyRing.cc:603
+#: zypp/KeyRing.cc:766
 msgid "Failed to delete key."
 msgstr ""
 
-#: zypp/KeyRing.cc:609
+#: zypp/KeyRing.cc:772
 #, c-format, boost-format
 msgid "Signature file %s not found"
 msgstr ""
@@ -3761,52 +3705,52 @@ msgstr[1] ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a cache directories path
-#: zypp/RepoInfo.cc:548
+#: zypp/RepoInfo.cc:547
 #, boost-format
 msgid "Looking for gpg key ID %1% in cache %2%."
 msgstr ""
 
 #. translator: %1% is a gpg key ID like 3DBDC284
 #. %2% is a repositories name
-#: zypp/RepoInfo.cc:576
+#: zypp/RepoInfo.cc:575
 #, boost-format
 msgid "Looking for gpg key ID %1% in repository %2%."
 msgstr ""
 
 #. translator: %1% is a repositories name
-#: zypp/RepoInfo.cc:600
+#: zypp/RepoInfo.cc:599
 #, boost-format
 msgid "Repository %1% does not define additional 'gpgkey=' URLs."
 msgstr ""
 
-#: zypp/RepoManager.cc:312
+#: zypp/RepoManager.cc:313
 #, boost-format
 msgid "Cannot read repo directory '%1%': Permission denied"
 msgstr ""
 
 #. TranslatorExplanation '%s' is a pathname
-#: zypp/RepoManager.cc:320 zypp/RepoManager.cc:783 zypp/RepoManager.cc:1568
+#: zypp/RepoManager.cc:321 zypp/RepoManager.cc:784 zypp/RepoManager.cc:1569
 #: zypp/repo/PluginServices.cc:49
 #, c-format, boost-format
 msgid "Failed to read directory '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:330
+#: zypp/RepoManager.cc:331
 #, boost-format
 msgid "Cannot read repo file '%1%': Permission denied"
 msgstr ""
 
-#: zypp/RepoManager.cc:353
+#: zypp/RepoManager.cc:354
 msgid "Repository alias cannot start with dot."
 msgstr ""
 
-#: zypp/RepoManager.cc:364
+#: zypp/RepoManager.cc:365
 msgid "Service alias cannot start with dot."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:738 zypp/RepoManager.cc:1686 zypp/RepoManager.cc:1752
-#: zypp/RepoManager.cc:1830 zypp/RepoManager.cc:1895 zypp/RepoManager.cc:2026
+#: zypp/RepoManager.cc:739 zypp/RepoManager.cc:1687 zypp/RepoManager.cc:1753
+#: zypp/RepoManager.cc:1831 zypp/RepoManager.cc:1896 zypp/RepoManager.cc:2027
 #, c-format, boost-format
 msgid "Can't open file '%s' for writing."
 msgstr ""
@@ -3814,43 +3758,43 @@ msgstr ""
 #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service.
 #. %1% = service name
 #. %2% = repository name
-#: zypp/RepoManager.cc:874
+#: zypp/RepoManager.cc:875
 #, boost-format
 msgid "Unknown service '%1%': Removing orphaned service repository '%2%'"
 msgstr ""
 
 #. we will throw this later if no URL checks out fine
-#: zypp/RepoManager.cc:1119
+#: zypp/RepoManager.cc:1120
 msgid "Valid metadata not found at specified URL"
 msgid_plural "Valid metadata not found at specified URLs"
 msgstr[0] ""
 msgstr[1] ""
 
-#: zypp/RepoManager.cc:1171 zypp/RepoManager.cc:1284 zypp/RepoManager.cc:1340
+#: zypp/RepoManager.cc:1172 zypp/RepoManager.cc:1285 zypp/RepoManager.cc:1341
 #, c-format, boost-format
 msgid "Can't create %s"
 msgstr ""
 
-#: zypp/RepoManager.cc:1179
+#: zypp/RepoManager.cc:1180
 msgid "Can't create metadata cache directory."
 msgstr ""
 
-#: zypp/RepoManager.cc:1326
+#: zypp/RepoManager.cc:1327
 #, c-format, boost-format
 msgid "Building repository '%s' cache"
 msgstr ""
 
-#: zypp/RepoManager.cc:1346
+#: zypp/RepoManager.cc:1347
 #, c-format, boost-format
 msgid "Can't create cache at %s - no writing permissions."
 msgstr ""
 
-#: zypp/RepoManager.cc:1411
+#: zypp/RepoManager.cc:1412
 #, c-format, boost-format
 msgid "Failed to cache repo (%d)."
 msgstr ""
 
-#: zypp/RepoManager.cc:1422
+#: zypp/RepoManager.cc:1423
 msgid "Unhandled repository type"
 msgstr ""
 
@@ -3860,68 +3804,47 @@ msgstr ""
 #. on ftp file-not-found(bnc #335906). Instead we'll check another types
 #. before throwing.
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1459 zypp/RepoManager.cc:2521
+#: zypp/RepoManager.cc:1460 zypp/RepoManager.cc:2522
 #, c-format, boost-format
 msgid "Error trying to read from '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1512 zypp/RepoManager.cc:2529
+#: zypp/RepoManager.cc:1513 zypp/RepoManager.cc:2530
 #, c-format, boost-format
 msgid "Unknown error reading from '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1650
+#: zypp/RepoManager.cc:1651
 #, c-format, boost-format
 msgid "Adding repository '%s'"
 msgstr ""
 
 #. TranslatorExplanation '%s' is an URL
-#: zypp/RepoManager.cc:1738
+#: zypp/RepoManager.cc:1739
 #, c-format, boost-format
 msgid "Invalid repo file name at '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1779
+#: zypp/RepoManager.cc:1780
 #, c-format, boost-format
 msgid "Removing repository '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:1798 zypp/RepoManager.cc:1876
+#: zypp/RepoManager.cc:1799 zypp/RepoManager.cc:1877
 msgid "Can't figure out where the repo is stored."
 msgstr ""
 
 #. TranslatorExplanation '%s' is a filename
-#: zypp/RepoManager.cc:1812 zypp/RepoManager.cc:2014
+#: zypp/RepoManager.cc:1813 zypp/RepoManager.cc:2015
 #, c-format, boost-format
 msgid "Can't delete '%s'"
 msgstr ""
 
-#: zypp/RepoManager.cc:2002 zypp/RepoManager.cc:2452
+#: zypp/RepoManager.cc:2003 zypp/RepoManager.cc:2453
 msgid "Can't figure out where the service is stored."
 msgstr ""
 
-#: zypp/Url.cc:114
-msgid "Invalid LDAP URL query string"
-msgstr ""
-
-#: zypp/Url.cc:153
-#, c-format, boost-format
-msgid "Invalid LDAP URL query parameter '%s'"
-msgstr ""
-
-#: zypp/Url.cc:301
-msgid "Unable to clone Url object"
-msgstr ""
-
-#: zypp/Url.cc:314
-msgid "Invalid empty Url object reference"
-msgstr ""
-
-#: zypp/Url.cc:327 zypp/Url.cc:341
-msgid "Unable to parse Url components"
-msgstr ""
-
 #: zypp/VendorSupportOptions.cc:14
 msgid "unknown"
 msgstr ""
@@ -3978,18 +3901,13 @@ msgstr ""
 msgid "Unknown support option. Description not available"
 msgstr ""
 
-#: zypp/ZYppFactory.cc:398
+#: zypp/ZYppFactory.cc:403
 #, c-format, boost-format
 msgid ""
 "System management is locked by the application with pid %d (%s).\n"
 "Close this application before trying again."
 msgstr ""
 
-#. TranslatorExplanation followed by the list of error messages that lead to this exception
-#: zypp/base/Exception.cc:134
-msgid "History:"
-msgstr ""
-
 #: zypp/base/StrMatcher.cc:152
 #, c-format, boost-format
 msgid "Unknown match mode '%s'"
@@ -4011,18 +3929,19 @@ msgid "Invalid regular expression '%s'"
 msgstr ""
 
 #. !\todo add comma to the message for the next release
-#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1382
+#: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1261
+#: zypp/zyppng/media/medianetwork.cc:581
 #, c-format, boost-format
 msgid "Authentication required for '%s'"
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:755
-#: zypp/zyppng/media/network/networkrequesterror.cc:116
+#: zypp/media/MediaCurl.cc:634
+#: zypp/zyppng/media/network/networkrequesterror.cc:127
 msgid "Visit the SUSE Customer Center to check whether your registration is valid and has not expired."
 msgstr ""
 
-#: zypp/media/MediaCurl.cc:757
-#: zypp/zyppng/media/network/networkrequesterror.cc:118
+#: zypp/media/MediaCurl.cc:636
+#: zypp/zyppng/media/network/networkrequesterror.cc:129
 msgid "Visit the Novell Customer Center to check whether your registration is valid and has not expired."
 msgstr ""
 
@@ -4047,7 +3966,7 @@ msgid "Medium not opened when trying to perform action '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:58
-#: zypp/zyppng/media/network/networkrequesterror.cc:127
+#: zypp/zyppng/media/network/networkrequesterror.cc:138
 #, c-format, boost-format
 msgid "File '%s' not found on medium '%s'"
 msgstr ""
@@ -4150,7 +4069,7 @@ msgid "Permission to access '%s' denied."
 msgstr ""
 
 #: zypp/media/MediaException.cc:189
-#: zypp/zyppng/media/network/networkrequesterror.cc:111
+#: zypp/zyppng/media/network/networkrequesterror.cc:122
 #, c-format, boost-format
 msgid "Timeout exceeded when accessing '%s'."
 msgstr ""
@@ -4161,7 +4080,7 @@ msgid "Downloaded data exceeded the expected filesize '%s' of '%s'."
 msgstr ""
 
 #: zypp/media/MediaException.cc:205
-#: zypp/zyppng/media/network/networkrequesterror.cc:107
+#: zypp/zyppng/media/network/networkrequesterror.cc:118
 #, c-format, boost-format
 msgid "Location '%s' is temporarily unaccessible."
 msgstr ""
@@ -4175,7 +4094,7 @@ msgstr ""
 msgid "Create attach point: Can't find a writable directory to create an attach point"
 msgstr ""
 
-#: zypp/media/MediaUserAuth.cc:140
+#: zypp/media/MediaUserAuth.cc:150
 #, c-format, boost-format
 msgid "Unsupported HTTP authentication method '%s'"
 msgstr ""
@@ -4232,7 +4151,7 @@ msgid "No url in repository."
 msgstr ""
 
 #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium.
-#: zypp/repo/SUSEMediaVerifier.cc:103
+#: zypp/repo/SUSEMediaVerifier.cc:104
 #, boost-format
 msgid "Expected medium %1%/%2% identified by file '%3%' with content:"
 msgstr ""
@@ -4349,280 +4268,254 @@ msgstr ""
 msgid "generally ignore of some dependencies"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1090
+#: zypp/solver/detail/SATResolver.cc:1089
 #, boost-format
 msgid "the installed %1% does not belong to a distupgrade repository and must be replaced"
 msgstr ""
 
 #. just in case
-#: zypp/solver/detail/SATResolver.cc:1092
+#: zypp/solver/detail/SATResolver.cc:1091
 #, boost-format
 msgid "the to be installed %1% does not belong to a distupgrade repository"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1096
+#: zypp/solver/detail/SATResolver.cc:1095
 #, boost-format
 msgid "the installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1098
+#: zypp/solver/detail/SATResolver.cc:1097
 #, boost-format
 msgid "the to be installed %1% has inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1101
+#: zypp/solver/detail/SATResolver.cc:1100
 #, boost-format
 msgid "problem with the installed %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1104
-#: zypp/solver/detail/SATResolver.cc:1572
-#: zypp/solver/detail/SATResolver.cc:2102
+#: zypp/solver/detail/SATResolver.cc:1103
 msgid "conflicting requests"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1107
-#: zypp/solver/detail/SATResolver.cc:1575
-#: zypp/solver/detail/SATResolver.cc:2104
+#: zypp/solver/detail/SATResolver.cc:1106
 msgid "some dependency problem"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1109
 #, boost-format
 msgid "nothing provides the requested '%1%'"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1111
-#: zypp/solver/detail/SATResolver.cc:1115
+#: zypp/solver/detail/SATResolver.cc:1110
+#: zypp/solver/detail/SATResolver.cc:1114
 msgid "Have you enabled all the required repositories?"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1114
+#: zypp/solver/detail/SATResolver.cc:1113
 #, boost-format
 msgid "the requested package %1% does not exist"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1118
-#: zypp/solver/detail/SATResolver.cc:1586
-#: zypp/solver/detail/SATResolver.cc:2112
+#: zypp/solver/detail/SATResolver.cc:1117
 msgid "unsupported request"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1121
+#: zypp/solver/detail/SATResolver.cc:1120
 #, boost-format
 msgid "'%1%' is provided by the system and cannot be erased"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1124
+#: zypp/solver/detail/SATResolver.cc:1123
 #, boost-format
 msgid "%1% is not installable"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1129
+#: zypp/solver/detail/SATResolver.cc:1128
 #, boost-format
 msgid "nothing provides '%1%' needed by the installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1131
+#: zypp/solver/detail/SATResolver.cc:1130
 #, boost-format
 msgid "nothing provides '%1%' needed by the to be installed %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1134
+#: zypp/solver/detail/SATResolver.cc:1133
 #, boost-format
 msgid "cannot install both %1% and %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1139
+#: zypp/solver/detail/SATResolver.cc:1138
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1141
+#: zypp/solver/detail/SATResolver.cc:1140
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1145
+#: zypp/solver/detail/SATResolver.cc:1144
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1147
+#: zypp/solver/detail/SATResolver.cc:1146
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1154
+#: zypp/solver/detail/SATResolver.cc:1153
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1156
+#: zypp/solver/detail/SATResolver.cc:1155
 #, boost-format
 msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1160
+#: zypp/solver/detail/SATResolver.cc:1159
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1162
+#: zypp/solver/detail/SATResolver.cc:1161
 #, boost-format
 msgid "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1167
+#: zypp/solver/detail/SATResolver.cc:1166
 #, boost-format
 msgid "the installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1169
+#: zypp/solver/detail/SATResolver.cc:1168
 #, boost-format
 msgid "the to be installed %1% conflicts with '%2%' provided by itself"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1201
+#: zypp/solver/detail/SATResolver.cc:1200
 #, boost-format
 msgid "the installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1203
+#: zypp/solver/detail/SATResolver.cc:1202
 #, boost-format
 msgid "the to be installed %1% requires '%2%', but this requirement cannot be provided"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1205
-#: zypp/solver/detail/SATResolver.cc:1644
-#: zypp/solver/detail/SATResolver.cc:2133
+#: zypp/solver/detail/SATResolver.cc:1204
 msgid "deleted providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1215
-#: zypp/solver/detail/SATResolver.cc:1654
-#: zypp/solver/detail/SATResolver.cc:2134
+#: zypp/solver/detail/SATResolver.cc:1214
 msgid ""
 "\n"
 "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1217
-#: zypp/solver/detail/SATResolver.cc:1656
-#: zypp/solver/detail/SATResolver.cc:2135
+#: zypp/solver/detail/SATResolver.cc:1216
 msgid "not installable providers: "
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1279
+#: zypp/solver/detail/SATResolver.cc:1278
 #, boost-format
 msgid "remove lock to allow removal of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1284
-#: zypp/solver/detail/SATResolver.cc:1320
+#: zypp/solver/detail/SATResolver.cc:1283
+#: zypp/solver/detail/SATResolver.cc:1319
 #, boost-format
 msgid "do not install %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1299
-#: zypp/solver/detail/SATResolver.cc:1341
+#: zypp/solver/detail/SATResolver.cc:1298
+#: zypp/solver/detail/SATResolver.cc:1340
 #, boost-format
 msgid "keep %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1304
+#: zypp/solver/detail/SATResolver.cc:1303
 #, boost-format
 msgid "remove lock to allow installation of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1355
-#: zypp/solver/detail/SATResolver.cc:1376
-#: zypp/solver/detail/SATResolver.cc:1794
-#: zypp/solver/detail/SATResolver.cc:1815
-#: zypp/solver/detail/SATResolver.cc:2150
-#: zypp/solver/detail/SATResolver.cc:2154
+#: zypp/solver/detail/SATResolver.cc:1354
+#: zypp/solver/detail/SATResolver.cc:1375
 msgid "This request will break your system!"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1356
-#: zypp/solver/detail/SATResolver.cc:1377
-#: zypp/solver/detail/SATResolver.cc:1795
-#: zypp/solver/detail/SATResolver.cc:1816
-#: zypp/solver/detail/SATResolver.cc:2151
-#: zypp/solver/detail/SATResolver.cc:2155
+#: zypp/solver/detail/SATResolver.cc:1355
+#: zypp/solver/detail/SATResolver.cc:1376
 msgid "ignore the warning of a broken system"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1361
+#: zypp/solver/detail/SATResolver.cc:1360
 #, boost-format
 msgid "do not ask to install a solvable providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1383
+#: zypp/solver/detail/SATResolver.cc:1382
 #, boost-format
 msgid "do not ask to delete all solvables providing %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1396
+#: zypp/solver/detail/SATResolver.cc:1395
 #, boost-format
 msgid "do not install most recent version of %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1417
+#: zypp/solver/detail/SATResolver.cc:1416
 #, boost-format
 msgid "keep %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1422
+#: zypp/solver/detail/SATResolver.cc:1421
 #, boost-format
 msgid "install %1% despite the inferior architecture"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1431
+#: zypp/solver/detail/SATResolver.cc:1430
 #, boost-format
 msgid "keep obsolete %1%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1436
+#: zypp/solver/detail/SATResolver.cc:1435
 #, boost-format
 msgid "install %1% from excluded repository"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1450
-#: zypp/solver/detail/SATResolver.cc:1889
-#: zypp/solver/detail/SATResolver.cc:2169
+#: zypp/solver/detail/SATResolver.cc:1449
 #, boost-format
 msgid "install %1% although it has been retracted"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1453
-#: zypp/solver/detail/SATResolver.cc:1892
-#: zypp/solver/detail/SATResolver.cc:2170
+#: zypp/solver/detail/SATResolver.cc:1452
 #, boost-format
 msgid "allow to install the PTF %1%"
 msgstr ""
 
 #. translator: %1% is a package name
-#: zypp/solver/detail/SATResolver.cc:1456
-#: zypp/solver/detail/SATResolver.cc:1895
-#: zypp/solver/detail/SATResolver.cc:2171
+#: zypp/solver/detail/SATResolver.cc:1455
 #, boost-format
 msgid "install %1% although it is blacklisted"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1476
+#: zypp/solver/detail/SATResolver.cc:1475
 #, boost-format
 msgid "downgrade of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1483
+#: zypp/solver/detail/SATResolver.cc:1482
 #, boost-format
 msgid "architecture change of %1% to %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1492
+#: zypp/solver/detail/SATResolver.cc:1493
 #, boost-format
 msgid ""
 "install %1% (with vendor change)\n"
@@ -4631,206 +4524,19 @@ msgstr ""
 
 #: zypp/solver/detail/SATResolver.cc:1498
 #, boost-format
-msgid "replacement of %1% with %2%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1509
-#, boost-format
-msgid "deinstallation of %1%"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1563
-#: zypp/solver/detail/SATResolver.cc:2096
-#, c-format, boost-format
-msgid "%s does not belong to a distupgrade repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1566
-#: zypp/solver/detail/SATResolver.cc:2098
-#, c-format, boost-format
-msgid "%s has inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1569
-#: zypp/solver/detail/SATResolver.cc:2100
-#, c-format, boost-format
-msgid "problem with installed package %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1578
-#: zypp/solver/detail/SATResolver.cc:2106
-#, c-format, boost-format
-msgid "nothing provides requested %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1579
-#: zypp/solver/detail/SATResolver.cc:1583
-#: zypp/solver/detail/SATResolver.cc:2107
-#: zypp/solver/detail/SATResolver.cc:2110
-msgid "Have you enabled all requested repositories?"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1582
-#: zypp/solver/detail/SATResolver.cc:2109
-#, c-format, boost-format
-msgid "package %s does not exist"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1589
-#: zypp/solver/detail/SATResolver.cc:2114
-#, c-format, boost-format
-msgid "%s is provided by the system and cannot be erased"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1592
-#: zypp/solver/detail/SATResolver.cc:2116
-#, c-format, boost-format
-msgid "%s is not installable"
-msgstr ""
-
-#. for setting weak dependencies
-#: zypp/solver/detail/SATResolver.cc:1596
-#: zypp/solver/detail/SATResolver.cc:2119
-#, c-format, boost-format
-msgid "nothing provides %s needed by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1599
-#: zypp/solver/detail/SATResolver.cc:2121
-#, c-format, boost-format
-msgid "cannot install both %s and %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1602
-#: zypp/solver/detail/SATResolver.cc:2123
-#, c-format, boost-format
-msgid "%s conflicts with %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1605
-#: zypp/solver/detail/SATResolver.cc:2125
-#, c-format, boost-format
-msgid "%s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1608
-#: zypp/solver/detail/SATResolver.cc:2127
-#, c-format, boost-format
-msgid "installed %s obsoletes %s provided by %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1611
-#: zypp/solver/detail/SATResolver.cc:2129
-#, c-format, boost-format
-msgid "solvable %s conflicts with %s provided by itself"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1642
-#: zypp/solver/detail/SATResolver.cc:2131
-#, c-format, boost-format
-msgid "%s requires %s, but this requirement cannot be provided"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1718
-#: zypp/solver/detail/SATResolver.cc:2140
-#, c-format, boost-format
-msgid "remove lock to allow removal of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1723
-#: zypp/solver/detail/SATResolver.cc:1759
-#: zypp/solver/detail/SATResolver.cc:2141
-#: zypp/solver/detail/SATResolver.cc:2146
-#, c-format, boost-format
-msgid "do not install %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1738
-#: zypp/solver/detail/SATResolver.cc:1780
-#: zypp/solver/detail/SATResolver.cc:2143
-#: zypp/solver/detail/SATResolver.cc:2148
-#, c-format, boost-format
-msgid "keep %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1743
-#: zypp/solver/detail/SATResolver.cc:2144
-#, c-format, boost-format
-msgid "remove lock to allow installation of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1800
-#: zypp/solver/detail/SATResolver.cc:2152
-#, c-format, boost-format
-msgid "do not ask to install a solvable providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1822
-#: zypp/solver/detail/SATResolver.cc:2156
-#, c-format, boost-format
-msgid "do not ask to delete all solvables providing %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1835
-#: zypp/solver/detail/SATResolver.cc:2158
-#, c-format, boost-format
-msgid "do not install most recent version of %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1856
-#: zypp/solver/detail/SATResolver.cc:2161
-#, c-format, boost-format
-msgid "keep %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1861
-#: zypp/solver/detail/SATResolver.cc:2162
-#, c-format, boost-format
-msgid "install %s despite the inferior architecture"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1870
-#: zypp/solver/detail/SATResolver.cc:2165
-#, c-format, boost-format
-msgid "keep obsolete %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1875
-#: zypp/solver/detail/SATResolver.cc:2166
-#, c-format, boost-format
-msgid "install %s from excluded repository"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1915
-#: zypp/solver/detail/SATResolver.cc:2174
-#, c-format, boost-format
-msgid "downgrade of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1922
-#: zypp/solver/detail/SATResolver.cc:2175
-#, c-format, boost-format
-msgid "architecture change of %s to %s"
-msgstr ""
-
-#: zypp/solver/detail/SATResolver.cc:1931
-#: zypp/solver/detail/SATResolver.cc:2176
-#, c-format, boost-format
 msgid ""
-"install %s (with vendor change)\n"
-"  %s  -->  %s"
+"install %1% from vendor %2%\n"
+"  replacing %3% from vendor %4%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1940
-#: zypp/solver/detail/SATResolver.cc:2177
-#, c-format, boost-format
-msgid "replacement of %s with %s"
+#: zypp/solver/detail/SATResolver.cc:1507
+#, boost-format
+msgid "replacement of %1% with %2%"
 msgstr ""
 
-#: zypp/solver/detail/SATResolver.cc:1951
-#: zypp/solver/detail/SATResolver.cc:2179
-#, c-format, boost-format
-msgid "deinstallation of %s"
+#: zypp/solver/detail/SATResolver.cc:1518
+#, boost-format
+msgid "deinstallation of %1%"
 msgstr ""
 
 #. strip tmp file suffix
@@ -4849,74 +4555,78 @@ msgstr ""
 msgid "Installation has been aborted as directed."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:397
+#: zypp/target/TargetImpl.cc:417
 msgid " executed"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:419
+#: zypp/target/TargetImpl.cc:439
 msgid " execution failed"
 msgstr ""
 
 #. translators: We may find the same script content in files with different names.
 #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line
 #. message for a log file. Preferably start translation with "%s"
-#: zypp/target/TargetImpl.cc:536
+#: zypp/target/TargetImpl.cc:556
 #, c-format, boost-format
 msgid "%s already executed as %s)"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:546
+#: zypp/target/TargetImpl.cc:566
 msgid " execution skipped while aborting"
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:601 zypp/target/TargetImpl.cc:621
-#: zypp/target/TargetImpl.cc:649 zypp/target/TargetImpl.cc:686
-#: zypp/target/TargetImpl.cc:694
+#: zypp/target/TargetImpl.cc:621 zypp/target/TargetImpl.cc:641
+#: zypp/target/TargetImpl.cc:669 zypp/target/TargetImpl.cc:706
+#: zypp/target/TargetImpl.cc:714
 msgid "Error sending update message notification."
 msgstr ""
 
-#: zypp/target/TargetImpl.cc:745
+#: zypp/target/TargetImpl.cc:765
 msgid "New update message"
 msgstr ""
 
+#: zypp/target/TargetImpl.cc:2619
+msgid "Executing the transaction failed because of the following problems:"
+msgstr ""
+
 #. TranslatorExplanation after semicolon is error message
 #. TranslatorExplanation the colon is followed by an error message
-#: zypp/target/rpm/RpmDb.cc:465 zypp/target/rpm/RpmDb.cc:1728
-#: zypp/target/rpm/RpmDb.cc:1884
+#: zypp/target/rpm/RpmDb.cc:467 zypp/target/rpm/RpmDb.cc:1769
+#: zypp/target/rpm/RpmDb.cc:1925
 msgid "RPM failed: "
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:790
+#: zypp/target/rpm/RpmDb.cc:792
 #, boost-format
 msgid "Failed to import public key %1%"
 msgstr ""
 
 #. Translator: %1% is a gpg public key
-#: zypp/target/rpm/RpmDb.cc:857
+#: zypp/target/rpm/RpmDb.cc:859
 #, boost-format
 msgid "Failed to remove public key %1%"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:1245
+#: zypp/target/rpm/RpmDb.cc:1235
 msgid "Package is not signed!"
 msgstr ""
 
 #. Translator: %s = name of an rpm package. A list of diffs follows
 #. this message.
-#: zypp/target/rpm/RpmDb.cc:1526
+#: zypp/target/rpm/RpmDb.cc:1568
 #, c-format, boost-format
 msgid "Changed configuration files for %s:"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1709
+#: zypp/target/rpm/RpmDb.cc:1750
 #, c-format, boost-format
 msgid "rpm saved %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1711
+#: zypp/target/rpm/RpmDb.cc:1752
 #, c-format, boost-format
 msgid ""
 "rpm saved %s as %s.\n"
@@ -4924,13 +4634,13 @@ msgid ""
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1714
+#: zypp/target/rpm/RpmDb.cc:1755
 #, c-format, boost-format
 msgid "rpm created %s as %s, but it was impossible to determine the difference"
 msgstr ""
 
 #. %s = filenames
-#: zypp/target/rpm/RpmDb.cc:1716
+#: zypp/target/rpm/RpmDb.cc:1757
 #, c-format, boost-format
 msgid ""
 "rpm created %s as %s.\n"
@@ -4939,142 +4649,254 @@ msgstr ""
 
 #. report additional rpm output in finish
 #. TranslatorExplanation Text is followed by a ':'  and the actual output.
-#: zypp/target/rpm/RpmDb.cc:1741 zypp/target/rpm/RpmDb.cc:1897
+#: zypp/target/rpm/RpmDb.cc:1782 zypp/target/rpm/RpmDb.cc:1938
 msgid "Additional rpm output"
 msgstr ""
 
-#: zypp/target/rpm/RpmDb.cc:2039
+#: zypp/target/rpm/RpmDb.cc:2080
 #, c-format, boost-format
 msgid "created backup %s"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2060
+#: zypp/target/rpm/RpmDb.cc:2101
 msgid "Signature is OK"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2062
+#: zypp/target/rpm/RpmDb.cc:2103
 msgid "Unknown type of signature"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2064
+#: zypp/target/rpm/RpmDb.cc:2105
 msgid "Signature does not verify"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2066
+#: zypp/target/rpm/RpmDb.cc:2107
 msgid "Signature is OK, but key is not trusted"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2068
+#: zypp/target/rpm/RpmDb.cc:2109
 msgid "Signatures public key is not available"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2070
+#: zypp/target/rpm/RpmDb.cc:2111
 msgid "File does not exist or signature can't be checked"
 msgstr ""
 
 #. translators: possible rpm package signature check result [brief]
-#: zypp/target/rpm/RpmDb.cc:2072
+#: zypp/target/rpm/RpmDb.cc:2113
 msgid "File is unsigned"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:220
+#: zypp/zyppng/media/network/networkrequesterror.cc:143
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Error code: %s\n"
+msgstr ""
+
+#: zypp/zyppng/media/network/networkrequesterror.cc:149
+#, c-format, boost-format
+msgid ""
+"Download (curl) error for '%s':\n"
+"Unable to retrieve HTTP response\n"
+msgstr ""
+
+#. dubious: Throw on malformed known types, otherwise log a warning.
+#: zypp-core/CheckSum.cc:136
+#, c-format, boost-format
+msgid "Dubious type '%s' for %u byte checksum '%s'"
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:245
+#, c-format, boost-format
+msgid "Can't open pty (%s)."
+msgstr ""
+
+#: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281
+#, c-format, boost-format
+msgid "Can't open pipe (%s)."
+msgstr ""
+
+#: zypp-core/Url.cc:114
+msgid "Invalid LDAP URL query string"
+msgstr ""
+
+#: zypp-core/Url.cc:153
+#, c-format, boost-format
+msgid "Invalid LDAP URL query parameter '%s'"
+msgstr ""
+
+#: zypp-core/Url.cc:301
+msgid "Unable to clone Url object"
+msgstr ""
+
+#: zypp-core/Url.cc:314
+msgid "Invalid empty Url object reference"
+msgstr ""
+
+#: zypp-core/Url.cc:327 zypp-core/Url.cc:341
+msgid "Unable to parse Url components"
+msgstr ""
+
+#. TranslatorExplanation followed by the list of error messages that lead to this exception
+#: zypp-core/base/Exception.cc:134
+msgid "History:"
+msgstr ""
+
+#: zypp-core/url/UrlBase.cc:220
 #, c-format, boost-format
 msgid "Url scheme does not allow a %s"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:239
+#: zypp-core/url/UrlBase.cc:239
 #, c-format, boost-format
 msgid "Invalid %s component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:246
+#: zypp-core/url/UrlBase.cc:246
 #, c-format, boost-format
 msgid "Invalid %s component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:863 zypp/url/UrlBase.cc:1308
+#: zypp-core/url/UrlBase.cc:863 zypp-core/url/UrlBase.cc:1308
 msgid "Query string parsing not supported for this URL"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:901
+#: zypp-core/url/UrlBase.cc:901
 msgid "Url scheme is a required component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:907
+#: zypp-core/url/UrlBase.cc:907
 #, c-format, boost-format
 msgid "Invalid Url scheme '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1026
+#: zypp-core/url/UrlBase.cc:1026
 msgid "Url scheme does not allow a username"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1060
+#: zypp-core/url/UrlBase.cc:1060
 msgid "Url scheme does not allow a password"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1089
+#: zypp-core/url/UrlBase.cc:1089
 msgid "Url scheme requires a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1099
+#: zypp-core/url/UrlBase.cc:1099
 msgid "Url scheme does not allow a host component"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1126
+#: zypp-core/url/UrlBase.cc:1126
 #, c-format, boost-format
 msgid "Invalid host component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1147
+#: zypp-core/url/UrlBase.cc:1147
 msgid "Url scheme does not allow a port"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1158
+#: zypp-core/url/UrlBase.cc:1158
 #, c-format, boost-format
 msgid "Invalid port component '%s'"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1175
+#: zypp-core/url/UrlBase.cc:1175
 msgid "Url scheme requires path name"
 msgstr ""
 
-#: zypp/url/UrlBase.cc:1196 zypp/url/UrlBase.cc:1210
+#: zypp-core/url/UrlBase.cc:1196 zypp-core/url/UrlBase.cc:1210
 msgid "Relative path not allowed if authority exists"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:111
+#: zypp-core/url/UrlUtils.cc:111
 msgid "Encoded string contains a NUL byte"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:173
+#: zypp-core/url/UrlUtils.cc:173
 msgid "Invalid parameter array split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:213
+#: zypp-core/url/UrlUtils.cc:213
 msgid "Invalid parameter map split separator character"
 msgstr ""
 
-#: zypp/url/UrlUtils.cc:283
+#: zypp-core/url/UrlUtils.cc:283
 msgid "Invalid parameter array join separator character"
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:132
+#: zypp-core/zyppng/io/abstractspawnengine.cc:174
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Error code: %s\n"
+msgid "Command exited with status %d."
 msgstr ""
 
-#: zypp/zyppng/media/network/networkrequesterror.cc:138
+#: zypp-core/zyppng/io/abstractspawnengine.cc:194
 #, c-format, boost-format
-msgid ""
-"Download (curl) error for '%s':\n"
-"Unable to retrieve HTTP response\n"
+msgid "Command was killed by signal %d (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/abstractspawnengine.cc:199
+msgid "Command exited with unknown error."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:111
+#: zypp-core/zyppng/io/forkspawnengine.cc:359
+msgid "Invalid spawn arguments given."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:174
+msgid "Unable to create control pipe."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:240
+#, c-format, boost-format
+msgid "Can't chroot to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:250
+#, c-format, boost-format
+msgid "Can't chdir to '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:251
+#, c-format, boost-format
+msgid "Can't chdir to '%s' inside chroot '%s' (%s)."
+msgstr ""
+
+#. don't want to get here
+#: zypp-core/zyppng/io/forkspawnengine.cc:280
+#, c-format, boost-format
+msgid "Can't exec '%s' (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:287
+#: zypp-core/zyppng/io/forkspawnengine.cc:448
+#, c-format, boost-format
+msgid "Can't fork (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:306
+#, c-format, boost-format
+msgid "Can't exec '%s', chdir failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:309
+#, c-format, boost-format
+msgid "Can't exec '%s', chroot failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:312
+#, c-format, boost-format
+msgid "Can't exec '%s', exec failed (%s)."
+msgstr ""
+
+#: zypp-core/zyppng/io/forkspawnengine.cc:316
+#, c-format, boost-format
+msgid "Can't exec '%s', unexpected error."
 msgstr ""
index b160343..88b06b9 100644 (file)
@@ -25,6 +25,7 @@ add_definitions( -DSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}")
 
 ADD_LIBRARY(zypp_test_utils
  TestSetup.h
+ TestTools.h
  WebServer.h
  WebServer.cc
 )
index f837599..79e92e6 100644 (file)
@@ -3,7 +3,7 @@
 #include <iostream>
 
 #ifndef INCLUDE_TESTSETUP_WITHOUT_BOOST
-#include <boost/test/auto_unit_test.hpp>
+#include <boost/test/unit_test.hpp>
 using boost::unit_test::test_case;
 #endif
 
@@ -374,5 +374,4 @@ private:
   std::unique_ptr<Impl> _pimpl;        // maybe worth creating RW_pointer traits for it
 };
 
-
 #endif //INCLUDE_TESTSETUP
diff --git a/tests/lib/TestTools.h b/tests/lib/TestTools.h
new file mode 100644 (file)
index 0000000..988f290
--- /dev/null
@@ -0,0 +1,29 @@
+#ifndef TESTTOOLS_H
+#define TESTTOOLS_H
+
+#include <iostream>
+#include <fstream>
+
+#include "zypp/Pathname.h"
+#include "zypp/PathInfo.h"
+
+namespace TestTools {
+  //read all contents of a file into a string)
+  std::string readFile ( const zypp::Pathname &file )
+  {
+    if ( ! zypp::PathInfo( file ).isFile() ) {
+      return std::string();
+    }
+    std::ifstream istr( file.asString().c_str() );
+    if ( ! istr ) {
+      return std::string();
+    }
+
+    std::string str((std::istreambuf_iterator<char>(istr)),
+      std::istreambuf_iterator<char>());
+    return str;
+  }
+}
+
+
+#endif // TESTTOOLS_H
index 55ba4a8..ef41cbc 100644 (file)
@@ -18,6 +18,8 @@
 #include <zypp/ExternalProgram.h>
 #include <zypp/TmpPath.h>
 #include <zypp/PathInfo.h>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+
 #include "WebServer.h"
 
 #include <thread>
@@ -309,14 +311,10 @@ public:
 
           //there is no way to give a timeout to FCGX_Accept_r, so we poll the socketfd for new
           //connections and listen on a pipe for a wakeup event to stop the worker if required
-          int ret = ::poll( fds, 3, INT_MAX );
-          if ( ret == 0 ) {
-            //timeout just continue the loop condition will stop if required
-            continue;
-          }
+          int ret = zyppng::eintrSafeCall( ::poll, fds, 3, -1 );
 
           if ( ret < 0 ) {
-            std::cerr << "Poll error " << endl;
+            std::cerr << "Poll error " << errno << endl;
             continue;
           }
 
@@ -396,7 +394,7 @@ public:
         }
 
         if ( prog.running() ) {
-            prog.kill( SIGQUIT );
+            prog.kill( SIGTERM );
             prog.close();
         }
     }
index e8baa70..ad1a29e 100644 (file)
@@ -38,3 +38,39 @@ BOOST_AUTO_TEST_CASE(parse_metalink)
   BOOST_CHECK(bl3.numBlocks() == 459);
   BOOST_CHECK(bl4.numBlocks() == 459);
 }
+
+BOOST_AUTO_TEST_CASE(parse_metalink_with_zsync_hash)
+{
+   Pathname meta4file = TESTS_SRC_DIR "/media/data/other.xml.gz.meta4";
+   MetaLinkParser mlp4;
+   mlp4.parse( meta4file );
+
+   auto bl = mlp4.getBlockList();
+   BOOST_REQUIRE( bl.haveBlocks() );
+   BOOST_REQUIRE_EQUAL( bl.numBlocks(), 246 );
+
+   const auto &rsums = mlp4.getZsyncBlockHashes();
+   const auto &csums = mlp4.getSHA1BlockHashes();
+   BOOST_REQUIRE_EQUAL( rsums.size(), csums.size() );
+   BOOST_REQUIRE_EQUAL( bl.numBlocks(), csums.size() );
+   BOOST_REQUIRE_EQUAL( bl.getFilesize(), 16108851 );
+
+   BOOST_REQUIRE( bl.getFileChecksum() == hexstr2bytes("702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121") );
+   BOOST_REQUIRE( rsums.front() == hexstr2bytes("52c0a614") );
+   BOOST_REQUIRE( rsums.back() == hexstr2bytes("349ad053") );
+   BOOST_REQUIRE( csums.front() == hexstr2bytes("b9f77f48f4a49f3438fc1bb6de90df39657597aa") );
+   BOOST_REQUIRE( csums.back() == hexstr2bytes("23788c5daf28813cdc6a14f1f02add712c020fd9") );
+
+   const auto &mirrors = mlp4.getMirrors();
+   BOOST_REQUIRE_EQUAL( mirrors.size(), 103 );
+
+   const auto &firstMirr = mirrors.front();
+   BOOST_REQUIRE_EQUAL( firstMirr.url, zypp::Url("http://ftp.uni-erlangen.de/pub/mirrors/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz"));
+   BOOST_REQUIRE_EQUAL( firstMirr.priority, 1 );
+   BOOST_REQUIRE_EQUAL( firstMirr.maxConnections, 10 );
+
+   const auto &lastMirr = mirrors.back();
+   BOOST_REQUIRE_EQUAL( lastMirr.url, zypp::Url("http://mirror.internode.on.net/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz"));
+   BOOST_REQUIRE_EQUAL( lastMirr.priority, 103 );
+   BOOST_REQUIRE_EQUAL( lastMirr.maxConnections, -1 );
+}
diff --git a/tests/media/data/other.xml.gz.meta4 b/tests/media/data/other.xml.gz.meta4
new file mode 100644 (file)
index 0000000..34baf30
--- /dev/null
@@ -0,0 +1,634 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metalink xmlns="urn:ietf:params:xml:ns:metalink">
+  <generator>MirrorBrain/2.19.0</generator>
+  <origin dynamic="true">http://download.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz.meta4</origin>
+  <published>2020-04-17T10:35:59Z</published>
+  <publisher>
+    <name>openSUSE</name>
+    <url>http://download.opensuse.org</url>
+  </publisher>
+
+  <file name="702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz">
+    <size>16108851</size>
+
+    <!-- <mtime>1579190526</mtime> -->
+
+    <!-- internal id: 639054365 -->
+    <hash type="md5">b0e3ea6121ce4a0a9efc732fa61498b4</hash>
+    <hash type="sha-1">9bf6ebc95bbf7776c8ee2a7d0a59ec94ab34953b</hash>
+    <hash type="sha-256">702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121</hash>
+    <pieces length="65536" type="zsync">
+      <hash>52c0a614</hash>
+      <hash>1d1b0484</hash>
+      <hash>a6eedb22</hash>
+      <hash>774ee5fd</hash>
+      <hash>48b1afe4</hash>
+      <hash>99676335</hash>
+      <hash>237f7e44</hash>
+      <hash>6716b34d</hash>
+      <hash>9de0b6b5</hash>
+      <hash>eeb79c2c</hash>
+      <hash>91a32ff3</hash>
+      <hash>cb7d3528</hash>
+      <hash>6821642b</hash>
+      <hash>4afbbfeb</hash>
+      <hash>4b3dd85a</hash>
+      <hash>06d847bf</hash>
+      <hash>0d4062b0</hash>
+      <hash>cf9421e9</hash>
+      <hash>ccc6bff3</hash>
+      <hash>d0469103</hash>
+      <hash>10f29244</hash>
+      <hash>078e5f5a</hash>
+      <hash>fb01f0a1</hash>
+      <hash>a4cb6923</hash>
+      <hash>b08fc953</hash>
+      <hash>49caabcc</hash>
+      <hash>1793fa09</hash>
+      <hash>b36e811d</hash>
+      <hash>b1a3bbe7</hash>
+      <hash>2956918c</hash>
+      <hash>53523172</hash>
+      <hash>254f3914</hash>
+      <hash>7f220a9c</hash>
+      <hash>bd30c70f</hash>
+      <hash>d8b1add2</hash>
+      <hash>d395e95e</hash>
+      <hash>3e979f77</hash>
+      <hash>930b076b</hash>
+      <hash>378c8b81</hash>
+      <hash>30ef4edf</hash>
+      <hash>dab0d9fc</hash>
+      <hash>5e391464</hash>
+      <hash>6ac489c6</hash>
+      <hash>36fa94f0</hash>
+      <hash>f3063b42</hash>
+      <hash>9f566ad4</hash>
+      <hash>6c12a5aa</hash>
+      <hash>1a25ae6b</hash>
+      <hash>5918c9ba</hash>
+      <hash>259ac921</hash>
+      <hash>f4957810</hash>
+      <hash>e6d0f681</hash>
+      <hash>7bd396e9</hash>
+      <hash>ae538fc9</hash>
+      <hash>f89b0b44</hash>
+      <hash>03d057ee</hash>
+      <hash>ab803b05</hash>
+      <hash>08b08ed8</hash>
+      <hash>c2917a7d</hash>
+      <hash>863d0b85</hash>
+      <hash>aa1f9d90</hash>
+      <hash>991afb80</hash>
+      <hash>4edf38ea</hash>
+      <hash>b5e40f1a</hash>
+      <hash>d4d4e483</hash>
+      <hash>f65e306b</hash>
+      <hash>7912c783</hash>
+      <hash>f6819c0c</hash>
+      <hash>04e266f2</hash>
+      <hash>187905a5</hash>
+      <hash>32711d10</hash>
+      <hash>86d5f0d4</hash>
+      <hash>850439c0</hash>
+      <hash>f804e0e4</hash>
+      <hash>ead17338</hash>
+      <hash>171a26ce</hash>
+      <hash>1140a195</hash>
+      <hash>40e5ab93</hash>
+      <hash>1c4141d1</hash>
+      <hash>65375cd7</hash>
+      <hash>85dbcc3b</hash>
+      <hash>4e3fe5e3</hash>
+      <hash>b39121ef</hash>
+      <hash>ce4798ee</hash>
+      <hash>712af259</hash>
+      <hash>2ed654bb</hash>
+      <hash>749ed9d5</hash>
+      <hash>98e286c7</hash>
+      <hash>6cdc3999</hash>
+      <hash>1992b5b9</hash>
+      <hash>14a34c09</hash>
+      <hash>8f2bdad5</hash>
+      <hash>adde2ef2</hash>
+      <hash>fcda3990</hash>
+      <hash>af59b0b0</hash>
+      <hash>d6b197ea</hash>
+      <hash>48a7fc22</hash>
+      <hash>e6303467</hash>
+      <hash>da1fff7c</hash>
+      <hash>ce22618c</hash>
+      <hash>c3058796</hash>
+      <hash>15225499</hash>
+      <hash>9f1bf1f1</hash>
+      <hash>380172a2</hash>
+      <hash>a1b44a09</hash>
+      <hash>c9d9f6f1</hash>
+      <hash>a8c78564</hash>
+      <hash>9cbd2bc3</hash>
+      <hash>64d0dcec</hash>
+      <hash>f465da8f</hash>
+      <hash>6a9d15f0</hash>
+      <hash>64fdc6da</hash>
+      <hash>f3dc5c56</hash>
+      <hash>11c6fc79</hash>
+      <hash>08d33205</hash>
+      <hash>39f3b762</hash>
+      <hash>fbcabbba</hash>
+      <hash>4b549193</hash>
+      <hash>367aa49b</hash>
+      <hash>0066daf1</hash>
+      <hash>2c1762d9</hash>
+      <hash>2e8a4128</hash>
+      <hash>358b5696</hash>
+      <hash>101e02b4</hash>
+      <hash>01b563a3</hash>
+      <hash>af77bfc1</hash>
+      <hash>1baa1682</hash>
+      <hash>21170038</hash>
+      <hash>bf1938f8</hash>
+      <hash>fc833941</hash>
+      <hash>4f4af457</hash>
+      <hash>2e69237a</hash>
+      <hash>339aa64a</hash>
+      <hash>6fc4603a</hash>
+      <hash>2bd4258e</hash>
+      <hash>2d96b5ca</hash>
+      <hash>5f1f0d5a</hash>
+      <hash>6e96399d</hash>
+      <hash>ac0c374c</hash>
+      <hash>3b1b78ef</hash>
+      <hash>13ea3a71</hash>
+      <hash>b7235e19</hash>
+      <hash>983b7750</hash>
+      <hash>6346a1cf</hash>
+      <hash>1c4674f2</hash>
+      <hash>29401c27</hash>
+      <hash>d20d75d9</hash>
+      <hash>58fe3a80</hash>
+      <hash>36046fa4</hash>
+      <hash>30f1bb0a</hash>
+      <hash>0d6bfb04</hash>
+      <hash>ba03494d</hash>
+      <hash>ddab80c6</hash>
+      <hash>3ebe0e52</hash>
+      <hash>717f3b33</hash>
+      <hash>4c1d18b4</hash>
+      <hash>194996e3</hash>
+      <hash>c0a5b547</hash>
+      <hash>46701b77</hash>
+      <hash>1fee6657</hash>
+      <hash>5c0b188e</hash>
+      <hash>36b0b261</hash>
+      <hash>542d6ecb</hash>
+      <hash>8075ad43</hash>
+      <hash>fec52502</hash>
+      <hash>58b78958</hash>
+      <hash>3cb977f5</hash>
+      <hash>d723f5f1</hash>
+      <hash>acce65f2</hash>
+      <hash>b8971b43</hash>
+      <hash>284701af</hash>
+      <hash>7806f59f</hash>
+      <hash>5d316f76</hash>
+      <hash>0744df06</hash>
+      <hash>74a71b65</hash>
+      <hash>af52e37a</hash>
+      <hash>36182408</hash>
+      <hash>dfb2d5e7</hash>
+      <hash>eb1837ae</hash>
+      <hash>06ebb86a</hash>
+      <hash>e29d708e</hash>
+      <hash>f41ddba4</hash>
+      <hash>3ca24f76</hash>
+      <hash>3ec2d12c</hash>
+      <hash>a05085e8</hash>
+      <hash>b3901429</hash>
+      <hash>5c7168b6</hash>
+      <hash>3b61dd7a</hash>
+      <hash>8ebabd02</hash>
+      <hash>27c0e98a</hash>
+      <hash>5ace82d6</hash>
+      <hash>321df0de</hash>
+      <hash>0b8f5b4c</hash>
+      <hash>4bae8466</hash>
+      <hash>68101f66</hash>
+      <hash>980da2ba</hash>
+      <hash>81d50c1a</hash>
+      <hash>4e84bd20</hash>
+      <hash>9b61208a</hash>
+      <hash>205a556b</hash>
+      <hash>057d34ba</hash>
+      <hash>31f20187</hash>
+      <hash>9e718b2a</hash>
+      <hash>d0b8e062</hash>
+      <hash>0872e972</hash>
+      <hash>b49a2bde</hash>
+      <hash>760271ef</hash>
+      <hash>6f76f48a</hash>
+      <hash>1c611d36</hash>
+      <hash>064db936</hash>
+      <hash>e7329863</hash>
+      <hash>cbfee98e</hash>
+      <hash>f3bcd1ec</hash>
+      <hash>926fbb8f</hash>
+      <hash>8c385a88</hash>
+      <hash>1b24f948</hash>
+      <hash>d7eb6751</hash>
+      <hash>f4d38846</hash>
+      <hash>a8599d87</hash>
+      <hash>78b0a47b</hash>
+      <hash>07ae8db1</hash>
+      <hash>f186b800</hash>
+      <hash>b46b9174</hash>
+      <hash>fae79ab0</hash>
+      <hash>737f9ce2</hash>
+      <hash>09cd0215</hash>
+      <hash>115a6c03</hash>
+      <hash>20a53586</hash>
+      <hash>d54c989a</hash>
+      <hash>c80e7714</hash>
+      <hash>9fb08412</hash>
+      <hash>765695e9</hash>
+      <hash>f7071fd6</hash>
+      <hash>b0acf700</hash>
+      <hash>67ee5560</hash>
+      <hash>fe631438</hash>
+      <hash>fb4f23ae</hash>
+      <hash>bb560d0b</hash>
+      <hash>60cc375c</hash>
+      <hash>5c02ef6d</hash>
+      <hash>58864bc2</hash>
+      <hash>232e0528</hash>
+      <hash>2851bfa6</hash>
+      <hash>24a78b42</hash>
+      <hash>54f4fba1</hash>
+      <hash>349ad053</hash>
+    </pieces>
+    <pieces length="65536" type="sha-1">
+      <hash>b9f77f48f4a49f3438fc1bb6de90df39657597aa</hash>
+      <hash>eb519d03cea235bd24f57941495cd917f84bd897</hash>
+      <hash>bbc848cfe07fc2588d94115dca1b6933b5b2c3e3</hash>
+      <hash>8cef145c2e633fe14f29be5692683e55aa70b543</hash>
+      <hash>c508c1c5dfb4684fb20ae91cfe6231fa0e6ba174</hash>
+      <hash>23ac327f06a38b40f10dc9b8c26f6563820fbaee</hash>
+      <hash>ca25b93d0744a27f31b9c50e680fb37fda988f6a</hash>
+      <hash>027e02287e26a679610d4d26f27ae03d0d90480d</hash>
+      <hash>9c63ede3e63de810e41d88b99f4ff29d236d0765</hash>
+      <hash>f5f60eabcdea574a4b25ed7892e5ff893d28e3e6</hash>
+      <hash>cac3ce8115413ad842cde8a8a5b3c376533695d4</hash>
+      <hash>b7ad7d09e62a1a581e58b33467a3afe012c51163</hash>
+      <hash>898aa214396d911d01e84b06ea7606fb834f6f82</hash>
+      <hash>664f445146b0548ac6b62400681d0ae651be8d59</hash>
+      <hash>c39c214f2fb452b1be664839df1a371f863970cd</hash>
+      <hash>5cc9e11746124ebf0282c1ea1f18e72cfaf6b60d</hash>
+      <hash>b3f7e9b52fe2a3630b9547e495e847ca530e283b</hash>
+      <hash>0ddaaa89b57a47a76cf8e870dd2adf3064c5b7d2</hash>
+      <hash>6863ae28830c18b39bbe40ccf663f36178dbaabe</hash>
+      <hash>c111b32adb590650b10c6131016bd118669fad9c</hash>
+      <hash>8a2941fddacbf7b2a144eb246e761c7c48134fa9</hash>
+      <hash>d222fe76b95e9034275121b86a124977a8a2a0f4</hash>
+      <hash>7072c00f004d82533321d0c99a6106a089ee4acd</hash>
+      <hash>026ea21296d66729725274dde37fb07b25a6bc90</hash>
+      <hash>a799bb63224e7ae4e2ac48c83548c0e7f4339ed9</hash>
+      <hash>090f7ed2f2a21712f1297ffbffc7441de521c72c</hash>
+      <hash>28a25cbd545c6b8936a58dbfbc6f3df66b1ff1f2</hash>
+      <hash>0b2df923da1a425330738bb0690723db59574ed8</hash>
+      <hash>3787396a99a302e8020a4936484a0548244e4696</hash>
+      <hash>836809523b244b31a70ecc9b8cfbc92b6189703a</hash>
+      <hash>6d26a0b6abe7961b1013540194dfd1568246e39b</hash>
+      <hash>eaa06966730e2960dff6b318739c47f53afb48fc</hash>
+      <hash>25840fe2bf327ce91d8920b595702de770efe901</hash>
+      <hash>0c5cd1b57bc8d833a0ec6cbcc2e983851672ff8a</hash>
+      <hash>4ab9385e1eea1f6dc45c4ea4cce55bc1689cb162</hash>
+      <hash>28f0d7c20caefbe1052db07410d6a22465a77768</hash>
+      <hash>0d52b5cc32cdc5ca3589210240b0e5b7173d71b4</hash>
+      <hash>b6412c472de727869867918d2186effc129334e0</hash>
+      <hash>c193530764f9fc5c2b008ecdc0ed454fd09a2016</hash>
+      <hash>325e3e4211f9815b4f647c3cef57bccaf3e4bcc1</hash>
+      <hash>e5583176f956725ac4f0d6618a22575dea4996a6</hash>
+      <hash>03dfdb60cb43e5a55d0c61678ca4698cffb403e4</hash>
+      <hash>226dc7d7c836d0397d0aa96b2d29706afb1100ae</hash>
+      <hash>f1b6075e2f073a270dd22e23afe0f0a68f685cb9</hash>
+      <hash>56b9d3b2d8b4a574d17d5e063f2a59e3be39c10e</hash>
+      <hash>8ff09431921fa287749cde787c7fe730826593c8</hash>
+      <hash>e24b0cd9b8fe9485d269f46856fc7b67689b8e93</hash>
+      <hash>33dc95d1b5b070010f08aca43a4496409168fed2</hash>
+      <hash>6dce6f86912a57890b0c801a39c7bac95ecd4304</hash>
+      <hash>7d7cc195b098047e04c8e667a5cd91649e50fdee</hash>
+      <hash>3059a0a978572cda808d4ddc402df2b67458733d</hash>
+      <hash>d9184e997d4737bf9966b56dbb20b9a5c74f6645</hash>
+      <hash>64addf29c0b35eac2ce21ae2fe6d8ce232af8ff9</hash>
+      <hash>2170eb72b643a229e1e33a28e1b7e554398b423d</hash>
+      <hash>4b7bacad11b4762e54cbd412d41ae043b7388706</hash>
+      <hash>4c5f8f1926419001ff88122a3d426dff0e2fcff5</hash>
+      <hash>ccd0dd77c83da20d7f4ddf13dab89d472f816398</hash>
+      <hash>5a66f1fdb6189de62f91e3c13b7859434eb2ae10</hash>
+      <hash>362f956e4061b1d4ae60654c3b59bc18a9aa8b5b</hash>
+      <hash>9712c3dfcea2ff067a4c510fae5dbcc90599ffe6</hash>
+      <hash>699440f8b691774ec9060caa988d008b79b0b272</hash>
+      <hash>b0638b719cdf6a634516b2cb7ec85e41b866bdbd</hash>
+      <hash>49afa1c7fdae319b4325edba0e19814459bd3d9a</hash>
+      <hash>aecf9ee3948c3530122e8839ffb450ebceb4df5b</hash>
+      <hash>d9709a7431c3c9c4ec42e76efbbbf7e7a2eb964a</hash>
+      <hash>a254ba5f983e12bffba48af2cae35783fbe3da6d</hash>
+      <hash>7a6ff90e51fce74e528ce3968507ebc6000614b5</hash>
+      <hash>44aea5f544bd0ea25774f392eab846f873e5fff8</hash>
+      <hash>75d7c5d1e09d73c368248835da602ed9bb785490</hash>
+      <hash>eb8b75f5ad07a6459ad05a9d88e22f529a21944d</hash>
+      <hash>993b71f98128b7f2c929d56b430f5e514b7c457a</hash>
+      <hash>72b582d7cb77f901f86e405c84b3e8eecb2bc22b</hash>
+      <hash>49bff42f3e2eefa5c53c03b698488c903f76fe55</hash>
+      <hash>248bc7caba7b75ca7edee72e1645e6ee0207b8e2</hash>
+      <hash>156215ff516ef914f28268b31dd27a360b4797e1</hash>
+      <hash>fe0c489135d495aea711c01d37d31f40d638cea2</hash>
+      <hash>5697a51c38f075aebea5e0593d48e899e79f5054</hash>
+      <hash>a146d446f52c08a4aa2515a76ac39003f62b588e</hash>
+      <hash>619386f78b66eac122d61c8028a992ca3cdf6eb3</hash>
+      <hash>ec216f4ef6a5983c448d1b63de347a0753b053ed</hash>
+      <hash>83e08e5f9d347d75337d77c01b38cbf8326e3982</hash>
+      <hash>5c60ba2c86df1b65e41eeff93481b99ee90e7a21</hash>
+      <hash>bed0f7975dbe0abb3e09d76ca239d5a8e8231974</hash>
+      <hash>a245c5324a6ca6626e0903d892712d8cd93cca84</hash>
+      <hash>cdbbc69c35540f4527ab858cb547ea599b5dabc4</hash>
+      <hash>e8bc63208646ff1db2c653a931eca96d3790e56f</hash>
+      <hash>75ce34d9dd80a13d00cc73f30c63dbc242ffe187</hash>
+      <hash>03a1c7dbd3cd99536600bf19b5275c4c58b82e58</hash>
+      <hash>f0d0d1fc1155a1dcfb804c952166ebdadb30a926</hash>
+      <hash>31e699f38b24cd4fdd89440904887c0c6490b2b1</hash>
+      <hash>387c9fde6f3d817da8bfbe791967ac7bed10b0bb</hash>
+      <hash>bd18d25208a69f60bc9ed47703b0598d05e88a65</hash>
+      <hash>88ec754b99b1d1a301665b52d0f5078a8313ced4</hash>
+      <hash>5c8d406fa3325410513c3f82abb839e68bd8cc5d</hash>
+      <hash>8fb9bbf106b201846af4827ea8f18151d1e54f1a</hash>
+      <hash>4d4a23f492a786868b2a8326108578eb222915c7</hash>
+      <hash>4c9a257ffd6aaecc8649f9fcd7658dc12886cc45</hash>
+      <hash>2999f114c2afc1d381b61f393ae9041042ea4c1b</hash>
+      <hash>c9f20744675482835bb4e307df78a0eb33ee9597</hash>
+      <hash>8f5c1d36a94e28b979232e75f5a09895670d43ba</hash>
+      <hash>b80f0f22d35d561a6f19ad414583692ad1a6baf7</hash>
+      <hash>d2e607369e972154e5cfb644b6b9065fe0ec8cc7</hash>
+      <hash>f8dfc2d1cb12c28fc393aa01db2fa4b6a473fffb</hash>
+      <hash>0695ec9bea77cdf4cfbbd40024bb23f415a96846</hash>
+      <hash>4e92c4015ac67f2ece37f29f31fc14ba4b5138fd</hash>
+      <hash>629dc485fee76e0f18dcfad4b1cae81e9d890cc8</hash>
+      <hash>fc14106f32b3ffef1bc04efc9cfd517004a0bccc</hash>
+      <hash>25c13c97f2a16b1fc222ad65a87adf1da03d3f13</hash>
+      <hash>f512eab85491096e799a78a22dbf18cd52314f05</hash>
+      <hash>12b559864bb0932a3773077a5dab5753479ca4a1</hash>
+      <hash>7e44c02f91d0e6fe04687e709db3787b370c910a</hash>
+      <hash>9f6f67023a05fd7bfa00bb39faf367ef00303aae</hash>
+      <hash>39c467877e9d220a52d570f303e76344b3a2608d</hash>
+      <hash>174a697aecf5d38b0f114b9bfa372a8f18c42c81</hash>
+      <hash>9f879aecaf6569cb3cfd164bc44c725ec0c3c100</hash>
+      <hash>a0f37fcf36cc62ec7028b0136a601a9743a11bb6</hash>
+      <hash>28d780cb009c6ec45f3d96f061d342cfcc39a116</hash>
+      <hash>f91a54e70e648566847152dc6da160a43c354462</hash>
+      <hash>8f1356a866020fa3403d001b1b9d8704c9ec014d</hash>
+      <hash>72d1935f0dbd5bbb4261d642b5a84c56fde79461</hash>
+      <hash>0019d698709935d84730ead1e75a88ce34d56047</hash>
+      <hash>8136920b4ec15543f69841411497930b9a0756ea</hash>
+      <hash>8d8d23fdf4a45991475bea88f8f4ae41313204d8</hash>
+      <hash>270ee2b97fdf893361fb0d1e6cd2b3dcc2a56cca</hash>
+      <hash>a46ed235e4e2350ce55d929437bef2696c73e58f</hash>
+      <hash>ffde235c872520ff2a4fb1686612422157b3da4e</hash>
+      <hash>70156892aaa72c869cb4de9f178211acd91386db</hash>
+      <hash>577030eac9eeb0149484d59e4675a0675ec29aba</hash>
+      <hash>51b73a522f31981f46fd9c93088dc649c9e18ded</hash>
+      <hash>eb1d66156a4de48f02550198d258c21987272094</hash>
+      <hash>8bf73b8e4ed442733be764995b19854dad16ad74</hash>
+      <hash>df2aac249fe67e78ed7efc88cf8373ca9664d25f</hash>
+      <hash>2087445ccafa2f380f8fd3083dd371be0c791011</hash>
+      <hash>dd95e88e8eec80074466a5629cc2bf27c0caa405</hash>
+      <hash>df0ae393f8c15b6c79764e0c20c23a63816b265f</hash>
+      <hash>6a3d41b1d89219b8e55f92d0c9e6d7c490ed3a9d</hash>
+      <hash>b77f200b3feeac052155676bebd7d79ff7c521b4</hash>
+      <hash>40a85837934de7349e4b7d499e45c8f0c89f0380</hash>
+      <hash>86f4ec3d1997356df228c2f8e12f7ec34376dad9</hash>
+      <hash>18b1eafaa4cbcc5246341f02120ef5a751b2a07a</hash>
+      <hash>4bce3c8d51fd178c83b92856d5a6d91a73b8c270</hash>
+      <hash>77e395ea41c389823415d295d43654c1ea0a13f8</hash>
+      <hash>0e5bc24274fcc33dc0bad9e793843ff004d14e6b</hash>
+      <hash>1f8e4e250a637126869934b3be7ea2dd4def9697</hash>
+      <hash>6c9e951e83951c7189f9a7cae64114f2d068b149</hash>
+      <hash>ee358a80270841ec34573070bc44a9a973e975f7</hash>
+      <hash>52bd4e79805c4b82c582a0e54a16eb64a41e0265</hash>
+      <hash>beeab96f0955f21d919047b1548cc63dda681e99</hash>
+      <hash>1a1dcc661db31042e679d8aba08050fe4ac46eb4</hash>
+      <hash>50bc05e6b0117a66737fe0ed916f7f399fe99e08</hash>
+      <hash>e3324f3cda3c99be671c6fb194b6333f6dc9ebcd</hash>
+      <hash>f8a657caa0609cb1735b2f89df79a58085692fbe</hash>
+      <hash>68e81283af7bfa5be9f34c2a20c7e1c176447f47</hash>
+      <hash>c9b06b781e3c1206f98efd4e129d500e84140aac</hash>
+      <hash>5ea9392a721308c336c4947f650ae1d67e0219b2</hash>
+      <hash>ea395621e73a3cdf0c810c9b66fa14db08fb318b</hash>
+      <hash>80c5e69781257a49808d7dd41e8607ae85354230</hash>
+      <hash>798c5481862e497135160472d11d9588a2d67a14</hash>
+      <hash>1bcae9f627068040e89bddc27797dd9d9c8db03e</hash>
+      <hash>2b47afadd5782554928703669796bd39239271b2</hash>
+      <hash>782bcea66a64ace7c2a5a0cef1f9607bd8d27520</hash>
+      <hash>5cf8116d576d670d6be3a116383cdf7f0d9c8484</hash>
+      <hash>c721d424f73d1dcb1ec1964a7b8274d01932eb6a</hash>
+      <hash>93240a9223131a0179d979f2dce69a3eddffbc02</hash>
+      <hash>349abb4775ac5696ccee9c69ebcc609701bd58aa</hash>
+      <hash>5add463a4edb0ae91f7ccea535dfb7746d7d6dd9</hash>
+      <hash>b1515c806cf9b3e5d6e4583983469830c4a280d5</hash>
+      <hash>b3673a2dfae021812831b56f0f5b728e9ed18f16</hash>
+      <hash>d8334d5c17258b6ae3b81e465174543d624f3d60</hash>
+      <hash>9ed0e5219d14aac67748cd5224f6348db4975cfa</hash>
+      <hash>4ae31784ea2ed429d97badf0fcf4c0476629837a</hash>
+      <hash>5fbec5ca9e444ac869e307ad9c202266174aec52</hash>
+      <hash>9c76b3f2f5fe557e89935e83239c6f077b5a15c0</hash>
+      <hash>89416abb164886ab6d62a5069f6372dbb1d5aed6</hash>
+      <hash>4ab5bfc5a77c9bd9a02f4387a2a156ad435ca734</hash>
+      <hash>5e4f901d92f1a028a8600ae6d1733d1a1447c30f</hash>
+      <hash>002ca76cf81c26feb9e45a0f839c89ba6cbb61ab</hash>
+      <hash>3e200848aaaa4f6c4f47724e81b7ca756c41e843</hash>
+      <hash>e7fe994aa2131b3daff2f55c5b3e655089ff91df</hash>
+      <hash>27147f6cb293f64e7c92dd8ae456ebef7936b40b</hash>
+      <hash>21622d7ef1ca2927d6228f6d22e9a9ad840decf5</hash>
+      <hash>189e3e39639d1b21268c6f92bfb4c76a6d9d1675</hash>
+      <hash>94f8084e4d6439d5381fb008061c68831d54eca8</hash>
+      <hash>468346108131da81828a06effb7105fa9908570f</hash>
+      <hash>6a2c40a1161acb3e3192ba56f114a287d1bd8075</hash>
+      <hash>8364b1e1722b18c25e013290ac83f2e9826cd0b0</hash>
+      <hash>085a690dc2f967ebef514b0eedbb65b5acabc6ec</hash>
+      <hash>23c83426d57e5026a649aa567f33424c10ed26a0</hash>
+      <hash>8e64b4ff663e3f70ea8f78df0fa1f4c8a8fd6964</hash>
+      <hash>71a4e3c72ee14ebc3790feee49c1f9171b2c3b0b</hash>
+      <hash>07505ef63db167bb46b17ca93f00f358bc0bca70</hash>
+      <hash>18376e3f57aaef28a167d53da5641aa6c52aba51</hash>
+      <hash>25f657d2985d243f908db3e10610ebc925a871da</hash>
+      <hash>bd1d54dbad5b26d69f0b563f1871790814aae02c</hash>
+      <hash>d441456e1f7c43e7aef24a7eaa4a761640e0868e</hash>
+      <hash>9f8e36d32e573dbd34eaaabd5f55c50a81a597cf</hash>
+      <hash>3f79e9a63d018fda063efe1367a1933bfb95cff6</hash>
+      <hash>a3eb8c31e8fef133e1041ddbb645cb18f112c8bf</hash>
+      <hash>00eac6ff6914ae5fefc5d38f62dfb2f702d3438f</hash>
+      <hash>7837845b7cdd1374ad35543094c637b8a61a508d</hash>
+      <hash>9ecb417b572d73a8698e009cbace10d0f49bc1f4</hash>
+      <hash>58efd0711cdcb0d59bf63ac2cecd8b45b4699f14</hash>
+      <hash>f83e6c8ae5f654a7f62974f8cc48f7874e87608f</hash>
+      <hash>fef21cedd6aeecac6c65dcffcb07726cd7491bfc</hash>
+      <hash>6131018fa558299e5df017d50d206e54d12fdac6</hash>
+      <hash>9ad2d8009f5958ee0714f7104cf73b06340c651e</hash>
+      <hash>99bd899a87a9ae07e50cf0a8eee6b209a5ebce49</hash>
+      <hash>c25f16d3deffb6e9d362f072791ddc994d0d1a70</hash>
+      <hash>06a3f40e2a1ed91d4d0b6bbd1aadbdbe8dda9b95</hash>
+      <hash>ebd13b83c8a14249ed95fcf6900e5c58de46b881</hash>
+      <hash>81e55b598eb22532f5b48898f59e1c0a4619c078</hash>
+      <hash>ef81c3884c81def482f667886494d6f93ce52c1e</hash>
+      <hash>555a16832d6b8acb9c8184a5eff52ba082e62000</hash>
+      <hash>4ac5ad095910ef4148dc526a147edaf38fc894e5</hash>
+      <hash>78cf92a1f62daf43273e0e5189e4969b3f40c284</hash>
+      <hash>a3b9ee6f0d9e00c5f2b0155f18288ec5656707b8</hash>
+      <hash>f7e7ae7cc6d63c8947aa87a9dc37642c13292401</hash>
+      <hash>7d6d48f8721f4b3c9b9dedc95ad55b1c6573d71c</hash>
+      <hash>db8bfaa26b11df13d8896e14731861fccdc477b1</hash>
+      <hash>848ed4b02af9b094459def417cc7c11736975d85</hash>
+      <hash>02d15cb753a295103146621251e51d61dff48351</hash>
+      <hash>55fd50c584c10365cacaffe437e60b01883687e6</hash>
+      <hash>52e09e6ea21b615131a55ccc3c3889693d357555</hash>
+      <hash>51f4a27756d001bc2861e09fa66e1c61e733c96a</hash>
+      <hash>d74b8360e3e79fdae041f352dc43b5c47fbe9d6c</hash>
+      <hash>b1c9de6514a7b4674aa1d902e4ffcfb5cb3dd653</hash>
+      <hash>76e85afeca22666bd9fe882baf184ab16bbd42d2</hash>
+      <hash>654e52677ceb84aea219d4d4fea61e79db34a631</hash>
+      <hash>7fa1c90807ca53c64553ae9538dc9b3a545538ea</hash>
+      <hash>2158c837a32a3e6deac4458985898be39696cea8</hash>
+      <hash>d6499e8d4d0e6dab8a9acee357312be7fd93c195</hash>
+      <hash>e92698d28f58b976527799619f68c98fd6b1f365</hash>
+      <hash>5c706b017ed4d74765d3c7015ab76370f961acf9</hash>
+      <hash>f143b67707f982a488d864a2d1e148f07eef1dd0</hash>
+      <hash>709a783cb5ba13dcc0b309cb12b8a5fc9582d1b7</hash>
+      <hash>452244a5246739fa8ba424b1b754da9fe5e8f6a4</hash>
+      <hash>b1b3bc21c6054382d40b6309de3f307e03ab8814</hash>
+      <hash>863a5fcb1f90350550bb366eb2b5d9af4f952beb</hash>
+      <hash>fd1100fc41b85a27dd5144a64e9552a09cea327c</hash>
+      <hash>31c2f06b23a797c8252b0efc6cb55e86531582f5</hash>
+      <hash>91ba8885fd33e935ea57f4936f41cad8afee735c</hash>
+      <hash>9320db884775a370709c7fc6dcb37eca77c46dd4</hash>
+      <hash>e219dc3a4cd44d2785fa6f4c7f930f2eadfb37ff</hash>
+      <hash>2a2ac760f2944c4e1b6ac7d3001ecc09ad49b1bc</hash>
+      <hash>693d0e7a7af313dd849c48222276e25d635512bc</hash>
+      <hash>23788c5daf28813cdc6a14f1f02add712c020fd9</hash>
+    </pieces>
+
+
+    <!-- Found 118 mirrors: 0 in the same network prefix, 0 in the same autonomous system,
+         15 handling this country, 43 in the same region, 45 elsewhere -->
+
+    <!-- Mirrors in the same network (unknown): -->
+
+    <!-- Mirrors in the same AS (3320): -->
+
+    <!-- Mirrors which handle this country (DE): -->
+    <url location="de" priority="1" maxconnections="10">http://ftp.uni-erlangen.de/pub/mirrors/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="2">http://widehat.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="3">http://ftp.uni-bayreuth.de/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="4">http://ftp.rz.uni-wuerzburg.de/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="5">http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="6">https://ftp.gwdg.de/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="7">http://opensuse.schlundtech.de/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="8">http://mirror.de.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="9">http://mirror.braun-software-solutions.de/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="10">http://mirror1.hs-esslingen.de/pub/Mirrors/ftp.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="11">http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="12">http://opensuse.mirror.iphh.net/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="13">http://ftp.uni-kl.de/pub/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="14">http://ftp.tu-ilmenau.de/mirror/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="de" priority="15">http://ftp.halifax.rwth-aachen.de/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+
+    <!-- Mirrors in the same continent (EU): -->
+    <url location="cz" priority="16">http://ftp.sh.cvut.cz/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="cz" priority="17">http://mirrors.nic.cz/opensuse/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ch" priority="18">http://mirror.hostsuisse.com/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ch" priority="19">http://pkg.adfinis-sygroup.ch/opensuse/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="si" priority="20">http://mirrors.xgroup.si/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="cz" priority="21">http://ftp.linux.cz/pub/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="cz" priority="22">http://mirror.karneval.cz/pub/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="at" priority="23">http://mirror.easyname.at/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="dk" priority="24">http://mirrors.dotsrc.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="dk" priority="25">http://ftp.klid.dk/ftp/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="pl" priority="26">http://ftp.man.poznan.pl/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="nl" priority="27">http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="nl" priority="28">http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="nl" priority="29">http://mirror.nl.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="nl" priority="30">http://opensuse.mirror.liteserver.nl/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="be" priority="31">http://ftp.belnet.be/mirror/ftp.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="it" priority="32">http://opensuse.mirror.garr.it/mirrors/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="pl" priority="33">http://ftp.pbone.net/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="hu" priority="34">http://quantum-mirror.hu/mirrors/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="hu" priority="35">http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="fr" priority="36">http://fr2.rpmfind.net/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="sk" priority="37">http://tux.rainside.sk/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="fr" priority="38">http://opensuse.mirrors.proxad.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="se" priority="39">http://ftp.lysator.liu.se/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="pl" priority="40">http://ftp.icm.edu.pl/pub/Linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="pl" priority="41">http://ftp.vectranet.pl/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="se" priority="42">http://ftp.acc.umu.se/mirror/opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="nl" priority="43">http://opensuse.hro.nl/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="gb" priority="44">http://mirrors.coreix.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="gb" priority="45">http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="hu" priority="46">http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="lv" priority="47">http://opensuse.koyanet.lv/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="gb" priority="48">http://mirror.rackspace.co.uk/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="bg" priority="49">http://opensuse.ipacct.com/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="bg" priority="50">http://mirrors.netix.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="gb" priority="51">http://www.mirrorservice.org/sites/download.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ro" priority="52">http://mirrors.nxthost.com/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="se" priority="53">http://ftp.acc.umu.se/mirror/opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="fi" priority="54">http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="pt" priority="55">http://ftp.rnl.tecnico.ulisboa.pt/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="cy" priority="56">http://mirror.library.ucy.ac.cy/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ru" priority="57">http://mirror.yandex.ru/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="nl" priority="58">http://ams.edge.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+
+    <!-- Mirrors in the rest of the world: -->
+    <url location="am" priority="59">http://opensuse.ucom.am/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ir" priority="60">http://repo.iut.ac.ir/repo/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="uz" priority="61">http://mirror.dc.uz/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="om" priority="62">http://mirror.squ.edu.om/opensuse/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ke" priority="63">http://opensuse.mirror.liquidtelecom.com/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ca" priority="64">http://mirror.its.dal.ca/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="65">http://mirror.siena.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="jp" priority="66">http://nrt.edge.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="67">http://sjc.edge.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="68">http://ewr.edge.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="69">http://mirror.clarkson.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="70">http://mirror.math.princeton.edu/pub/opensuse-full/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="br" priority="71">http://opensuse.c3sl.ufpr.br/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="72">http://mirror.us.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="73">http://mirror.vtti.vt.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ca" priority="74">http://mirror.csclub.uwaterloo.ca/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="75">http://mirrors.rit.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="cn" priority="76">http://mirror.lzu.edu.cn/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="77">http://plug-mirror.rcac.purdue.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="cr" priority="78">http://mirrors.ucr.ac.cr/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ec" priority="79">http://mirror.cedia.org.ec/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="cn" priority="80">http://mirror.bjtu.edu.cn/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="cn" priority="81">http://mirrors.tuna.tsinghua.edu.cn/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="hk" priority="82">http://mirror.rackspace.hk/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="cn" priority="83">http://mirrors.ustc.edu.cn/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="uy" priority="84">http://espejito.fder.edu.uy/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="ca" priority="85">http://www.muug.mb.ca/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="86">http://mirror.dal10.us.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="87">http://mirror.datto.com/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="88">http://mirror.rackspace.com/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="tw" priority="89">http://ftp.yzu.edu.tw/Linux/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="kr" priority="90">http://ftp.kaist.ac.kr/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="91">https://provo-mirror.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="92">http://opensuse.cs.utah.edu/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="jp" priority="93">http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="jp" priority="94">http://ftp.kddilabs.jp/Linux/packages/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="jp" priority="95">http://ftp.riken.jp/Linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="96">http://mirror.sjc02.svwh.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="97">http://mirror.sfo12.us.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="98">http://opensuse-mirror-gce-ap.susecloud.net/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="99">http://opensuse-mirror-gce-us.opensu.se/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="100">http://sfo-korg-mirror.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="us" priority="101">http://suse.mobile-central.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="nz" priority="102">http://opensuse.mirrors.theom.nz/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+    <url location="au" priority="103">http://mirror.internode.on.net/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz</url>
+  </file>
+</metalink>
index 910def0..967293e 100644 (file)
@@ -5,6 +5,7 @@
 #include <boost/test/unit_test_log.hpp>
 
 #include <zypp/MediaSetAccess.h>
+#include <zypp/media/MediaHandler.h>
 #include <zypp/Url.h>
 #include <zypp/PathInfo.h>
 
@@ -26,9 +27,9 @@ public:
     _media_id = id;
   }
 
-  bool isDesiredMedia(const media::MediaAccessRef &ref) const override
+  bool isDesiredMedia(const media::MediaHandler &ref) const override
   {
-    return ref->doesFileExist(Pathname("/x." + _media_id ));
+    return ref.doesFileExist(Pathname("/x." + _media_id ));
   }
 
 private:
index 98a2fe6..ef5c560 100644 (file)
@@ -1,19 +1,33 @@
 #include "TestSetup.h"
 #include <zypp/PurgeKernels.h>
+#include <set>
 
 #include <boost/test/data/test_case.hpp>
 
 using namespace zypp;
 using namespace boost::unit_test;
 
+namespace  {
+  // Defines a expected removal of a package and carries the flag if it actually was removed
+  struct ExpectedRemoval {
+    ExpectedRemoval( std::string &&name ) : packageNVRA(std::move(name)) {}
+    std::string packageNVRA;
+    mutable bool wasRemoved = false;
+  };
+
+  bool operator< ( const ExpectedRemoval &a, const ExpectedRemoval &b ) {
+    return a.packageNVRA < b.packageNVRA;
+  }
+}
+
 namespace boost { namespace test_tools { namespace tt_detail {
 template<>
-struct print_log_value< std::map<std::string, bool> > {
+struct print_log_value< std::set<ExpectedRemoval> > {
 void operator()( std::ostream& ostr,
-    std::map<std::string, bool> const& set)
+    std::set<ExpectedRemoval> const& set)
 {
   ostr << "{" << std::endl;
-  for( const auto &elem : set ) ostr << "'" << elem.first << "'," << std::endl;
+  for( const auto &elem : set ) ostr << "'" << elem.packageNVRA << "'," << std::endl;
   ostr << "}" << std::endl;
 }
 };
@@ -29,7 +43,7 @@ namespace  {
     std::string, // uname_r
     zypp::Arch,  // arch
     std::string, // keepSpec
-    std::map<std::string, bool> // expectedRems
+    std::set<ExpectedRemoval> // expectedRems
     >;
 
   std::vector<TestSample>  maketestdata() {
@@ -40,23 +54,23 @@ namespace  {
         Arch("x86_64"),
         "oldest,running,latest",
         {
-          { "kernel-default-1-2.x86_64", false },
-          { "kernel-default-devel-1-2.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-2.x86_64", false },
-          { "kernel-devel-1-2.noarch", false },
-          { "kernel-livepatch-default-1-2.x86_64", false },
-          { "kernel-syms-1-2.x86_64", false },
-          { "kernel-default-1-4.x86_64", false },
-          { "kernel-default-devel-1-4.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-4.x86_64", false },
-          { "kernel-devel-1-4.noarch", false },
-          { "kernel-syms-1-4.x86_64", false },
+          { "kernel-default-1-2.x86_64" },
+          { "kernel-default-devel-1-2.x86_64" },
+          { "kernel-default-devel-debuginfo-1-2.x86_64" },
+          { "kernel-devel-1-2.noarch" },
+          { "kernel-livepatch-default-1-2.x86_64" },
+          { "kernel-syms-1-2.x86_64" },
+          { "kernel-default-1-4.x86_64" },
+          { "kernel-default-devel-1-4.x86_64" },
+          { "kernel-default-devel-debuginfo-1-4.x86_64" },
+          { "kernel-devel-1-4.noarch" },
+          { "kernel-syms-1-4.x86_64" },
           // left over devel packages that need to go away too
-          { "kernel-devel-1-1.2.noarch", false },
-          { "kernel-source-1-1.2.noarch", false },
-          { "kernel-default-devel-1-3.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-3.x86_64", false },
-          { "kernel-devel-1-3.noarch", false },
+          { "kernel-devel-1-1.2.noarch" },
+          { "kernel-source-1-1.2.noarch" },
+          { "kernel-default-devel-1-3.x86_64" },
+          { "kernel-default-devel-debuginfo-1-3.x86_64" },
+          { "kernel-devel-1-3.noarch" },
         }
       },
       //test that keeps only the running kernel
@@ -66,37 +80,37 @@ namespace  {
         Arch("x86_64"),
         "running",
         {
-          { "kernel-default-1-1.x86_64", false },
-          { "kernel-default-devel-1-1.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-1.x86_64", false },
-          { "kernel-livepatch-default-1-1.x86_64", false },
-          { "kernel-devel-1-1.noarch", false },
-          { "kernel-syms-1-1.x86_64", false },
-          { "kernel-source-1-1.noarch", false },
-          { "kernel-default-1-2.x86_64", false },
-          { "kernel-default-devel-1-2.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-2.x86_64", false },
-          { "kernel-devel-1-2.noarch", false },
-          { "kernel-livepatch-default-1-2.x86_64", false },
-          { "kernel-syms-1-2.x86_64", false },
-          { "kernel-default-1-4.x86_64", false },
-          { "kernel-default-devel-1-4.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-4.x86_64", false },
-          { "kernel-devel-1-4.noarch", false },
-          { "kernel-syms-1-4.x86_64", false },
-          { "kernel-default-1-5.x86_64", false },
-          { "kernel-default-devel-1-5.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-5.x86_64", false },
-          { "kernel-devel-1-5.noarch", false },
-          { "kernel-syms-1-5.x86_64", false },
-          { "dummy-kmp-default-1-0.x86_64", false },
+          { "kernel-default-1-1.x86_64" },
+          { "kernel-default-devel-1-1.x86_64" },
+          { "kernel-default-devel-debuginfo-1-1.x86_64" },
+          { "kernel-livepatch-default-1-1.x86_64" },
+          { "kernel-devel-1-1.noarch" },
+          { "kernel-syms-1-1.x86_64" },
+          { "kernel-source-1-1.noarch" },
+          { "kernel-default-1-2.x86_64" },
+          { "kernel-default-devel-1-2.x86_64" },
+          { "kernel-default-devel-debuginfo-1-2.x86_64" },
+          { "kernel-devel-1-2.noarch" },
+          { "kernel-livepatch-default-1-2.x86_64" },
+          { "kernel-syms-1-2.x86_64" },
+          { "kernel-default-1-4.x86_64" },
+          { "kernel-default-devel-1-4.x86_64" },
+          { "kernel-default-devel-debuginfo-1-4.x86_64" },
+          { "kernel-devel-1-4.noarch" },
+          { "kernel-syms-1-4.x86_64" },
+          { "kernel-default-1-5.x86_64" },
+          { "kernel-default-devel-1-5.x86_64" },
+          { "kernel-default-devel-debuginfo-1-5.x86_64" },
+          { "kernel-devel-1-5.noarch" },
+          { "kernel-syms-1-5.x86_64" },
+          { "dummy-kmp-default-1-0.x86_64" },
           // left over devel packages that need to go away too
-          { "kernel-devel-1-1.2.noarch", false },
-          { "kernel-source-1-1.2.noarch", false },
-          { "kernel-default-devel-1-3.x86_64", false },
-          { "kernel-devel-1-3.noarch", false },
-          { "kernel-default-devel-1-3.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-3.x86_64", false },
+          { "kernel-devel-1-1.2.noarch" },
+          { "kernel-source-1-1.2.noarch" },
+          { "kernel-default-devel-1-3.x86_64" },
+          { "kernel-devel-1-3.noarch" },
+          { "kernel-default-devel-1-3.x86_64" },
+          { "kernel-default-devel-debuginfo-1-3.x86_64" },
         }
       },
       TestSample {
@@ -105,23 +119,23 @@ namespace  {
         Arch("x86_64"),
         "oldest+1,running,latest-1",
         {
-          { "kernel-default-1-1.x86_64", false },
-          { "kernel-livepatch-default-1-1.x86_64", false },
-          { "kernel-default-devel-1-1.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-1.x86_64", false },
-          { "kernel-devel-1-1.noarch", false },
-          { "kernel-syms-1-1.x86_64", false },
-          { "kernel-source-1-1.noarch", false },
-          { "kernel-default-1-5.x86_64", false },
-          { "kernel-default-devel-1-5.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-5.x86_64", false },
-          { "kernel-devel-1-5.noarch", false },
-          { "kernel-syms-1-5.x86_64", false },
-          { "dummy-kmp-default-1-0.x86_64", false },
+          { "kernel-default-1-1.x86_64" },
+          { "kernel-livepatch-default-1-1.x86_64" },
+          { "kernel-default-devel-1-1.x86_64" },
+          { "kernel-default-devel-debuginfo-1-1.x86_64" },
+          { "kernel-devel-1-1.noarch" },
+          { "kernel-syms-1-1.x86_64" },
+          { "kernel-source-1-1.noarch" },
+          { "kernel-default-1-5.x86_64" },
+          { "kernel-default-devel-1-5.x86_64" },
+          { "kernel-default-devel-debuginfo-1-5.x86_64" },
+          { "kernel-devel-1-5.noarch" },
+          { "kernel-syms-1-5.x86_64" },
+          { "dummy-kmp-default-1-0.x86_64" },
           // left over devel packages that need to go away too
-          { "kernel-default-devel-1-3.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-3.x86_64", false },
-          { "kernel-devel-1-3.noarch", false },
+          { "kernel-default-devel-1-3.x86_64" },
+          { "kernel-default-devel-debuginfo-1-3.x86_64" },
+          { "kernel-devel-1-3.noarch" },
         }
       },
       TestSample {
@@ -131,18 +145,18 @@ namespace  {
         Arch("x86_64"),
         "running",
         {
-          { "kernel-default-1-2.x86_64", false },
-          { "kernel-default-extra-1-2.x86_64", false },
-          { "kernel-default-devel-1-2.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-2.x86_64", false },
-          { "kernel-devel-1-2.noarch", false },
-          { "kernel-livepatch-default-1-2.x86_64", false },
-          { "kernel-syms-1-2.x86_64", false },
+          { "kernel-default-1-2.x86_64" },
+          { "kernel-default-extra-1-2.x86_64" },
+          { "kernel-default-devel-1-2.x86_64" },
+          { "kernel-default-devel-debuginfo-1-2.x86_64" },
+          { "kernel-devel-1-2.noarch" },
+          { "kernel-livepatch-default-1-2.x86_64" },
+          { "kernel-syms-1-2.x86_64" },
           // the following packages are not held back because they do not fit keep spec and no deps are keeping them
-          { "kernel-default-devel-1-1.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-1.x86_64", false },
-          { "kernel-devel-1-1.noarch", false},
-          { "kernel-syms-1-1.x86_64", false},
+          { "kernel-default-devel-1-1.x86_64" },
+          { "kernel-default-devel-debuginfo-1-1.x86_64" },
+          { "kernel-devel-1-1.noarch" },
+          { "kernel-syms-1-1.x86_64" },
         }
       },
       TestSample {
@@ -152,17 +166,17 @@ namespace  {
         Arch("x86_64"),
         "running",
         {
-          { "kernel-default-1-2.x86_64", false },
-          { "kernel-default-extra-1-2.x86_64", false },
-          { "kernel-default-devel-1-2.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-2.x86_64", false },
-          { "kernel-devel-1-2.noarch", false },
-          { "kernel-livepatch-default-1-2.x86_64", false },
-          { "kernel-syms-1-2.x86_64", false },
-          { "kernel-default-devel-1-5.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-5.x86_64", false },
-          { "kernel-devel-1-5.noarch", false },
-          { "kernel-syms-1-5.x86_64", false },
+          { "kernel-default-1-2.x86_64" },
+          { "kernel-default-extra-1-2.x86_64" },
+          { "kernel-default-devel-1-2.x86_64" },
+          { "kernel-default-devel-debuginfo-1-2.x86_64" },
+          { "kernel-devel-1-2.noarch" },
+          { "kernel-livepatch-default-1-2.x86_64" },
+          { "kernel-syms-1-2.x86_64" },
+          { "kernel-default-devel-1-5.x86_64" },
+          { "kernel-default-devel-debuginfo-1-5.x86_64" },
+          { "kernel-devel-1-5.noarch" },
+          { "kernel-syms-1-5.x86_64" },
         }
       },
       TestSample {
@@ -173,10 +187,10 @@ namespace  {
         Arch("x86_64"),
         "running,1-2",
         {
-          { "kernel-default-devel-1-5.x86_64", false },
-          { "kernel-default-devel-debuginfo-1-5.x86_64", false },
-          { "kernel-devel-1-5.noarch", false },
-          { "kernel-syms-1-5.x86_64", false },
+          { "kernel-default-devel-1-5.x86_64" },
+          { "kernel-default-devel-debuginfo-1-5.x86_64" },
+          { "kernel-devel-1-5.noarch" },
+          { "kernel-syms-1-5.x86_64" },
         }
       },
       TestSample {
@@ -187,41 +201,41 @@ namespace  {
         Arch("x86_64"),
         "latest,running",
         {
-          { "kernel-default-1-1.aarch64", false },
-          { "kernel-default-1-1.i686", false },
+          { "kernel-default-1-1.aarch64" },
+          { "kernel-default-1-1.i686" },
 
-          //{ "kernel-syms-1-1.x86_64", false },
-          //{ "kernel-default-devel-1-1.x86_64", false },
-          //{ "kernel-default-devel-debuginfo-1-1.x86_64", false },
+          //{ "kernel-syms-1-1.x86_64" },
+          //{ "kernel-default-devel-1-1.x86_64" },
+          //{ "kernel-default-devel-debuginfo-1-1.x86_64" },
 
-          { "kernel-default-1-2.aarch64", false },
-          { "kernel-default-1-2.i686", false },
-          { "kernel-default-1-2.x86_64", false },
+          { "kernel-default-1-2.aarch64" },
+          { "kernel-default-1-2.i686" },
+          { "kernel-default-1-2.x86_64" },
 
-          { "kernel-default-devel-1-1.aarch64", false },
-          { "kernel-default-devel-1-1.i686", false },
-          { "kernel-default-devel-1-2.aarch64", false },
-          { "kernel-default-devel-1-2.i686", false },
-          { "kernel-default-devel-1-2.x86_64", false },
+          { "kernel-default-devel-1-1.aarch64" },
+          { "kernel-default-devel-1-1.i686" },
+          { "kernel-default-devel-1-2.aarch64" },
+          { "kernel-default-devel-1-2.i686" },
+          { "kernel-default-devel-1-2.x86_64" },
 
-          { "kernel-default-devel-debuginfo-1-1.aarch64", false },
-          { "kernel-default-devel-debuginfo-1-1.i686", false },
-          { "kernel-default-devel-debuginfo-1-2.aarch64", false },
-          { "kernel-default-devel-debuginfo-1-2.i686", false },
-          { "kernel-default-devel-debuginfo-1-2.x86_64", false },
+          { "kernel-default-devel-debuginfo-1-1.aarch64" },
+          { "kernel-default-devel-debuginfo-1-1.i686" },
+          { "kernel-default-devel-debuginfo-1-2.aarch64" },
+          { "kernel-default-devel-debuginfo-1-2.i686" },
+          { "kernel-default-devel-debuginfo-1-2.x86_64" },
 
-          { "kernel-devel-1-2.noarch", false },
+          { "kernel-devel-1-2.noarch" },
 
-          { "kernel-livepatch-default-1-2.aarch64", false },
-          { "kernel-livepatch-default-1-2.i686", false },
-          { "kernel-livepatch-default-1-2.x86_64", false },
+          { "kernel-livepatch-default-1-2.aarch64" },
+          { "kernel-livepatch-default-1-2.i686" },
+          { "kernel-livepatch-default-1-2.x86_64" },
 
-          { "kernel-syms-1-1.aarch64", false },
-          { "kernel-syms-1-1.i686", false },
+          { "kernel-syms-1-1.aarch64" },
+          { "kernel-syms-1-1.i686" },
 
-          { "kernel-syms-1-2.aarch64", false },
-          { "kernel-syms-1-2.i686", false },
-          { "kernel-syms-1-2.x86_64", false },
+          { "kernel-syms-1-2.aarch64" },
+          { "kernel-syms-1-2.i686" },
+          { "kernel-syms-1-2.x86_64" },
         }
       },
       TestSample {
@@ -230,7 +244,7 @@ namespace  {
         Arch("x86_64"),
         "running",
         {
-          { "kernel-source-1-1.noarch", false },
+          { "kernel-source-1-1.noarch" },
         }
       },
       TestSample {
@@ -239,19 +253,19 @@ namespace  {
         Arch("x86_64"),
         "latest,latest-1,running",
         {
-          { "kernel-default-5.7.8-1.1.g8f507a0.x86_64", false },
-          { "kernel-default-5.7.9-1.1.ga010166.x86_64", false },
-          { "kernel-default-5.7.10-1.1.g6a1b5cf.x86_64", false },
-          { "kernel-default-5.7.10-3.1.gd1148b9.x86_64", false },
-          { "kernel-default-5.7.11-1.1.g5015994.x86_64", false },
-          { "kernel-default-5.7.12-1.1.g9c98feb.x86_64", false },
-          { "kernel-default-5.8.0-1.1.gd3bf2d6.x86_64", false },
-          { "kernel-default-5.8.0-2.1.g9bc0044.x86_64", false },
-          { "kernel-default-5.8.0-3.1.gd4e7682.x86_64", false },
-          { "kernel-default-5.8.1-1.1.ge6658c9.x86_64", false },
+          { "kernel-default-5.7.8-1.1.g8f507a0.x86_64" },
+          { "kernel-default-5.7.9-1.1.ga010166.x86_64" },
+          { "kernel-default-5.7.10-1.1.g6a1b5cf.x86_64" },
+          { "kernel-default-5.7.10-3.1.gd1148b9.x86_64" },
+          { "kernel-default-5.7.11-1.1.g5015994.x86_64" },
+          { "kernel-default-5.7.12-1.1.g9c98feb.x86_64" },
+          { "kernel-default-5.8.0-1.1.gd3bf2d6.x86_64" },
+          { "kernel-default-5.8.0-2.1.g9bc0044.x86_64" },
+          { "kernel-default-5.8.0-3.1.gd4e7682.x86_64" },
+          { "kernel-default-5.8.1-1.1.ge6658c9.x86_64" },
           // those are running, latest and latest-1 , they should stay
-          //{ "kernel-default-5.8.1-2.1.g553537d.x86_64", false },
-          //{ "kernel-default-5.8.1-3.1.g846658e.x86_64", false },
+          //{ "kernel-default-5.8.1-2.1.g553537d.x86_64" },
+          //{ "kernel-default-5.8.1-3.1.g846658e.x86_64" },
           }
       },
       TestSample {
@@ -260,10 +274,10 @@ namespace  {
         Arch("x86_64"),
         "running",
         {
-          { "kernel-default-base-5.7.8-1.1.1.1.x86_64", false },
-          { "kernel-default-base-5.7.8-2.1.1.1.x86_64", false },
-          //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64", false },
-          { "kernel-default-base-5.8.8-2.1.1.1.x86_64", false },
+          { "kernel-default-base-5.7.8-1.1.1.1.x86_64" },
+          { "kernel-default-base-5.7.8-2.1.1.1.x86_64" },
+          //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64" },
+          { "kernel-default-base-5.8.8-2.1.1.1.x86_64" },
           }
       },
       TestSample {
@@ -272,10 +286,10 @@ namespace  {
         Arch("x86_64"),
         "running, 5.7.8-2.1.1",
         {
-          { "kernel-default-base-5.7.8-1.1.1.1.x86_64", false },
-          { "kernel-default-base-5.8.8-2.1.1.1.x86_64", false },
-          //{ "kernel-default-base-5.7.8-2.1.1.1.x86_64", false },
-          //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64", false },
+          { "kernel-default-base-5.7.8-1.1.1.1.x86_64" },
+          { "kernel-default-base-5.8.8-2.1.1.1.x86_64" },
+          //{ "kernel-default-base-5.7.8-2.1.1.1.x86_64" },
+          //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64" },
           }
       },
       TestSample {
@@ -284,34 +298,45 @@ namespace  {
         Arch("x86_64"),
         "running",
         {
-          { "kernel-rt-1-1.x86_64", false },
-          { "kernel-rt-devel-1-1.x86_64", false },
-          { "kernel-rt-devel-debuginfo-1-1.x86_64", false },
-          { "kernel-devel-rt-1-1.noarch", false },
-          { "kernel-syms-rt-1-1.x86_64", false },
-          { "kernel-source-rt-1-1.noarch", false },
-          { "kernel-rt-1-2.x86_64", false },
-          { "kernel-rt-devel-1-2.x86_64", false },
-          { "kernel-rt-devel-debuginfo-1-2.x86_64", false },
-          { "kernel-devel-rt-1-2.noarch", false },
-          { "kernel-syms-rt-1-2.x86_64", false },
-          { "kernel-rt-1-4.x86_64", false },
-          { "kernel-rt-devel-1-4.x86_64", false },
-          { "kernel-rt-devel-debuginfo-1-4.x86_64", false },
-          { "kernel-devel-rt-1-4.noarch", false },
-          { "kernel-syms-rt-1-4.x86_64", false },
-          { "kernel-rt-1-5.x86_64", false },
-          { "kernel-rt-devel-1-5.x86_64", false },
-          { "kernel-rt-devel-debuginfo-1-5.x86_64", false },
-          { "kernel-devel-rt-1-5.noarch", false },
-          { "kernel-syms-rt-1-5.x86_64", false },
+          { "kernel-rt-1-1.x86_64" },
+          { "kernel-rt-devel-1-1.x86_64" },
+          { "kernel-rt-devel-debuginfo-1-1.x86_64" },
+          { "kernel-devel-rt-1-1.noarch" },
+          { "kernel-syms-rt-1-1.x86_64" },
+          { "kernel-source-rt-1-1.noarch" },
+          { "kernel-rt-1-2.x86_64" },
+          { "kernel-rt-devel-1-2.x86_64" },
+          { "kernel-rt-devel-debuginfo-1-2.x86_64" },
+          { "kernel-devel-rt-1-2.noarch" },
+          { "kernel-syms-rt-1-2.x86_64" },
+          { "kernel-rt-1-4.x86_64" },
+          { "kernel-rt-devel-1-4.x86_64" },
+          { "kernel-rt-devel-debuginfo-1-4.x86_64" },
+          { "kernel-devel-rt-1-4.noarch" },
+          { "kernel-syms-rt-1-4.x86_64" },
+          { "kernel-rt-1-5.x86_64" },
+          { "kernel-rt-devel-1-5.x86_64" },
+          { "kernel-rt-devel-debuginfo-1-5.x86_64" },
+          { "kernel-devel-rt-1-5.noarch" },
+          { "kernel-syms-rt-1-5.x86_64" },
           // left over devel packages that need to go away too
-          { "kernel-devel-rt-1-1.2.noarch", false },
-          { "kernel-source-rt-1-1.2.noarch", false },
-          { "kernel-rt-devel-1-3.x86_64", false },
-          { "kernel-devel-rt-1-3.noarch", false },
-          { "kernel-rt-devel-1-3.x86_64", false },
-          { "kernel-rt-devel-debuginfo-1-3.x86_64", false },
+          { "kernel-devel-rt-1-1.2.noarch" },
+          { "kernel-source-rt-1-1.2.noarch" },
+          { "kernel-rt-devel-1-3.x86_64" },
+          { "kernel-devel-rt-1-3.noarch" },
+          { "kernel-rt-devel-1-3.x86_64" },
+          { "kernel-rt-devel-debuginfo-1-3.x86_64" },
+        }
+      },
+      // rc kernels have a special naming hack because upstream uses characters that are forbidden in rpm versions
+      TestSample {
+        TESTS_SRC_DIR"/zypp/data/PurgeKernels/rckrnl",
+        "5.13.0-rc7-17-default",
+        Arch("x86_64"),
+        "running",
+        {
+          { "kernel-default-5.13.rc7-16.1.x86_64" },
+          { "kernel-default-5.13~rc7-18.1.x86_64" }
         }
       },
     };
@@ -341,15 +366,15 @@ BOOST_DATA_TEST_CASE(purge_kernels, bdata::make( maketestdata() ), repoPath, una
   for ( auto it = pool.byStatusBegin( toBeUninstalledFilter ); it != pool.byStatusEnd( toBeUninstalledFilter );  it++  ) {
     removeCount++;
 
-    auto pck = expectedRemovals.find( makeNVRA(*it) );
+    std::set<ExpectedRemoval>::iterator pck = expectedRemovals.find( makeNVRA(*it) );
     BOOST_REQUIRE_MESSAGE(  pck != expectedRemovals.end(), std::string("Unexpected package removed: ") + makeNVRA(*it) + (it->status().isByUser() ? " (by user)" : " (autoremoved)") );
 
-    pck->second = true;
+    (*pck).wasRemoved = true;
   }
 
   for ( const auto &rem : expectedRemovals ) {
-    if (!rem.second)
-      std::cout << std::string( "Expected package removal did not happen for: ") + rem.first  << std::endl;
+    if (!rem.wasRemoved)
+      std::cout << std::string( "Expected package removal did not happen for: ") + rem.packageNVRA  << std::endl;
     //BOOST_REQUIRE_MESSAGE( rem.second, std::string( "Expected package removal did not happen for: ") + rem.first );
   }
 
index 7f367b5..aff401b 100644 (file)
@@ -5,7 +5,7 @@ using target::rpm::RpmDb;
 
 #define DATADIR (Pathname(TESTS_SRC_DIR) / "/zypp/data/RpmPkgSigCheck")
 
-#ifndef HAVE_NO_RPMTSSETVFYFLAGS
+#ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP
 #define HAVE_RPMTSSETVFYFLAGS
 #endif
 
@@ -165,13 +165,13 @@ BOOST_AUTO_TEST_CASE(signed_pkg_nokey)
   BOOST_CHECK_EQUAL( cp, cs );
 
   CheckResult xpct { RpmDb::CHK_NOKEY, {
-    { RpmDb::CHK_NOKEY,        "    Header V3 RSA/SHA256 Signature, key ID 3dbdc284: NOKEY" },
+    { RpmDb::CHK_NOKEY,        "    Header V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: NOKEY" },
     { RpmDb::CHK_OK,   "    Header SHA1 digest: OK" },
     { RpmDb::CHK_OK,   "    Header SHA256 digest: OK" },
     { RpmDb::CHK_OK,   "    Payload SHA256 digest: OK" },
     { RpmDb::CHK_OK,   "    MD5 digest: OK" },
 #ifdef HAVE_RPMTSSETVFYFLAGS
-    { RpmDb::CHK_NOKEY,        "    V3 RSA/SHA256 Signature, key ID 3dbdc284: NOKEY" },
+    { RpmDb::CHK_NOKEY,        "    V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: NOKEY" },
 #endif
   } };
   BOOST_CHECK_EQUAL( xpct, cs );
@@ -185,13 +185,13 @@ BOOST_AUTO_TEST_CASE(signed_broken_pkg_nokey)
   BOOST_CHECK_EQUAL( cp, cs );
 
   CheckResult xpct { RpmDb::CHK_FAIL, {
-    { RpmDb::CHK_NOKEY,        "    Header V3 RSA/SHA256 Signature, key ID 3dbdc284: NOKEY" },
+    { RpmDb::CHK_NOKEY,        "    Header V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: NOKEY" },
     { RpmDb::CHK_OK,   "    Header SHA1 digest: OK" },
     { RpmDb::CHK_OK,   "    Header SHA256 digest: OK" },
     { RpmDb::CHK_FAIL, "    Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" },
     { RpmDb::CHK_FAIL, "    MD5 digest: BAD (Expected 8e64684e4d5bd90c3c13f76ecbda9ee2 != 442a473472708c39f3ac2b5eb38b476f)" },
 #ifdef HAVE_RPMTSSETVFYFLAGS
-    { RpmDb::CHK_FAIL, "    V3 RSA/SHA256 Signature, key ID 3dbdc284: BAD" },
+    { RpmDb::CHK_FAIL, "    V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: BAD" },
 #endif
   } };
   BOOST_CHECK_EQUAL( xpct, cs );
@@ -205,13 +205,13 @@ BOOST_AUTO_TEST_CASE(signed_broken_header_pkg_nokey)
   BOOST_CHECK_EQUAL( cp, cs );
 
   CheckResult xpct { RpmDb::CHK_FAIL, {
-    { RpmDb::CHK_FAIL, "    Header V3 RSA/SHA256 Signature, key ID 3dbdc284: BAD" },
+    { RpmDb::CHK_FAIL, "    Header V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: BAD" },
     { RpmDb::CHK_FAIL, "    Header SHA1 digest: BAD (Expected 9ca2e3aec038e562d33442271ee52c08ded0d637 != 95286fd653f927df0a42746e310861d3f89bb75c)" },
     { RpmDb::CHK_FAIL, "    Header SHA256 digest: BAD (Expected e88100656c8e06b6e4bb9155f0dd111ef8042866941f02b623cb46e12a82f732 != 76b343bcb9b8aaf9998fdcf7392e234944a0b078c67667fa0d658208b9a66983)" },
     { RpmDb::CHK_FAIL, "    Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" },
     { RpmDb::CHK_FAIL, "    MD5 digest: BAD (Expected 8e64684e4d5bd90c3c13f76ecbda9ee2 != 81df819a7d94638ff3ffe0bb93a7d177)" },
 #ifdef HAVE_RPMTSSETVFYFLAGS
-    { RpmDb::CHK_FAIL, "    V3 RSA/SHA256 Signature, key ID 3dbdc284: BAD" },
+    { RpmDb::CHK_FAIL, "    V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: BAD" },
 #endif
   } };
   BOOST_CHECK_EQUAL( xpct, cs );
@@ -256,13 +256,13 @@ BOOST_AUTO_TEST_CASE(signed_broken_pkg_withkey)
   BOOST_CHECK_EQUAL( cp, cs );
 
   CheckResult xpct { RpmDb::CHK_FAIL, {
-    { RpmDb::CHK_OK,   "    Header V3 RSA/SHA256 Signature, key ID 3dbdc284: OK" },
+    { RpmDb::CHK_OK,   "    Header V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: OK" },
     { RpmDb::CHK_OK,   "    Header SHA1 digest: OK" },
     { RpmDb::CHK_OK,   "    Header SHA256 digest: OK" },
     { RpmDb::CHK_FAIL, "    Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" },
     { RpmDb::CHK_FAIL, "    MD5 digest: BAD (Expected 8e64684e4d5bd90c3c13f76ecbda9ee2 != 442a473472708c39f3ac2b5eb38b476f)" },
 #ifdef HAVE_RPMTSSETVFYFLAGS
-    { RpmDb::CHK_FAIL, "    V3 RSA/SHA256 Signature, key ID 3dbdc284: BAD" },
+    { RpmDb::CHK_FAIL, "    V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: BAD" },
 #endif
   } };
   BOOST_CHECK_EQUAL( xpct, cs );
@@ -276,13 +276,13 @@ BOOST_AUTO_TEST_CASE(signed_broken_header_pkg_withkey)
   BOOST_CHECK_EQUAL( cp, cs );
 
   CheckResult xpct { RpmDb::CHK_FAIL, {
-    { RpmDb::CHK_FAIL, "    Header V3 RSA/SHA256 Signature, key ID 3dbdc284: BAD" },
+    { RpmDb::CHK_FAIL, "    Header V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: BAD" },
     { RpmDb::CHK_FAIL, "    Header SHA1 digest: BAD (Expected 9ca2e3aec038e562d33442271ee52c08ded0d637 != 95286fd653f927df0a42746e310861d3f89bb75c)" },
     { RpmDb::CHK_FAIL, "    Header SHA256 digest: BAD (Expected e88100656c8e06b6e4bb9155f0dd111ef8042866941f02b623cb46e12a82f732 != 76b343bcb9b8aaf9998fdcf7392e234944a0b078c67667fa0d658208b9a66983)" },
     { RpmDb::CHK_FAIL, "    Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" },
     { RpmDb::CHK_FAIL, "    MD5 digest: BAD (Expected 8e64684e4d5bd90c3c13f76ecbda9ee2 != 81df819a7d94638ff3ffe0bb93a7d177)" },
 #ifdef HAVE_RPMTSSETVFYFLAGS
-    { RpmDb::CHK_FAIL, "    V3 RSA/SHA256 Signature, key ID 3dbdc284: BAD" },
+    { RpmDb::CHK_FAIL, "    V3 RSA/SHA256 Signature, key ID b88b2fd43dbdc284: BAD" },
 #endif
   } };
   BOOST_CHECK_EQUAL( xpct, cs );
index 802564b..5974754 100644 (file)
@@ -1,5 +1,7 @@
 #include "TestSetup.h"
+#include "TestTools.h"
 #include <zypp/ExternalProgram.h>
+#include <zypp/TmpPath.h>
 
 #include <chrono>
 #include <thread>
@@ -7,9 +9,163 @@
 #include <sys/wait.h>
 
 #define BOOST_TEST_MODULE ExternalProgram
+#define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/base/data/ExternalProgram")
 
 using zypp::ExternalProgram;
 
+BOOST_AUTO_TEST_CASE( Basic )
+{
+  const char *argv[] = {
+    "bash",
+    "-c",
+    "echo \"Hello\";sleep 1;echo \"I'm the second line\";exit 123;",
+    nullptr
+  };
+  ExternalProgram proc( argv, ExternalProgram::Normal_Stderr );
+  BOOST_CHECK( proc.running() );
+
+  const auto pid = proc.getpid();
+  BOOST_REQUIRE ( pid != -1 );
+  std::string line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("Hello\n") );
+  line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("I'm the second line\n") );
+  int exitCode = proc.close();
+  BOOST_REQUIRE( !proc.running() );
+  BOOST_REQUIRE_EQUAL( proc.getpid(), -1 );
+  BOOST_REQUIRE_EQUAL( exitCode, 123 );
+  BOOST_REQUIRE_LT   ( ::getpgid( pid ) , 0 );
+}
+
+BOOST_AUTO_TEST_CASE( StderrToStdout )
+{
+  const char *argv[] = {
+    "bash",
+    "-c",
+    "echo \"Hello\";sleep 1;echo \"I'm the second line\" >&2;",
+    nullptr
+  };
+  ExternalProgram proc( argv, ExternalProgram::Stderr_To_Stdout );
+  BOOST_CHECK( proc.running() );
+  BOOST_REQUIRE ( proc.getpid() != -1 );
+  std::string line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("Hello\n") );
+  line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("I'm the second line\n") );
+  proc.close();
+  BOOST_REQUIRE( !proc.running() );
+  BOOST_REQUIRE_EQUAL( proc.getpid(), -1 );
+}
+
+BOOST_AUTO_TEST_CASE( SetEnv )
+{
+  const char *argv[] = {
+    "bash",
+    "-c",
+    "echo \"${ZYPPENV}\"",
+    nullptr
+  };
+  ExternalProgram proc( argv, ExternalProgram::Environment{ std::make_pair("ZYPPENV", "Hello from env") }, ExternalProgram::Normal_Stderr );
+  std::string line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("Hello from env\n") );
+  proc.close();
+}
+
+// environment of the parent has to be in the child process as well
+// some code paths rely on that
+BOOST_AUTO_TEST_CASE( ParentEnv )
+{
+  const char *argv[] = {
+    "bash",
+    "-c",
+    "echo \"${PARENTENV}${ZYPPENV}\"",
+    nullptr
+  };
+
+  setenv( "PARENTENV", "Hello from", 0 );
+
+  ExternalProgram proc( argv, ExternalProgram::Environment{ std::make_pair("ZYPPENV", " env") }, ExternalProgram::Normal_Stderr );
+  std::string line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("Hello from env\n") );
+  proc.close();
+
+  unsetenv( "PARENTENV" );
+}
+
+// weird feature to redirect stdout and stderr
+BOOST_AUTO_TEST_CASE( RedirectStdoutAndStderrWithChdir )
+{
+  zypp::filesystem::TmpDir dir;
+
+  const zypp::Pathname stdoutPath( dir.path()/"stdout" );
+  const zypp::Pathname stderrPath( dir.path()/"stderr" );
+
+  const std::string stdoutRedir( zypp::str::form(">%s", stdoutPath.c_str() ) );
+  const std::string chDir( zypp::str::form("#%s", dir.path().c_str() ) );
+  zypp::AutoFD stdErrRedir( ::open( stderrPath.c_str() , O_CREAT | O_RDWR, 0666 ) );
+
+  BOOST_REQUIRE( *stdErrRedir != -1 );
+
+  const char *argv[] = {
+    chDir.c_str(),
+    stdoutRedir.c_str(),
+    "bash",
+    "-c",
+    "echo \"Hello on stdout\";echo \"Hello on stderr\" >&2;echo \"Hello on file in chdir\" > chdirfile",
+    nullptr
+  };
+
+  ExternalProgram proc (argv, ExternalProgram::Stderr_To_FileDesc, false, *stdErrRedir );
+
+  int exitCode = proc.close();
+  BOOST_REQUIRE( !proc.running() );
+  BOOST_REQUIRE_EQUAL( exitCode, 0 );
+
+  ::close( *stdErrRedir );
+  *stdErrRedir = -1;
+
+  BOOST_REQUIRE_EQUAL( TestTools::readFile( stdoutPath ), "Hello on stdout\n");
+  BOOST_REQUIRE_EQUAL( TestTools::readFile( stderrPath ), "Hello on stderr\n");
+  BOOST_REQUIRE_EQUAL( TestTools::readFile( dir.path() / "chdirfile" ), "Hello on file in chdir\n");
+}
+
+BOOST_AUTO_TEST_CASE( LongRunningEcho )
+{
+  const auto executable = DATADIR/"echo.sh";
+  const char *argv[] = {
+    executable.c_str(),
+    nullptr
+  };
+
+  ExternalProgram proc (argv, ExternalProgram::Normal_Stderr );
+  BOOST_REQUIRE( proc.running() );
+  BOOST_REQUIRE( proc.send( "Hello" ) );
+  BOOST_REQUIRE( proc.send( " my friend\n" ) );
+  BOOST_REQUIRE( proc.send( "How are you today\n" ) );
+  BOOST_REQUIRE_EQUAL( proc.receiveLine(), "Hello my friend\n" );
+  BOOST_REQUIRE_EQUAL( proc.receiveLine(), "How are you today\n" );
+
+  BOOST_REQUIRE( proc.running() );
+  BOOST_REQUIRE( proc.send( "q\n" ) );
+  const auto res = proc.close();
+  BOOST_REQUIRE_EQUAL( res, 0 );
+}
+
+BOOST_AUTO_TEST_CASE( SendSignal )
+{
+  const auto executable = DATADIR/"echo.sh";
+  const char *argv[] = {
+    executable.c_str(),
+    nullptr
+  };
+
+  ExternalProgram proc (argv, ExternalProgram::Normal_Stderr );
+  BOOST_REQUIRE( proc.running() );
+  proc.kill( SIGTERM );
+  const auto exitCode = proc.close();
+  BOOST_REQUIRE_EQUAL( exitCode, SIGTERM+128 );
+}
+
 BOOST_AUTO_TEST_CASE( CleanerThread_default )
 {
   pid_t pid = -1;
@@ -19,10 +175,10 @@ BOOST_AUTO_TEST_CASE( CleanerThread_default )
     pid = proc.getpid();
   }
   std::this_thread::sleep_for( std::chrono::seconds(4) );
-  int status = 0;
-  int res = waitpid( pid, &status, WNOHANG );
-  BOOST_CHECK_EQUAL( res, -1 );
-  BOOST_CHECK_EQUAL( errno, ECHILD );
+  // check if the process is really gone, can't use waitpid because some ExternalProgram
+  // implementations do spawn processes from a helper thread which means they are not our direct children
+  BOOST_CHECK_EQUAL( ::getpgid( pid ), -1 );
+  BOOST_CHECK_EQUAL( errno, ESRCH );
 }
 
 BOOST_AUTO_TEST_CASE( ReadTimeout )
@@ -33,3 +189,24 @@ BOOST_AUTO_TEST_CASE( ReadTimeout )
   BOOST_CHECK_EQUAL( prog.receiveLine( 3000 ), "" );
   BOOST_CHECK_EQUAL( prog.close(), 0 );
 }
+
+BOOST_AUTO_TEST_CASE( CloseFDs )
+{
+  // simple bash script that counts the number of open fds, 4 is the minimum since ls opens one fd to read the /proc/self/fd
+  std::string_view script ( "if [ $( ls /proc/self/fd | wc -l ) -gt \"4\" ]; then exit 1; fi; exit 0" );
+
+  const char *argv[] = {
+    "bash",
+    "-c",
+    script.data(),
+    nullptr
+  };
+
+  // open random fds we definitely can read to get higher nr of fds
+  zypp::AutoFD testFD( ::open( "/proc/self/fd", O_RDONLY ) );
+  zypp::AutoFD testFD2( ::open( "/proc/self/fd", O_RDONLY ) );
+
+  ExternalProgram proc( argv, ExternalProgram::Discard_Stderr );
+  const auto exitCode = proc.close();
+  BOOST_REQUIRE_EQUAL( exitCode, 0 );
+}
diff --git a/tests/zypp/base/data/ExternalProgram/echo.sh b/tests/zypp/base/data/ExternalProgram/echo.sh
new file mode 100755 (executable)
index 0000000..a4e207b
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+#just read from stdin and write to stdout until we get a single q
+
+while read -r line
+do
+  if [ "$line" == "q" ]
+  then
+    exit 0
+  fi
+
+  echo "$line"
+done
diff --git a/tests/zypp/data/PurgeKernels/rckrnl/@System.repo b/tests/zypp/data/PurgeKernels/rckrnl/@System.repo
new file mode 100644 (file)
index 0000000..67b2e59
--- /dev/null
@@ -0,0 +1,34 @@
+=Ver: 3.0
+=Pkg: glibc 1 1 x86_64
++Prv:
+glibc = 1-1
+-Prv:
+=Vnd: openSUSE
+=Pkg: kernel-default 5.13.rc7 16.1 x86_64
++Prv:
+multiversion(kernel)
+kernel-default-5.13.rc7-16.1
+kernel = 5.13.rc7-16.1
+kernel-uname-r = 5.13.0-rc7-16-default
+kernel-default = 5.13.rc7-16.1
+-Prv:
+=Vnd: openSUSE
+=Pkg: kernel-default 5.13~rc7 17.1 x86_64
++Prv:
+multiversion(kernel)
+kernel-default-5.13~rc7-17.1
+kernel = 5.13~rc7-17.1
+kernel-uname-r = 5.13.0-rc7-17-default
+kernel-default = 5.13~rc7-17.1
+-Prv:
+=Vnd: openSUSE
+=Pkg: kernel-default 5.13~rc7 18.1 x86_64
++Prv:
+multiversion(kernel)
+kernel-default-5.13~rc7-18.1
+kernel = 5.13~rc7-18.1
+kernel-uname-r = 5.13.0-rc7-18-default
+kernel-default = 5.13~rc7-18.1
+-Prv:
+=Vnd: openSUSE
+
diff --git a/tests/zypp/data/PurgeKernels/rckrnl/zypp-control.yaml b/tests/zypp/data/PurgeKernels/rckrnl/zypp-control.yaml
new file mode 100644 (file)
index 0000000..e80c106
--- /dev/null
@@ -0,0 +1,38 @@
+version: 1.0
+setup:
+  channels:
+    - alias: "@System"
+      url: []
+      path: ""
+      type: NONE
+      generated: 0
+      outdated: 0
+      priority: 99
+      file: "@System.repo"
+  arch: x86_64
+  locales:
+    - fate: ""
+      name: en_US
+    - fate: ""
+      name: de
+  autoinst:
+    []
+  modalias:
+    []
+  multiversion:
+    []
+  resolverFlags:
+    focus: Job
+    ignorealreadyrecommended: false
+    onlyRequires: false
+    forceResolve: false
+    cleandepsOnRemove: false
+    allowDowngrade: false
+    allowNameChange: false
+    allowArchChange: false
+    allowVendorChange: false
+    dupAllowDowngrade: false
+    dupAllowNameChange: false
+    dupAllowArchChange: false
+    dupAllowVendorChange: false
+trials: []
index e9139db..fb2f50e 100644 (file)
@@ -1,5 +1,7 @@
 ADD_TESTS(
   EventLoop
+  IOBuffer
 )
 
 ADD_SUBDIRECTORY( media )
+ADD_SUBDIRECTORY( io )
index ef944dc..c92cf34 100644 (file)
@@ -1,13 +1,14 @@
 #include <boost/test/unit_test.hpp>
-#include <zypp/zyppng/base/EventDispatcher>
-#include <zypp/zyppng/base/Timer>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/Timer>
 #include <zypp/base/Exception.h>
 
 #include <iostream>
 
 BOOST_AUTO_TEST_CASE(eventloop)
 {
-  zyppng::EventDispatcher::Ptr loop = zyppng::EventDispatcher::createMain();
+  zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create();
 
   //we should hit that timer first
   zyppng::Timer::Ptr t1 = zyppng::Timer::create();
@@ -27,7 +28,7 @@ BOOST_AUTO_TEST_CASE(eventloop)
   int executedIdle = 0;
   int executedIdleOnce = 0;
 
-  t1->sigExpired().connect( [ &hitT1, &t3 ]( zyppng::Timer &t) {
+  t1->sigExpired().connect( [ &hitT1, &t3 ]( zyppng::Timer & ) {
     hitT1++;
     t3.reset();
   });
@@ -44,7 +45,7 @@ BOOST_AUTO_TEST_CASE(eventloop)
   });
 
   t4->setSingleShot( true );
-  t4->sigExpired().connect( [ &hitT4 ]( zyppng::Timer &t ){
+  t4->sigExpired().connect( [ &hitT4 ]( zyppng::Timer & ){
     hitT4++;
 
     //timer deviation should not be too big, can only be tested on a singleShot timer
@@ -73,7 +74,7 @@ BOOST_AUTO_TEST_CASE(eventloop)
   t1->stop();
   t2->stop();
 
-  BOOST_REQUIRE_EQUAL( loop->runningTimers(), 0 );
+  BOOST_REQUIRE_EQUAL( loop->eventDispatcher()->runningTimers(), 0 );
 }
 
 BOOST_AUTO_TEST_CASE(createTimerWithoutEV)
@@ -83,8 +84,8 @@ BOOST_AUTO_TEST_CASE(createTimerWithoutEV)
 
 BOOST_AUTO_TEST_CASE(checkcleanup)
 {
-  zyppng::EventDispatcher::Ptr loop = zyppng::EventDispatcher::createMain();
-  BOOST_REQUIRE_EQUAL( loop.get(), zyppng::EventDispatcher::instance().get() );
+  zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create();
+  BOOST_REQUIRE_EQUAL( loop->eventDispatcher().get(), zyppng::EventDispatcher::instance().get() );
 
   //explicit cleanup
   loop.reset();
@@ -92,13 +93,7 @@ BOOST_AUTO_TEST_CASE(checkcleanup)
 
   //implicit cleanup
   {
-    zyppng::EventDispatcher::createMain();
+    zyppng::EventLoop::create();
     BOOST_REQUIRE_EQUAL( static_cast<zyppng::EventDispatcher *>(nullptr), zyppng::EventDispatcher::instance().get() );
   }
-
-  //only one instance per thread
-  loop = zyppng::EventDispatcher::createMain();
-  BOOST_REQUIRE_THROW( zyppng::EventDispatcher::createMain(), zypp::Exception );
-
-  BOOST_REQUIRE_EQUAL( loop.get(), zyppng::EventDispatcher::instance().get() );
 }
diff --git a/tests/zyppng/IOBuffer_test.cc b/tests/zyppng/IOBuffer_test.cc
new file mode 100644 (file)
index 0000000..498c1f6
--- /dev/null
@@ -0,0 +1,174 @@
+#include <boost/test/unit_test.hpp>
+#include <zypp-core/zyppng/io/private/iobuffer_p.h>
+#include <algorithm>
+
+BOOST_AUTO_TEST_CASE(iobuf)
+{
+  zyppng::IOBuffer buf ( 10 );
+
+  zyppng::ByteArray t("Hello World");
+
+  buf.append( t );
+  buf.append( zyppng::ByteArray(" it's a great day!") );
+
+
+  zyppng::ByteArray rbuf( 30, '\0' );
+
+  BOOST_REQUIRE_EQUAL( buf.size(), 29);
+  BOOST_REQUIRE_EQUAL( buf.chunks(), 2);
+
+  buf.read( rbuf.data(), 5 );
+  BOOST_REQUIRE_EQUAL( std::string_view(rbuf.data()), "Hello" );
+  BOOST_REQUIRE_EQUAL( buf.size(), 24);
+  BOOST_REQUIRE_EQUAL( buf.chunks(), 2);
+
+  buf.read( rbuf.data()+5, 6);
+  BOOST_REQUIRE_EQUAL( std::string_view(rbuf.data()), "Hello World" );
+  BOOST_REQUIRE_EQUAL( buf.size(), 18);
+  BOOST_REQUIRE_EQUAL( buf.chunks(), 1);
+
+  buf.read( rbuf.data()+11, 18 );
+  BOOST_REQUIRE_EQUAL( std::string_view(rbuf.data()), "Hello World it's a great day!" );
+  BOOST_REQUIRE_EQUAL( buf.size(), 0);
+  BOOST_REQUIRE_EQUAL( buf.chunks(), 0);
+}
+
+
+BOOST_AUTO_TEST_CASE(iobuf_reserve_and_discard)
+{
+  zyppng::IOBuffer buf;
+  buf.reserve( 1234 );
+  BOOST_REQUIRE_EQUAL( buf.size(), 1234);
+  BOOST_REQUIRE_EQUAL( buf.chunks(), 1);
+  buf.discard( 1234 );
+  BOOST_REQUIRE_EQUAL( buf.size(), 0);
+  BOOST_REQUIRE_EQUAL( buf.chunks(), 0);
+}
+
+BOOST_AUTO_TEST_CASE(iobuf_readtoomuch)
+{
+  zyppng::IOBuffer buf;
+  buf.append( zyppng::ByteArray("Short Text") );
+  BOOST_REQUIRE_EQUAL( buf.size(), 10);
+
+  zyppng::ByteArray rbuf( 15, '\0' );
+  const auto read = buf.read( rbuf.data(), rbuf.size() );
+  BOOST_REQUIRE_EQUAL( read, 10 );
+  BOOST_REQUIRE_EQUAL( std::string_view(rbuf.data()), "Short Text" );
+  BOOST_REQUIRE_EQUAL( buf.size(), 0);
+}
+
+BOOST_AUTO_TEST_CASE(iobuf_reserve_small)
+{
+  zyppng::IOBuffer buf( 20 );
+  buf.append( zyppng::ByteArray("1234567890") );
+  buf.append( zyppng::ByteArray("1234567890") );
+  BOOST_REQUIRE_EQUAL( buf.chunks(), 1);
+  buf.append( zyppng::ByteArray("1234567890") );
+  BOOST_REQUIRE_EQUAL( buf.chunks(), 2);
+}
+
+
+BOOST_AUTO_TEST_CASE(iobuf_indexof)
+{
+  zyppng::IOBuffer buf(10);
+                               /*|-Chunk1-|*/
+  buf.append( zyppng::ByteArray("1234567890") );
+                                /*|--Chunk2-|*/
+  buf.append( zyppng::ByteArray("\n23456\n89a") );
+                               /*|-Chunk3-|*/
+  buf.append( zyppng::ByteArray("9876543210") );
+
+  BOOST_REQUIRE_EQUAL( buf.chunks(), 3);
+  BOOST_REQUIRE_EQUAL( buf.indexOf('\n'), 10 );
+  BOOST_REQUIRE_EQUAL( buf.indexOf('\n', buf.size(), 10), 10 );
+  BOOST_REQUIRE_EQUAL( buf.indexOf('\n', buf.size(), 11), 16 );
+  BOOST_REQUIRE_EQUAL( buf.indexOf('\n', buf.size(), 17), -1 );
+  BOOST_REQUIRE_EQUAL( buf.indexOf('a', buf.size(), 12), 19 );
+}
+
+//shamelessly adapted from Qt
+BOOST_AUTO_TEST_CASE(iobuf_indexof_progression)
+{
+  zyppng::IOBuffer buf(16);
+  for ( int i = 1; i <= 256; i++ ) {
+    buf.append( zyppng::ByteArray({char(i)}));
+  }
+
+  for (int i = 16; i < 256; ++i) {
+    auto index = buf.indexOf(char(i));
+    BOOST_REQUIRE_EQUAL(index, (i - 1));
+    BOOST_REQUIRE_EQUAL(buf.indexOf(char(i), i, i >> 1), index);
+    BOOST_REQUIRE_EQUAL(buf.indexOf(char(i), 256, i), -1);
+    BOOST_REQUIRE_EQUAL(buf.indexOf(char(i), i - 1), -1); // test for absent char
+  }
+}
+
+BOOST_AUTO_TEST_CASE(reserveAndRead)
+{
+  zyppng::IOBuffer buf;
+  // fill buffer with an arithmetic progression
+  for (int i = 1; i < 256; ++i) {
+    zyppng::ByteArray ba(i, char(i));
+    char *ringPos = buf.reserve(i);
+    BOOST_REQUIRE(ringPos);
+    memcpy(ringPos, ba.data(), i);
+  }
+  // readback and check stored data
+  for (int i = 1; i < 256; ++i) {
+    zyppng::ByteArray ba;
+    ba.resize(i);
+    int64_t thisRead = buf.read(ba.data(), i);
+    BOOST_REQUIRE_EQUAL(thisRead, int64_t(i));
+    BOOST_REQUIRE_EQUAL(std::count( ba.begin(), ba.end(), char(i)), i);
+  }
+  BOOST_REQUIRE_EQUAL(buf.size(), 0);
+}
+
+BOOST_AUTO_TEST_CASE(readline)
+{
+  zyppng::IOBuffer buf(10);
+
+  zyppng::ByteArray b1("Hello World\n");
+  buf.append( b1 );
+  zyppng::ByteArray b2("Another\n");
+  buf.append( b2 );
+  zyppng::ByteArray b3("1234\n");
+  buf.append( b3 );
+  zyppng::ByteArray b4("6789\n");
+  buf.append( b4 );
+
+  BOOST_REQUIRE( buf.canReadLine() );
+
+  auto r1 = buf.readLine( 5 );
+  BOOST_REQUIRE_EQUAL( r1.size(), 0 );
+  r1 = buf.readLine();
+  BOOST_REQUIRE_EQUAL( std::string_view( r1.data(), r1.size() ), std::string_view(b1.data(), b1.size()) );
+  r1 = buf.readLine();
+  BOOST_REQUIRE_EQUAL( std::string_view( r1.data(), r1.size() ), std::string_view(b2.data(), b2.size()) );
+  r1 = buf.readLine();
+  BOOST_REQUIRE_EQUAL( std::string_view( r1.data(), r1.size() ), std::string_view(b3.data(), b3.size()) );
+  r1 = buf.readLine( 5 );
+  BOOST_REQUIRE_EQUAL( std::string_view( r1.data(), r1.size() ), std::string_view(b4.data(), b4.size()) );
+
+}
+
+BOOST_AUTO_TEST_CASE(move)
+{
+  zyppng::IOBuffer buf(10);
+
+  zyppng::ByteArray b1("Hello World\n");
+  buf.append( b1 );
+  zyppng::ByteArray b2("Another\n");
+  buf.append( b2 );
+  zyppng::ByteArray b3("1234\n");
+  buf.append( b3 );
+  zyppng::ByteArray b4("6789\n");
+  buf.append( b4 );
+
+  const auto size = buf.size();
+  zyppng::IOBuffer buf2( std::move( buf ) );
+
+  BOOST_REQUIRE_EQUAL( size, buf2.size() );
+
+}
diff --git a/tests/zyppng/data/downloader/primary-deltatemplate.xml.zck b/tests/zyppng/data/downloader/primary-deltatemplate.xml.zck
new file mode 100644 (file)
index 0000000..84e21a5
Binary files /dev/null and b/tests/zyppng/data/downloader/primary-deltatemplate.xml.zck differ
diff --git a/tests/zyppng/data/downloader/primary.xml.zck b/tests/zyppng/data/downloader/primary.xml.zck
new file mode 100644 (file)
index 0000000..8289ddf
Binary files /dev/null and b/tests/zyppng/data/downloader/primary.xml.zck differ
diff --git a/tests/zyppng/data/downloader/primary.xml.zck.meta b/tests/zyppng/data/downloader/primary.xml.zck.meta
new file mode 100644 (file)
index 0000000..2b953ff
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metalink version="3.0"
+  xmlns="http://www.metalinker.org/"
+  generator="http://metalinks.sourceforge.net/"
+  >
+<files>
+       <file name="primary.xml.zck">
+               <size>274638</size>
+               <verification>
+                       <hash type="md5">e5b4a4abe414f4d71ab4074605b05c09</hash>
+                       <hash type="sha1">22d7d67a9f7dd879906c58842973957dc4fe506a</hash>
+                       <pieces length="262144" type="sha1">
+                               <hash piece="0">2f13f8abd8501a05a66e4b9dd70e7af5b3977bb8</hash>
+                               <hash piece="1">836b510886ff38a29d344ffa629087be134d1053</hash>
+                       </pieces>
+               </verification>
+               <resources>
+                       %1%
+               </resources>
+       </file>
+</files>
+</metalink>
diff --git a/tests/zyppng/data/process/echo.sh b/tests/zyppng/data/process/echo.sh
new file mode 100755 (executable)
index 0000000..7648676
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+#just read from the predefined fd (3) until we get a single q and echo everything else to the predefined write fd (4)
+
+while read -u 3 -r line
+do
+  if [ "$line" == "q" ]
+  then
+    printf "Byt Bye" >&2;
+    exit 0
+  fi
+
+  echo "$line" >&4
+  echo "Received line $line" >&2
+done
+exit 123
diff --git a/tests/zyppng/io/AsyncDataSource_test.cc b/tests/zyppng/io/AsyncDataSource_test.cc
new file mode 100644 (file)
index 0000000..9012509
--- /dev/null
@@ -0,0 +1,165 @@
+#include <boost/test/unit_test.hpp>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/Timer>
+#include <zypp-core/zyppng/io/AsyncDataSource>
+#include <thread>
+#include <string_view>
+#include <iostream>
+#include <glib-unix.h>
+
+
+BOOST_AUTO_TEST_CASE ( pipe_read_close )
+{
+  std::string_view text ("Hello from thread");
+  int pipeFds[2] { -1, -1 };
+  BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) );
+
+  auto loop = zyppng::EventLoop::create();
+  auto dataSource = zyppng::AsyncDataSource::create();
+
+  // make sure we are not stuck
+  auto timer = zyppng::Timer::create();
+  timer->start( 1000 );
+  timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){
+    loop->quit();
+  });
+
+  bool gotClosed = false;
+  zypp::ByteArray readData;
+
+  BOOST_REQUIRE( dataSource->open( pipeFds[0] ) );
+  BOOST_REQUIRE( dataSource->canRead() );
+
+  dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadyRead, [&](){
+    std::cout <<"Got read"<<std::endl;
+    zypp::ByteArray d = dataSource->readAll();
+    readData.insert( readData.end(), d.begin(), d.end()  );
+  } );
+
+  dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadFdClosed, [&]( auto ){
+    gotClosed = true;
+    loop->quit();
+  });
+
+  std::thread writer( []( int writeFd, std::string_view text ){
+    ::write( writeFd, text.data(), text.length() );
+    ::close( writeFd );
+  }, pipeFds[1], text );
+
+  loop->run();
+  writer.join();
+
+  ::close( pipeFds[0] );
+  BOOST_REQUIRE_EQUAL( std::string_view( readData.data(), readData.size() ), text );
+  BOOST_REQUIRE ( gotClosed );
+}
+
+BOOST_AUTO_TEST_CASE ( pipe_write_close )
+{
+  std::string_view text ("Hello from main");
+  int pipeFds[2] { -1, -1 };
+  BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) );
+
+  auto loop = zyppng::EventLoop::create();
+  auto dataSink = zyppng::AsyncDataSource::create();
+
+  // make sure we are not stuck
+  auto timer = zyppng::Timer::create();
+  timer->start( 3000 );
+  timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){
+    loop->quit();
+  });
+
+  BOOST_REQUIRE( dataSink->open( -1, pipeFds[1] ) );
+  BOOST_REQUIRE( dataSink->canWrite() );
+
+  std::size_t bytesWritten = 0;
+  dataSink->connectFunc( &zyppng::AsyncDataSource::sigBytesWritten, [&]( std::size_t bytes ){
+    bytesWritten += bytes;
+    if ( bytesWritten == text.size() )
+      loop->quit();
+
+  });
+
+  zypp::ByteArray readData;
+  std::thread reader( [ &readData ]( int readFd, std::string_view text ) {
+
+    auto loop = zyppng::EventLoop::create();
+    auto dataSource = zyppng::AsyncDataSource::create();
+
+    if ( !dataSource->open( readFd ) )
+      return;
+
+    // make sure we are not stuck
+    auto timer = zyppng::Timer::create();
+    timer->start( 1000 );
+    timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){
+      loop->quit();
+    });
+
+    dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadyRead, [&](){
+      zypp::ByteArray d = dataSource->readAll();
+      readData.insert( readData.end(), d.begin(), d.end()  );
+      if ( readData.size() == text.length() )
+        loop->quit();
+    });
+
+    loop->run();
+
+    std::cout << "Thread did read: " << readData.data() << std::endl;
+
+    ::close( readFd );
+
+  }, pipeFds[0], text );
+
+  BOOST_REQUIRE_EQUAL( dataSink->write( text.data(), text.length() ), text.length() );
+
+  loop->run();
+  reader.join();
+
+  ::close( pipeFds[1] );
+  BOOST_REQUIRE_EQUAL( std::string_view( readData.data(), readData.size() ), text );
+}
+
+BOOST_AUTO_TEST_CASE ( pipe_close )
+{
+  std::string_view text ("Hello from main");
+  int pipeFds[2] { -1, -1 };
+  BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) );
+
+  auto loop = zyppng::EventLoop::create();
+  auto dataSink = zyppng::AsyncDataSource::create();
+
+  // make sure we are not stuck
+  auto timer = zyppng::Timer::create();
+  timer->start( 3000 );
+  timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){
+    loop->quit();
+  });
+
+  bool gotClosed = false;
+
+  BOOST_REQUIRE( dataSink->open( -1, pipeFds[1] ) );
+  BOOST_REQUIRE( dataSink->canWrite() );
+
+  std::size_t bytesWritten = 0;
+  dataSink->connectFunc( &zyppng::AsyncDataSource::sigBytesWritten, [&]( std::size_t bytes ){
+    bytesWritten += bytes;
+  });
+
+  dataSink->sigWriteFdClosed().connect([&]( auto ){
+    gotClosed = true;
+    loop->quit();
+  });
+
+  // we close the pipe before the loop even has a chance writing to it
+  ::close( pipeFds[0] );
+
+  BOOST_REQUIRE_EQUAL( dataSink->write( text.data(), text.length() ), text.length() );
+
+  loop->run();
+  ::close( pipeFds[1] );
+
+  BOOST_REQUIRE ( gotClosed );
+}
+
diff --git a/tests/zyppng/io/CMakeLists.txt b/tests/zyppng/io/CMakeLists.txt
new file mode 100644 (file)
index 0000000..f326520
--- /dev/null
@@ -0,0 +1,5 @@
+ADD_TESTS(
+    UnixSocket
+    AsyncDataSource
+    Process
+)
diff --git a/tests/zyppng/io/Process_test.cc b/tests/zyppng/io/Process_test.cc
new file mode 100644 (file)
index 0000000..83130c2
--- /dev/null
@@ -0,0 +1,367 @@
+#include "TestSetup.h"
+#include "TestTools.h"
+#include <zypp/ExternalProgram.h>
+#include <zypp/TmpPath.h>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/io/Process>
+#include <zypp-core/zyppng/io/IODevice>
+#include <zypp-core/zyppng/io/AsyncDataSource>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+
+#include <chrono>
+#include <thread>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#define BOOST_TEST_MODULE ExternalProgram
+#define DATADIR (Pathname(TESTS_SRC_DIR) + "/zyppng/data/process")
+
+using zypp::ExternalProgram;
+
+BOOST_AUTO_TEST_CASE( Basic )
+{
+  const char *argv[] = {
+    "bash",
+    "-c",
+    "echo \"Hello\";sleep 1;echo \"I'm the second line\";exit 123;",
+    nullptr
+  };
+
+  auto ev = zyppng::EventLoop::create();
+  auto proc = zyppng::Process::create();
+
+  bool gotStarted = false;
+  proc->connectFunc( &zyppng::Process::sigStarted, [&](){
+    gotStarted = true;
+  });
+
+  int  exitCode = -1;
+  bool gotFinished = false;
+  proc->connectFunc( &zyppng::Process::sigFinished, [&]( int status ){
+    gotFinished = true;
+    exitCode = status;
+    ev->quit();
+  });
+
+  bool gotFailedToStart = false;
+  proc->connectFunc( &zyppng::Process::sigFailedToStart, [&]( ){
+    gotFailedToStart = true;
+    ev->quit();
+  });
+
+  BOOST_REQUIRE( proc->start( argv ) );
+  BOOST_REQUIRE( proc->isRunning() );
+
+  const auto pid = proc->pid();
+  BOOST_REQUIRE ( pid != -1 );
+
+  ev->run();
+
+  BOOST_REQUIRE( gotStarted );
+  BOOST_REQUIRE( gotFinished );
+  BOOST_REQUIRE_EQUAL( exitCode, 123 );
+  BOOST_REQUIRE( !gotFailedToStart );
+
+  BOOST_REQUIRE( proc->stdoutDevice()->bytesAvailable() );
+
+  auto data = proc->stdoutDevice()->readLine();
+  BOOST_REQUIRE_EQUAL( data.asStringView(), std::string_view("Hello\n") );
+
+  data = proc->stdoutDevice()->readLine();
+  BOOST_REQUIRE_EQUAL( data.asStringView(), std::string_view("I'm the second line\n") );
+
+  BOOST_REQUIRE( !proc->isRunning() );
+  BOOST_REQUIRE_EQUAL( proc->exitStatus(), 123 );
+
+  BOOST_REQUIRE_LT   ( ::getpgid( pid ) , 0 );
+}
+
+BOOST_AUTO_TEST_CASE( InvalidExec )
+{
+  const char *argv[] = {
+    "./NoSuchFileHere",
+    nullptr
+  };
+
+  auto ev = zyppng::EventLoop::create();
+  auto proc = zyppng::Process::create();
+
+  bool gotStarted = false;
+  proc->connectFunc( &zyppng::Process::sigStarted, [&](){
+    gotStarted = true;
+  });
+
+  int  exitCode = -1;
+  bool gotFinished = false;
+  proc->connectFunc( &zyppng::Process::sigFinished, [&]( int status ){
+    gotFinished = true;
+    exitCode = status;
+  });
+
+  bool gotFailedToStart = false;
+  proc->connectFunc( &zyppng::Process::sigFailedToStart, [&]( ){
+    gotFailedToStart = true;
+  });
+
+  BOOST_REQUIRE( !proc->start( argv ) );
+  BOOST_REQUIRE( !proc->isRunning() );
+
+  BOOST_REQUIRE( !gotStarted );
+  BOOST_REQUIRE( !gotFinished );
+  BOOST_REQUIRE( gotFailedToStart );
+  BOOST_REQUIRE_EQUAL( proc->exitStatus(), 129 );
+}
+
+/*
+ * This tests a special feature where we move arbitrary fds into the new process for special use
+ */
+BOOST_AUTO_TEST_CASE( mapExtraFD )
+{
+  auto pipeA = zyppng::Pipe::create( );
+  auto pipeB = zyppng::Pipe::create( );
+
+  BOOST_REQUIRE( pipeA );
+  BOOST_REQUIRE( pipeB );
+
+  auto ev = zyppng::EventLoop::create();
+  auto proc = zyppng::Process::create();
+
+  // we have one pipe we want to write to, so the process can receive data
+  proc->addFd( pipeA->readFd  );
+  // and another one the process uses to talk to us
+  proc->addFd( pipeB->writeFd );
+
+  auto dataSource = zyppng::AsyncDataSource::create();
+  BOOST_REQUIRE( dataSource->open( pipeB->readFd, pipeA->writeFd ) );
+  BOOST_REQUIRE( dataSource->canRead() );
+  BOOST_REQUIRE( dataSource->canWrite( ) );
+
+  proc->connectFunc( &zyppng::Process::sigStarted, [&](){
+
+    // once the process has been started close the ends of the pipes we gave to the process
+    pipeA->unrefRead();
+    pipeB->unrefWrite();
+
+    // write some data
+    BOOST_REQUIRE( dataSource->write( zypp::ByteArray("Hello") ) );
+    BOOST_REQUIRE( dataSource->write( zypp::ByteArray(" my friend\n" ) ) );
+    BOOST_REQUIRE( dataSource->write( zypp::ByteArray("How are you today\n" ) ) );
+    BOOST_REQUIRE( dataSource->write( zypp::ByteArray("q\n" ) ) );
+
+  });
+
+  ByteArray bytesRead;
+  const auto &readAllData = [&](){
+    const auto &data = dataSource->readAll();
+    bytesRead.insert( bytesRead.end(), data.begin(), data.end() );
+  };
+
+  dataSource->sigReadyRead().connect( [&](){
+    readAllData();
+  });
+
+  int  exitCode = -1;
+  bool gotFinished = false;
+  proc->connectFunc( &zyppng::Process::sigFinished, [&]( int status ){
+    gotFinished = true;
+    exitCode = status;
+    ev->quit();
+  });
+
+  const auto executable = DATADIR/"echo.sh";
+  const char *argv[] = {
+    executable.c_str(),
+    nullptr
+  };
+
+  BOOST_REQUIRE( proc->start( argv ) );
+  BOOST_REQUIRE( proc->isRunning() );
+
+  ev->run();
+
+  BOOST_REQUIRE_EQUAL ( exitCode, 0 );
+  BOOST_REQUIRE       ( gotFinished );
+
+  if ( dataSource->bytesAvailable() )
+    readAllData();
+
+  BOOST_REQUIRE_EQUAL( zypp::ByteArray("Hello my friend\nHow are you today\n"), bytesRead );
+
+
+}
+
+#if 0
+BOOST_AUTO_TEST_CASE( StderrToStdout )
+{
+  const char *argv[] = {
+    "bash",
+    "-c",
+    "echo \"Hello\";sleep 1;echo \"I'm the second line\" >&2;",
+    nullptr
+  };
+  ExternalProgram proc( argv, ExternalProgram::Stderr_To_Stdout );
+  BOOST_CHECK( proc.running() );
+  BOOST_REQUIRE ( proc.getpid() != -1 );
+  std::string line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("Hello\n") );
+  line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("I'm the second line\n") );
+  proc.close();
+  BOOST_REQUIRE( !proc.running() );
+  BOOST_REQUIRE_EQUAL( proc.getpid(), -1 );
+}
+
+BOOST_AUTO_TEST_CASE( SetEnv )
+{
+  const char *argv[] = {
+    "bash",
+    "-c",
+    "echo \"${ZYPPENV}\"",
+    nullptr
+  };
+  ExternalProgram proc( argv, ExternalProgram::Environment{ std::make_pair("ZYPPENV", "Hello from env") }, ExternalProgram::Normal_Stderr );
+  std::string line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("Hello from env\n") );
+  proc.close();
+}
+
+// environment of the parent has to be in the child process as well
+// some code paths rely on that
+BOOST_AUTO_TEST_CASE( ParentEnv )
+{
+  const char *argv[] = {
+    "bash",
+    "-c",
+    "echo \"${PARENTENV}${ZYPPENV}\"",
+    nullptr
+  };
+
+  setenv( "PARENTENV", "Hello from", 0 );
+
+  ExternalProgram proc( argv, ExternalProgram::Environment{ std::make_pair("ZYPPENV", " env") }, ExternalProgram::Normal_Stderr );
+  std::string line = proc.receiveLine();
+  BOOST_REQUIRE_EQUAL( line, std::string("Hello from env\n") );
+  proc.close();
+
+  unsetenv( "PARENTENV" );
+}
+
+// weird feature to redirect stdout and stderr
+BOOST_AUTO_TEST_CASE( RedirectStdoutAndStderrWithChdir )
+{
+  zypp::filesystem::TmpDir dir;
+
+  const zypp::Pathname stdoutPath( dir.path()/"stdout" );
+  const zypp::Pathname stderrPath( dir.path()/"stderr" );
+
+  const std::string stdoutRedir( zypp::str::form(">%s", stdoutPath.c_str() ) );
+  const std::string chDir( zypp::str::form("#%s", dir.path().c_str() ) );
+  zypp::AutoFD stdErrRedir( ::open( stderrPath.c_str() , O_CREAT | O_RDWR, 0666 ) );
+
+  BOOST_REQUIRE( *stdErrRedir != -1 );
+
+  const char *argv[] = {
+    chDir.c_str(),
+    stdoutRedir.c_str(),
+    "bash",
+    "-c",
+    "echo \"Hello on stdout\";echo \"Hello on stderr\" >&2;echo \"Hello on file in chdir\" > chdirfile",
+    nullptr
+  };
+
+  ExternalProgram proc (argv, ExternalProgram::Stderr_To_FileDesc, false, *stdErrRedir );
+
+  int exitCode = proc.close();
+  BOOST_REQUIRE( !proc.running() );
+  BOOST_REQUIRE_EQUAL( exitCode, 0 );
+
+  ::close( *stdErrRedir );
+  *stdErrRedir = -1;
+
+  BOOST_REQUIRE_EQUAL( TestTools::readFile( stdoutPath ), "Hello on stdout\n");
+  BOOST_REQUIRE_EQUAL( TestTools::readFile( stderrPath ), "Hello on stderr\n");
+  BOOST_REQUIRE_EQUAL( TestTools::readFile( dir.path() / "chdirfile" ), "Hello on file in chdir\n");
+}
+
+BOOST_AUTO_TEST_CASE( LongRunningEcho )
+{
+  const auto executable = DATADIR/"echo.sh";
+  const char *argv[] = {
+    executable.c_str(),
+    nullptr
+  };
+
+  ExternalProgram proc (argv, ExternalProgram::Normal_Stderr );
+  BOOST_REQUIRE( proc.running() );
+  BOOST_REQUIRE( proc.send( "Hello" ) );
+  BOOST_REQUIRE( proc.send( " my friend\n" ) );
+  BOOST_REQUIRE( proc.send( "How are you today\n" ) );
+  BOOST_REQUIRE_EQUAL( proc.receiveLine(), "Hello my friend\n" );
+  BOOST_REQUIRE_EQUAL( proc.receiveLine(), "How are you today\n" );
+
+  BOOST_REQUIRE( proc.running() );
+  BOOST_REQUIRE( proc.send( "q\n" ) );
+  const auto res = proc.close();
+  BOOST_REQUIRE_EQUAL( res, 0 );
+}
+
+BOOST_AUTO_TEST_CASE( SendSignal )
+{
+  const auto executable = DATADIR/"echo.sh";
+  const char *argv[] = {
+    executable.c_str(),
+    nullptr
+  };
+
+  ExternalProgram proc (argv, ExternalProgram::Normal_Stderr );
+  BOOST_REQUIRE( proc.running() );
+  proc.kill( SIGTERM );
+  const auto exitCode = proc.close();
+  BOOST_REQUIRE_EQUAL( exitCode, SIGTERM+128 );
+}
+
+BOOST_AUTO_TEST_CASE( CleanerThread_default )
+{
+  pid_t pid = -1;
+  {
+    ExternalProgram proc( "bash -c 'sleep 2'", ExternalProgram::Normal_Stderr );
+    BOOST_CHECK( proc.running() );
+    pid = proc.getpid();
+  }
+  std::this_thread::sleep_for( std::chrono::seconds(4) );
+  // check if the process is really gone, can't use waitpid because some ExternalProgram
+  // implementations do spawn processes from a helper thread which means they are not our direct children
+  BOOST_CHECK_EQUAL( ::getpgid( pid ), -1 );
+  BOOST_CHECK_EQUAL( errno, ESRCH );
+}
+
+BOOST_AUTO_TEST_CASE( ReadTimeout )
+{
+  static const char* argv[] = { "sleep", "2", NULL };
+  ExternalProgram prog( argv, ExternalProgram::Discard_Stderr );
+  BOOST_CHECK_THROW( prog.receiveLine( 100 ), io::TimeoutException );
+  BOOST_CHECK_EQUAL( prog.receiveLine( 3000 ), "" );
+  BOOST_CHECK_EQUAL( prog.close(), 0 );
+}
+
+BOOST_AUTO_TEST_CASE( CloseFDs )
+{
+  // simple bash script that counts the number of open fds, 4 is the minimum since ls opens one fd to read the /proc/self/fd
+  std::string_view script ( "if [ $( ls /proc/self/fd | wc -l ) -gt \"4\" ]; then exit 1; fi; exit 0" );
+
+  const char *argv[] = {
+    "bash",
+    "-c",
+    script.data(),
+    nullptr
+  };
+
+  // open random fds we definitely can read to get higher nr of fds
+  zypp::AutoFD testFD( ::open( "/proc/self/fd", O_RDONLY ) );
+  zypp::AutoFD testFD2( ::open( "/proc/self/fd", O_RDONLY ) );
+
+  ExternalProgram proc( argv, ExternalProgram::Discard_Stderr );
+  const auto exitCode = proc.close();
+  BOOST_REQUIRE_EQUAL( exitCode, 0 );
+}
+#endif
diff --git a/tests/zyppng/io/UnixSocket_test.cc b/tests/zyppng/io/UnixSocket_test.cc
new file mode 100644 (file)
index 0000000..b72b00f
--- /dev/null
@@ -0,0 +1,409 @@
+#include <boost/test/unit_test.hpp>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/Timer>
+#include <zypp-core/zyppng/io/Socket>
+#include <zypp-core/zyppng/io/SockAddr>
+#include <thread>
+#include <string_view>
+#include <iostream>
+
+BOOST_AUTO_TEST_CASE ( lorem )
+{
+
+  const std::string payloadT =
+    "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, "
+    "sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem "
+    "ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore "
+    "magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata "
+    "sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut "
+    "labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
+    "no sea takimata sanctus est Lorem ipsum dolor sit amet.";
+
+  // make sure we get over the OS buffers
+  std::string payload;
+  for ( int i = 0; i < 700; i++ ) {
+    payload += payloadT;
+  }
+
+  auto ev = zyppng::EventLoop::create();
+  auto listeningSock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+  auto error = zyppng::Socket::NoError;
+
+  size_t bytesWritten = 0;
+  zyppng::ByteArray dataReceived; //< This is where the thread will write the data
+
+  auto addr = std::make_shared<zyppng::UnixSockAddr>( "socktest", true );
+  BOOST_REQUIRE( listeningSock->bind( addr ) );
+  BOOST_REQUIRE( listeningSock->listen() );
+  BOOST_REQUIRE_EQUAL( listeningSock->state(), zyppng::Socket::ListeningState );
+
+  zyppng::Socket::Ptr connection;
+
+  listeningSock->sigIncomingConnection().connect( [&](){
+    connection = listeningSock->accept();
+    BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ConnectedState );
+
+    connection->sigError().connect([&]( const auto err ){
+      if ( err == zyppng::Socket::ConnectionDelayed )
+        return;
+      error = err;
+      ev->quit();
+    });
+
+    connection->sigDisconnected().connect( [&](){
+      BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ClosedState );
+      ev->quit();
+    });
+
+    connection->sigBytesWritten().connect( [&]( const auto bytes ){
+      bytesWritten += bytes;
+    });
+
+    connection->write( payload.data(), payload.size() );
+  });
+
+  std::thread clientThread( [ payload, &dataReceived ](){
+    auto ev   = zyppng::EventLoop::create();
+    auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+    auto timer = zyppng::Timer::create();
+
+    bool timedOut = false;
+    bool gotConnected = false;
+    bool gotDisconnected = false;
+    auto error = zyppng::Socket::NoError;
+
+    sock->sigError().connect( [&]( const zyppng::Socket::SocketError err ){
+      if ( err == zyppng::Socket::ConnectionDelayed )
+        return;
+      error = err;
+      ev->quit();
+    });
+
+    sock->sigConnected().connect( [&](){
+      BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ConnectedState );
+      gotConnected = true;
+    });
+
+    sock->sigDisconnected().connect( [&](){
+      gotDisconnected = true;
+      BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState );
+      ev->quit();
+    });
+
+    sock->sigReadyRead().connect([&](){
+      const auto bA = sock->bytesAvailable();
+      auto all = sock->readAll();
+
+      std::cout << "Received" << std::endl;
+
+      dataReceived.insert( dataReceived.end(), all.begin(), all.end() );
+      BOOST_REQUIRE_GE( all.size(), bA );
+
+      if ( dataReceived.size() == payload.length() ) {
+        std::string_view rec( dataReceived.data(), dataReceived.size() );
+        BOOST_REQUIRE_EQUAL( rec, payload );
+        sock->disconnect();
+      }
+    });
+
+    timer->sigExpired().connect([&]( zyppng::Timer &) {
+      timedOut = true;
+      ev->quit();
+    });
+
+    timer->start( 30000 );
+
+    sock->connect( std::make_shared<zyppng::UnixSockAddr>( "socktest", true ) );
+    BOOST_REQUIRE( sock->state() == zyppng::Socket::ConnectedState || sock->state() == zyppng::Socket::ConnectingState );
+
+
+    ev->run();
+    BOOST_REQUIRE_EQUAL( error, zyppng::Socket::NoError );
+    BOOST_REQUIRE( gotConnected );
+    BOOST_REQUIRE( gotDisconnected );
+    BOOST_REQUIRE_EQUAL( timedOut, false );
+  });
+
+  ev->run();
+  clientThread.join();
+
+  BOOST_REQUIRE_EQUAL( payload , std::string_view( dataReceived.data(), dataReceived.size() ) );
+  BOOST_REQUIRE_EQUAL( bytesWritten, payload.size() );
+
+}
+
+BOOST_AUTO_TEST_CASE ( echo )
+{
+
+  const std::string payload = "Hello World";
+
+  auto ev = zyppng::EventLoop::create();
+  auto listeningSock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+  auto error = zyppng::Socket::NoError;
+
+  auto addr = std::make_shared<zyppng::UnixSockAddr>( "socktest", true );
+  BOOST_REQUIRE( listeningSock->bind( addr ) );
+  BOOST_REQUIRE( listeningSock->listen() );
+  BOOST_REQUIRE_EQUAL( listeningSock->state(), zyppng::Socket::ListeningState );
+
+  zyppng::Socket::Ptr connection;
+  zyppng::ByteArray received;
+
+  listeningSock->sigIncomingConnection().connect( [&](){
+    connection = listeningSock->accept();
+    BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ConnectedState );
+
+    connection->sigError().connect([&]( const auto err ){
+      if ( err == zyppng::Socket::ConnectionDelayed )
+        return;
+      error = err;
+      ev->quit();
+    });
+
+    connection->sigDisconnected().connect( [&](){
+      BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ClosedState );
+      ev->quit();
+    });
+
+    // just echo received data back right away
+    connection->sigReadyRead().connect( [&](){
+      connection->write( connection->readAll() );
+    });
+  });
+
+  std::thread clientThread( [ payload ](){
+    auto ev   = zyppng::EventLoop::create();
+    auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+    auto timer = zyppng::Timer::create();
+
+    bool timedOut = false;
+    bool gotConnected = false;
+    bool gotDisconnected = false;
+    auto error = zyppng::Socket::NoError;
+
+    sock->sigError().connect( [&]( const zyppng::Socket::SocketError err ){
+      if ( err == zyppng::Socket::ConnectionDelayed )
+        return;
+      error = err;
+      ev->quit();
+    });
+
+    sock->sigConnected().connect( [&](){
+      BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ConnectedState );
+      gotConnected = true;
+
+
+      sock->write( payload.data(), payload.size() );
+    });
+
+    sock->sigDisconnected().connect( [&](){
+      gotDisconnected = true;
+      BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState );
+      ev->quit();
+    });
+
+    zyppng::ByteArray dataReceived;
+    sock->sigReadyRead().connect([&](){
+      const auto bA = sock->bytesAvailable();
+      auto all = sock->readAll();
+
+      dataReceived.insert( dataReceived.end(), all.begin(), all.end() );
+      BOOST_REQUIRE_EQUAL( bA, all.size() );
+
+      if ( dataReceived.size() == payload.length() ) {
+        std::string_view rec( dataReceived.data(), dataReceived.size() );
+        BOOST_REQUIRE_EQUAL( rec, payload );
+        sock->disconnect();
+      }
+    });
+
+    timer->sigExpired().connect([&]( zyppng::Timer &) {
+      timedOut = true;
+      ev->quit();
+    });
+
+    timer->start( 30000 );
+
+    sock->connect( std::make_shared<zyppng::UnixSockAddr>( "socktest", true ) );
+    BOOST_REQUIRE( sock->state() == zyppng::Socket::ConnectedState || sock->state() == zyppng::Socket::ConnectingState );
+
+
+    ev->run();
+    BOOST_REQUIRE_EQUAL( error, zyppng::Socket::NoError );
+    BOOST_REQUIRE( gotConnected );
+    BOOST_REQUIRE( gotDisconnected );
+    BOOST_REQUIRE_EQUAL( timedOut, false );
+  });
+
+  ev->run();
+  clientThread.join();
+}
+
+BOOST_AUTO_TEST_CASE ( err )
+{
+  auto ev   = zyppng::EventLoop::create();
+  {
+    auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+
+    const auto res = sock->connect( std::make_shared<zyppng::UnixSockAddr>( "socktest", true ) );
+    BOOST_REQUIRE( !res );
+    BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState );
+    BOOST_REQUIRE_EQUAL ( sock->lastError() ,  zyppng::Socket::ConnectionRefused );
+  }
+
+  if ( ::geteuid() != 0 ) {
+    auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+
+    const auto res = sock->bind( std::make_shared<zyppng::UnixSockAddr>( "/root/socketicannotcreate", false ) );
+    BOOST_REQUIRE( !res );
+    BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState );
+    BOOST_REQUIRE_EQUAL ( sock->lastError() ,  zyppng::Socket::InsufficientPermissions );
+  }
+
+  {
+    auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+    auto addr = std::make_shared<zyppng::UnixSockAddr>( "socktest", true );
+    sock->bind( addr );
+    const auto res = sock->bind( addr );
+    BOOST_REQUIRE( !res );
+    BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState );
+    BOOST_REQUIRE_EQUAL ( sock->lastError() ,  zyppng::Socket::SocketAlreadyBound );
+  }
+
+  {
+    auto sock  = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+    auto sock2 = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+
+    auto addr = std::make_shared<zyppng::UnixSockAddr>( "socktest", true );
+    sock->bind( addr );
+
+    const auto res = sock2->bind( addr );
+    BOOST_REQUIRE( !res );
+    BOOST_REQUIRE_EQUAL ( sock2->lastError() ,  zyppng::Socket::AddressInUse );
+  }
+}
+
+BOOST_AUTO_TEST_CASE ( lotsofdata )
+{
+
+  const std::string payload =
+    "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, "
+    "sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem "
+    "ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore "
+    "magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata "
+    "sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut "
+    "labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
+    "no sea takimata sanctus est Lorem ipsum dolor sit amet.";
+
+  auto ev = zyppng::EventLoop::create();
+  auto listeningSock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+  auto error = zyppng::Socket::NoError;
+
+  const int iterations = 1000000;
+  size_t bytesShouldBeWritten = 0;
+  size_t bytesWritten = 0;
+  size_t bytesWrittenSignaled = 0;
+  size_t bytesReceived = 0;
+
+  auto addr = std::make_shared<zyppng::UnixSockAddr>( "socktest", true );
+  BOOST_REQUIRE( listeningSock->bind( addr ) );
+  BOOST_REQUIRE( listeningSock->listen() );
+  BOOST_REQUIRE_EQUAL( listeningSock->state(), zyppng::Socket::ListeningState );
+
+  zyppng::Socket::Ptr connection;
+
+  listeningSock->sigIncomingConnection().connect( [&](){
+    connection = listeningSock->accept();
+    BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ConnectedState );
+
+    connection->sigError().connect([&]( const auto err ){
+      if ( err == zyppng::Socket::ConnectionDelayed )
+        return;
+      error = err;
+      ev->quit();
+    });
+
+    connection->sigDisconnected().connect( [&](){
+      BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ClosedState );
+      ev->quit();
+    });
+
+    connection->sigReadyRead().connect([&](){
+      auto all = connection->readAll();
+      bytesReceived += all.size();
+    });
+  });
+
+  std::thread clientThread( [ payload, &bytesWritten, &bytesWrittenSignaled, &bytesShouldBeWritten ](){
+    auto cev   = zyppng::EventLoop::create();
+    auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+    auto timer = zyppng::Timer::create();
+
+    bool timedOut = false;
+    bool gotConnected = false;
+    bool gotDisconnected = false;
+
+    auto error = zyppng::Socket::NoError;
+
+    sock->sigError().connect( [&]( const zyppng::Socket::SocketError err ){
+      if ( err == zyppng::Socket::ConnectionDelayed )
+        return;
+      error = err;
+      cev->quit();
+    });
+
+    sock->sigConnected().connect( [&](){
+      BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ConnectedState );
+      gotConnected = true;
+
+      for ( int i = 0; i < iterations; i++ ) {
+        auto thisBytesWritten = sock->write( payload.data(), payload.length() );
+        bytesShouldBeWritten += payload.length();
+        bytesWritten += thisBytesWritten;
+
+      }
+      sock->disconnect();
+    });
+
+    sock->sigBytesWritten().connect( [&]( const auto bytes ){
+      timer->start();
+      bytesWrittenSignaled += bytes;
+    });
+
+    sock->sigDisconnected().connect( [&](){
+      gotDisconnected = true;
+      BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState );
+      cev->quit();
+    });
+
+    timer->sigExpired().connect([&]( zyppng::Timer &) {
+      timedOut = true;
+      cev->quit();
+    });
+
+    timer->start( 30000 );
+
+    sock->connect( std::make_shared<zyppng::UnixSockAddr>( "socktest", true ) );
+
+    if ( sock->state() == zyppng::Socket::ConnectingState
+         || sock->state() == zyppng::Socket::ConnectedState
+         || sock->state() == zyppng::Socket::ClosingState ) {
+      cev->run();
+    }
+
+    BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState );
+    BOOST_REQUIRE_EQUAL( error, zyppng::Socket::NoError );
+    BOOST_REQUIRE( gotConnected );
+    BOOST_REQUIRE( gotDisconnected );
+    BOOST_REQUIRE_EQUAL( timedOut, false );
+  });
+
+  ev->run();
+  clientThread.join();
+
+  BOOST_REQUIRE_EQUAL( error, zyppng::Socket::ConnectionClosedByRemote );
+  BOOST_REQUIRE_EQUAL( bytesWritten, payload.size() * iterations );
+  BOOST_REQUIRE_EQUAL( bytesWritten, bytesReceived );
+  BOOST_REQUIRE_EQUAL( bytesWritten, bytesWrittenSignaled );
+
+}
index 95025eb..2f335b2 100644 (file)
@@ -1,9 +1,12 @@
-#include <zypp/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/EventDispatcher>
 #include <zypp/zyppng/media/network/downloader.h>
+#include <zypp/zyppng/media/network/downloadspec.h>
 #include <zypp/zyppng/media/network/networkrequesterror.h>
 #include <zypp/zyppng/media/network/networkrequestdispatcher.h>
 #include <zypp/zyppng/media/network/request.h>
 #include <zypp/media/CredentialManager.h>
+#include <zypp/Digest.h>
 #include <zypp/TmpPath.h>
 #include <zypp/PathInfo.h>
 #include <zypp/ZConfig.h>
 #include <fstream>
 #include <random>
 #include "WebServer.h"
+#include "TestTools.h"
 
 #include <boost/test/unit_test.hpp>
 #include <boost/test/data/test_case.hpp>
 
 #define BOOST_TEST_REQ_SUCCESS(REQ) \
   do { \
-      BOOST_REQUIRE_MESSAGE( REQ->state() == zyppng::Download::Success, zypp::str::Format(" %1% != zyppng::Download::Success (%2%)") % REQ->state() % REQ->errorString() ); \
+      BOOST_REQUIRE_MESSAGE( REQ->state() == zyppng::Download::Finished && !REQ->hasError(), zypp::str::Format(" %1% != zyppng::Download::Success (%2%)") % REQ->state() % REQ->errorString() ); \
       BOOST_REQUIRE_EQUAL( REQ->lastRequestError().type(), zyppng::NetworkRequestError::NoError ); \
       BOOST_REQUIRE( REQ->errorString().empty() ); \
   } while(false)
 
 #define BOOST_TEST_REQ_FAILED(REQ) \
   do { \
-      BOOST_REQUIRE_EQUAL( REQ->state(), zyppng::Download::Failed ); \
+      BOOST_REQUIRE_EQUAL( REQ->state(), zyppng::Download::Finished ); \
+      BOOST_REQUIRE( REQ->hasError() ); \
       BOOST_REQUIRE_NE( REQ->lastRequestError().type(), zyppng::NetworkRequestError::NoError ); \
       BOOST_REQUIRE( !REQ->errorString().empty() ); \
   } while(false)
@@ -33,28 +38,11 @@ namespace bdata = boost::unit_test::data;
 
 bool withSSL[] = {true, false};
 
-//read all contents of a file into a string)
-std::string readFile ( const zypp::Pathname &file )
-{
-  if ( ! zypp::PathInfo( file ).isFile() ) {
-    return std::string();
-  }
-  std::ifstream istr( file.asString().c_str() );
-  if ( ! istr ) {
-    return std::string();
-  }
-
-  std::string str((std::istreambuf_iterator<char>(istr)),
-    std::istreambuf_iterator<char>());
-  return str;
-}
-
-
 BOOST_DATA_TEST_CASE( dltest_basic, bdata::make( withSSL ), withSSL)
 {
-  auto ev = zyppng::EventDispatcher::createMain();
+  auto ev = zyppng::EventLoop::create();
 
-  zyppng::Downloader downloader;
+  zyppng::Downloader::Ptr downloader = std::make_shared<zyppng::Downloader>();
 
   //make sure the data here is big enough to cross the threshold of 256 bytes so we get a progress signal emitted and not only the alive signal.
   std::string dummyContent = "This is just some dummy content,\nto test downloading and signals.\n"
@@ -81,8 +69,8 @@ BOOST_DATA_TEST_CASE( dltest_basic, bdata::make( withSSL ), withSSL)
   std::vector<zyppng::Download::State> allStates;
 
 
-  zyppng::Download::Ptr dl = downloader.downloadFile(  weburl, targetFile.path(), dummyContent.length() );
-  dl->settings() = set;
+  zyppng::Download::Ptr dl = downloader->downloadFile(  zyppng::DownloadSpec(weburl, targetFile.path(), dummyContent.length()) );
+  dl->spec().setTransferSettings( set );
 
   dl->sigFinished().connect([&]( zyppng::Download & ){
     gotFinished = true;
@@ -116,19 +104,25 @@ BOOST_DATA_TEST_CASE( dltest_basic, bdata::make( withSSL ), withSSL)
   BOOST_REQUIRE( gotAlive );
   BOOST_REQUIRE_EQUAL( totalDL, dummyContent.length() );
   BOOST_REQUIRE_EQUAL( lastProgress, dummyContent.length() );
-  BOOST_REQUIRE ( allStates == std::vector<zyppng::Download::State>({zyppng::Download::Initializing,zyppng::Download::Running, zyppng::Download::Success}) );
+  BOOST_REQUIRE ( allStates == std::vector<zyppng::Download::State>({zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::Finished}) );
 }
 
-
 struct MirrorSet
 {
   std::string name; //<dataset name, used only in debug output if the test fails
-  std::string handlerPath; //< the webhandler path used to query the resource
+  std::string filename; //< the name of the file we want to query, the test will base all other handlers and filenames on this
+  zypp::ByteCount dlTotal;
   std::vector< std::pair<int, std::string> > mirrors; //all mirrors injected into the metalink file
   int expectedFileDownloads; //< how many downloads are direct file downloads
   int expectedHandlerDownloads; //< how many started downloads are handler requests
   std::vector<zyppng::Download::State> expectedStates;
   bool expectSuccess; //< should the download work out?
+  zypp::ByteCount chunkSize = zypp::ByteCount( 256, zypp::ByteCount::K );
+
+  //zck data
+  zypp::CheckSum  headerChecksum; //< ZChunk header checksum
+  zypp::ByteCount headerSize;     //< ZChunk header size
+  std::string     deltaFilePath;  //< ZChunk delta file
 
   std::ostream & operator<<( std::ostream & str ) const {
     str << "MirrorSet{ " << name << " }";
@@ -152,38 +146,71 @@ std::vector< MirrorSet > generateMirr ()
   //all mirrors good:
   res.push_back( MirrorSet() );
   res.back().name = "All good mirrors";
+  res.back().filename = "test.txt";
+  res.back().dlTotal = 2148018;
   res.back().expectSuccess = true;
   res.back().expectedHandlerDownloads  = 1;
   res.back().expectedFileDownloads  = 9;
-  res.back().expectedStates = {zyppng::Download::Initializing, zyppng::Download::RunningMulti, zyppng::Download::Success};
+  res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished};
+  for ( int i = 100 ; i >= 10; i -= 10 )
+    res.back().mirrors.push_back( std::make_pair( i, "/test.txt") );
+
+  //all mirrors good big chunk
+  res.push_back( MirrorSet() );
+  res.back().name = "All good mirrors, 1024 chunk size";
+  res.back().filename = "test.txt";
+  res.back().dlTotal = 2148018;
+  res.back().expectSuccess = true;
+  res.back().expectedHandlerDownloads  = 1;
+  res.back().expectedFileDownloads  = 3;
+  res.back().chunkSize = zypp::ByteCount( 1024, zypp::ByteCount::K );
+  res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished};
   for ( int i = 100 ; i >= 10; i -= 10 )
     res.back().mirrors.push_back( std::make_pair( i, "/test.txt") );
 
   //no mirrors:
   res.push_back( MirrorSet() );
   res.back().name = "Empty mirrors";
+  res.back().filename = "test.txt";
+  res.back().dlTotal = 2148018;
   res.back().expectSuccess = true;
   res.back().expectedHandlerDownloads  = 10;
   res.back().expectedFileDownloads  = 0;
-  res.back().expectedStates = {zyppng::Download::Initializing, zyppng::Download::RunningMulti, zyppng::Download::Success};
+  res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished};
 
   //only broken mirrors:
   res.push_back( MirrorSet() );
   res.back().name = "All broken mirrors";
+  res.back().filename = "test.txt";
+  res.back().dlTotal = 2148018;
   res.back().expectSuccess = true;
   res.back().expectedHandlerDownloads  = 2; //has to fall back to url handler download
   res.back().expectedFileDownloads  = 10; //should try all mirrors and fail
-  res.back().expectedStates = {zyppng::Download::Initializing, zyppng::Download::RunningMulti, zyppng::Download::Running, zyppng::Download::Success};
+  res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::DlSimple, zyppng::Download::Finished};
   for ( int i = 100 ; i >= 10; i -= 10 )
     res.back().mirrors.push_back( std::make_pair( i, "/doesnotexist.txt") );
 
+  //only broken mirrors:
+  res.push_back( MirrorSet() );
+  res.back().name = "All broken mirrors by params";
+  res.back().filename = "test.txt";
+  res.back().dlTotal = 2148018;
+  res.back().expectSuccess = true;
+  res.back().expectedHandlerDownloads  = 2; //has to fall back to url handler download
+  res.back().expectedFileDownloads  = 0; // Setting up the mirrors will fail before even starting a download, so we should only see requests to the handler directly
+  res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::DlSimple, zyppng::Download::Finished};
+  for ( int i = 100 ; i >= 10; i -= 10 )
+    res.back().mirrors.push_back( std::make_pair( i, "/test.txt?auth=foobar") );
+
   //some broken mirrors:
   res.push_back( MirrorSet() );
   res.back().name = "Some broken mirrors less URLs than blocks";
+  res.back().filename = "test.txt";
+  res.back().dlTotal = 2148018;
   res.back().expectSuccess = true;
   res.back().expectedHandlerDownloads = 1;
   res.back().expectedFileDownloads = 9 + 3; // 3 should fail due to broken mirrors
-  res.back().expectedStates = {zyppng::Download::Initializing, zyppng::Download::RunningMulti, zyppng::Download::Success};
+  res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished};
   for ( int i = 10 ; i >= 5; i-- ) {
     if ( i % 2 ) {
       res.back().mirrors.push_back( std::make_pair( i*10, "/doesnotexist.txt") );
@@ -195,13 +222,15 @@ std::vector< MirrorSet > generateMirr ()
   //some broken mirrors with more URLs than blocks:
   res.push_back( MirrorSet() );
   res.back().name = "Some broken mirrors more URLs than blocks";
+  res.back().filename = "test.txt";
+  res.back().dlTotal = 2148018;
   res.back().expectSuccess = true;
   res.back().expectedHandlerDownloads = 1;
   //its not really possible to know how many times the downloads will fail, there are
   //5 broken mirrors in the set, but if a working mirror is done before the last broken
   //URL is picked from the dataset not all broken URLs will be used
   res.back().expectedFileDownloads  = -1;
-  res.back().expectedStates = {zyppng::Download::Initializing, zyppng::Download::RunningMulti, zyppng::Download::Success};
+  res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished};
   for ( int i = 10 ; i >= 1; i-- ) {
     if ( i % 2 ) {
       res.back().mirrors.push_back( std::make_pair( i*10, "/doesnotexist.txt") );
@@ -213,13 +242,15 @@ std::vector< MirrorSet > generateMirr ()
   //mirrors where some return a invalid block
   res.push_back( MirrorSet() );
   res.back().name = "Some mirrors return broken blocks";
+  res.back().filename = "test.txt";
+  res.back().dlTotal = 2148018;
   res.back().expectSuccess = true;
   res.back().expectedHandlerDownloads  = 1;
   //its not really possible to know how many times the downloads will fail, there are
   //5 broken mirrors in the set, but if a working mirror is done before the last broken
   //URL is picked from the dataset not all broken URLs will be used
   res.back().expectedFileDownloads  = -1;
-  res.back().expectedStates = {zyppng::Download::Initializing, zyppng::Download::RunningMulti, zyppng::Download::Success};
+  res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished};
   for ( int i = 10 ; i >= 1; i-- ) {
     if ( i % 2 ) {
       res.back().mirrors.push_back( std::make_pair( i*10, "/handler/random") );
@@ -227,6 +258,25 @@ std::vector< MirrorSet > generateMirr ()
       res.back().mirrors.push_back( std::make_pair( i*10, "/test.txt") );
     }
   }
+
+#if ENABLE_ZCHUNK_COMPRESSION
+  //all mirrors good with zck:
+  res.push_back( MirrorSet() );
+  res.back().name = "All good mirrors with zck";
+  res.back().filename = "primary.xml.zck";
+  res.back().dlTotal = 274638;
+  res.back().expectSuccess = true;
+  res.back().expectedHandlerDownloads  = 2; // query if metalink avail + dl metalink
+  res.back().expectedFileDownloads  = 6; // Zck Head + 5 Chunks ( chunk size is at least 4K but is likely a few bytes bigger )
+  res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DetectMetaLink, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlZChunkHead, zyppng::Download::DlZChunk, zyppng::Download::Finished};
+  res.back().headerChecksum = zypp::CheckSum( zypp::Digest::sha256(), "90a1a1b99ba3b6c8ae9f14b0c8b8c43141c69ec3388bfa3b9915fbeea03926b7");
+  res.back().headerSize     = 11717;
+  res.back().deltaFilePath  = "primary-deltatemplate.xml.zck";
+  res.back().chunkSize      = zypp::ByteCount( 4, zypp::ByteCount::K );
+  for ( int i = 100 ; i >= 10; i -= 10 )
+    res.back().mirrors.push_back( std::make_pair( i, "/primary.xml.zck") );
+#endif
+
   return res;
 }
 
@@ -234,7 +284,7 @@ std::vector< MirrorSet > generateMirr ()
 //create one URL line for a metalink template file
 std::string makeUrl ( int pref, const zyppng::Url &url )
 {
-  return ( zypp::str::Format( "<url preference=\"%1%\" location=\"de\" type=\"%2%\">%3%</url>" ) % pref % url.getScheme() % url );
+  return ( zypp::str::Format( "<url preference=\"%1%\" location=\"de\" type=\"%2%\">%3%</url>" ) % pref % url.getScheme() % url.asCompleteString() );
 };
 
 
@@ -252,23 +302,23 @@ static bool requestWantsMetaLink ( const WebServer::Request &req )
 
 //creates a request handler for the Mock WebServer that returns the metalink data
 //specified in \a data if the request has the metalink accept handler
-WebServer::RequestHandler makeMetaFileHandler ( const std::string *data )
+WebServer::RequestHandler makeMetaFileHandler ( const std::string &fName, const std::string *data )
 {
-  return [ data ]( WebServer::Request &req ){
+  return [ data, fName ]( WebServer::Request &req ){
     if ( requestWantsMetaLink( req ) ) {
       req.rout << WebServer::makeResponseString( "200", { "Content-Type: application/metalink+xml; charset=utf-8\r\n" }, *data );
       return;
     }
-    req.rout << "Location: /test.txt\r\n\r\n";
+    req.rout << "Location: /"<<fName<<"\r\n\r\n";
     return;
   };
 };
 
 //creates a request handler for the Mock WebServer that returns a junk block of
 //data for a range request, otherwise relocates the request
-WebServer::RequestHandler makeJunkBlockHandler ( )
+WebServer::RequestHandler makeJunkBlockHandler ( const std::string &fName )
 {
-  return [ ]( WebServer::Request &req ){
+  return [ fName ]( WebServer::Request &req ){
     auto it = req.params.find( "HTTP_RANGE" );
     if ( it != req.params.end() && zypp::str::startsWith( it->second, "bytes=" ) ) {
         //bytes=786432-1048575
@@ -283,17 +333,19 @@ WebServer::RequestHandler makeJunkBlockHandler ( )
 
         if ( start != -1 && end != -1 ) {
           std::string block;
-          for ( off_t curr = 0; curr < ( end - start); curr++ ) {
+          for ( off_t curr = start; curr <= end; curr++ ) {
             block += 'a';
           }
           req.rout << "Status: 206 Partial Content\r\n"
                    << "Accept-Ranges: bytes\r\n"
-                   << "Content-Length: "<<( end - start)<<"\r\n\r\n"
+                   << "Content-Length: "<< block.length() <<"\r\n"
+                   << "Content-Range: bytes "<<start<<"-"<<end<<"/"<<block.length()<<"\r\n"
+                   <<"\r\n"
                    << block;
           return;
         }
     }
-    req.rout << "Location: /test.txt\r\n\r\n";
+    req.rout << "Location: /"<<fName<<"\r\n\r\n";
     return;
   };
 };
@@ -302,36 +354,41 @@ int maxConcurrentDLs[] = { 1, 2, 4, 8, 10, 15 };
 
 BOOST_DATA_TEST_CASE( test1, bdata::make( generateMirr() ) * bdata::make( withSSL ) * bdata::make( maxConcurrentDLs )  , elem, withSSL, maxDLs )
 {
-  //each URL in the metalink file has a preference , a schema and of course the URL, we need to adapt those to our test setup
-  //so we generate the file on the fly from a template in the test data
-  std::string metaTempl = readFile ( zypp::Pathname(TESTS_SRC_DIR)/"/zyppng/data/downloader/test.txt.meta" );
+
+  zypp::Pathname testRoot = zypp::Pathname(TESTS_SRC_DIR)/"zyppng/data/downloader";
+
+  // std::cout << "Starting with test " << elem.name << std::endl;
+
+  // each URL in the metalink file has a preference , a schema and of course the URL, we need to adapt those to our test setup
+  // so we generate the file on the fly from a template in the test data
+  std::string metaTempl = TestTools::readFile ( testRoot/( zypp::str::Format("%1%.meta") % elem.filename ).str() );
   BOOST_REQUIRE( !metaTempl.empty() );
 
-  auto ev = zyppng::EventDispatcher::createMain();
+  auto ev = zyppng::EventLoop::create();
 
-  WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"/zyppng/data/downloader").c_str(), 10001, withSSL );
+  WebServer web( testRoot.c_str(), 10001, withSSL );
   BOOST_REQUIRE( web.start() );
 
   zypp::filesystem::TmpFile targetFile;
-  zyppng::Downloader downloader;
-  downloader.requestDispatcher()->setMaximumConcurrentConnections( maxDLs );
+  std::shared_ptr<zyppng::Downloader> downloader = std::make_shared<zyppng::Downloader>();
+  downloader->requestDispatcher()->setMaximumConcurrentConnections( maxDLs );
 
   //first metalink download, generate a fully valid one
   zyppng::Url weburl (web.url());
-  weburl.setPathName("/handler/test.txt");
+  weburl.setPathName( zypp::str::Format("/handler/%1%") % elem.filename );
 
   std::string urls;
   if ( elem.mirrors.size() ) {
     for ( const auto &mirr : elem.mirrors ) {
-      zyppng::Url mirrUrl (web.url());
-      mirrUrl.setPathName( mirr.second );
+      zyppng::Url mirrUrl ( web.url().asCompleteString() + mirr.second );
+      // mirrUrl.setPathName( mirr.second );
       urls += makeUrl( mirr.first, mirrUrl ) + "\n";
     }
   }
 
   std::string metaFile = zypp::str::Format( metaTempl ) % urls;
-  web.addRequestHandler("test.txt", makeMetaFileHandler( &metaFile ) );
-  web.addRequestHandler("random", makeJunkBlockHandler( ) );
+  web.addRequestHandler( elem.filename, makeMetaFileHandler(  elem.filename, &metaFile ) );
+  web.addRequestHandler("random", makeJunkBlockHandler( elem.filename ) );
 
   int expectedDownloads = elem.expectedHandlerDownloads + elem.expectedFileDownloads;
   int startedDownloads = 0;
@@ -347,8 +404,13 @@ BOOST_DATA_TEST_CASE( test1, bdata::make( generateMirr() ) * bdata::make( withSS
   int countHandlerReq = 0; //the requests made to the handler slot
   int countFileReq = 0;    //the requests made to the file directly, e.g. a mirror read from the metalink file
 
-  auto dl = downloader.downloadFile( weburl, targetFile );
-  dl->settings() = web.transferSettings();
+  auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile) );
+  dl->spec().setTransferSettings( web.transferSettings() )
+    .setPreferredChunkSize( elem.chunkSize )
+    .setHeaderSize( elem.headerSize )
+    .setHeaderChecksum( elem.headerChecksum )
+    .setDeltaFile( elem.deltaFilePath.empty() ? zypp::Pathname() : testRoot/elem.deltaFilePath )
+    .setExpectedFileSize( elem.dlTotal );
 
   dl->dispatcher().sigDownloadStarted().connect( [&]( zyppng::NetworkRequestDispatcher &, zyppng::NetworkRequest &req){
     startedDownloads++;
@@ -381,7 +443,7 @@ BOOST_DATA_TEST_CASE( test1, bdata::make( generateMirr() ) * bdata::make( withSS
   });
 
   dl->sigStateChanged().connect([&]( zyppng::Download &, zyppng::Download::State state ){
-    if ( state == zyppng::Download::RunningMulti )
+    if ( state == zyppng::Download::DlMetalink || state == zyppng::Download::DlZChunk )
       gotMultiDLState = true;
   });
 
@@ -399,14 +461,16 @@ BOOST_DATA_TEST_CASE( test1, bdata::make( generateMirr() ) * bdata::make( withSS
   else
     BOOST_TEST_REQ_FAILED ( dl );
 
-  if ( elem.expectedHandlerDownloads > -1 && elem.expectedFileDownloads > -1 )
+  if ( elem.expectedHandlerDownloads > -1 && elem.expectedFileDownloads > -1 ) {
     BOOST_REQUIRE_EQUAL( startedDownloads, expectedDownloads );
+  }
 
   BOOST_REQUIRE_EQUAL( startedDownloads, finishedDownloads );
   BOOST_REQUIRE( gotAlive );
   BOOST_REQUIRE( gotProgress );
   BOOST_REQUIRE( gotMultiDLState );
-  BOOST_REQUIRE_EQUAL( lastProgress, 2148018 );
+  if ( elem.dlTotal > 0 )
+    BOOST_REQUIRE_EQUAL( lastProgress, elem.dlTotal );
   BOOST_REQUIRE_EQUAL( lastProgress, gotTotal );
 
   if ( elem.expectedHandlerDownloads > -1 )
@@ -470,9 +534,9 @@ BOOST_DATA_TEST_CASE( dltest_auth, bdata::make( withSSL ), withSSL )
   zypp::filesystem::TmpDir repoManagerRoot;
   zypp::ZConfig::instance().setRepoManagerRoot( repoManagerRoot.path() );
 
-  auto ev = zyppng::EventDispatcher::createMain();
+  auto ev = zyppng::EventLoop::create();
 
-  zyppng::Downloader downloader;
+  std::shared_ptr<zyppng::Downloader> downloader = std::make_shared<zyppng::Downloader>();
 
   WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"/zyppng/data/downloader").c_str(), 10001, withSSL );
   BOOST_REQUIRE( web.start() );
@@ -486,8 +550,8 @@ BOOST_DATA_TEST_CASE( dltest_auth, bdata::make( withSSL ), withSSL )
   web.addRequestHandler( "quit", [ &ev ]( WebServer::Request & ){ ev->quit();} );
 
   {
-    auto dl = downloader.downloadFile( weburl, targetFile.path() );
-    dl->settings() = set;
+    auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile.path()) );
+    dl->spec().setTransferSettings(set);
 
     dl->sigFinished( ).connect([ &ev ]( zyppng::Download & ){
       ev->quit();
@@ -500,8 +564,8 @@ BOOST_DATA_TEST_CASE( dltest_auth, bdata::make( withSSL ), withSSL )
   }
 
   {
-    auto dl = downloader.downloadFile( weburl, targetFile.path() );
-    dl->settings() = set;
+    auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile.path()) );
+    dl->spec().setTransferSettings(set);
 
     int gotAuthRequest = 0;
 
@@ -527,8 +591,8 @@ BOOST_DATA_TEST_CASE( dltest_auth, bdata::make( withSSL ), withSSL )
   {
     int gotAuthRequest = 0;
     std::vector<zyppng::Download::State> allStates;
-    auto dl = downloader.downloadFile( weburl, targetFile.path() );
-    dl->settings() = set;
+    auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile.path()) );
+    dl->spec().setTransferSettings(set);
 
     dl->sigFinished( ).connect([ &ev ]( zyppng::Download & ){
       ev->quit();
@@ -549,14 +613,14 @@ BOOST_DATA_TEST_CASE( dltest_auth, bdata::make( withSSL ), withSSL )
     ev->run();
     BOOST_TEST_REQ_SUCCESS( dl );
     BOOST_REQUIRE_EQUAL( gotAuthRequest, 1 );
-    BOOST_REQUIRE ( allStates == std::vector<zyppng::Download::State>({zyppng::Download::Initializing, zyppng::Download::RunningMulti, zyppng::Download::Success}) );
+    BOOST_REQUIRE ( allStates == std::vector<zyppng::Download::State>({ zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished}) );
   }
 
   {
     //the creds should be in the credential manager now, we should not need to specify them again in the slot
     bool gotAuthRequest = false;
-    auto dl = downloader.downloadFile( weburl, targetFile.path() );
-    dl->settings() = set;
+    auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile.path()) );
+    dl->spec().setTransferSettings(set);
 
     dl->sigFinished( ).connect([ &ev ]( zyppng::Download & ){
       ev->quit();
@@ -584,9 +648,9 @@ BOOST_DATA_TEST_CASE( dltest_auth_basic, bdata::make( withSSL ), withSSL )
   zypp::filesystem::TmpDir repoManagerRoot;
   zypp::ZConfig::instance().setRepoManagerRoot( repoManagerRoot.path() );
 
-  auto ev = zyppng::EventDispatcher::createMain();
+  auto ev = zyppng::EventLoop::create();
 
-  zyppng::Downloader downloader;
+  std::shared_ptr<zyppng::Downloader> downloader = std::make_shared<zyppng::Downloader>();
 
   WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"/zyppng/data/downloader").c_str(), 10001, withSSL );
   BOOST_REQUIRE( web.start() );
@@ -614,16 +678,16 @@ BOOST_DATA_TEST_CASE( dltest_auth_basic, bdata::make( withSSL ), withSSL )
     // if the proactive code adding the credentials to the first request is not executed we will
     // have more than 1 request.
     int reqCount = 0;
-    auto dispatcher = downloader.requestDispatcher();
+    auto dispatcher = downloader->requestDispatcher();
     dispatcher->sigDownloadStarted().connect([&]( zyppng::NetworkRequestDispatcher &, zyppng::NetworkRequest & ){
       reqCount++;
     });
 
 
-    auto dl = downloader.downloadFile( weburl, targetFile.path() );
-    dl->setMultiPartHandlingEnabled( false );
-
-    dl->settings() = set;
+    auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile.path())
+      .setMetalinkEnabled( false )
+      .setTransferSettings( set )
+    );
 
     dl->sigFinished( ).connect([ &ev ]( zyppng::Download & ){
       ev->quit();
index ce2a7d2..ca57c39 100644 (file)
@@ -1,6 +1,7 @@
 #include <boost/test/unit_test.hpp>
 #include <boost/test/data/test_case.hpp>
-#include <zypp/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp/media/MetaLinkParser.h> // for hexstr2bytes
 #include <zypp/zyppng/media/network/request.h>
 #include <zypp/zyppng/media/network/networkrequestdispatcher.h>
 #include <zypp/zyppng/media/network/networkrequesterror.h>
@@ -14,6 +15,7 @@
 #include <chrono>
 
 #include "WebServer.h"
+#include "TestTools.h"
 
 
 #define BOOST_TEST_REQ_ERR(REQ, EXPECERR) \
@@ -53,34 +55,11 @@ const char * err401 = "Status: 401 Unauthorized\r\n"
 
 bool withSSL[] = { true, false };
 
-// convert a string in its byte representation
-std::vector<unsigned char> convertHexStrToVector( const std::string &str )
-{
-  std::vector<unsigned char> bytes;
-  for ( size_t i = 0; i < str.length(); i+=2 )
-  {
-#define c2h(c) (((c)>='0' && (c)<='9') ? ((c)-'0')              \
-                : ((c)>='a' && (c)<='f') ? ((c)-('a'-10))       \
-                : ((c)>='A' && (c)<='F') ? ((c)-('A'-10))       \
-                : -1)
-    int v = c2h(str[i]);
-    if (v < 0)
-      return {};
-    bytes.push_back(v);
-    v = c2h(str[i+1]);
-    if (v < 0)
-      return {};
-    bytes.back() = (bytes.back() << 4) | v;
-#undef c2h
-  }
-  return bytes;
-}
-
 BOOST_DATA_TEST_CASE(nwdispatcher_basic, bdata::make( withSSL ), withSSL)
 {
   std::string dummyContent = "This is just some dummy content,\nto test downloading and signals.";
 
-  auto ev = zyppng::EventDispatcher::createMain();
+  auto ev = zyppng::EventLoop::create();
 
   WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL );
   web.addRequestHandler("getData", WebServer::makeResponse("200 OK", dummyContent ) );
@@ -89,9 +68,9 @@ BOOST_DATA_TEST_CASE(nwdispatcher_basic, bdata::make( withSSL ), withSSL)
   BOOST_REQUIRE( !web.isStopped() );
 
   zyppng::TransferSettings set = web.transferSettings();
-  zyppng::NetworkRequestDispatcher disp;
-  disp.run();
-  disp.sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->run();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
     ev->quit();
   });
 
@@ -119,7 +98,7 @@ BOOST_DATA_TEST_CASE(nwdispatcher_basic, bdata::make( withSSL ), withSSL)
     totalDL = dltotal;
   });
 
-  disp.enqueue( reqData );
+  disp->enqueue( reqData );
   ev->run();
 
   BOOST_TEST_REQ_SUCCESS( reqData );
@@ -136,7 +115,7 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_errors, bdata::make( withSSL ), withSSL)
     return WebServer::makeResponse( err, "This is a error." );
   };
 
-  auto ev = zyppng::EventDispatcher::createMain();
+  auto ev = zyppng::EventLoop::create();
   WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL );
 
   web.addRequestHandler("get404", WebServer::makeResponse( err404 ) );
@@ -153,8 +132,8 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_errors, bdata::make( withSSL ), withSSL)
 
   zyppng::TransferSettings set = web.transferSettings();
 
-  zyppng::NetworkRequestDispatcher disp;
-  disp.sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
     ev->quit();
   });
 
@@ -164,19 +143,19 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_errors, bdata::make( withSSL ), withSSL)
   zypp::filesystem::TmpFile targetFile;
   zyppng::NetworkRequest::Ptr req404 = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   req404->transferSettings() = set;
-  disp.enqueue( req404 );
+  disp->enqueue( req404 );
 
   weburl = zyppng::Url( "bad://127.0.0.1" );
-  BOOST_REQUIRE( !disp.supportsProtocol(weburl) );
+  BOOST_REQUIRE( !disp->supportsProtocol(weburl) );
   zyppng::NetworkRequest::Ptr reqInvProto = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   reqInvProto->transferSettings() = set;
-  disp.enqueue( reqInvProto );
+  disp->enqueue( reqInvProto );
 
   weburl = zyppng::Url( web.url() );
   weburl.setPathName("/handler/get401");
   zyppng::NetworkRequest::Ptr reqUnauthorized = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   reqUnauthorized->transferSettings() = set;
-  disp.enqueue( reqUnauthorized );
+  disp->enqueue( reqUnauthorized );
 
   weburl = zyppng::Url( web.url() );
   weburl.setPathName("/handler/get401");
@@ -184,45 +163,45 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_errors, bdata::make( withSSL ), withSSL)
   reqAuthFailed->transferSettings() = set;
   reqAuthFailed->transferSettings().setUsername("test");
   reqAuthFailed->transferSettings().setPassword("test");
-  disp.enqueue( reqAuthFailed );
+  disp->enqueue( reqAuthFailed );
 
   weburl = zyppng::Url( web.url() );
   weburl.setPathName("/handler/get502");
   zyppng::NetworkRequest::Ptr req502 = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   req502->transferSettings() = set;
-  disp.enqueue( req502 );
+  disp->enqueue( req502 );
 
   weburl = zyppng::Url( web.url() );
   weburl.setPathName("/handler/get503");
   zyppng::NetworkRequest::Ptr req503 = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   req503->transferSettings() = set;
-  disp.enqueue( req503 );
+  disp->enqueue( req503 );
 
   weburl = zyppng::Url( web.url() );
   weburl.setPathName("/handler/get504");
   zyppng::NetworkRequest::Ptr req504 = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   req504->transferSettings() = set;
-  disp.enqueue( req504 );
+  disp->enqueue( req504 );
 
   weburl = zyppng::Url( web.url() );
   weburl.setPathName("/handler/get403");
   zyppng::NetworkRequest::Ptr req403 = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   req403->transferSettings() = set;
-  disp.enqueue( req403 );
+  disp->enqueue( req403 );
 
   weburl = zyppng::Url( web.url() );
   weburl.setPathName("/handler/get410");
   zyppng::NetworkRequest::Ptr req410 = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   req410->transferSettings() = set;
-  disp.enqueue( req410 );
+  disp->enqueue( req410 );
 
   weburl = zyppng::Url( web.url() );
   weburl.setPathName("/handler/get418");
   zyppng::NetworkRequest::Ptr req418 = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   req418->transferSettings() = set;
-  disp.enqueue( req418 );
+  disp->enqueue( req418 );
 
-  disp.run();
+  disp->run();
   ev->run();
 
   BOOST_TEST_REQ_ERR( req404, zyppng::NetworkRequestError::NotFound );
@@ -239,13 +218,13 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_errors, bdata::make( withSSL ), withSSL)
 
 BOOST_DATA_TEST_CASE(nwdispatcher_http_download, bdata::make( withSSL ), withSSL )
 {
-  auto ev = zyppng::EventDispatcher::createMain();
-  zyppng::NetworkRequestDispatcher disp;
-  disp.sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+  auto ev = zyppng::EventLoop::create();
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
     ev->quit();
   });
   //start request dispatching, does not need to have requests enqueued
-  disp.run();
+  disp->run();
 
   WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"zypp/data/Fetcher/remote-site").c_str(), 10001, withSSL );
   BOOST_REQUIRE( web.start() );
@@ -262,15 +241,15 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_download, bdata::make( withSSL ), withSSL
   BOOST_REQUIRE_MESSAGE( dig->create( zypp::Digest::sha1() ), "Unable to create Digest " );
 
   reqDLFile->transferSettings() = set;
-  reqDLFile->setDigest( dig );
-  reqDLFile->setExpectedChecksum( convertHexStrToVector("f1d2d2f924e986ac86fdf7b36c94bcdf32beec15") );
-  disp.enqueue( reqDLFile );
+  reqDLFile->addRequestRange(0, 0, dig, zypp::media::hexstr2bytes("f1d2d2f924e986ac86fdf7b36c94bcdf32beec15") );
+  disp->enqueue( reqDLFile );
   ev->run();
   BOOST_TEST_REQ_SUCCESS( reqDLFile );
 
   //modify the checksum -> request should fail now
-  reqDLFile->setExpectedChecksum( convertHexStrToVector("f1d2d2f924e986ac86fdf7b36c94bcdf32beec20") );
-  disp.enqueue( reqDLFile );
+  reqDLFile->resetRequestRanges();
+  reqDLFile->addRequestRange(0, 0, dig, zypp::media::hexstr2bytes("f1d2d2f924e986ac86fdf7b36c94bcdf32beec20") );
+  disp->enqueue( reqDLFile );
   ev->run();
   BOOST_TEST_REQ_ERR( reqDLFile, zyppng::NetworkRequestError::InvalidChecksum );
 
@@ -279,8 +258,8 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_download, bdata::make( withSSL ), withSSL
   reqDLFile = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   reqDLFile->transferSettings() = set;
   reqDLFile->setUrl( weburl );
-  reqDLFile->setRequestRange( 0, 7 );
-  disp.enqueue( reqDLFile );
+  reqDLFile->addRequestRange( 0, 7 );
+  disp->enqueue( reqDLFile );
   ev->run();
   BOOST_TEST_REQ_SUCCESS( reqDLFile );
   {
@@ -295,13 +274,13 @@ BOOST_DATA_TEST_CASE(nwdispatcher_http_download, bdata::make( withSSL ), withSSL
 
 BOOST_DATA_TEST_CASE(nwdispatcher_delay_download, bdata::make( withSSL ), withSSL )
 {
-  auto ev = zyppng::EventDispatcher::createMain();
-  zyppng::NetworkRequestDispatcher disp;
-  disp.sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+  auto ev = zyppng::EventLoop::create();
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
     ev->quit();
   });
 
-  disp.run();
+  disp->run();
 
   WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL );
 
@@ -325,9 +304,249 @@ BOOST_DATA_TEST_CASE(nwdispatcher_delay_download, bdata::make( withSSL ), withSS
   zyppng::NetworkRequest::Ptr reqDLFile = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
   reqDLFile->transferSettings() = set;
 
-  disp.enqueue( reqDLFile );
+  disp->enqueue( reqDLFile );
   ev->run();
 
   BOOST_TEST_REQ_ERR( reqDLFile, zyppng::NetworkRequestError::Timeout );
 }
 
+//Get a simple range from a existing file
+BOOST_DATA_TEST_CASE(nwdispatcher_multipart_dl, bdata::make( withSSL ), withSSL )
+{
+  auto ev = zyppng::EventLoop::create();
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+    ev->quit();
+  });
+
+  disp->run();
+
+  WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"zypp/data/Fetcher/remote-site").c_str(), 10001, withSSL );
+  BOOST_REQUIRE( web.start() );
+
+  auto weburl = web.url();
+  weburl.setPathName("/file-1.txt");
+
+  zyppng::TransferSettings set = web.transferSettings();
+  zypp::filesystem::TmpFile targetFile;
+
+  auto reqDLFile = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
+  reqDLFile->transferSettings() = set;
+  reqDLFile->setUrl( weburl );
+  reqDLFile->addRequestRange(  13, 4 );
+  reqDLFile->addRequestRange( 248, 6 );
+  reqDLFile->addRequestRange(  76, 9 );
+  disp->enqueue( reqDLFile );
+  ev->run();
+  auto err = reqDLFile->error();
+  BOOST_TEST_REQ_SUCCESS( reqDLFile );
+
+  std::string downloaded = TestTools::readFile ( targetFile.path() );
+  BOOST_REQUIRE( !downloaded.empty() );
+  BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+13 , 4 ), "SUSE" );
+  BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+248, 6 ), "TCP/IP" );
+  BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+76 , 9 ), "Slackware" );
+}
+
+struct RangeData {
+  off_t offset;
+  std::string payload;
+};
+
+auto makeMultiPartHandler ( std::vector<RangeData> &&values )
+{
+  return [ values = std::move(values) ]( WebServer::Request &r ){
+    const char *boundary = "THIS_STRING_SEPARATES";
+    r.rout << "Status: 206\r\n"
+              "Content-Type: multipart/byteranges; boundary="<<boundary<<"\r\n"
+                          "\r\n";
+
+    int fullSize = std::accumulate( values.begin(), values.end(), 0, []( const auto &val1, const auto &val2) { return val1 + val2.payload.length();} );
+    for ( const RangeData &val : values ) {
+      off_t end = val.offset + val.payload.length() - 1;
+      r.rout << "--"<<boundary<<"\r\n"
+             << "Content-Type: text/plain\r\n"
+             << "Content-Range: bytes "<<val.offset<<"-"<<end<<"/"<<fullSize<<"\r\n"
+             << "\r\n"
+             << val.payload;
+    }
+  };
+}
+
+//Get a range response with the ranges out of order
+BOOST_DATA_TEST_CASE(nwdispatcher_multipart_dl_no_order, bdata::make( withSSL ), withSSL )
+{
+  auto ev = zyppng::EventLoop::create();
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+    ev->quit();
+  });
+
+  disp->run();
+
+  const std::string_view str1 = "Hello";
+  const std::string_view str2 = "World";
+  const std::string_view str3 = "in Multibyte";
+
+  WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL );
+  web.addRequestHandler("mbyte", makeMultiPartHandler( {
+    { 10, str2.data() },
+    {  0, str1.data() },
+    { 25, str3.data() }
+  }));
+
+  BOOST_REQUIRE( web.start() );
+
+  auto weburl = web.url();
+  weburl.setPathName("/handler/mbyte");
+
+  zyppng::TransferSettings set = web.transferSettings();
+  zypp::filesystem::TmpFile targetFile;
+
+  auto reqDLFile = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
+  reqDLFile->transferSettings() = set;
+  reqDLFile->setUrl( weburl );
+  reqDLFile->addRequestRange(  0, str1.length() );
+  reqDLFile->addRequestRange( 10, str2.length() );
+  reqDLFile->addRequestRange( 25, str3.length() );
+  disp->enqueue( reqDLFile );
+  ev->run();
+  BOOST_TEST_REQ_SUCCESS( reqDLFile );
+
+  std::string downloaded = TestTools::readFile ( targetFile.path() );
+  BOOST_REQUIRE( !downloaded.empty() );
+  BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data(), 5 )   , str1 );
+  BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+10, 5 ), str2 );
+  BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+25 )   , str3 );
+}
+
+//Get a range response where the boundary string is part of the data
+//Some servers like nginx do not check if the boundary string is inside the data, thus we need
+//to make sure the parser is not affected by that
+BOOST_DATA_TEST_CASE(nwdispatcher_multipart_dl_weird_data, bdata::make( withSSL ), withSSL )
+{
+  auto ev = zyppng::EventLoop::create();
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+    ev->quit();
+  });
+
+  disp->run();
+
+  const std::string_view str1 = "SUSE Linux";
+  const std::string_view str2 = "World--THIS_STRING_SEPARATES A";
+  const std::string_view str3 = "Other String";
+
+  WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL );
+  web.addRequestHandler("mbyte", makeMultiPartHandler( {
+                                    { 0,   str1.data() },
+                                    { 25,  str2.data() },
+                                    { 70,  str3.data() },
+                                  }));
+
+  BOOST_REQUIRE( web.start() );
+
+  auto weburl = web.url();
+  weburl.setPathName("/handler/mbyte");
+
+  zyppng::TransferSettings set = web.transferSettings();
+  zypp::filesystem::TmpFile targetFile;
+
+  auto reqDLFile = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
+  reqDLFile->transferSettings() = set;
+  reqDLFile->setUrl( weburl );
+  reqDLFile->addRequestRange(  0, str1.length() );
+  reqDLFile->addRequestRange( 25, str2.length() );
+  reqDLFile->addRequestRange( 70, str3.length() );
+  disp->enqueue( reqDLFile );
+  ev->run();
+  BOOST_TEST_REQ_SUCCESS( reqDLFile );
+
+  std::string downloaded = TestTools::readFile ( targetFile.path() );
+  BOOST_REQUIRE( !downloaded.empty() );
+  BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()   , str1.length() ), str1 );
+  BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+25, str2.length() ), str2 );
+  BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+70, str3.length() ), str3 );
+}
+
+BOOST_DATA_TEST_CASE(nwdispatcher_multipart_dl_overlap, bdata::make( withSSL ), withSSL )
+{
+  auto ev = zyppng::EventLoop::create();
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+    ev->quit();
+  });
+  disp->run();
+
+  const char *data = "The SUSE Linux distribution was originally a German translation of Slackware Linux. In mid-1992, Softlanding Linux System (SLS) was founded by Peter MacDonald, and was the first comprehensive distribution to contain elements such as X and TCP/IP. The Slackware distribution (maintained by Patrick Volkerding) was initially based largely on SLS.";
+  const std::string_view str1 = std::string_view( data, 50 );
+  const std::string_view str2 = std::string_view( data+40 );
+
+  WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL );
+  web.addRequestHandler("mbyte", makeMultiPartHandler( {
+                                    { 0,   std::string( str1.data(), str1.length() ) },
+                                    { 40,  str2.data() }
+                                    }));
+
+  BOOST_REQUIRE( web.start() );
+
+  auto weburl = web.url();
+  weburl.setPathName("/handler/mbyte");
+
+  zyppng::TransferSettings set = web.transferSettings();
+  zypp::filesystem::TmpFile targetFile;
+
+  auto reqDLFile = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
+  reqDLFile->transferSettings() = set;
+  reqDLFile->setUrl( weburl );
+  reqDLFile->addRequestRange(  0, str1.length() );
+  reqDLFile->addRequestRange( 40, str2.length() );
+  disp->enqueue( reqDLFile );
+  ev->run();
+  BOOST_TEST_REQ_SUCCESS( reqDLFile );
+
+  std::string downloaded = TestTools::readFile ( targetFile.path() );
+  BOOST_REQUIRE( !downloaded.empty() );
+  BOOST_REQUIRE_EQUAL( downloaded, std::string(data) );
+}
+
+//Get a range response with missing data
+BOOST_DATA_TEST_CASE(nwdispatcher_multipart_data_missing, bdata::make( withSSL ), withSSL )
+{
+  auto ev = zyppng::EventLoop::create();
+  auto disp = std::make_shared<zyppng::NetworkRequestDispatcher>();
+  disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){
+    ev->quit();
+  });
+
+  disp->run();
+
+  const std::string_view str1 = "Hello";
+  const std::string_view str2 = "World";
+  const std::string_view str3 = "in Multibyte";
+
+  WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL );
+  web.addRequestHandler("mbyte", makeMultiPartHandler( {
+                                    { 10, str2.data() },
+                                    {  0, str1.data() },
+                                    { 25, str3.data() }
+                                  }));
+
+  BOOST_REQUIRE( web.start() );
+
+  auto weburl = web.url();
+  weburl.setPathName("/handler/mbyte");
+
+  zyppng::TransferSettings set = web.transferSettings();
+  zypp::filesystem::TmpFile targetFile;
+
+  auto reqDLFile = std::make_shared<zyppng::NetworkRequest>( weburl, targetFile.path() );
+  reqDLFile->transferSettings() = set;
+  reqDLFile->setUrl( weburl );
+  reqDLFile->addRequestRange(  0, str1.length() );
+  reqDLFile->addRequestRange( 10, str2.length() + 1 );
+  reqDLFile->addRequestRange( 25, str3.length() );
+  disp->enqueue( reqDLFile );
+  ev->run();
+  BOOST_TEST_REQ_ERR( reqDLFile, zyppng::NetworkRequestError::MissingData );
+}
index 97b28ce..4c8a8fd 100644 (file)
@@ -16,3 +16,5 @@ ENDFOREACH( loop_var )
 
 INSTALL(TARGETS zypp-CheckAccessDeleted DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
 INSTALL(TARGETS zypp-NameReqPrv                DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
+
+ADD_SUBDIRECTORY( zypp-rpm )
index fc3b8fa..5501603 100644 (file)
@@ -221,11 +221,8 @@ void dTree( const std::string & cmd_r, const std::string & spec_r )
     Table t;
     for ( const auto & el : spec )
     {
-      auto & details { t.row( el ) };
       for ( const auto & cap : el.provides() )
       {
-       //details.push_back( "prv: "+cap.asString() );  // list only matching ones
-
        // get attrs matching cap
        for ( const auto & attr : attrs )
        {
diff --git a/tools/zypp-rpm/BinHeader.cc b/tools/zypp-rpm/BinHeader.cc
new file mode 100644 (file)
index 0000000..b2b259c
--- /dev/null
@@ -0,0 +1,432 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/target/rpm/BinHeader.cc
+ *
+*/
+
+extern "C"
+{
+#ifdef _RPM_5
+#undef RPM_NULL_TYPE
+#define RPM_NULL_TYPE rpmTagType(0)
+typedef rpmuint32_t rpm_count_t;
+#endif
+}
+
+#include <iostream>
+
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/NonCopyable.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/AutoDispose.h>
+
+#include "BinHeader.h"
+
+using std::endl;
+using namespace zypp;
+
+/** Helper for header data retieval.
+   * With \c _RPM_4 use \c ::headerGet; with \c _RPM_5
+   * use the meanwhile deprecated \c ::headerGetEntry.
+   * \ingroup g_RAII
+   */
+struct HeaderEntryGetter : private base::NonCopyable
+{
+public:
+  HeaderEntryGetter( const Header & h_r, rpmTag & tag_r );
+  ~HeaderEntryGetter();
+  rpmTagType  type();
+  rpm_count_t cnt();
+  void *      val();
+private:
+#ifndef _RPM_5
+  ::rpmtd              _rpmtd;
+#else
+  rpmTagType   _type;
+  rpm_count_t  _cnt;
+  void *               _val;
+#endif //_RPM_5
+};
+
+#ifndef _RPM_5
+inline HeaderEntryGetter::HeaderEntryGetter( const Header & h_r, rpmTag & tag_r )
+  : _rpmtd( ::rpmtdNew() )
+{ ::headerGet( h_r, tag_r, _rpmtd, HEADERGET_EXT ); }
+inline HeaderEntryGetter::~HeaderEntryGetter()
+{ ::rpmtdFreeData( _rpmtd ); ::rpmtdFree( _rpmtd ); }
+inline rpmTagType      HeaderEntryGetter::type()       { return rpmtdType( _rpmtd ); }
+inline rpm_count_t     HeaderEntryGetter::cnt()        { return _rpmtd->count; }
+inline void *          HeaderEntryGetter::val()        { return _rpmtd->data; }
+#else
+inline HeaderEntryGetter::HeaderEntryGetter( const Header & h_r, rpmTag & tag_r )
+  : _type( RPM_NULL_TYPE )
+  , _cnt( 0 )
+  , _val( 0 )
+{ ::headerGetEntry( h_r, tag_r, hTYP_t(&_type), &_val, &_cnt ); }
+inline HeaderEntryGetter::~HeaderEntryGetter()
+{ if ( _val && _type == RPM_STRING_ARRAY_TYPE ) free( _val ); }
+inline rpmTagType      HeaderEntryGetter::type()       { return _type; }
+inline rpm_count_t     HeaderEntryGetter::cnt()        { return _cnt; }
+inline void *          HeaderEntryGetter::val()        { return _val; }
+#endif //_RPM_5
+
+///////////////////////////////////////////////////////////////////
+//
+//        CLASS NAME : BinHeader::intList
+//
+///////////////////////////////////////////////////////////////////
+
+unsigned BinHeader::intList::set( void * val_r, unsigned cnt_r, rpmTagType type_r )
+{
+  _type = type_r; // remember the type!
+  if ( val_r )
+    switch ( _type )
+    {
+#if RPM_CHAR_TYPE != RPM_INT8_TYPE
+      case RPM_CHAR_TYPE:
+        std::vector<long>( (char*)val_r, ((char*)val_r)+cnt_r ).swap( _data );
+        break;
+#endif
+      case RPM_INT8_TYPE:
+        std::vector<long>( (int8_t*)val_r, ((int8_t*)val_r)+cnt_r ).swap( _data );
+        break;
+      case RPM_INT16_TYPE:
+        std::vector<long>( (int16_t*)val_r, ((int16_t*)val_r)+cnt_r ).swap( _data );
+        break;
+      case RPM_INT32_TYPE:
+        std::vector<long>( (int32_t*)val_r, ((int32_t*)val_r)+cnt_r ).swap( _data );
+        break;
+#ifndef _RPM_5
+      case RPM_INT64_TYPE:
+        std::vector<long>( (int64_t*)val_r, ((int64_t*)val_r)+cnt_r ).swap( _data );
+        break;
+#endif
+      default:
+        std::vector<long>( cnt_r, 0L ).swap( _data );
+        break;
+    }
+  else
+    _data.clear();
+  return _data.size();
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//        CLASS NAME : BinHeader::stringList
+//
+///////////////////////////////////////////////////////////////////
+
+unsigned BinHeader::stringList::set( char ** val_r, unsigned cnt_r )
+{
+  if ( val_r )
+    std::vector<std::string>( val_r, val_r+cnt_r ).swap( _data );
+  else
+    _data.clear();
+  return _data.size();
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//        CLASS NAME : BinHeader
+//
+///////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::BinHeader
+//        METHOD TYPE : Constructor
+//
+BinHeader::BinHeader( Header h_r )
+  : _h( h_r )
+{
+  if ( _h )
+  {
+    headerLink( _h );
+  }
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::BinHeader
+//        METHOD TYPE : Constructor
+//
+BinHeader::BinHeader( BinHeader::Ptr & rhs )
+{
+  INT << "INJECT from " << rhs;
+  if ( ! (rhs && rhs->_h) )
+  {
+    _h = 0;
+  }
+  else
+  {
+    _h = rhs->_h;  // ::headerLink already done in rhs
+    rhs->_h = 0;
+  }
+  INT << ": " << *this << "   (" << rhs << ")" << endl;
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::~BinHeader
+//        METHOD TYPE : Destructor
+//
+BinHeader::~BinHeader()
+{
+  if ( _h )
+  {
+    headerFree( _h );
+  }
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::assertHeader
+//        METHOD TYPE : void
+//
+bool BinHeader::assertHeader()
+{
+  if ( !_h )
+  {
+    _h = ::headerNew();
+    if ( !_h )
+    {
+      INT << "OOPS: NULL HEADER created!" << endl;
+      return false;
+    }
+  }
+  return true;
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::has_tag
+//        METHOD TYPE : bool
+//
+//        DESCRIPTION :
+//
+bool BinHeader::has_tag( tag tag_r ) const
+{
+  return( !empty() && ::headerIsEntry( _h, tag_r ) );
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::int_list
+//        METHOD TYPE : unsigned
+//
+//        DESCRIPTION :
+//
+unsigned BinHeader::int_list( tag tag_r, intList & lst_r ) const
+{
+  if ( !empty() )
+  {
+    HeaderEntryGetter headerget( _h, tag_r );
+
+    if ( headerget.val() )
+    {
+      switch ( headerget.type() )
+      {
+        case RPM_NULL_TYPE:
+          return lst_r.set( 0, 0, headerget.type() );
+#if RPM_CHAR_TYPE != RPM_INT8_TYPE
+        case RPM_CHAR_TYPE:
+#endif
+        case RPM_INT8_TYPE:
+        case RPM_INT16_TYPE:
+        case RPM_INT32_TYPE:
+#ifndef _RPM_5
+        case RPM_INT64_TYPE:
+#endif
+          return lst_r.set( headerget.val(), headerget.cnt(), headerget.type() );
+
+        default:
+          INT << "RPM_TAG MISSMATCH: RPM_INTxx_TYPE " << tag_r << " got type " << headerget.type() << endl;
+      }
+    }
+  }
+  return lst_r.set( 0, 0, RPM_NULL_TYPE );
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::string_list
+//        METHOD TYPE : unsigned
+//
+//        DESCRIPTION :
+//
+unsigned BinHeader::string_list( tag tag_r, stringList & lst_r ) const
+{
+  if ( !empty() )
+  {
+    HeaderEntryGetter headerget( _h, tag_r );
+
+    if ( headerget.val() )
+    {
+      switch ( headerget.type() )
+      {
+        case RPM_NULL_TYPE:
+          return lst_r.set( 0, 0 );
+        case RPM_STRING_ARRAY_TYPE:
+          return lst_r.set( (char**)headerget.val(), headerget.cnt() );
+
+        default:
+          INT << "RPM_TAG MISSMATCH: RPM_STRING_ARRAY_TYPE " << tag_r << " got type " << headerget.type() << endl;
+      }
+    }
+  }
+  return lst_r.set( 0, 0 );
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::int_val
+//        METHOD TYPE : int
+//
+//        DESCRIPTION :
+//
+int BinHeader::int_val( tag tag_r ) const
+{
+  if ( !empty() )
+  {
+    HeaderEntryGetter headerget( _h, tag_r );
+
+    if ( headerget.val() )
+    {
+      switch ( headerget.type() )
+      {
+        case RPM_NULL_TYPE:
+          return 0;
+#if RPM_CHAR_TYPE != RPM_INT8_TYPE
+        case RPM_CHAR_TYPE:
+          return *((char*)headerget.val());
+#endif
+        case RPM_INT8_TYPE:
+          return *((int8_t*)headerget.val());
+        case RPM_INT16_TYPE:
+          return *((int16_t*)headerget.val());
+        case RPM_INT32_TYPE:
+          return *((int32_t*)headerget.val());
+#ifndef _RPM_5
+        case RPM_INT64_TYPE:
+          return *((int64_t*)headerget.val());
+#endif
+
+        default:
+          INT << "RPM_TAG MISSMATCH: RPM_INTxx_TYPE " << tag_r << " got type " << headerget.type() << endl;
+      }
+    }
+  }
+  return 0;
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::string_val
+//        METHOD TYPE : std::string
+//
+//        DESCRIPTION :
+//
+std::string BinHeader::string_val( tag tag_r ) const
+{
+  if ( !empty() )
+  {
+    HeaderEntryGetter headerget( _h, tag_r );
+
+    if ( headerget.val() )
+    {
+      switch ( headerget.type() )
+      {
+        case RPM_NULL_TYPE:
+          return "";
+        case RPM_STRING_TYPE:
+          return (char*)headerget.val();
+
+        default:
+          INT << "RPM_TAG MISSMATCH: RPM_STRING_TYPE " << tag_r << " got type " << headerget.type() << endl;
+      }
+    }
+  }
+  return "";
+}
+
+std::string BinHeader::nvra() const
+{
+  if ( !empty() ) {
+    std::string nvra = string_val( RPMTAG_NVRA );
+    if ( nvra.empty() ) {
+      //name-version-release-arch
+      nvra = string_val( RPMTAG_NAME ) + "-" + string_val( RPMTAG_VERSION )  + "-" + string_val( RPMTAG_RELEASE)  + "-" + string_val( RPMTAG_ARCH )  ;
+    }
+    return nvra;
+  }
+  return "";
+}
+
+
+
+std::string BinHeader::format(const char *fmt) const
+{
+  zypp::AutoDispose<char *> form(headerFormat(_h, fmt, NULL), free);
+  if ( !form )
+    return std::string();
+
+  return std::string(form);
+}
+
+Header BinHeader::get() const
+{
+  return _h;
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//        METHOD NAME : BinHeader::stringList_val
+//        METHOD TYPE : std::list<std::string>
+//
+//        DESCRIPTION :
+//
+std::list<std::string> BinHeader::stringList_val( tag tag_r ) const
+{
+  std::list<std::string> ret;
+
+  if ( !empty() )
+  {
+    stringList lines;
+    unsigned count = string_list( tag_r, lines );
+    for ( unsigned i = 0; i < count; ++i )
+    {
+      ret.push_back( lines[i] );
+    }
+  }
+  return ret;
+}
+
+///////////////////////////////////////////////////////////////////
+//
+//
+//      METHOD NAME : BinHeader::dumpOn
+//      METHOD TYPE : ostream &
+//
+//      DESCRIPTION :
+//
+std::ostream & BinHeader::dumpOn( std::ostream & str ) const
+{
+  ReferenceCounted::dumpOn( str );
+  return str << '{' << (void*)_h << '}';
+}
diff --git a/tools/zypp-rpm/BinHeader.h b/tools/zypp-rpm/BinHeader.h
new file mode 100644 (file)
index 0000000..172260d
--- /dev/null
@@ -0,0 +1,158 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/target/rpm/BinHeader.h
+ *
+*/
+#ifndef ZYPP_TARGET_RPM_BINHEADER_H
+#define ZYPP_TARGET_RPM_BINHEADER_H
+
+extern "C"
+{
+#include <stdint.h>
+}
+
+#include <iosfwd>
+#include <string>
+#include <vector>
+#include <list>
+
+#include <zypp-core/base/ReferenceCounted.h>
+#include <zypp-core/base/NonCopyable.h>
+#include <zypp-core/base/PtrTypes.h>
+#include <zypp/target/rpm/librpm.h>
+
+/**
+ *
+ **/
+class BinHeader : public zypp::base::ReferenceCounted, private zypp::base::NonCopyable
+{
+
+public:
+
+  typedef zypp::intrusive_ptr<BinHeader> Ptr;
+
+  typedef zypp::intrusive_ptr<const BinHeader> constPtr;
+
+  typedef rpmTag tag;
+
+  class intList;
+
+  class stringList;
+
+private:
+
+  Header _h;
+
+  bool assertHeader();
+
+public:
+
+  BinHeader( Header h_r = 0 );
+
+  /**
+   * <B>Dangerous!<\B> This one takes the header out of rhs
+   * and leaves rhs empty.
+   **/
+  BinHeader( BinHeader::Ptr & rhs );
+
+  virtual ~BinHeader();
+
+public:
+
+  bool empty() const
+  {
+    return( _h == NULL );
+  }
+
+  bool has_tag( tag tag_r ) const;
+
+  unsigned int_list( tag tag_r, intList & lst_r ) const;
+
+  unsigned string_list( tag tag_r, stringList & lst_r ) const;
+
+  int int_val( tag tag_r ) const;
+
+  std::string string_val( tag tag_r ) const;
+  std::string format ( const char * fmt) const;
+
+  Header get() const;
+
+  std::string nvra()      const;
+
+public:
+
+  std::list<std::string> stringList_val( tag tag_r ) const;
+
+public:
+
+  virtual std::ostream & dumpOn( std::ostream & str ) const;
+};
+
+///////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////
+//
+//     CLASS NAME : BinHeader::intList
+/**
+ *
+ **/
+class BinHeader::intList : private zypp::base::NonCopyable
+{
+  public:
+    intList()
+      : _type( RPM_NULL_TYPE )
+    {}
+
+    bool empty() const
+    { return _data.empty(); }
+
+    unsigned size() const
+    { return _data.size(); }
+
+    long operator[]( const unsigned idx_r ) const
+    { return idx_r < _data.size() ? _data[idx_r] : 0; }
+
+  private:
+    friend class BinHeader;
+    unsigned set( void * val_r, unsigned cnt_r, rpmTagType type_r );
+
+  private:
+    std::vector<long> _data;
+    rpmTagType _type;
+};
+
+///////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////
+//
+//     CLASS NAME : BinHeader::stringList
+/**
+ *
+ **/
+class BinHeader::stringList : private zypp::base::NonCopyable
+{
+  public:
+    bool empty() const
+    { return _data.empty(); }
+
+    unsigned size() const
+    { return _data.size(); }
+
+    std::string operator[]( const unsigned idx_r ) const
+    { return idx_r < _data.size() ? _data[idx_r] : std::string(); }
+
+  private:
+    friend class BinHeader;
+    unsigned set( char ** val_r, unsigned cnt_r );
+
+  private:
+    std::vector<std::string> _data;
+};
+
+#endif // ZYPP_TARGET_RPM_BINHEADER_H
diff --git a/tools/zypp-rpm/CMakeLists.txt b/tools/zypp-rpm/CMakeLists.txt
new file mode 100644 (file)
index 0000000..36470e7
--- /dev/null
@@ -0,0 +1,42 @@
+PROJECT( zypp-rpm C CXX )
+
+set (CMAKE_CXX_STANDARD 17)
+SET (CMAKE_CXX_EXTENSIONS OFF)
+
+FIND_PACKAGE(Protobuf REQUIRED)
+
+FIND_PACKAGE(Rpm REQUIRED)
+IF ( NOT RPM_FOUND)
+  MESSAGE( FATAL_ERROR " rpm-devel not found" )
+ELSE ( NOT RPM_FOUND)
+
+  INCLUDE_DIRECTORIES(${RPM_INCLUDE_DIR})
+  # fix includes not relative to rpm
+  INCLUDE_DIRECTORIES(${RPM_INCLUDE_DIR}/rpm)
+
+  # rpm verify function and callback states were introduced in rpm-4.15
+  if( RPM_LIB_VER VERSION_GREATER_EQUAL "4.15.0"  AND  RPM_LIB_VER VERSION_LESS "5.0.0")
+    ADD_DEFINITIONS( -DHAVE_RPM_VERIFY_TRANSACTION_STEP )
+  endif()
+
+  if( RPM_LIB_VER VERSION_GREATER_EQUAL "5.0.0" )
+       MESSAGE( STATUS "rpm found: enable rpm-4 compat interface." )
+       ADD_DEFINITIONS(-D_RPM_5)
+  endif ()
+ENDIF( NOT RPM_FOUND)
+
+SET( SOURCES
+  errorcodes.h
+  main.cc
+  BinHeader.h
+  BinHeader.cc
+)
+
+add_executable( ${PROJECT_NAME} ${SOURCES} )
+target_link_libraries( ${PROJECT_NAME} zypp-core )
+target_link_libraries( ${PROJECT_NAME} zypp-protobuf )
+target_link_libraries( ${PROJECT_NAME} util )
+target_link_libraries( ${PROJECT_NAME} ${PROTOBUF_LITE_LIBRARIES} )
+target_link_libraries( ${PROJECT_NAME} ${RPM_LIBRARY} ${RPMIO_LIBRARY} )
+
+INSTALL( TARGETS ${PROJECT_NAME}       DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}" )
diff --git a/tools/zypp-rpm/errorcodes.h b/tools/zypp-rpm/errorcodes.h
new file mode 100644 (file)
index 0000000..da8df68
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef ZYPP_RPM_ERRORCODES_H
+#define ZYPP_RPM_ERRORCODES_H
+
+#include <string_view>
+
+// This is supposed to contain header only code, add nothing that would require symbols to be linked
+namespace zypprpm {
+  enum ErrCodes {
+    NoError = 0,
+    FailedToOpenDb,
+    WrongHeaderSize,
+    WrongMessageFormat,
+    RpmInitFailed,
+    FailedToReadPackage,
+    FailedToAddStepToTransaction,
+    RpmFinishedWithTransactionError, // we got explicit error problems from rpm
+    RpmFinishedWithError,            // the transaction started but could not be finished)
+    OtherError = 255
+  };
+}
+
+// we will send a end of message tag through the script FD whenever we receive a "STOP" message
+// this message will consist of this tag and a \n
+constexpr char endOfScriptTagData[] = {
+  (char)0xde,
+  (char)0xad,
+  (char)0xbe,
+  (char)0xef,
+  '\n'
+};
+constexpr std::string_view endOfScriptTag ( endOfScriptTagData, 5 );
+
+#endif // ZYPP_RPM_ERRORCODES_H
diff --git a/tools/zypp-rpm/main.cc b/tools/zypp-rpm/main.cc
new file mode 100644 (file)
index 0000000..0190463
--- /dev/null
@@ -0,0 +1,787 @@
+#include <zypp-proto/commit.pb.h>
+#include <zypp-core/zyppng/core/ByteArray>
+#include <zypp-core/zyppng/rpc/rpc.h>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <zypp-core/AutoDispose.h>
+#include <zypp-core/Pathname.h>
+#include <zypp-core/fs/PathInfo.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/StringV.h>
+
+// we do not link against libzypp, but these are pure header only files, if that changes
+// a copy should be created directly in the zypp-rpm project
+#include <zypp/target/rpm/librpm.h>
+#include <zypp/target/rpm/RpmFlags.h>
+
+#include <zypp-core/zyppng/rpc/zerocopystreams.h>
+
+extern "C"
+{
+#include <rpm/rpmcli.h>
+#include <rpm/rpmlog.h>
+}
+
+#include "BinHeader.h"
+#include "errorcodes.h"
+
+#include <cstdio>
+#include <iostream>
+#include <signal.h>
+#include <unistd.h>
+
+
+// this is the order we expect the FDs we need to communicate to be set up
+// by the parent. This is not pretty but it works and is less effort than
+// setting up a Unix Domain Socket and sending FDs over that.
+// Usually relying on conventions is not exactly a good idea but in this case we make an exception ;)
+enum class ExpectedFds : int {
+  MessageFd = STDERR_FILENO+1,
+  ScriptFd  = STDERR_FILENO+2
+};
+
+using zypp::target::rpm::RpmInstFlag;
+using zypp::target::rpm::RpmInstFlags;
+using namespace zypprpm;
+
+void *rpmLibCallback( const void *h, const rpmCallbackType what, const rpm_loff_t amount, const rpm_loff_t total, fnpyKey key, rpmCallbackData data );
+int rpmLogCallback ( rpmlogRec rec, rpmlogCallbackData data );
+
+template <typename Stream>
+void rpmpsPrintToStream ( Stream &str, rpmps ps )
+{
+  if ( !ps )
+    return;
+
+  rpmProblem p;
+  zypp::AutoDispose<rpmpsi> psi ( ::rpmpsInitIterator(ps), ::rpmpsFreeIterator );
+  while ((p = rpmpsiNext(psi))) {
+    zypp::AutoFREE<char> msg( rpmProblemString(p) );
+    str << "\t" << msg << std::endl;
+  }
+}
+
+bool recvBytes ( int fd, char *buf, size_t n ) {
+  size_t read = 0;
+  while ( read != n ) {
+    const auto r = zyppng::eintrSafeCall( ::read, fd, buf+read, n - read );
+    if ( r <= 0 )
+      return false;
+
+    read += r;
+  }
+  return true;
+}
+
+bool sendBytes ( int fd, const void *buf, size_t n ) {
+  const auto written =  zyppng::eintrSafeCall( ::write, fd, buf, n );
+  return written == n;
+}
+
+template <typename Message>
+bool pushMessage ( const Message &msg ) {
+
+  zypp::proto::Envelope env;
+  env.set_messagetypename( msg.GetTypeName() );
+  msg.SerializeToString( env.mutable_value() );
+
+  const auto &str = env.SerializeAsString();
+  zyppng::rpc::HeaderSizeType msgSize = str.length();
+  if ( !sendBytes( static_cast<int>( ExpectedFds::MessageFd ), reinterpret_cast< void* >( &msgSize), sizeof (zyppng::rpc::HeaderSizeType) ) )
+    return false;
+  return sendBytes( static_cast<int>( ExpectedFds::MessageFd ), str.c_str(), str.length() );
+}
+
+bool pushTransactionErrorMessage ( rpmps ps )
+{
+  if ( !ps )
+    return false;
+
+  zypp::proto::target::TransactionError err;
+
+  rpmProblem p;
+  zypp::AutoDispose<rpmpsi> psi ( ::rpmpsInitIterator(ps), ::rpmpsFreeIterator );
+  while ((p = rpmpsiNext(psi))) {
+    zypp::AutoFREE<char> msg( rpmProblemString(p) );
+
+    zypp::proto::target::TransactionProblemDesc desc;
+    desc.set_message( zypp::str::asString( msg.value() ) );
+
+    *err.mutable_problems()->Add() = std::move(desc);
+  }
+
+  return pushMessage( err );
+}
+
+
+using RpmHeader = std::shared_ptr<std::remove_pointer_t<Header>>;
+std::pair<RpmHeader, int> readPackage( rpmts ts_r, const zypp::filesystem::Pathname &path_r )
+{
+  zypp::PathInfo file( path_r );
+  if ( ! file.isFile() ) {
+    std::cerr << "Not a file: " << path_r << std::endl;
+    return std::make_pair( RpmHeader(), -1 );
+  }
+
+  FD_t fd = ::Fopen( path_r.c_str(), "r.ufdio" );
+  if ( fd == 0  || ::Ferror(fd) )
+  {
+    std::cerr << "Can't open file for reading: " << path_r << " (" << ::Fstrerror(fd) << ")" << std::endl;
+    if ( fd )
+      ::Fclose( fd );
+    return std::make_pair( RpmHeader(), -1 );
+  }
+
+  Header nh = 0;
+  int res = ::rpmReadPackageFile( ts_r, fd, path_r.asString().c_str(), &nh );
+  ::Fclose( fd );
+
+  if ( ! nh )
+  {
+    std::cerr << "Error reading header from " << path_r << " error(" << res << ")" << std::endl;
+    return std::make_pair( RpmHeader(), res );
+  }
+
+  RpmHeader h( nh, ::headerFree );
+  return std::make_pair( h, res );
+}
+
+
+struct TransactionData {
+  zypp::proto::target::Commit &commitData;
+
+  // dbinstance of removals to transaction step index
+  std::unordered_map<int, int> removePckIndex = {};
+
+  // the fd used by rpm to dump script output
+  zypp::AutoDispose<FD_t> rpmFd = {};
+};
+
+int main( int, char ** )
+{
+
+  // check if our env is set up correctly
+  if ( ::isatty(STDIN_FILENO) || ::isatty(STDOUT_FILENO) || ::isatty(STDERR_FILENO) ) {
+    std::cerr << "Running zypp-rpm directly from the console is not supported. This is just a internal helper tool for libzypp." << std::endl;
+    return OtherError;
+  }
+
+  // make sure the expected FDs are around too
+  struct stat sb;
+  if ( fstat( static_cast<int>(ExpectedFds::MessageFd), &sb) == -1 ) {
+    std::cerr << "Expected message fd is not valid, aborting" << std::endl;
+    return OtherError;
+  }
+  if ( (sb.st_mode & S_IFMT) != S_IFIFO ){
+    std::cerr << "Expected message fd is not a pipe, aborting" << std::endl;
+    return OtherError;
+  }
+
+  if ( fstat( static_cast<int>(ExpectedFds::ScriptFd), &sb) == -1 ) {
+    std::cerr << "Expected script fd is not valid, aborting" << std::endl;
+    return OtherError;
+  }
+  if ( (sb.st_mode & S_IFMT) != S_IFIFO ){
+    std::cerr << "Expected script fd is not a pipe, aborting" << std::endl;
+    return OtherError;
+  }
+
+  // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone
+  // to CTRL+C us
+  zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } );
+
+  // lets read our todo from stdin
+  zyppng::rpc::HeaderSizeType msgSize = 0;
+  if ( !recvBytes( STDIN_FILENO, reinterpret_cast<char *>(&msgSize), sizeof(zyppng::rpc::HeaderSizeType) ) ) {
+    std::cerr << "Wrong Header size, aborting" << std::endl;
+    return WrongHeaderSize;
+  }
+
+  // since all we can receive on stdin is the commit message, there is no need to read a envelope first
+  // we read it directly from the FD
+  zypp::proto::target::Commit msg;
+  {
+    zyppng::FileInputStream in( STDIN_FILENO );
+    if ( !msg.ParseFromBoundedZeroCopyStream( &in, msgSize ) ) {
+      std::cerr << "Wrong commit message format, aborting" << std::endl;
+      return WrongMessageFormat;
+    }
+
+  }
+
+  // we have all data ready now lets start installing
+  // first we initialize the rpmdb
+  int rc = ::rpmReadConfigFiles( NULL, NULL );
+  if ( rc ) {
+    std::cerr << "rpmReadConfigFiles returned " << rc << std::endl;
+    return RpmInitFailed;
+  }
+
+  ::addMacro( NULL, "_dbpath", NULL, msg.dbpath().c_str(), RMIL_CMDLINE );
+
+  auto ts = zypp::AutoDispose<rpmts>( ::rpmtsCreate(), ::rpmtsFree );;
+  ::rpmtsSetRootDir( ts, msg.root().c_str() );
+
+  int tsFlags           = RPMTRANS_FLAG_NONE;
+  int tsVerifyFlags     = RPMVSF_DEFAULT;
+
+  if ( msg.flags() & RpmInstFlag::RPMINST_NODIGEST)
+    tsVerifyFlags |= _RPMVSF_NODIGESTS;
+  if ( msg.flags()  & RpmInstFlag::RPMINST_NOSIGNATURE)
+    tsVerifyFlags |= _RPMVSF_NOSIGNATURES;
+  if ( msg.flags()  & RpmInstFlag::RPMINST_EXCLUDEDOCS)
+    tsFlags |= RPMTRANS_FLAG_NODOCS;
+  if ( msg.flags()  & RpmInstFlag::RPMINST_NOSCRIPTS)
+    tsFlags |= RPMTRANS_FLAG_NOSCRIPTS;
+  if ( msg.flags()  & RpmInstFlag::RPMINST_JUSTDB)
+    tsFlags |= RPMTRANS_FLAG_JUSTDB;
+  if ( msg.flags()  & RpmInstFlag::RPMINST_TEST)
+    tsFlags |= RPMTRANS_FLAG_TEST;
+  if ( msg.flags()  & RpmInstFlag::RPMINST_NOPOSTTRANS)
+    tsFlags |= RPMTRANS_FLAG_NOPOSTTRANS;
+  if ( msg.flags() & RpmInstFlag::RPMINST_NOSCRIPTS )
+    tsFlags |= RPMTRANS_FLAG_NOSCRIPTS;
+
+  // setup transaction settings
+  ::rpmtsSetFlags( ts, tsFlags );
+
+  // set the verify flags so readPackage does the right thing
+  ::rpmtsSetVSFlags( ts, tsVerifyFlags );
+
+#ifdef HAVE_RPMTSSETVFYLEVEL
+  {
+    int vfylevel = ::rpmtsVfyLevel(ts);
+    if ( msg.flags() & RpmInstFlag::RPMINST_NODIGEST)
+      vfylevel &= ~( RPMSIG_DIGEST_TYPE );
+    if ( msg.flags()  & RpmInstFlag::RPMINST_NOSIGNATURE)
+      vfylevel &= ~( RPMSIG_SIGNATURE_TYPE);
+    ::rpmtsSetVfyLevel(ts, vfylevel);
+  }
+#endif
+
+  // open database for reading
+  if ( rpmtsGetRdb(ts) == NULL ) {
+    int res = ::rpmtsOpenDB( ts, O_RDWR );
+    if ( res ) {
+      std::cerr << "rpmdbOpen error(" << res << "): " << std::endl;
+      return FailedToOpenDb;
+    }
+  }
+
+  // the transaction data we will get in the callback
+  TransactionData data { msg };
+
+
+  for ( int i = 0; i < msg.steps_size(); i++ ) {
+    const auto &step = msg.steps(i);
+
+    if ( step.has_install() ) {
+
+      const auto &file = step.install().pathname();
+      auto rpmHeader = readPackage( ts, step.install().pathname() );
+      switch(rpmHeader.second) {
+        case RPMRC_OK:
+          break;
+        case RPMRC_NOTTRUSTED:
+          std::cerr << zypp::str::Format( "Failed to verify key for %s" ) % file << std::endl;
+          return FailedToReadPackage;
+        case RPMRC_NOKEY:
+          std::cerr << zypp::str::Format( "Public key unavailable for %s" ) % file << std::endl;
+          return FailedToReadPackage;
+        case RPMRC_NOTFOUND:
+          std::cerr << zypp::str::Format( "Signature not found for %s" ) % file << std::endl;
+          return FailedToReadPackage;
+        case RPMRC_FAIL:
+          std::cerr << zypp::str::Format( "Signature does not verify for %s" ) % file << std::endl;
+          return FailedToReadPackage;
+        default:
+          std::cerr << zypp::str::Format( "Failed to open(generic error): %1%" ) % file << std::endl;
+          return FailedToReadPackage;
+      }
+
+      if ( !rpmHeader.first ) {
+        std::cerr << zypp::str::Format( "Failed to read rpm header from: %1%" )% file << std::endl;
+        return FailedToReadPackage;
+      }
+
+      const auto res = ::rpmtsAddInstallElement( ts, rpmHeader.first.get(), &step, !step.install().multiversion(), nullptr  );
+      if ( res ) {
+        std::cerr << zypp::str::Format( "Failed to add %1% to the transaction." )% file << std::endl;
+        return FailedToAddStepToTransaction;
+      }
+
+    } else if ( step.has_remove() ) {
+
+      const auto &remove = step.remove();
+
+      const std::string &name = remove.name()
+                                + "-" + remove.version()
+                                + "-" + remove.release()
+                                + "." + remove.arch();
+
+      bool found = false;
+      zypp::AutoDispose<rpmdbMatchIterator> it( ::rpmtsInitIterator( ts, rpmTag(RPMTAG_NAME), remove.name().c_str(), 0 ), ::rpmdbFreeIterator );
+      while ( ::Header h = ::rpmdbNextIterator( it ) ) {
+        BinHeader hdr(h);
+        if ( hdr.string_val( RPMTAG_VERSION ) == remove.version()
+             &&  hdr.string_val( RPMTAG_RELEASE ) == remove.release()
+             &&  hdr.string_val( RPMTAG_ARCH ) == remove.arch() ) {
+          found = true;
+
+          const auto res = ::rpmtsAddEraseElement( ts, hdr.get(), 0  );
+          if ( res ) {
+            std::cerr << zypp::str::Format( "Failed to add removal of %1% to the transaction." ) % name << std::endl;
+            return FailedToAddStepToTransaction;
+          }
+
+          data.removePckIndex.insert( std::make_pair( headerGetInstance( h ), i ) );
+          break;
+        }
+      }
+
+      if ( !found ) {
+        std::cerr << "Unable to remove " << name << " it was not found!" << std::endl;
+      }
+
+    } else {
+      std::cerr << "Ignoring step that is neither a remove, nor a install." << std::endl;
+    }
+
+  }
+
+  // set the callback function for progress reporting and things
+  ::rpmtsSetNotifyCallback( ts, rpmLibCallback, &data );
+
+  // make sure we get da log
+  ::rpmlogSetMask( RPMLOG_UPTO( RPMLOG_PRI(RPMLOG_INFO) ) );
+  ::rpmlogSetCallback( rpmLogCallback, nullptr );
+
+  // redirect the script output to a fd ( log level MUST be at least INFO )
+  data.rpmFd = zypp::AutoDispose<FD_t> (
+    ::fdDup( static_cast<int>( ExpectedFds::ScriptFd ) ),
+    Fclose
+  );
+
+  if ( data.rpmFd.value() ) {
+    std::cerr << "Assigning script FD" << std::endl;
+    ::rpmtsSetScriptFd( ts,  data.rpmFd );
+  } else {
+    std::cerr << "Failed to assign script FD" << std::endl;
+  }
+
+
+#if 0
+  // unset the verify flags, we already checked those when reading the package header and libzypp made sure
+  // all signatures are fine as well
+  ::rpmtsSetVSFlags( ts, rpmtsVSFlags(ts) | _RPMVSF_NODIGESTS | _RPMVSF_NOSIGNATURES );
+
+#ifdef HAVE_RPMTSSETVFYLEVEL
+  {
+    int vfylevel = ::rpmtsVfyLevel(ts);
+    vfylevel &= ~( RPMSIG_DIGEST_TYPE | RPMSIG_SIGNATURE_TYPE);
+    ::rpmtsSetVfyLevel(ts, vfylevel);
+  }
+#endif
+
+#endif
+
+  // handle --nodeps
+  if ( !( msg.flags() & RpmInstFlag::RPMINST_NODEPS) ) {
+    if ( ::rpmtsCheck(ts) ) {
+      zypp::AutoDispose<rpmps> ps( ::rpmtsProblems(ts), ::rpmpsFree );
+      pushTransactionErrorMessage( ps );
+
+      std::ostringstream sstr;
+      sstr << "rpm output:" << "Failed dependencies:" << std::endl;
+      rpmpsPrintToStream( sstr, ps );
+
+      const auto &rpmMsg = sstr.str();
+
+      // TranslatorExplanation the colon is followed by an error message
+      std::cerr << std::string("RPM failed: ") + rpmMsg << std::endl;
+      return RpmFinishedWithTransactionError;
+    }
+  }
+
+  int tsProbFilterFlags = RPMPROB_FILTER_NONE;
+
+
+  if ( msg.ignorearch() )
+    tsProbFilterFlags |= RPMPROB_FILTER_IGNOREARCH;
+
+  if ( msg.flags() & RpmInstFlag::RPMINST_ALLOWDOWNGRADE )
+    tsProbFilterFlags |= ( RPMPROB_FILTER_OLDPACKAGE ); // --oldpackage
+
+  if ( msg.flags() & RpmInstFlag::RPMINST_REPLACEFILES )
+    tsProbFilterFlags |= ( RPMPROB_FILTER_REPLACENEWFILES
+                           | RPMPROB_FILTER_REPLACEOLDFILES ); // --replacefiles
+
+  if ( msg.flags() & RpmInstFlag::RPMINST_FORCE )
+    tsProbFilterFlags |= ( RPMPROB_FILTER_REPLACEPKG
+                           | RPMPROB_FILTER_REPLACENEWFILES
+                           | RPMPROB_FILTER_REPLACEOLDFILES
+                           | RPMPROB_FILTER_OLDPACKAGE ); // --force
+
+  if ( msg.flags() & RpmInstFlag::RPMINST_IGNORESIZE )
+    tsProbFilterFlags |= RPMPROB_FILTER_DISKSPACE | RPMPROB_FILTER_DISKNODES;
+
+  // transaction steps are set up lets execute it
+  // the way how libRPM works is that it will try to install all packages even if some of them fail
+  // we need to go over the rpm problem set to mark those steps that have failed, we get no other hint on wether
+  // it worked or not
+  const auto transRes = ::rpmtsRun( ts, nullptr, tsProbFilterFlags );
+  //data.finishCurrentStep( );
+
+  if ( transRes != 0 ) {
+
+    auto err = RpmFinishedWithError;
+
+    std::string errMsg;
+    if ( transRes > 0 ) {
+      //@NOTE dnf checks if the problem set is empty and if it is seems to treat the transaction as successful, can this really happen?
+      zypp::AutoDispose<rpmps> ps( ::rpmtsProblems(ts), ::rpmpsFree );
+
+      pushTransactionErrorMessage( ps );
+
+      std::ostringstream sstr;
+      sstr << "rpm output:" << std::endl;
+      rpmpsPrintToStream( sstr, ps );
+      errMsg = sstr.str();
+      err = RpmFinishedWithTransactionError;
+    } else {
+      errMsg = "Running the transaction failed.";
+    }
+
+    //HistoryLog().comment( str::form("Transaction failed"), true /*timestamp*/ );
+    std::ostringstream sstr;
+    sstr << "rpm output:" << std::endl << errMsg << std::endl;
+    //HistoryLog().comment(sstr.str());
+
+    std::cerr << "RPM transaction failed: " + errMsg << std::endl;
+    return err;
+  }
+
+  std::cerr << "Success !!!!" << std::endl;
+
+  return NoError;
+}
+
+std::string_view tagToScriptTypeName ( int tag )
+{
+  using namespace std::literals;
+  switch (tag) {
+    case RPMTAG_PREIN:
+      return "prein"sv;
+    case RPMTAG_PREUN:
+      return "preun"sv;
+    case RPMTAG_TRIGGERPREIN:
+      return "triggerprein"sv;
+    case RPMTAG_POSTIN:
+      return "postin"sv;
+    case RPMTAG_POSTUN:
+      return "postun"sv;
+    case RPMTAG_PRETRANS:
+      return "pretrans"sv;
+    case RPMTAG_POSTTRANS:
+      return "posttrans"sv;
+    case RPMTAG_TRIGGERUN:
+      return "triggerun"sv;
+    case RPMTAG_TRIGGERIN:
+      return "triggerin"sv;
+    case RPMTAG_TRIGGERPOSTUN:
+      return "triggerpostun"sv;
+    case RPMTAG_VERIFYSCRIPT:
+      return "verifyscript"sv;
+    default:
+      return ""sv;
+  }
+}
+
+void *rpmLibCallback( const void *h, const rpmCallbackType what, const rpm_loff_t amount, const rpm_loff_t total, fnpyKey key, rpmCallbackData data )
+{
+  void * rc = NULL;
+  TransactionData* that = reinterpret_cast<TransactionData *>( data );
+  if ( !that )
+    return rc;
+
+  static FD_t fd = NULL;
+  const BinHeader header( (Header)h );
+
+  auto iStep = key ? reinterpret_cast< const zypp::proto::target::TransactionStep * >( key ) : nullptr;
+  if ( !iStep && h ) {
+    auto key = headerGetInstance( header.get() );
+    if ( key > 0 ) {
+      auto i = that->removePckIndex.find(key);
+      if ( i != that->removePckIndex.end() )
+        iStep = &that->commitData.steps( i->second );
+    }
+  }
+
+  const auto &sendEndOfScriptTag = [&](){
+    std::cerr << "Send end of script" << std::endl;
+    ::sendBytes( static_cast<int>( ExpectedFds::ScriptFd ), endOfScriptTag.data(), endOfScriptTag.size() );
+  };
+
+  switch (what) {
+    case RPMCALLBACK_INST_OPEN_FILE: {
+
+      if ( !iStep || !iStep->has_install() || iStep->install().pathname().empty() )
+        return NULL;
+      if ( fd != NULL )
+        std::cerr << "ERR opening a file before closing the old one?  Really ? " << std::endl;
+      fd = Fopen( iStep->install().pathname().data(), "r.ufdio" );
+      if (fd == NULL || Ferror(fd)) {
+        std::cerr << "Error when opening file " << iStep->install().pathname().data() << std::endl;
+        if (fd != NULL) {
+          Fclose(fd);
+          fd = NULL;
+        }
+      } else
+        fd = fdLink(fd);
+      return (void *)fd;
+      break;
+    }
+
+    case RPMCALLBACK_INST_CLOSE_FILE:
+      fd = fdFree(fd);
+      if (fd != NULL) {
+        Fclose(fd);
+        fd = NULL;
+      }
+      break;
+
+    case RPMCALLBACK_INST_START: {
+
+      if ( !iStep || !iStep->has_install() )
+        return rc;
+
+      zypp::proto::target::PackageBegin step;
+      step.set_stepid( iStep->stepid() );
+      pushMessage( step );
+
+      break;
+    }
+
+    case RPMCALLBACK_UNINST_START: {
+
+      if ( !iStep ) {
+
+        if ( header.empty() ) {
+          std::cerr << "No header and no transaction step for a uninstall start, not sending anything" << std::endl;
+          return rc;
+        }
+
+        // this is a package cleanup send the report accordingly
+        zypp::proto::target::CleanupBegin step;
+        step.set_nvra( header.nvra() );
+        pushMessage( step );
+
+      } else {
+
+        if ( !iStep->has_remove() ) {
+          std::cerr << "Could not find package in removables " << header << " in transaction elements" << std::endl;
+          return rc;
+        }
+
+        zypp::proto::target::PackageBegin step;
+        step.set_stepid( iStep->stepid() );
+        pushMessage( step );
+      }
+      break;
+    }
+
+    case RPMCALLBACK_INST_STOP: {
+
+      if ( !iStep ) {
+        std::cerr << "Could not find package " << header << " in transaction elements for " << what << std::endl;
+        return rc;
+      }
+
+      sendEndOfScriptTag();
+
+      zypp::proto::target::PackageFinished step;
+      step.set_stepid( iStep->stepid() );
+      pushMessage( step );
+
+      break;
+    }
+
+    case RPMCALLBACK_UNINST_STOP: {
+
+      if ( !iStep ) {
+        if ( header.empty() ) {
+          std::cerr << "No header and no transaction step for a uninstall stop, not sending anything" << std::endl;
+          return rc;
+        }
+
+        sendEndOfScriptTag();
+
+        // this is a package cleanup send the report accordingly
+        zypp::proto::target::CleanupFinished step;
+        step.set_nvra( header.nvra() );
+        pushMessage( step );
+      } else {
+
+        sendEndOfScriptTag();
+
+        zypp::proto::target::PackageFinished step;
+        step.set_stepid( iStep->stepid() );
+        pushMessage( step );
+
+      }
+
+      break;
+    }
+    case RPMCALLBACK_UNPACK_ERROR: {
+
+      if ( !iStep ) {
+        std::cerr << "Could not find package " << header << " in transaction elements for " << what << std::endl;
+        return rc;
+      }
+
+      zypp::proto::target::PackageError step;
+      step.set_stepid( iStep->stepid() );
+      pushMessage( step );
+      break;
+    }
+
+    case RPMCALLBACK_INST_PROGRESS: {
+
+      if ( !iStep  )
+        return rc;
+
+      const auto progress = (double) (total
+                                        ? ((((float) amount) / total) * 100)
+                                        : 100.0);
+
+      zypp::proto::target::PackageProgress step;
+      step.set_stepid( iStep->stepid() );
+      step.set_amount( progress );
+      pushMessage( step );
+
+      break;
+    }
+
+    case RPMCALLBACK_UNINST_PROGRESS: {
+
+      const auto progress = (double) (total
+                                        ? ((((float) amount) / total) * 100)
+                                        : 100.0);
+      if ( !iStep  ) {
+        if ( header.empty() ) {
+          std::cerr << "No header and no transaction step for a uninstall progress, not sending anything" << std::endl;
+          return rc;
+        }
+
+        // this is a package cleanup send the report accordingly
+        zypp::proto::target::CleanupProgress step;
+        step.set_nvra( header.nvra() );
+        step.set_amount( progress );
+        pushMessage( step );
+
+      } else {
+        zypp::proto::target::PackageProgress step;
+        step.set_stepid( iStep->stepid() );
+        step.set_amount( progress );
+        pushMessage( step );
+      }
+      break;
+    }
+
+#ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP
+    case RPMCALLBACK_VERIFY_START:
+#endif
+    case RPMCALLBACK_TRANS_START: {
+      zypp::proto::target::TransBegin step;
+      const char *n = "Preparing";
+#ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP
+      if ( what == RPMCALLBACK_VERIFY_START )
+        n = "Verifying";
+#endif
+      step.set_name( n );
+      pushMessage( step );
+      break;
+    }
+
+#ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP
+    case RPMCALLBACK_VERIFY_STOP:
+#endif
+    case RPMCALLBACK_TRANS_STOP: {
+      sendEndOfScriptTag();
+      zypp::proto::target::TransFinished step;
+      pushMessage( step );
+      break;
+    }
+
+#ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP
+    case RPMCALLBACK_VERIFY_PROGRESS:
+#endif
+    case RPMCALLBACK_TRANS_PROGRESS: {
+      const auto percentage = (double) (total
+                                      ? ((((float) amount) / total) * 100)
+                                      : 100.0);
+      zypp::proto::target::TransProgress prog;
+      prog.set_amount( percentage );
+      pushMessage( prog );
+      break;
+    }
+    case RPMCALLBACK_CPIO_ERROR:
+      std::cerr << "CPIO Error when installing package" << std::endl;
+      break;
+    case RPMCALLBACK_SCRIPT_START: {
+      zypp::proto::target::ScriptBegin script;
+      if ( iStep )
+        script.set_stepid( iStep->stepid() );
+      else
+        script.set_stepid( -1 );
+      script.set_scripttype( std::string( tagToScriptTypeName( amount ) ) );
+
+      if ( header.get() ) {
+        script.set_scriptpackage( header.nvra() );
+      }
+
+      pushMessage( script );
+      break;
+    }
+
+    case RPMCALLBACK_SCRIPT_STOP: {
+      sendEndOfScriptTag();
+      zypp::proto::target::ScriptFinished script;
+      if ( iStep )
+        script.set_stepid( iStep->stepid() );
+      else
+        script.set_stepid( -1 );
+      pushMessage( script );
+      break;
+    }
+    case RPMCALLBACK_SCRIPT_ERROR: {
+      zypp::proto::target::ScriptError script;
+      if ( iStep )
+        script.set_stepid( iStep->stepid() );
+      else
+        script.set_stepid( -1 );
+
+      // for RPMCALLBACK_SCRIPT_ERROR 'total' is abused by librpm to distinguish between warning and "real" errors
+      script.set_fatal( total != RPMRC_OK );
+      pushMessage( script );
+      break;
+    }
+    case RPMCALLBACK_UNKNOWN:
+    default:
+      break;
+  }
+
+  return rc;
+}
+
+int rpmLogCallback ( rpmlogRec rec, rpmlogCallbackData )
+{
+  int logRc = 0;
+
+  zypp::proto::target::RpmLog log;
+  log.set_level( rpmlogRecPriority(rec)  );
+  log.set_line( zypp::str::asString( ::rpmlogRecMessage(rec) ) );
+  std::cerr << "Pushing log message: " << log.line() << std::endl;
+  pushMessage( log );
+
+  return logRc;
+}
diff --git a/zypp-core/AutoDispose.h b/zypp-core/AutoDispose.h
new file mode 100644 (file)
index 0000000..d30ff77
--- /dev/null
@@ -0,0 +1,316 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/AutoDispose.h
+ *
+*/
+#ifndef ZYPP_AUTODISPOSE_H
+#define ZYPP_AUTODISPOSE_H
+
+#include <iosfwd>
+#include <boost/call_traits.hpp>
+
+#include <zypp-core/base/NonCopyable.h>
+#include <zypp-core/base/PtrTypes.h>
+#include <zypp-core/base/Function.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  ///////////////////////////////////////////////////////////////////
+  //
+  //   CLASS NAME : AutoDispose<Tp>
+  //
+  /** Reference counted access to a \c Tp object calling a custom
+   *  \c Dispose function when the last AutoDispose handle to it is
+   *  destroyed or reset.
+   *
+   * \note As with pointers, constness of an \c AutoDispose object does
+   * \b not apply to the stored \c Tp object. If the stored \c Tp object
+   * should be immutable, you should use <tt>AutoDispose\<const Tp\></tt>.
+   *
+   * Pass a filename to the application and provide the appropriate
+   * code to be executed when the file is no longer needed:
+   * \code
+   * struct FileCache
+   * {
+   *   Pathname getFile();
+   *   void     releaseFile( const Pathname & );
+   * };
+   *
+   * static FileCache cache;
+   *
+   * void unlink( const Pathname & file_r );
+   *
+   * AutoDispose<const Pathname> provideFile( ... )
+   * {
+   *   if ( file_is_in_cache )
+   *     {
+   *       // will call 'cache.releaseFile( file )'
+   *       return AutoDispose<const Pathname>( cache.getFile(),
+   *                                           bind( &FileCache::releaseFile, ref(cache), _1 ) );
+   *     }
+   *   else if ( file_is_temporary )
+   *     {
+   *       // will call 'unlink( file )'
+   *       return AutoDispose<const Pathname>( file, unlink );
+   *     }
+   *   else if ( file_is_permanent )
+   *     {
+   *       // will do nothing.
+   *       return AutoDispose<const Pathname>( file );
+   *     }
+   *   else
+   *     {
+   *       // will do nothing.
+   *       return AutoDispose<const Pathname>();
+   *     }
+   * }
+   * \endcode
+   *
+   * Exception safe handling of temporary files:
+   * \code
+   * void provideFileAt( const Pathname & destination )
+   * {
+   *   AutoDispose<const Pathname> guard( destination, unlink );
+   *
+   *   // Any exception here will lead to 'unlink( destination )'
+   *   // ...
+   *
+   *   // On success: reset the dispose function to NOOP.
+   *   guard.resetDispose();
+   * }
+   * \endcode
+  */
+  template<class Tp>
+    class AutoDispose
+    {
+    public:
+      typedef typename boost::call_traits<Tp>::param_type       param_type;
+      typedef typename boost::call_traits<Tp>::reference        reference;
+      typedef typename boost::call_traits<Tp>::const_reference  const_reference;
+      typedef Tp                                                value_type;
+      typedef typename boost::call_traits<Tp>::value_type       result_type;
+
+    public:
+      /** Dispose function signatue. */
+      typedef function<void ( param_type )> Dispose;
+
+    public:
+      /** Default Ctor using default constructed value and no dispose function. */
+      AutoDispose()
+      : _pimpl( new Impl( value_type() ) )
+      {}
+
+      /** Ctor taking dispose function and using default constructed value. */
+      explicit AutoDispose( const Dispose & dispose_r )
+      : _pimpl( new Impl( value_type(), dispose_r ) )
+      {}
+
+      /** Ctor taking value and no dispose function. */
+      explicit AutoDispose( param_type value_r )
+      : _pimpl( new Impl( value_r ) )
+      {}
+
+      /** Ctor taking value and dispose function. */
+      AutoDispose( param_type value_r, const Dispose & dispose_r )
+      : _pimpl( new Impl( value_r, dispose_r ) )
+      {}
+
+    public:
+
+      /** Provide implicit conversion to \c Tp\&. */
+      operator reference() const
+      { return _pimpl->_value; }
+
+      /** Reference to the \c Tp object. */
+      reference value() const
+      { return _pimpl->_value; }
+
+      /** Reference to the \c Tp object. */
+      reference operator*() const
+      { return _pimpl->_value; }
+
+      /** Pointer to the \c Tp object (asserted to be <tt>!= NULL</tt>). */
+      value_type * operator->() const
+      { return & _pimpl->_value; }
+
+      /** Reset to default Ctor values. */
+      void reset()
+      { AutoDispose().swap( *this ); }
+
+      /** Exchange the contents of two AutoDispose objects. */
+      void swap( AutoDispose & rhs )
+      { _pimpl.swap( rhs._pimpl ); }
+
+    public:
+      /** Return the current dispose function. */
+      const Dispose & getDispose() const
+      { return _pimpl->_dispose; }
+
+      /** Set a new dispose function. */
+      void setDispose( const Dispose & dispose_r )
+      { _pimpl->_dispose = dispose_r; }
+
+      /** Set no dispose function. */
+      void resetDispose()
+      { setDispose( Dispose() ); }
+
+      /** Exchange the dispose function. */
+      void swapDispose( Dispose & dispose_r )
+      { _pimpl->_dispose.swap( dispose_r ); }
+
+    private:
+      struct Impl : private base::NonCopyable
+      {
+        Impl( param_type value_r )
+        : _value( value_r )
+        {}
+        Impl( param_type value_r, const Dispose & dispose_r )
+        : _value( value_r )
+        , _dispose( dispose_r )
+        {}
+        ~Impl()
+        {
+          if ( _dispose )
+            try { _dispose( _value ); } catch(...) {}
+        }
+        value_type _value;
+        Dispose    _dispose;
+      };
+
+      shared_ptr<Impl> _pimpl;
+    };
+
+    template<>
+    class AutoDispose<void>
+    {
+    public:
+      /** Dispose function signatue. */
+      typedef function<void ()> Dispose;
+
+    public:
+      /** Default Ctor using default constructed value and no dispose function. */
+      AutoDispose()
+        : _pimpl( new Impl() )
+      {}
+
+      /** Ctor taking dispose function and using default constructed value. */
+      explicit AutoDispose( const Dispose & dispose_r )
+        : _pimpl( new Impl( dispose_r ) )
+      {}
+
+    public:
+
+      /** Reset to default Ctor values. */
+      void reset()
+      { AutoDispose().swap( *this ); }
+
+      /** Exchange the contents of two AutoDispose objects. */
+      void swap( AutoDispose & rhs )
+      { _pimpl.swap( rhs._pimpl ); }
+
+    public:
+      /** Return the current dispose function. */
+      const Dispose & getDispose() const
+      { return _pimpl->_dispose; }
+
+      /** Set a new dispose function. */
+      void setDispose( const Dispose & dispose_r )
+      { _pimpl->_dispose = dispose_r; }
+
+      /** Set no dispose function. */
+      void resetDispose()
+      { setDispose( Dispose() ); }
+
+      /** Exchange the dispose function. */
+      void swapDispose( Dispose & dispose_r )
+      { _pimpl->_dispose.swap( dispose_r ); }
+
+    private:
+      struct Impl : private base::NonCopyable
+      {
+        Impl( )
+        {}
+
+        Impl( const Dispose & dispose_r )
+          : _dispose( dispose_r )
+        {}
+
+        ~Impl()
+        {
+          if ( _dispose )
+            try { _dispose(); } catch(...) {}
+        }
+        Dispose    _dispose;
+      };
+      shared_ptr<Impl> _pimpl;
+    };
+
+  /*!
+   * Simple way to run a function at scope exit:
+   * \code
+   * bool wasBlocking = unblockFile( fd, true );
+   * OnScopeExit cleanup( [wasBlocking, fd](){
+   *  if ( wasBlocking ) unblockFile( fd, false );
+   * });
+   * \endcode
+   */
+  using OnScopeExit = AutoDispose<void>;
+
+  ///////////////////////////////////////////////////////////////////
+
+  /** \relates AutoDispose Stream output of the \c Tp object. */
+  template<class Tp>
+    inline std::ostream & operator<<( std::ostream & str, const AutoDispose<Tp> & obj )
+    { return str << obj.value(); }
+
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class AutoFD
+  /// \brief \ref AutoDispose\<int>  calling \c ::close
+  /// \ingroup g_RAII
+  ///////////////////////////////////////////////////////////////////
+  struct AutoFD : public AutoDispose<int>
+  {
+    AutoFD( int fd_r = -1 ) : AutoDispose<int>( fd_r, [] ( int fd_r ) { if ( fd_r != -1 ) ::close( fd_r ); } ) {}
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class AutoFILE
+  /// \brief \ref AutoDispose\<FILE*> calling \c ::fclose
+  /// \see \ref AutoDispose
+  /// \ingroup g_RAII
+  ///////////////////////////////////////////////////////////////////
+  struct AutoFILE : public AutoDispose<FILE*>
+  {
+    AutoFILE( FILE* file_r = nullptr ) : AutoDispose<FILE*>( file_r, [] ( FILE* file_r ) { if ( file_r ) ::fclose( file_r ); } ) {}
+  };
+
+  ///////////////////////////////////////////////////////////////////
+  /// \class AutoFREE<Tp>
+  /// \brief \ref AutoDispose\<Tp*> calling \c ::free
+  /// \ingroup g_RAII
+  ///////////////////////////////////////////////////////////////////
+  template <typename Tp>
+  struct AutoFREE : public AutoDispose<Tp*>
+  {
+    AutoFREE( Tp* ptr_r = nullptr ) : AutoDispose<Tp*>( ptr_r, [] ( Tp* ptr_r ) { if ( ptr_r ) ::free( ptr_r ); } ) {}
+    AutoFREE( void* ptr_r ) : AutoFREE( static_cast<Tp*>(ptr_r) ) {}
+  };
+
+  template <>
+  struct AutoFREE<void> : public AutoDispose<void*>
+  {
+    AutoFREE( void* ptr_r = nullptr ) : AutoDispose<void*>( ptr_r, [] ( void* ptr_r ) { if ( ptr_r ) ::free( ptr_r ); } ) {}
+  };
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_AUTODISPOSE_H
diff --git a/zypp-core/ByteArray.h b/zypp-core/ByteArray.h
new file mode 100644 (file)
index 0000000..d8253ae
--- /dev/null
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+#ifndef ZYPP_BYTEARRAY_H
+#define ZYPP_BYTEARRAY_H
+
+#include <vector>
+#include <cstring>
+#include <string>
+#include <string_view>
+
+namespace zypp {
+  class ByteArray : public std::vector<char>
+  {
+  public:
+    using vector<char>::vector;
+    explicit ByteArray ( const char *data, const int len = -1 ) : ByteArray( data, data + (len == -1 ? strlen(data) : len) ) { }
+    std::string asString () const {
+      if ( size() == 0 )
+        return std::string();
+      return std::string( data(), size() );
+    }
+
+#ifdef __cpp_lib_string_view
+    std::string_view asStringView () const {
+      if ( size() == 0 )
+        return std::string_view();
+      return std::string_view( data(), size() );
+    }
+#endif
+  };
+
+  class UByteArray : public std::vector<unsigned char>
+  {
+  public:
+    using vector<unsigned char>::vector;
+    explicit UByteArray ( const char *data, const int len = -1 ) : UByteArray( data, data + (len == -1 ? strlen(data) : len) ) { }
+  };
+}
+
+
+#endif
similarity index 99%
rename from zypp/ByteCount.cc
rename to zypp-core/ByteCount.cc
index 30c845b..b2eb4a0 100644 (file)
@@ -11,7 +11,7 @@
 */
 #include <iostream>
 
-#include <zypp/ByteCount.h>
+#include <zypp-core/ByteCount.h>
 
 using std::endl;
 
diff --git a/zypp-core/ByteCount.h b/zypp-core/ByteCount.h
new file mode 100644 (file)
index 0000000..31e9c5d
--- /dev/null
@@ -0,0 +1,166 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/ByteCount.h
+ *
+*/
+#ifndef ZYPP_BYTECOUNT_H
+#define ZYPP_BYTECOUNT_H
+
+#include <iosfwd>
+
+#include <zypp-core/base/Unit.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  ///////////////////////////////////////////////////////////////////
+  //
+  //   CLASS NAME : ByteCount
+  //
+  /** Store and operate with byte count.
+   *
+  */
+  class ByteCount
+  {
+    friend std::ostream & operator<<( std::ostream & str, const ByteCount & obj );
+
+  public:
+
+    typedef base::Unit      Unit;
+    typedef Unit::ValueType SizeType;
+
+    /** \name Byte unit constants. */
+    //@{
+    /** 1 Byte */
+    static const Unit B;
+
+    /** 1024 Byte */
+    static const Unit K;
+    static const Unit KiB;
+    /** 1024^2 Byte */
+    static const Unit M;
+    static const Unit MiB;
+    /** 1024^3 Byte */
+    static const Unit G;
+    static const Unit GiB;
+    /** 1024^4 Byte */
+    static const Unit T;
+    static const Unit TiB;
+
+    /** 1000 Byte */
+    static const Unit kB;
+    /** 1000^2 Byte */
+    static const Unit MB;
+    /** 1000^3 Byte */
+    static const Unit GB;
+    /** 1000^4 Byte */
+    static const Unit TB;
+    //@}
+
+  public:
+
+    /** Default ctor */
+    ByteCount()
+    : _count( 0 )
+    {}
+    /** Ctor taking 1 Unit. */
+    ByteCount( const Unit & unit_r )
+    : _count( unit_r.factor() )
+    {}
+    /** Ctor taking a count and optinal Unit. */
+    ByteCount( const SizeType count_r, const Unit & unit_r = B )
+    : _count( count_r * unit_r.factor() )
+    {}
+
+ public:
+
+    /** Conversion to SizeType. */
+    operator SizeType() const
+    { return _count; }
+
+    /** \name Arithmetic operations.
+     * \c + \c - \c * \c / are provided via conversion to SizeType.
+    */
+    //@{
+    ByteCount & operator+=( const SizeType rhs ) { _count += rhs; return *this; }
+    ByteCount & operator-=( const SizeType rhs ) { _count -= rhs; return *this; }
+    ByteCount & operator*=( const SizeType rhs ) { _count *= rhs; return *this; }
+    ByteCount & operator/=( const SizeType rhs ) { _count /= rhs; return *this; }
+
+    ByteCount & operator++(/*prefix*/) { _count += 1; return *this; }
+    ByteCount & operator--(/*prefix*/) { _count -= 1; return *this; }
+
+    ByteCount operator++(int/*postfix*/) { return _count++; }
+    ByteCount operator--(int/*postfix*/) { return _count--; }
+    //@}
+
+    /** Adjust count to multiple of \a blocksize_r (default 1K).
+     * Zero blocksize_r is treated as 1B.
+    */
+    ByteCount & fillBlock( ByteCount blocksize_r = K );
+
+    /** Return count adjusted to multiple of \a blocksize_r (default 1K). */
+    ByteCount fullBlocks( ByteCount blocksize_r = K ) const
+    { return ByteCount(*this).fillBlock( blocksize_r ); }
+
+    /** Return number of blocks of size \a blocksize_r (default 1K). */
+    SizeType blocks( ByteCount blocksize_r = K ) const
+    { return fullBlocks( blocksize_r ) / blocksize_r; }
+
+  public:
+
+    /** Return the best Unit (B,K,M,G,T) for count. */
+    const Unit & bestUnit() const;
+
+    /** Return the best Unit (B,kB,MB,GB,TB) for count. */
+    const Unit & bestUnit1000() const;
+
+    /** \name Conversion to string.
+     * \li \a field_width_r Width for the number part (incl. precision)
+     * \li \a unit_width_r With for the unit symbol (without symbol if zero)
+     * \li \a prec_r Precision to use.
+     * \see zypp::base::Unit
+    */
+    //@{
+    /** Auto selected Unit and precision. */
+    std::string asString( unsigned field_width_r = 0,
+                          unsigned unit_width_r  = 1 ) const
+    { return asString( bestUnit(), field_width_r, unit_width_r ); }
+    /** Auto selected Unit. */
+    std::string asString( unsigned field_width_r,
+                          unsigned unit_width_r,
+                          unsigned prec_r ) const
+    { return asString( bestUnit(), field_width_r, unit_width_r, prec_r ); }
+    /** Auto selected precision. */
+    std::string asString( const Unit & unit_r,
+                          unsigned field_width_r = 0,
+                          unsigned unit_width_r  = 1 ) const
+    { return asString( unit_r, field_width_r, unit_width_r, unit_r.prec() ); }
+    /** Nothing auto selected. */
+    std::string asString( const Unit & unit_r,
+                          unsigned field_width_r,
+                          unsigned unit_width_r,
+                          unsigned prec_r ) const
+    { return unit_r.form( _count, field_width_r, unit_width_r, prec_r ); }
+    //@}
+
+  private:
+    SizeType _count;
+  };
+  ///////////////////////////////////////////////////////////////////
+
+  /** \relates ByteCount Stream output */
+  inline std::ostream & operator<<( std::ostream & str, const ByteCount & obj )
+  { return str << obj.asString(); }
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BYTECOUNT_H
diff --git a/zypp-core/CMakeLists.txt b/zypp-core/CMakeLists.txt
new file mode 100644 (file)
index 0000000..915166b
--- /dev/null
@@ -0,0 +1,265 @@
+# Collect all files that may contain translatable texts
+FILE( GLOB_RECURSE POT_FILE_DEPENDS RELATIVE ${LIBZYPP_SOURCE_DIR} "*.h" "*.cc" )
+SET( POT_FILE_DEPENDS_ZYPP_CORE ${POT_FILE_DEPENDS} PARENT_SCOPE )
+
+INCLUDE_DIRECTORIES ( ${LIBZYPP_SOURCE_DIR} )
+
+ADD_DEFINITIONS( -DLOCALEDIR="${CMAKE_INSTALL_PREFIX}/share/locale" -DTEXTDOMAIN="zypp" -DZYPP_DLL )
+
+SET( zypp_toplevel_headers
+  AutoDispose.h
+  ByteArray.h
+  ByteCount.h
+  CheckSum.h
+  Date.h
+  Digest.h
+  ExternalProgram.h
+  Globals.h
+  ManagedFile.h
+  Pathname.h
+  TriBool.h
+  Url.h
+)
+
+SET( zypp_toplevel_SRCS
+  ByteCount.cc
+  CheckSum.cc
+  Date.cc
+  Digest.cc
+  ExternalProgram.cc
+  Pathname.cc
+  Url.cc
+)
+INSTALL(  FILES ${zypp_toplevel_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core" )
+
+SET( zypp_base_HEADERS
+  base/Easy.h
+  base/EnumClass.h
+  base/Errno.h
+  base/Exception.h
+  base/ExternalDataSource.h
+  base/Function.h
+  base/Flags.h
+  base/Gettext.h
+  base/Hash.h
+  base/IOStream.h
+  base/IOTools.h
+  base/Iterable.h
+  base/Iterator.h
+  base/LogControl.h
+  base/LogTools.h
+  base/Logger.h
+  base/NonCopyable.h
+  base/ProfilingFormater.h
+  base/PtrTypes.h
+  base/ReferenceCounted.h
+  base/Regex.h
+  base/String.h
+  base/StringV.h
+  base/Unit.h
+  base/Xml.h
+)
+
+SET( zypp_base_SRCS
+  base/CleanerThread.cc
+  base/Exception.cc
+  base/ExternalDataSource.cc
+  base/Gettext.cc
+  base/IOStream.cc
+  base/IOTools.cc
+  base/LogControl.cc
+  base/ProfilingFormater.cc
+  base/ReferenceCounted.cc
+  base/Regex.cc
+  base/String.cc
+  base/StringV.cc
+  base/Unit.cc
+  base/Xml.cc
+)
+
+INSTALL(  FILES ${zypp_base_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/base" )
+
+
+SET( zypp_fs_SRCS
+  fs/PathInfo.cc
+  fs/TmpPath.cc
+)
+
+SET( zypp_fs_HEADERS
+  fs/PathInfo.h
+  fs/TmpPath.h
+)
+
+INSTALL(  FILES ${zypp_fs_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/fs" )
+
+
+SET( zypp_url_SRCS
+  url/UrlUtils.cc
+  url/UrlBase.cc
+)
+
+SET( zypp_url_HEADERS
+  url/UrlBase.h
+  url/UrlException.h
+  url/UrlUtils.h
+)
+
+INSTALL(  FILES ${zypp_url_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/url" )
+
+SET( zypp_parser_xml_SRCS
+  parser/xml/XmlEscape.cc
+)
+
+SET( zypp_parser_xml_HEADERS
+  parser/xml/XmlEscape.h
+)
+
+INSTALL(  FILES ${zypp_parser_xml_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/parser/xml" )
+
+SET( zyppng_base_SRCS
+  zyppng/base/abstracteventsource.cc
+  zyppng/base/base.cc
+  zyppng/base/eventdispatcher_glib.cc
+  zyppng/base/eventloop_glib.cc
+  zyppng/base/linuxhelpers.cc
+  zyppng/base/timer.cc
+  zyppng/base/threaddata.cc
+  zyppng/base/socketnotifier.cc
+)
+
+SET( zyppng_base_HEADERS
+  zyppng/base/AbstractEventSource
+  zyppng/base/abstracteventsource.h
+  zyppng/base/AutoDisconnect
+  zyppng/base/autodisconnect.h
+  zyppng/base/Base
+  zyppng/base/base.h
+  zyppng/base/EventDispatcher
+  zyppng/base/eventdispatcher.h
+  zyppng/base/EventLoop
+  zyppng/base/eventloop.h
+  zyppng/base/signals.h
+  zyppng/base/SocketNotifier
+  zyppng/base/socketnotifier.h
+  zyppng/base/statemachine.h
+  zyppng/base/Timer
+  zyppng/base/timer.h
+  zyppng/base/zyppglobal.h
+)
+
+SET( zyppng_base_private_HEADERS
+  zyppng/base/private/abstracteventsource_p.h
+  zyppng/base/private/base_p.h
+  zyppng/base/private/eventdispatcher_glib_p.h
+  zyppng/base/private/eventloop_glib_p.h
+  zyppng/base/private/linuxhelpers_p.h
+  zyppng/base/private/threaddata_p.h
+)
+
+SET( zyppng_core_HEADERS
+  zyppng/core/bytearray.h
+  zyppng/core/ByteArray
+  zyppng/core/url.h
+  zyppng/core/Url
+  zyppng/core/idstring.h
+  zyppng/core/IdString
+  zyppng/core/string.h
+  zyppng/core/String
+)
+
+SET( zyppng_io_private_HEADERS
+  zyppng/io/private/iobuffer_p.h
+  zyppng/io/private/iodevice_p.h
+  zyppng/io/private/socket_p.h
+  zyppng/io/private/sockaddr_p.h
+  zyppng/io/private/abstractspawnengine_p.h
+  zyppng/io/private/forkspawnengine_p.h
+)
+
+SET( zyppng_io_SRCS
+  zyppng/io/asyncdatasource.cpp
+  zyppng/io/iobuffer.cc
+  zyppng/io/iodevice.cc
+  zyppng/io/process.cpp
+  zyppng/io/socket.cc
+  zyppng/io/sockaddr.cpp
+  zyppng/io/abstractspawnengine.cc
+  zyppng/io/forkspawnengine.cc
+)
+
+SET( zyppng_io_HEADERS
+  zyppng/io/AsyncDataSource
+  zyppng/io/asyncdatasource.h
+  zyppng/io/IODevice
+  zyppng/io/iodevice.h
+  zyppng/io/Process
+  zyppng/io/process.h
+  zyppng/io/Socket
+  zyppng/io/socket.h
+  zyppng/io/sockaddr.h
+  zyppng/io/SockAddr
+)
+
+SET( zyppng_rpc_HEADERS
+  zyppng/rpc/rpc.h
+  zyppng/rpc/zerocopystreams.h
+)
+
+SET( zyppng_rpc_SRCS
+  zyppng/rpc/rpc.cc
+  zyppng/rpc/zerocopystreams.cc
+)
+
+SET( zyppng_thread_SRCS
+  zyppng/thread/asyncqueue.cc
+  zyppng/thread/wakeup.cpp
+)
+
+SET( zyppng_thread_HEADERS
+  zyppng/thread/AsyncQueue
+  zyppng/thread/asyncqueue.h
+  zyppng/thread/private/asyncqueue_p.h
+  zyppng/thread/Wakeup
+  zyppng/thread/wakeup.h
+)
+
+SET( zyppng_thread_private_HEADERS
+)
+
+SET ( zypp_HEADERS
+  ${zypp_toplevel_headers}
+  ${zypp_base_HEADERS}
+  ${zypp_fs_HEADERS}
+  ${zypp_url_HEADERS}
+  ${zypp_parser_xml_HEADERS}
+  ${zyppng_base_HEADERS}
+  ${zyppng_base_private_HEADERS}
+  ${zyppng_core_HEADERS}
+  ${zyppng_io_HEADERS}
+  ${zyppng_io_private_HEADERS}
+  ${zyppng_rpc_HEADERS}
+  ${zyppng_thread_HEADERS}
+  ${zyppng_thread_private_HEADERS}
+)
+
+SET ( zypp_SRCS
+  ${zypp_toplevel_SRCS}
+  ${zypp_base_SRCS}
+  ${zypp_fs_SRCS}
+  ${zypp_url_SRCS}
+  ${zypp_parser_xml_SRCS}
+  ${zyppng_base_SRCS}
+  ${zyppng_io_SRCS}
+  ${zyppng_rpc_SRCS}
+  ${zyppng_thread_SRCS}
+)
+
+ADD_LIBRARY( zypp-core STATIC ${zypp_SRCS} ${zypp_HEADERS} )
+#we include generated headers, so we need to wait for zypp-protobuf to be ready
+add_dependencies( zypp-core zypp-protobuf )
+
+target_link_libraries( zypp-core ${LIBGLIB_LIBRARIES} )
+target_link_libraries( zypp-core ${OPENSSL_LIBRARIES} )
+target_link_libraries( zypp-core ${CRYPTO_LIBRARIES} )
+target_link_libraries( zypp-core pthread )
+target_link_libraries( zypp-core ${SIGCPP_LIBRARIES} )
diff --git a/zypp-core/CheckSum.cc b/zypp-core/CheckSum.cc
new file mode 100644 (file)
index 0000000..fc138fc
--- /dev/null
@@ -0,0 +1,216 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/CheckSum.cc
+ *
+*/
+#include <iostream>
+#include <sstream>
+
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/Gettext.h>
+#include <zypp-core/base/String.h>
+
+#include <zypp-core/CheckSum.h>
+#include <zypp-core/Digest.h>
+
+using std::endl;
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  const std::string & CheckSum::md5Type()
+  { return Digest::md5(); }
+
+  const std::string & CheckSum::shaType()
+  { static std::string _type( "sha" ); return _type; }
+
+  const std::string & CheckSum::sha1Type()
+  { return Digest::sha1(); }
+
+  const std::string & CheckSum::sha224Type()
+  { return Digest::sha224(); }
+
+  const std::string & CheckSum::sha256Type()
+  { return Digest::sha256(); }
+
+  const std::string & CheckSum::sha384Type()
+  { return Digest::sha384(); }
+
+  const std::string & CheckSum::sha512Type()
+  { return Digest::sha512(); }
+
+  CheckSum::CheckSum( const std::string & type, const std::string & checksum )
+  : _type( str::toLower( type ) )
+  , _checksum( checksum )
+  {
+    switch ( checksum.size() )
+    {
+      case 128:
+        if ( _type == sha512Type() )
+          return;
+        if ( _type.empty() || _type == shaType() )
+        {
+          _type = sha512Type();
+          return;
+        }
+        // else: dubious
+        break;
+
+      case 96:
+        if ( _type == sha384Type() )
+          return;
+        if ( _type.empty() || _type == shaType() )
+        {
+          _type = sha384Type();
+          return;
+        }
+        // else: dubious
+        break;
+
+      case 64:
+        if ( _type == sha256Type() )
+          return;
+        if ( _type.empty() || _type == shaType() )
+        {
+          _type = sha256Type();
+          return;
+        }
+        // else: dubious
+        break;
+
+      case 56:
+        if ( _type == sha224Type() )
+          return;
+        if ( _type.empty() || _type == shaType() )
+        {
+          _type = sha224Type();
+          return;
+        }
+        // else: dubious
+        break;
+
+      case 40:
+        if ( _type == sha1Type() )
+          return;
+        if ( _type.empty() || _type == shaType() )
+        {
+          _type = sha1Type();
+          return;
+        }
+        // else: dubious
+        break;
+
+      case 32:
+        if (  _type == md5Type() )
+          return;
+        if ( _type.empty() )
+        {
+          _type = md5Type();
+          return;
+        }
+        // else: dubious
+        break;
+
+      case 0:
+        return; // empty checksum is ok
+        break;
+
+      default:
+        if ( _type.empty() )
+        {
+          WAR << "Can't determine type of " << checksum.size() << " byte checksum '" << _checksum << "'" << endl;
+          return;
+        }
+        // else: dubious
+        break;
+    }
+
+    // dubious: Throw on malformed known types, otherwise log a warning.
+    std::string msg = str::form ( _("Dubious type '%s' for %u byte checksum '%s'"),
+                                  _type.c_str(), checksum.size(), _checksum.c_str() );
+    if (    _type == md5Type()
+         || _type == shaType()
+         || _type == sha1Type()
+         || _type == sha224Type()
+         || _type == sha256Type()
+         || _type == sha384Type()
+         || _type == sha512Type() )
+    {
+      ZYPP_THROW( CheckSumException( msg ) );
+    }
+    else
+    {
+      WAR << msg << endl;
+    }
+  }
+
+  CheckSum::CheckSum( const std::string & type_r, std::istream & input_r )
+  {
+    if ( input_r.good() && ! type_r.empty() )
+      {
+        _type = str::toLower( type_r );
+        _checksum = Digest::digest( _type, input_r );
+        if ( ! input_r.eof() || _checksum.empty() )
+          {
+            _type = _checksum = std::string();
+          }
+      }
+  }
+
+  std::string CheckSum::type() const
+  { return _type; }
+
+  std::string CheckSum::checksum() const
+  { return _checksum; }
+
+  bool CheckSum::empty() const
+  { return (checksum().empty() || type().empty()); }
+
+  std::string CheckSum::asString() const
+  {
+    std::ostringstream str;
+    str << *this;
+    return str.str();
+  }
+
+  std::ostream & operator<<( std::ostream & str, const CheckSum & obj )
+  {
+    if ( obj.checksum().empty() )
+      {
+        return str << std::string("NoCheckSum");
+      }
+
+    return str << ( obj.type().empty() ? std::string("UNKNOWN") : obj.type() ) << '-' << obj.checksum();
+  }
+
+  std::ostream & dumpAsXmlOn( std::ostream & str, const CheckSum & obj )
+  {
+    const std::string & type( obj.type() );
+    const std::string & checksum( obj.checksum() );
+    str << "<checksum";
+    if ( ! type.empty() ) str << " type=\"" << type << "\"";
+    if ( checksum.empty() )
+      str << "/>";
+    else
+      str << ">" << checksum << "</checksum>";
+    return str;
+  }
+
+   /** \relates CheckSum */
+  bool operator==( const CheckSum & lhs, const CheckSum & rhs )
+  { return lhs.checksum() == rhs.checksum() && lhs.type() == rhs.type(); }
+
+  /** \relates CheckSum */
+  bool operator!=( const CheckSum & lhs, const CheckSum & rhs )
+  { return ! ( lhs == rhs ); }
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
diff --git a/zypp-core/CheckSum.h b/zypp-core/CheckSum.h
new file mode 100644 (file)
index 0000000..41e6b62
--- /dev/null
@@ -0,0 +1,139 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp-core/CheckSum.h
+ *
+*/
+#ifndef ZYPP_CORE_CHECKSUM_H
+#define ZYPP_CORE_CHECKSUM_H
+
+#include <iosfwd>
+#include <string>
+#include <sstream>
+
+#include <zypp-core/base/Exception.h>
+#include <zypp-core/Pathname.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  struct CheckSumException : public Exception
+  {
+    CheckSumException( const std::string & msg )
+      : Exception( msg )
+    {}
+  };
+
+  class CheckSum
+  {
+  public:
+    /** Default Ctor: empty checksum. */
+    CheckSum()
+    {}
+    /**
+     * Creates a checksum for algorithm \param type.
+     * \throws CheckSumException if the checksum is invalid and can't be constructed
+     */
+    CheckSum( const std::string & type, const std::string & checksum );
+    /**
+     * Creates a checksum auto probing the algorithm type.
+     * \throws CheckSumException if the checksum is invalid and can't be constructed
+     */
+    CheckSum( const std::string & checksum )
+      : CheckSum( std::string(), checksum )
+    {}
+
+    /**
+     * Reads the content of \param input_r and computes the checksum.
+     */
+    CheckSum( const std::string & type, std::istream & input_r );
+
+    /** Ctor from temporary istream */
+    CheckSum( const std::string & type, std::istream && input_r )
+      : CheckSum( type, input_r )
+    {}
+
+  public:
+    static const std::string & md5Type();
+    static const std::string & shaType();
+    static const std::string & sha1Type();
+    static const std::string & sha224Type();
+    static const std::string & sha256Type();
+    static const std::string & sha384Type();
+    static const std::string & sha512Type();
+
+    /** \name Creates a checksum for algorithm \param type. */
+    //@{
+    static CheckSum md5( const std::string & checksum )                { return  CheckSum( md5Type(), checksum); }
+    static CheckSum sha( const std::string & checksum )                { return  CheckSum( shaType(), checksum); }
+    static CheckSum sha1( const std::string & checksum )       { return  CheckSum( sha1Type(), checksum); }
+    static CheckSum sha224( const std::string & checksum )     { return  CheckSum( sha224Type(), checksum); }
+    static CheckSum sha256( const std::string & checksum )     { return  CheckSum( sha256Type(), checksum); }
+    static CheckSum sha384( const std::string & checksum )     { return  CheckSum( sha384Type(), checksum); }
+    static CheckSum sha512( const std::string & checksum )     { return  CheckSum( sha512Type(), checksum); }
+    //@}
+
+    /** \name Reads the content of \param input_r and computes the checksum. */
+    //@{
+    static CheckSum md5( std::istream & input_r )              { return  CheckSum( md5Type(), input_r ); }
+    static CheckSum sha( std::istream & input_r )              { return  CheckSum( sha1Type(), input_r ); }
+    static CheckSum sha1( std::istream & input_r )             { return  CheckSum( sha1Type(), input_r ); }
+    static CheckSum sha224( std::istream & input_r )           { return  CheckSum( sha224Type(), input_r ); }
+    static CheckSum sha256( std::istream & input_r )           { return  CheckSum( sha256Type(), input_r ); }
+    static CheckSum sha384( std::istream & input_r )           { return  CheckSum( sha384Type(), input_r ); }
+    static CheckSum sha512( std::istream & input_r )           { return  CheckSum( sha512Type(), input_r ); }
+
+    static CheckSum md5( std::istream && input_r )             { return  CheckSum( md5Type(), input_r ); }
+    static CheckSum sha( std::istream && input_r )             { return  CheckSum( sha1Type(), input_r ); }
+    static CheckSum sha1( std::istream && input_r )            { return  CheckSum( sha1Type(), input_r ); }
+    static CheckSum sha224( std::istream && input_r )          { return  CheckSum( sha224Type(), input_r ); }
+    static CheckSum sha256( std::istream && input_r )          { return  CheckSum( sha256Type(), input_r ); }
+    static CheckSum sha384( std::istream && input_r )          { return  CheckSum( sha384Type(), input_r ); }
+    static CheckSum sha512( std::istream && input_r )          { return  CheckSum( sha512Type(), input_r ); }
+    //@}
+
+    /** \name Reads the content of \param input_r and computes the checksum. */
+    //@{
+    static CheckSum md5FromString( const std::string & input_r )       { return md5( std::stringstream( input_r ) ); }
+    static CheckSum shaFromString( const std::string & input_r )       { return sha( std::stringstream( input_r ) ); }
+    static CheckSum sha1FromString( const std::string & input_r )      { return sha1( std::stringstream( input_r ) ); }
+    static CheckSum sha224FromString( const std::string & input_r )    { return sha224( std::stringstream( input_r ) ); }
+    static CheckSum sha256FromString( const std::string & input_r )    { return sha256( std::stringstream( input_r ) ); }
+    static CheckSum sha384FromString( const std::string & input_r )    { return sha384( std::stringstream( input_r ) ); }
+    static CheckSum sha512FromString( const std::string & input_r )    { return sha512( std::stringstream( input_r ) ); }
+    //@}
+
+  public:
+    std::string type() const;
+    std::string checksum() const;
+    bool empty() const;
+
+  public:
+    std::string asString() const;
+
+  private:
+    std::string _type;
+    std::string _checksum;
+  };
+
+  /** \relates CheckSum Stream output. */
+  std::ostream & operator<<( std::ostream & str, const CheckSum & obj );
+
+  /** \relates CheckSum XML output. */
+  std::ostream & dumpAsXmlOn( std::ostream & str, const CheckSum & obj );
+
+  /** \relates CheckSum */
+  bool operator==( const CheckSum & lhs, const CheckSum & rhs );
+
+  /** \relates CheckSum */
+  bool operator!=( const CheckSum & lhs, const CheckSum & rhs );
+
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_CHECKSUM_H
similarity index 98%
rename from zypp/Date.cc
rename to zypp-core/Date.cc
index 2534595..df69429 100644 (file)
  *
 */
 #include <iostream>
-//#include <zypp/base/Logger.h>
+//#include <zypp-core/base/Logger.h>
 
-#include <zypp/base/String.h>
-#include <zypp/base/Xml.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/Xml.h>
 
-#include <zypp/Date.h>
+#include <zypp-core/Date.h>
 
 using std::endl;
 
diff --git a/zypp-core/Date.h b/zypp-core/Date.h
new file mode 100644 (file)
index 0000000..5ac2981
--- /dev/null
@@ -0,0 +1,271 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/Date.h
+ *
+*/
+#ifndef ZYPP_DATE_H
+#define ZYPP_DATE_H
+
+#include <ctime>
+#include <iosfwd>
+#include <string>
+
+#include <zypp-core/base/Exception.h>
+#include <zypp-core/base/EnumClass.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  ///////////////////////////////////////////////////////////////////
+  //
+  //   CLASS NAME : Date
+  //
+  /** Store and operate on date (time_t).
+  */
+  class Date
+  {
+    friend std::ostream & operator<<( std::ostream & str, const Date & obj );
+
+  public:
+
+    typedef time_t ValueType;
+    typedef time_t Duration;
+
+    static const ValueType second      = 1;
+    static const ValueType minute      = 60;
+    static const ValueType hour                = 3600;
+    static const ValueType day         = 86400;
+    static const ValueType month28     = 2419200;
+    static const ValueType month29     = 2505600;
+    static const ValueType month30     = 2592000;
+    static const ValueType month31     = 2678400;
+    static const ValueType month       = month30;
+    static const ValueType year365     = 31536000;
+    static const ValueType year366     = 31622400;
+    static const ValueType year                = year365;
+
+    enum TimeBase { TB_LOCALTIME, TB_UTC };
+
+    /** Default ctor: 0 */
+    Date()
+    : _date( 0 )
+    {}
+    /** Ctor taking time_t value. */
+    Date( ValueType date_r )
+    : _date( date_r )
+    {}
+    /** Ctor taking time_t value as string. */
+    explicit Date( const std::string & seconds_r );
+
+    /**
+     * Ctor from a \a date_str (in localtime) formatted using \a format.
+     *
+     * \throws DateFormatException in case \a date_str cannot be
+     *         parsed according to \a format.
+     */
+    Date( const std::string & date_str, const std::string & format );
+    /** \overload with explicitly given \ref TimeBase. */
+    Date( const std::string & date_str, const std::string & format, TimeBase base_r );
+
+    /** Return the current time. */
+    static Date now()
+    { return ::time( 0 ); }
+
+  public:
+    /** Conversion to time_t. */
+    operator ValueType() const
+    { return _date; }
+
+    /** \name Arithmetic operations. */
+    //@{
+    Date operator+( const time_t rhs ) const { return _date + rhs; }
+    Date operator-( const time_t rhs ) const { return _date - rhs; }
+    Date operator*( const time_t rhs ) const { return _date * rhs; }
+    Date operator/( const time_t rhs ) const { return _date / rhs; }
+
+    Date & operator+=( const time_t rhs ) { _date += rhs; return *this; }
+    Date & operator-=( const time_t rhs ) { _date -= rhs; return *this; }
+    Date & operator*=( const time_t rhs ) { _date *= rhs; return *this; }
+    Date & operator/=( const time_t rhs ) { _date /= rhs; return *this; }
+
+    Date & operator++(/*prefix*/) { _date += 1; return *this; }
+    Date & operator--(/*prefix*/) { _date -= 1; return *this; }
+
+    Date operator++(int/*postfix*/) { return _date++; }
+    Date operator--(int/*postfix*/) { return _date--; }
+    //@}
+
+  public:
+    /** Return string representation according to format as localtime.
+     * \see 'man strftime' (which is used internaly) for valid
+     * conversion specifiers in format.
+     *
+     * \return An empty string on illegal format, "0" if date is unspecified.
+     **/
+    std::string form( const std::string & format_r ) const
+    { return form( format_r, TB_LOCALTIME ); }
+    /** \overload with explicitly given \ref TimeBase. */
+    std::string form( const std::string & format_r, TimeBase base_r ) const;
+
+    /** Default string representation of Date.
+     * The preferred date and time representation for the current locale.
+     **/
+    std::string asString() const
+    { return form( "%c" ); }
+
+    /** Convert to string representation of calendar time in
+     *  numeric form (like "1029255142").
+     **/
+    std::string asSeconds() const
+    { return form( "%s" ); }
+
+  public:
+    /** \name Printing in various predefined formats */
+    //@{
+    /** Date formats for printing (use like 'enum class \ref DateFormat') */
+    struct EDateFormatDef { enum Enum {
+      none,    ///< ""
+      calendar,        ///< 2014-02-07
+      month,   ///< 2014-02
+      year,    ///< 2014
+      week,    ///< 2014-W06
+      weekday, ///< 2014-W06-5 (1 is Monday)
+      ordinal, ///< 2014-038
+    };};
+    typedef base::EnumClass<EDateFormatDef> DateFormat;        ///< 'enum class DateFormat'
+
+    /** Time formats for printing (use like 'enum class \ref TimeFormat') */
+    struct ETimeFormatDef { enum Enum {
+      none,    ///< ""
+      seconds, ///< 07:06:41
+      minutes, ///< 07:06
+      hours,   ///< 07
+    };};
+    typedef base::EnumClass<ETimeFormatDef> TimeFormat;        ///< 'enum class TimeFormat'
+
+    /** Timezone indicator for printing (use like 'enum class \ref TimeZoneFormat') */
+    struct ETimeZoneFormatDef { enum Enum {
+      none,    ///< ""
+      name,    ///< UTC, CET, ...
+      offset,  ///< +00[:00]
+    };};
+    typedef base::EnumClass<ETimeZoneFormatDef> TimeZoneFormat;        ///< 'enum class TimeZoneFormat'
+
+    /** Default format is <tt>'2014-02-07 07:06:41 CET'</tt>
+     * The default is \ref DateFormat::calendar, \ref TimeFormat::seconds, \ref TimeZoneFormat::name and
+     * \ref TB_LOCALTIME. For other formats you don't have to repeat all the defaults, just pass the
+     * values where you differ.
+     */
+    std::string print( DateFormat dateFormat_r = DateFormat::calendar, TimeFormat timeFormat_r = TimeFormat::seconds, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const;
+    /** \overload */
+    std::string print( TimeFormat timeFormat_r, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const
+    { return print( DateFormat::calendar, timeFormat_r, timeZoneFormat_r, base_r ); }
+    /** \overload */
+    std::string print( DateFormat dateFormat_r, TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const
+    { return print( dateFormat_r, TimeFormat::seconds, timeZoneFormat_r, base_r ); }
+    /** \overload */
+    std::string print( DateFormat dateFormat_r, TimeFormat timeFormat_r, TimeBase base_r ) const
+    { return print( dateFormat_r, timeFormat_r, TimeZoneFormat::name, base_r ); }
+    /** \overload */
+    std::string print( TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const
+    { return print( DateFormat::calendar, TimeFormat::seconds, timeZoneFormat_r, base_r ); }
+    /** \overload */
+    std::string print( TimeFormat timeFormat_r, TimeBase base_r ) const
+    { return print( DateFormat::calendar, timeFormat_r, TimeZoneFormat::name, base_r ); }
+    /** \overload */
+    std::string print( DateFormat dateFormat_r, TimeBase base_r ) const
+    { return print( dateFormat_r, TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
+    /** \overload */
+    std::string print( TimeBase base_r ) const
+    { return print( DateFormat::calendar, TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
+
+    /** Convenience for printing the date only [<tt>'2014-02-07'</tt>]
+     * The default is \ref DateFormat::calendar and \ref TB_LOCALTIME
+     */
+    std::string printDate( DateFormat dateFormat_r = DateFormat::calendar, TimeBase base_r = TB_LOCALTIME ) const
+    { return print( dateFormat_r, TimeFormat::none, TimeZoneFormat::none, base_r ); }
+    /** \overload */
+    std::string printDate( TimeBase base_r ) const
+    { return printDate( DateFormat::calendar, base_r ); }
+
+    /** Convenience for printing the time only [<tt>'07:06:41 CET'</tt>]
+     * The default is \ref DateFormat::calendar and \ref TB_LOCALTIME
+     */
+    std::string printTime( TimeFormat timeFormat_r = TimeFormat::seconds, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const
+    { return print( DateFormat::none, timeFormat_r, timeZoneFormat_r, base_r ); }
+    /** \overload */
+    std::string printTime( TimeZoneFormat timeZoneFormat_r , TimeBase base_r = TB_LOCALTIME ) const
+    { return printTime( TimeFormat::seconds, timeZoneFormat_r, base_r ); }
+    /** \overload */
+    std::string printTime( TimeFormat timeFormat_r , TimeBase base_r ) const
+    { return printTime( timeFormat_r, TimeZoneFormat::name, base_r ); }
+    /** \overload */
+    std::string printTime( TimeBase base_r ) const
+    { return printTime( TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
+
+    /** Default ISO 8601 format is <tt>'2014-02-07T07:06:41+01'</tt>
+     * \note As timezone names are not used in ISO, \ref TimeZoneFormat::name is the same as
+     * \ref TimeZoneFormat::offset when printing in \ref TB_LOCALTIME. When printing \ref TB_UTC
+     * it uses a \c 'Z' to indicate UTC (Zulu time) rather than printing \c '+00'.
+     */
+    std::string printISO( DateFormat dateFormat_r = DateFormat::calendar, TimeFormat timeFormat_r = TimeFormat::seconds, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const;
+    /** \overload */
+    std::string printISO( TimeFormat timeFormat_r, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const
+    { return printISO( DateFormat::calendar, timeFormat_r, timeZoneFormat_r, base_r ); }
+    /** \overload */
+    std::string printISO( DateFormat dateFormat_r, TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const
+    { return printISO( dateFormat_r, TimeFormat::seconds, timeZoneFormat_r, base_r ); }
+    /** \overload */
+    std::string printISO( DateFormat dateFormat_r, TimeFormat timeFormat_r, TimeBase base_r ) const
+    { return printISO( dateFormat_r, timeFormat_r, TimeZoneFormat::name, base_r ); }
+    /** \overload */
+    std::string printISO( TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const
+    { return printISO( DateFormat::calendar, TimeFormat::seconds, timeZoneFormat_r, base_r ); }
+    /** \overload */
+    std::string printISO( TimeFormat timeFormat_r, TimeBase base_r ) const
+    { return printISO( DateFormat::calendar, timeFormat_r, TimeZoneFormat::name, base_r ); }
+    /** \overload */
+    std::string printISO( DateFormat dateFormat_r, TimeBase base_r ) const
+    { return printISO( dateFormat_r, TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
+    /** \overload */
+    std::string printISO( TimeBase base_r ) const
+    { return printISO( DateFormat::calendar, TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
+    //@}
+
+ private:
+    /** Calendar time.
+     * The number of seconds elapsed since 00:00:00 on January 1, 1970,
+     * Coordinated Universal Time (UTC).
+     **/
+    ValueType _date;
+  };
+  ///////////////////////////////////////////////////////////////////
+
+  /** \relates Date Stream output */
+  inline std::ostream & operator<<( std::ostream & str, const Date & obj )
+  { return str << obj.asString(); }
+
+  /** \relates Date XML output.
+   * Print \c time_t and \c text attribute. Allow alternate node name [date].
+   */
+  std::ostream & dumpAsXmlOn( std::ostream & str, const Date & obj, const std::string & name_r = "date" );
+
+  ///////////////////////////////////////////////////////////////////
+  class DateFormatException : public Exception
+  {
+  public:
+    DateFormatException( const std::string & msg ) : Exception( msg )
+    {}
+  };
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_DATE_H
diff --git a/zypp-core/Digest.cc b/zypp-core/Digest.cc
new file mode 100644 (file)
index 0000000..decd0c2
--- /dev/null
@@ -0,0 +1,311 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/Digest.cc
+ *
+ * \todo replace by Blocxx
+ *
+*/
+
+#include <cstdio> // snprintf
+#include <openssl/evp.h>
+#include <openssl/conf.h>
+#include <openssl/engine.h>
+#include <string>
+#include <string.h>
+
+#include <iostream>
+#include <sstream>
+
+#include <zypp-core/Digest.h>
+#include <zypp-core/base/PtrTypes.h>
+
+using std::endl;
+
+namespace zypp {
+
+    const std::string & Digest::md5()
+    { static std::string _type( "md5" ); return _type; }
+
+    const std::string & Digest::sha1()
+    { static std::string _type( "sha1" ); return _type; }
+
+    const std::string & Digest::sha224()
+    { static std::string _type( "sha224" ); return _type; }
+
+    const std::string & Digest::sha256()
+    { static std::string _type( "sha256" ); return _type; }
+
+    const std::string & Digest::sha384()
+    { static std::string _type( "sha384" ); return _type; }
+
+    const std::string & Digest::sha512()
+    { static std::string _type( "sha512" ); return _type; }
+
+    // private data
+    class Digest::P
+    {
+      P(const P& p);
+      const P& operator=(const P& p);
+
+      public:
+        typedef zypp::shared_ptr<EVP_MD_CTX> EvpDataPtr;
+        P();
+        ~P();
+
+        EvpDataPtr mdctx;
+
+        const EVP_MD *md;
+        unsigned char md_value[EVP_MAX_MD_SIZE];
+        unsigned md_len;
+
+        bool finalized : 1;
+        static bool openssl_digests_added;
+
+        std::string name;
+
+        inline bool maybeInit();
+        inline void cleanup();
+    };
+
+
+
+    bool Digest::P::openssl_digests_added = false;
+
+    Digest::P::P() :
+      md(NULL),
+      finalized(false)
+    {
+    }
+
+    Digest::P::~P()
+    {
+      cleanup();
+    }
+
+    bool Digest::P::maybeInit()
+    {
+      if(!openssl_digests_added)
+      {
+        OPENSSL_config(NULL);
+        ENGINE_load_builtin_engines();
+        ENGINE_register_all_complete();
+        OpenSSL_add_all_digests();
+        openssl_digests_added = true;
+      }
+
+      if(!mdctx)
+      {
+        md = EVP_get_digestbyname(name.c_str());
+        if(!md)
+          return false;
+
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+        EvpDataPtr tmp_mdctx(EVP_MD_CTX_create(), EVP_MD_CTX_destroy);
+#else
+        EvpDataPtr tmp_mdctx(EVP_MD_CTX_new(), EVP_MD_CTX_free);
+#endif
+        if (!tmp_mdctx)
+          return false;
+
+        if (!EVP_DigestInit_ex(tmp_mdctx.get(), md, NULL)) {
+          return false;
+        }
+
+        md_len = 0;
+        ::memset(md_value, 0, sizeof(md_value));
+
+        mdctx.swap(tmp_mdctx);
+      }
+      return true;
+    }
+
+    void Digest::P::cleanup()
+    {
+      mdctx.reset();
+      finalized = false;
+    }
+
+    Digest::Digest() : _dp(new P())
+    {
+    }
+
+    Digest::~Digest()
+    {
+      delete _dp;
+    }
+
+    bool Digest::create(const std::string& name)
+    {
+      if(name.empty()) return false;
+
+      if(_dp->mdctx)
+       _dp->cleanup();
+
+      _dp->name = name;
+
+      return _dp->maybeInit();
+    }
+
+    const std::string& Digest::name()
+    {
+      return _dp->name;
+    }
+
+    bool Digest::reset()
+    {
+      if (!_dp->mdctx)
+        return false;
+      if(!_dp->finalized)
+      {
+        (void)EVP_DigestFinal_ex(_dp->mdctx.get(), _dp->md_value, &_dp->md_len);
+        _dp->finalized = true;
+      }
+      if(!EVP_DigestInit_ex(_dp->mdctx.get(), _dp->md, NULL))
+        return false;
+      _dp->finalized = false;
+      return true;
+    }
+
+    std::string Digest::digest()
+    {
+      return digestVectorToString( digestVector() );
+    }
+
+    std::string Digest::digestVectorToString(const UByteArray &vec)
+    {
+      if ( vec.empty() )
+        return std::string();
+
+      std::vector<char> resData ( vec.size()*2 + 1, '\0' );
+      char *mdtxt = &resData[0];
+      for(unsigned i = 0; i < vec.size(); ++i)
+      {
+        ::snprintf( mdtxt+(i*2), 3, "%02hhx", vec[i]);
+      }
+      return std::string( resData.data() );
+    }
+
+#ifdef __cpp_lib_string_view
+    namespace {
+      template <typename BArr>
+      BArr hexStrToBArr ( std::string_view &&str ) {
+       BArr bytes;
+       for ( std::string::size_type i = 0; i < str.length(); i+=2 )
+       {
+         #define c2h(c) (((c)>='0' && (c)<='9') ? ((c)-'0')              \
+         : ((c)>='a' && (c)<='f') ? ((c)-('a'-10))       \
+         : ((c)>='A' && (c)<='F') ? ((c)-('A'-10))       \
+         : -1)
+         int v = c2h(str[i]);
+         if (v < 0)
+           return {};
+         bytes.push_back(v);
+         v = c2h(str[i+1]);
+         if (v < 0)
+           return {};
+         bytes.back() = (bytes.back() << 4) | v;
+         #undef c2h
+       }
+       return bytes;
+      }
+    } // namespace
+
+    ByteArray Digest::hexStringToByteArray(std::string_view str)
+    {
+      return hexStrToBArr<ByteArray>( std::move(str) );
+    }
+
+    UByteArray Digest::hexStringToUByteArray( std::string_view str )
+    {
+      return hexStrToBArr<UByteArray>( std::move(str) );
+    }
+#endif
+
+    UByteArray Digest::digestVector()
+    {
+      UByteArray r;
+      if(!_dp->maybeInit())
+        return r;
+
+      if(!_dp->finalized)
+      {
+        if(!EVP_DigestFinal_ex(_dp->mdctx.get(), _dp->md_value, &_dp->md_len))
+            return r;
+        _dp->finalized = true;
+      }
+      r.reserve(_dp->md_len);
+      for(unsigned i = 0; i < _dp->md_len; ++i)
+       r.push_back(_dp->md_value[i]);
+      return r;
+    }
+
+    bool Digest::update(const char* bytes, size_t len)
+    {
+      if(!bytes)
+      {
+       return false;
+      }
+
+      if(!_dp->maybeInit())
+       return false;
+
+      if(_dp->finalized)
+      {
+       _dp->cleanup();
+       if(!_dp->maybeInit())
+           return false;
+
+      }
+      if(!EVP_DigestUpdate(_dp->mdctx.get(), reinterpret_cast<const unsigned char*>(bytes), len))
+       return false;
+
+      return true;
+    }
+
+    bool Digest::update(std::istream &is, size_t bufsize)
+    {
+      if( !is )
+        return false;
+
+      char buf[bufsize];
+
+      while(is.good())
+      {
+        size_t readed;
+        is.read(buf, bufsize);
+        readed = is.gcount();
+        if(readed && !update(buf, readed))
+          return false;
+      }
+
+      return true;
+    }
+
+    std::string Digest::digest(const std::string& name, std::istream& is, size_t bufsize)
+    {
+      if(name.empty() || !is)
+       return std::string();
+
+      Digest digest;
+      if(!digest.create(name))
+        return std::string();
+
+      if ( !digest.update( is, bufsize ))
+        return std::string();
+
+      return digest.digest();
+    }
+
+    std::string Digest::digest( const std::string & name, const std::string & input, size_t bufsize )
+    {
+      std::istringstream is( input );
+      return digest( name, is, bufsize );
+    }
+
+} // namespace zypp
diff --git a/zypp-core/Digest.h b/zypp-core/Digest.h
new file mode 100644 (file)
index 0000000..530f99c
--- /dev/null
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp-core/Digest.h
+ *
+ * \todo replace by Blocxx
+ *
+*/
+
+#ifndef ZYPP_CORE_DIGEST_H
+#define ZYPP_CORE_DIGEST_H
+
+#include <string>
+#include <iosfwd>
+#include <vector>
+
+#include <zypp-core/Pathname.h>
+#include <zypp-core/ByteArray.h>
+
+namespace zypp {
+
+    /** \brief Compute Message Digests (MD5, SHA1 etc)
+     *
+     * The computation works by initializing the algorithm using create(). This
+     * will construct an internal state. successive calls to update() deliver the
+     * data for which the digest is to be computed. After all data has been
+     * deliverd, a call to digest() finalizes the computation and returns the
+     * result
+     * */
+    class Digest
+    {
+      private:
+       class P;
+       P* _dp;
+
+       // disabled
+       Digest(const Digest& d);
+       // disabled
+       const Digest& operator=(const Digest& d);
+
+      public:
+       /** \name Well known digest algorithm names. */
+       //@{
+       /** md5 */
+       static const std::string & md5();
+       /** sha1 */
+       static const std::string & sha1();
+       /** sha224 */
+       static const std::string & sha224();
+       /** sha256 */
+       static const std::string & sha256();
+       /** sha384 */
+       static const std::string & sha384();
+       /** sha512 */
+       static const std::string & sha512();
+       //@}
+
+      public:
+       Digest();
+       ~Digest();
+
+       /** \brief initialize creation of a new message digest
+        *
+        * Since openssl is used as backend you may use anything that openssl
+        * supports (see man 1 dgst). Common examples are md5 or sha1. sha1
+        * should be preferred when creating digests to verify the authenticity
+        * of something.
+        *
+        * successive calls to this funcion will destroy the internal state and
+        * reinit from scratch
+        *
+        * @param name name of the message digest algorithm.
+        * @return whether an error occured
+        * */
+       bool create(const std::string& name);
+
+       /** \brief get the name of the current digest algorithm */
+       const std::string& name();
+
+       /** \brief feed data into digest computation algorithm
+        * @param bytes
+        * @param len
+        * @return whether an error occured
+        * */
+       bool update(const char* bytes, size_t len);
+
+        /** \brief feed data into digest computation algorithm
+        * @param is
+        * @param bufsize
+        * @return whether an error occured
+        * */
+        bool update(std::istream& is, size_t bufsize = 4096);
+
+       /** \brief get hex string representation of the digest
+        *
+        * this function will finalize the digest computation. calls to update
+        * after this function will start from scratch
+        *
+        * @return hex string representation of the digest
+        * */
+       std::string digest();
+
+        /** \brief get hex string representation of the digest vector given as parameter
+        *
+        * @return hex string representation of the digest
+        * */
+        static std::string digestVectorToString ( const UByteArray &vec );
+
+#ifdef __cpp_lib_string_view
+        /** \brief convert the hex string representation of the digest vector given as parameter into the actual byte array representation
+        *
+        * @return hex string representation of the digest
+        * */
+        static ByteArray hexStringToByteArray ( std::string_view str );
+        static UByteArray hexStringToUByteArray ( std::string_view str );
+#endif
+
+       /** \brief get vector of unsigned char representation of the digest
+        *
+        * this function will finalize the digest computation. calls to update
+        * after this function will start from scratch
+        *
+        * @return vector representation of the digest
+        * */
+       UByteArray digestVector();
+
+       /** \brief reset internal digest state
+        *
+        * this function is equivalent to calling create() with an unchanged name,
+        * but it may be implemented in a more efficient way.
+        */
+       bool reset();
+
+       /** \brief compute digest of a stream. convenience function
+        *
+        * calls create, update and digest in one function. The data for the
+        * computation is read from the stream
+        *
+        * @param name name of the digest algorithm, \see create
+        * @param is an input stream to get the data from
+        * @param bufsize size of the buffer used for update(). Be careful, this is on the stack.
+        * @return the digest or empty on error
+        * */
+       static std::string digest(const std::string& name, std::istream& is, size_t bufsize = 4096);
+
+       /** \overload Reading input data from \c string. */
+       static std::string digest( const std::string & name, const std::string & input, size_t bufsize = 4096 );
+    };
+
+} // namespace zypp
+
+#endif
similarity index 50%
rename from zypp/ExternalProgram.cc
rename to zypp-core/ExternalProgram.cc
index ab853d2..f1529ca 100644 (file)
 #include <iostream>
 #include <sstream>
 
-#include <zypp/base/Logger.h>
-#include <zypp/base/String.h>
-#include <zypp/base/Gettext.h>
-#include <zypp/ExternalProgram.h>
-#include <zypp/base/CleanerThread_p.h>
+#include <zypp-core/AutoDispose.h>
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/Gettext.h>
+#include <zypp-core/ExternalProgram.h>
+#include <zypp-core/base/CleanerThread_p.h>
+
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <zypp-core/zyppng/io/private/forkspawnengine_p.h>
 
 using std::endl;
 
@@ -38,8 +42,6 @@ using std::endl;
 namespace zypp {
 
     ExternalProgram::ExternalProgram()
-      : use_pty (false)
-      , pid( -1 )
     {}
 
 
@@ -49,8 +51,6 @@ namespace zypp {
                                       int stderr_fd,
                                       bool default_locale,
                                       const Pathname & root )
-      : use_pty (use_pty)
-      , pid( -1 )
     {
       const char *argv[4];
       argv[0] = "/bin/sh";
@@ -58,18 +58,15 @@ namespace zypp {
       argv[2] = commandline.c_str();
       argv[3] = 0;
 
-      start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str() );
+      start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty );
     }
 
-
     ExternalProgram::ExternalProgram( const Arguments & argv,
                                       Stderr_Disposition stderr_disp,
                                       bool use_pty,
                                      int stderr_fd,
                                       bool default_locale,
                                       const Pathname & root )
-      : use_pty (use_pty)
-      , pid( -1 )
     {
       const char * argvp[argv.size() + 1];
       unsigned c = 0;
@@ -80,10 +77,9 @@ namespace zypp {
       }
       argvp[c] = 0;
 
-      start_program( argvp, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str() );
+      start_program( argvp, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty );
     }
 
-
     ExternalProgram::ExternalProgram( const Arguments & argv,
                                       const Environment & environment,
                                       Stderr_Disposition stderr_disp,
@@ -91,8 +87,6 @@ namespace zypp {
                                      int stderr_fd,
                                       bool default_locale,
                                      const Pathname & root )
-      : use_pty (use_pty)
-      , pid( -1 )
     {
       const char * argvp[argv.size() + 1];
       unsigned c = 0;
@@ -103,24 +97,19 @@ namespace zypp {
       }
       argvp[c] = 0;
 
-      start_program( argvp, environment, stderr_disp, stderr_fd, default_locale, root.c_str() );
+      start_program( argvp, environment, stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty );
     }
 
-
-
     ExternalProgram::ExternalProgram( const char *const *argv,
                                       Stderr_Disposition stderr_disp,
                                       bool use_pty,
                                       int stderr_fd,
                                       bool default_locale,
                                       const Pathname & root )
-      : use_pty (use_pty)
-      , pid( -1 )
     {
-      start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str() );
+      start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty );
     }
 
-
     ExternalProgram::ExternalProgram( const char *const * argv,
                                      const Environment & environment,
                                      Stderr_Disposition stderr_disp,
@@ -128,18 +117,14 @@ namespace zypp {
                                      int stderr_fd,
                                      bool default_locale,
                                      const Pathname & root )
-      : use_pty (use_pty)
-      , pid( -1 )
     {
-      start_program( argv, environment, stderr_disp, stderr_fd, default_locale, root.c_str() );
+      start_program( argv, environment, stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty );
     }
 
 
     ExternalProgram::ExternalProgram( const char *binpath,
                                      const char *const *argv_1,
                                      bool use_pty )
-      : use_pty (use_pty)
-      , pid( -1 )
     {
       int i = 0;
       while (argv_1[i++])
@@ -147,16 +132,13 @@ namespace zypp {
       const char *argv[i + 1];
       argv[0] = binpath;
       memcpy( &argv[1], argv_1, (i - 1) * sizeof (char *) );
-      start_program( argv, Environment() );
+      start_program( argv, Environment(), Normal_Stderr, 1, false, NULL, false, false, use_pty );
     }
 
-
     ExternalProgram::ExternalProgram( const char *binpath,
                                      const char *const *argv_1,
                                      const Environment & environment,
                                      bool use_pty )
-      : use_pty (use_pty)
-      , pid( -1 )
     {
       int i = 0;
       while (argv_1[i++])
@@ -164,32 +146,32 @@ namespace zypp {
       const char *argv[i + 1];
       argv[0] = binpath;
       memcpy( &argv[1], argv_1, (i - 1) * sizeof (char *) );
-      start_program( argv, environment );
+      start_program( argv, environment, Normal_Stderr, 1, false, NULL, false, false, use_pty );
     }
 
-
     ExternalProgram::~ExternalProgram()
-    {
-      if ( running() ) {
-        // we got destructed while the external process is still alive
-        // make sure the zombie is cleaned up once it exits
-        CleanerThread::watchPID( pid );
-      }
-    }
+    { }
 
 
 
-    void ExternalProgram::start_program(const char *const *argv,
+    void ExternalProgram::start_program( const char *const *argv,
                                         const Environment & environment,
                                         Stderr_Disposition stderr_disp,
                                         int stderr_fd,
                                         bool default_locale,
-                                        const char * root , bool switch_pgid, bool die_with_parent )
+                                        const char * root , bool switch_pgid, bool die_with_parent , bool usePty )
     {
-      pid = -1;
-      _exitStatus = 0;
-      int to_external[2], from_external[2];    // fds for pair of pipes
-      int master_tty,  slave_tty;              // fds for pair of ttys
+      if ( _backend )
+        return;
+
+      // usePty is only supported by the forking backend
+      if ( usePty ) {
+        DBG << "usePty was set, forcing the ForkSpawnEngine to start external processes" << std::endl;
+        _backend = std::make_unique<zyppng::ForkSpawnEngine>();
+        static_cast<zyppng::ForkSpawnEngine&>(*_backend).setUsePty( true );
+      } else {
+        _backend = zyppng::AbstractSpawnEngine::createDefaultEngine();
+      }
 
       // retrieve options at beginning of arglist
       const char * redirectStdin = nullptr;    // <[file]
@@ -211,7 +193,7 @@ namespace zypp {
        }
       }
 
-      for ( bool strip = false; argv[0]; ++argv )
+      for ( bool strip = false; argv[0] != nullptr; ++argv )
       {
        strip = false;
        switch ( argv[0][0] )
@@ -240,222 +222,128 @@ namespace zypp {
          break;
       }
 
-      // do not remove the single quotes around every argument, copy&paste of
-      // command to shell will not work otherwise!
-      {
-       std::stringstream cmdstr;
-        for (int i = 0; argv[i]; i++)
-        {
-          if (i>0) cmdstr << ' ';
-          cmdstr << '\'';
-          cmdstr << argv[i];
-          cmdstr << '\'';
-        }
-        if ( redirectStdin )
-          cmdstr << " < '" << redirectStdin << "'";
-        if ( redirectStdout )
-          cmdstr << " > '" << redirectStdout << "'";
-        _command = cmdstr.str();
-      }
-      DBG << "Executing" << (default_locale?"[C] ":" ") << _command << endl;
+      // those are the FDs that the new process will receive
+      // AutoFD will take care of closing them on our side
+      zypp::AutoFD stdinFd  = -1;
+      zypp::AutoFD stdoutFd = -1;
+      zypp::AutoFD stderrFd = -1;
 
+      // those are the fds we will keep, we put them into autofds in case
+      // we need to return early without actually spawning the new process
+      zypp::AutoFD childStdinParentFd = -1;
+      zypp::AutoFD childStdoutParentFd = -1;
 
-      if (use_pty)
+      if ( usePty )
       {
+
+        int master_tty,        slave_tty;              // fds for pair of ttys
+
        // Create pair of ttys
         DBG << "Using ttys for communication with " << argv[0] << endl;
        if (openpty (&master_tty, &slave_tty, 0, 0, 0) != 0)
        {
-          _execError = str::form( _("Can't open pty (%s)."), strerror(errno) );
-          _exitStatus = 126;
-          ERR << _execError << endl;
+          _backend->setExecError( str::form( _("Can't open pty (%s)."), strerror(errno) ) );
+          _backend->setExitStatus( 126 );
+          ERR << _backend->execError() << endl;
           return;
        }
+
+        stdinFd  = slave_tty;
+        stdoutFd = slave_tty;
+        childStdinParentFd = master_tty;
+        childStdoutParentFd = master_tty;
       }
       else
       {
-       // Create pair of pipes
-       if (pipe (to_external) != 0 || pipe (from_external) != 0)
-       {
-          _execError = str::form( _("Can't open pipe (%s)."), strerror(errno) );
-          _exitStatus = 126;
-          ERR << _execError << endl;
-          return;
-       }
-      }
-
-      pid_t ppid_before_fork = ::getpid();
-
-      // Create module process
-      if ((pid = fork()) == 0)
-      {
-        //////////////////////////////////////////////////////////////////////
-        // Don't write to the logfile after fork!
-        //////////////////////////////////////////////////////////////////////
-       if (use_pty)
-       {
-           setsid();
-           if(slave_tty != 1)
-               dup2 (slave_tty, 1);      // set new stdout
-           renumber_fd (slave_tty, 0);   // set new stdin
-           ::close(master_tty);          // Belongs to father process
-
-           // We currently have no controlling terminal (due to setsid).
-           // The first open call will also set the new ctty (due to historical
-           // unix guru knowledge ;-) )
-
-           char name[512];
-           ttyname_r(slave_tty, name, sizeof(name));
-           ::close(open(name, O_RDONLY));
-       }
-       else
-       {
-            if ( switch_pgid )
-              setpgid( 0, 0);
-           renumber_fd (to_external[0], 0); // set new stdin
-           ::close(from_external[0]);    // Belongs to father process
-
-           renumber_fd (from_external[1], 1); // set new stdout
-           ::close(to_external  [1]);    // Belongs to father process
-       }
-
-        if ( redirectStdin )
-        {
-          ::close( 0 );
-          int inp_fd = open( redirectStdin, O_RDONLY );
-          dup2( inp_fd, 0 );
-        }
-
-        if ( redirectStdout )
-        {
-          ::close( 1 );
-          int inp_fd = open( redirectStdout, O_WRONLY|O_CREAT|O_APPEND, 0600 );
-          dup2( inp_fd, 1 );
-        }
-
-       // Handle stderr
-       if (stderr_disp == Discard_Stderr)
-       {
-           int null_fd = open("/dev/null", O_WRONLY);
-           dup2(null_fd, 2);
-           ::close(null_fd);
-       }
-       else if (stderr_disp == Stderr_To_Stdout)
-       {
-           dup2(1, 2);
-       }
-       else if (stderr_disp == Stderr_To_FileDesc)
-       {
-           // Note: We don't have to close anything regarding stderr_fd.
-           // Our caller is responsible for that.
-           dup2 (stderr_fd, 2);
-       }
-
-       for ( Environment::const_iterator it = environment.begin(); it != environment.end(); ++it ) {
-         setenv( it->first.c_str(), it->second.c_str(), 1 );
-       }
-
-       if(default_locale)
-               setenv("LC_ALL","C",1);
-
-       if(root)
-       {
-           if(chroot(root) == -1)
-           {
-                _execError = str::form( _("Can't chroot to '%s' (%s)."), root, strerror(errno) );
-                std::cerr << _execError << endl;// After fork log on stderr too
-               _exit (128);                    // No sense in returning! I am forked away!!
-           }
-           if ( ! chdirTo )
-             chdirTo = "/";
-       }
-
-       if ( chdirTo && chdir( chdirTo ) == -1 )
-       {
-         _execError = root ? str::form( _("Can't chdir to '%s' inside chroot '%s' (%s)."), chdirTo, root, strerror(errno) )
-                           : str::form( _("Can't chdir to '%s' (%s)."), chdirTo, strerror(errno) );
-         std::cerr << _execError << endl;// After fork log on stderr too
-         _exit (128);                  // No sense in returning! I am forked away!!
-       }
-
-       // close all filedesctiptors above stderr
-       for ( int i = ::getdtablesize() - 1; i > 2; --i ) {
-         ::close( i );
-       }
-
-        if ( die_with_parent ) {
-          // process dies with us
-          int r = prctl(PR_SET_PDEATHSIG, SIGTERM);
-          if (r == -1) {
-            //ignore if it did not work, worst case the process lives on after the parent dies
-            std::cerr << "Failed to set PR_SET_PDEATHSIG" << endl;// After fork log on stderr too
+        if ( redirectStdin ) {
+          stdinFd  = open( redirectStdin, O_RDONLY );
+        } else {
+          int to_external[2];
+          if ( pipe (to_external) != 0 )
+          {
+            _backend->setExecError( str::form( _("Can't open pipe (%s)."), strerror(errno) ) );
+            _backend->setExitStatus( 126 );
+            ERR << _backend->execError() << endl;
+            return;
           }
+          stdinFd            = to_external[0];
+          childStdinParentFd = to_external[1];
+        }
 
-          // test in case the original parent exited just
-          // before the prctl() call
-          pid_t ppidNow = getppid();
-          if (ppidNow != ppid_before_fork) {
-            std::cerr << "PPID changed from "<<ppid_before_fork<<" to "<< ppidNow << endl;// After fork log on stderr too
-            _exit(128);
+        if ( redirectStdout ) {
+          stdoutFd = open( redirectStdout, O_WRONLY|O_CREAT|O_APPEND, 0600 );
+        } else {
+
+          int from_external[2];
+          // Create pair of pipes
+          if ( pipe (from_external) != 0 )
+          {
+            _backend->setExecError( str::form( _("Can't open pipe (%s)."), strerror(errno) ) );
+            _backend->setExitStatus( 126 );
+            ERR << _backend->execError() << endl;
+            return;
           }
+          stdoutFd = from_external[1];
+          childStdoutParentFd = from_external[0];
         }
-
-       execvp(argv[0], const_cast<char *const *>(argv));
-        // don't want to get here
-        _execError = str::form( _("Can't exec '%s' (%s)."), argv[0], strerror(errno) );
-        std::cerr << _execError << endl;// After fork log on stderr too
-        _exit (129);                   // No sense in returning! I am forked away!!
-        //////////////////////////////////////////////////////////////////////
       }
 
-      else if (pid == -1)       // Fork failed, close everything.
+      // Handle stderr
+      if (stderr_disp == Discard_Stderr)
       {
-        _execError = str::form( _("Can't fork (%s)."), strerror(errno) );
-        _exitStatus = 127;
-        ERR << _execError << endl;
-
-       if (use_pty) {
-           ::close(master_tty);
-           ::close(slave_tty);
-       }
-       else {
-           ::close(to_external[0]);
-           ::close(to_external[1]);
-           ::close(from_external[0]);
-           ::close(from_external[1]);
-       }
+        stderrFd = open("/dev/null", O_WRONLY);
+      }
+      else if (stderr_disp == Stderr_To_Stdout)
+      {
+        stderrFd = *stdoutFd;
+        //no double close
+        stderrFd.resetDispose();
+      }
+      else if (stderr_disp == Stderr_To_FileDesc)
+      {
+        // Note: We don't have to close anything regarding stderr_fd.
+        // Our caller is responsible for that.
+        stderrFd = stderr_fd;
+        stderrFd.resetDispose();
       }
 
-      else {
-       if (use_pty)
-       {
-           ::close(slave_tty);        // belongs to child process
-           inputfile  = fdopen(master_tty, "r");
-           outputfile = fdopen(master_tty, "w");
-       }
-       else
-       {
-           ::close(to_external[0]);   // belongs to child process
-           ::close(from_external[1]); // belongs to child process
-           inputfile = fdopen(from_external[0], "r");
-           outputfile = fdopen(to_external[1], "w");
-       }
+      if ( root )
+        _backend->setChroot( root );
+      if ( chdirTo )
+        _backend->setWorkingDirectory( chdirTo );
+
+      _backend->setDieWithParent( die_with_parent );
+      _backend->setSwitchPgid( switch_pgid );
+      _backend->setEnvironment( environment );
+      _backend->setUseDefaultLocale( default_locale );
+
+      if ( _backend->start( argv, stdinFd, stdoutFd, stderrFd ) ) {
 
-       DBG << "pid " << pid << " launched" << endl;
+        inputfile  = fdopen( childStdoutParentFd, "r" );
+        childStdoutParentFd.resetDispose();
+        outputfile = fdopen( childStdinParentFd, "w" );
+        childStdinParentFd.resetDispose();
 
        if (!inputfile || !outputfile)
        {
            ERR << "Cannot create streams to external program " << argv[0] << endl;
-           close();
+            ExternalProgram::close();
        }
+      } else {
+        // Fork failed, exit code and status was set by backend
+        return;
       }
     }
 
-
     int
     ExternalProgram::close()
     {
-      if (pid > 0)
+      if ( !_backend ) {
+        ExternalDataSource::close();
+        return -1;
+      }
+
+      if ( _backend->isRunning() )
       {
        if ( inputFile() )
        {
@@ -503,80 +391,26 @@ namespace zypp {
            else
            {
              // No data within time.
-             if ( ! running() )
+             if ( ! _backend->isRunning() )
                break;
            }
          } while ( true );
        }
 
-       if ( pid > 0 )  // bsc#1109877: must re-check! running() in the loop above may have already waited.
-       {
-         // Wait for child to exit
-         int ret;
-         int status = 0;
-         do
-         {
-           ret = waitpid(pid, &status, 0);
-         }
-         while (ret == -1 && errno == EINTR);
-
-         if (ret != -1)
-         {
-           _exitStatus = checkStatus( status );
-         }
-         pid = -1;
-       }
-      }
-
-      return _exitStatus;
-    }
-
-
-    int ExternalProgram::checkStatus( int status )
-    {
-      if (WIFEXITED (status))
-      {
-       status = WEXITSTATUS (status);
-       if(status)
-       {
-           DBG << "Pid " << pid << " exited with status " << status << endl;
-            _execError = str::form( _("Command exited with status %d."), status );
-       }
-       else
-       {
-           // if 'launch' is logged, completion should be logged,
-           // even if successfull.
-           DBG << "Pid " << pid << " successfully completed" << endl;
-            _execError.clear(); // empty if running or successfully completed
-       }
-      }
-      else if (WIFSIGNALED (status))
-      {
-       status = WTERMSIG (status);
-       WAR << "Pid " << pid << " was killed by signal " << status
-               << " (" << strsignal(status);
-       if (WCOREDUMP (status))
-       {
-           WAR << ", core dumped";
-       }
-       WAR << ")" << endl;
-        _execError = str::form( _("Command was killed by signal %d (%s)."), status, strsignal(status) );
-       status+=128;
-      }
-      else {
-       ERR << "Pid " << pid << " exited with unknown error" << endl;
-        _execError = _("Command exited with unknown error.");
+       // wait for the process to end)
+       _backend->isRunning( true );
       }
 
-      return status;
+      ExternalDataSource::close();
+      return _backend->exitStatus();
     }
 
     bool
     ExternalProgram::kill()
     {
-      if (pid > 0)
+      if ( _backend && _backend->isRunning() )
       {
-       ::kill(pid, SIGKILL);
+       ::kill( _backend->pid(), SIGKILL);
        close();
       }
       return true;
@@ -584,9 +418,9 @@ namespace zypp {
 
     bool ExternalProgram::kill(int sig)
     {
-      if (pid > 0)
+      if ( _backend && _backend->isRunning()  )
       {
-        ::kill(pid, sig);
+        ::kill( _backend->pid(), sig );
       }
       return true;
     }
@@ -594,38 +428,39 @@ namespace zypp {
     bool
     ExternalProgram::running()
     {
-      if ( pid < 0 ) return false;
-
-      int status = 0;
-      int p = waitpid( pid, &status, WNOHANG );
-      switch ( p )
-        {
-        case -1:
-          ERR << "waitpid( " << pid << ") returned error '" << strerror(errno) << "'" << endl;
-          return false;
-          break;
-        case 0:
-          return true; // still running
-          break;
-        }
+      if ( !_backend ) return false;
+      return _backend->isRunning();
+    }
 
-      // Here: completed...
-      _exitStatus = checkStatus( status );
-      pid = -1;
-      return false;
+    pid_t ExternalProgram::getpid()
+    {
+      if ( !running() )
+        return -1;
+      return _backend->pid();
+    }
+
+    const std::string &ExternalProgram::command() const
+    {
+      if ( !_backend ) {
+        static std::string empty;
+        return empty;
+      }
+      return _backend->executedCommand();
+    }
+
+    const std::string &ExternalProgram::execError() const
+    {
+      if ( !_backend ) {
+        static std::string empty;
+        return empty;
+      }
+      return _backend->execError();
     }
 
     // origfd will be accessible as newfd and closed (unless they were equal)
     void ExternalProgram::renumber_fd (int origfd, int newfd)
     {
-      // It may happen that origfd is already the one we want
-      // (Although in our circumstances, that would mean somebody has closed
-      // our stdin or stdout... weird but has appened to Cray, #49797)
-      if (origfd != newfd)
-      {
-       dup2 (origfd, newfd);
-       ::close (origfd);
-      }
+      return zyppng::renumberFd( origfd, newfd );
     }
 
     std::ostream & ExternalProgram::operator>>( std::ostream & out_r )
diff --git a/zypp-core/ExternalProgram.h b/zypp-core/ExternalProgram.h
new file mode 100644 (file)
index 0000000..5d987d9
--- /dev/null
@@ -0,0 +1,314 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/ExternalProgram.h
+*/
+
+
+#ifndef ZYPP_EXTERNALPROGRAM_H
+#define ZYPP_EXTERNALPROGRAM_H
+
+#include <unistd.h>
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include <zypp-core/Globals.h>
+#include <zypp-core/base/ExternalDataSource.h>
+#include <zypp-core/Pathname.h>
+
+namespace zyppng {
+  class AbstractSpawnEngine;
+}
+
+namespace zypp {
+
+    /**
+     * @short Execute a program and give access to its io
+     * An object of this class encapsulates the execution of
+     * an external program. It starts the program using fork
+     * and some exec.. call, gives you access to the program's
+     * stdio and closes the program after use.
+     *
+     * \code
+     *
+     * const char* argv[] =
+     * {
+     *     "/usr/bin/foo,
+     *     "--option1",
+     *     "--option2",
+     *     NULL
+     * };
+     *
+     * ExternalProgram prog( argv,
+     *                        ExternalProgram::Discard_Stderr,
+     *                        false, -1, true);
+     * string line;
+     * for(line = prog.receiveLine();
+     *     ! line.empty();
+     *     line = prog.receiveLine() )
+     * {
+     *     stream << line;
+     * }
+     * prog.close();
+     *
+     * \endcode
+     */
+    class ExternalProgram : public zypp::externalprogram::ExternalDataSource
+    {
+
+    public:
+
+      typedef std::vector<std::string> Arguments;
+
+      /**
+       * Define symbols for different policies on the handling
+       * of stderr
+       */
+      enum Stderr_Disposition {
+       Normal_Stderr,
+       Discard_Stderr,
+       Stderr_To_Stdout,
+       Stderr_To_FileDesc
+      };
+
+      /**
+       * For passing additional environment variables to set
+       */
+      typedef std::map<std::string,std::string> Environment;
+
+      /**
+       * Start the external program by using the shell <tt>/bin/sh<tt>
+       * with the option <tt>-c</tt>. You can use io direction symbols < and >.
+       * @param commandline a shell commandline that is appended to
+       * <tt>/bin/sh -c</tt>.
+       * @param default_locale whether to set LC_ALL=C before starting
+       * @param root directory to chroot into; or just 'cd' if '/'l;  nothing if empty
+       */
+      ExternalProgram (std::string commandline,
+                    Stderr_Disposition stderr_disp = Normal_Stderr,
+                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
+                    const Pathname& root = "");
+
+      /**
+       * Start an external program by giving the arguments as an arry of char *pointers.
+       * If environment is provided, varaiables will be added to the childs environment,
+       * overwriting existing ones.
+       *
+       * Initial args starting with \c # are discarded but some are treated specially:
+       *       #/[path] - chdir to /[path] before executing
+       *
+       * Stdin redirection: If the \b 1st argument starts with a \b '<', the remaining
+       * part is treated as file opened for reading on standard input (or \c /dev/null
+       * if empty).
+       * \code
+       *   // cat file /tmp/x
+       *   const char* argv[] = { "</tmp/x", "cat", NULL };
+       *   ExternalProgram prog( argv );
+       * \endcode
+       *
+       * Stdout redirection: If the \b 1st argument starts with a \b '>', the remaining
+       * part is treated as file opened for writing on standard output (or \c /dev/null
+       * if empty).
+       */
+
+      ExternalProgram();
+
+      ExternalProgram (const Arguments &argv,
+                    Stderr_Disposition stderr_disp = Normal_Stderr,
+                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
+                    const Pathname& root = "");
+
+      ExternalProgram (const Arguments &argv, const Environment & environment,
+                    Stderr_Disposition stderr_disp = Normal_Stderr,
+                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
+                    const Pathname& root = "");
+
+      ExternalProgram (const char *const *argv,
+                    Stderr_Disposition stderr_disp = Normal_Stderr,
+                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
+                    const Pathname& root = "");
+
+      ExternalProgram (const char *const *argv, const Environment & environment,
+                    Stderr_Disposition stderr_disp = Normal_Stderr,
+                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
+                    const Pathname& root = "");
+
+      ExternalProgram (const char *binpath, const char *const *argv_1,
+                    bool use_pty = false);
+
+
+      ExternalProgram (const char *binpath, const char *const *argv_1, const Environment & environment,
+                    bool use_pty = false);
+
+
+      ~ExternalProgram();
+
+      /** Wait for the progamm to complete. */
+      int close();
+
+      /**
+       * Kill the program
+       */
+      bool kill();
+
+      /**
+       * Send a signal to the program
+       */
+      bool kill( int sig );
+
+      /**
+       * Return whether program is running
+       */
+      bool running();
+
+      /**
+       * return pid
+       * */
+      pid_t getpid();
+
+      /** The command we're executing. */
+      const std::string & command() const;
+
+      /** Some detail telling why the execution failed, if it failed.
+       * Empty if the command is still running or successfully completed.
+       *
+       * \li <tt>Can't open pty (%s).</tt>
+       * \li <tt>Can't open pipe (%s).</tt>
+       * \li <tt>Can't fork (%s).</tt>
+       * \li <tt>Command exited with status %d.</tt>
+       * \li <tt>Command was killed by signal %d (%s).</tt>
+      */
+      const std::string & execError() const;
+
+      /**
+       * origfd will be accessible as newfd and closed (unless they were equal)
+       */
+      static void renumber_fd (int origfd, int newfd);
+
+    public:
+
+      /**
+       * Redirect all command output to an \c ostream.
+       * Returns when the command has completed.
+       * \code
+       *   std::ostringstream s;
+       *   ExternalProgram("pwd") >> s;
+       *   SEC << s.str() << endl;
+       * \endcode
+       * \code
+       *   std::ostringstream s;
+       *   ExternalProgram prog("ls -l wrzl");
+       *   prog >> s;
+       *   if ( prog.close() == 0 )
+       *     MIL << s.str() << endl;
+       *   else
+       *     ERR << prog.execError() << endl;
+       * \endcode
+       */
+      std::ostream & operator>>( std::ostream & out_r );
+
+    private:
+      std::unique_ptr<zyppng::AbstractSpawnEngine> _backend;
+
+    protected:
+
+      void start_program (const char *const *argv, const Environment & environment,
+                       Stderr_Disposition stderr_disp = Normal_Stderr,
+                       int stderr_fd = -1, bool default_locale = false,
+                       const char* root = NULL, bool switch_pgid = false, bool die_with_parent = false, bool usePty = false );
+
+    };
+
+
+  namespace externalprogram
+  {
+    /** Helper providing pipe FDs for \ref ExternalProgramWithStderr.
+     * Moved to a basse class because the pipe needs to be initialized
+     * before the \ref ExternalProgram base class is initialized.
+     * \see \ref ExternalProgramWithStderr
+     */
+    struct EarlyPipe
+    {
+      enum { R=0, W=1 };
+      EarlyPipe();
+      ~EarlyPipe();
+      void closeW()            { if ( _fds[W] != -1 ) { ::close( _fds[W] ); _fds[W] = -1; } }
+      FILE * fStdErr()         { return _stderr; }
+      protected:
+       FILE * _stderr;
+       int _fds[2];
+    };
+  } // namespace externalprogram
+
+  /** ExternalProgram extended to offer reading programs stderr.
+   * \see \ref ExternalProgram
+   */
+  class ExternalProgramWithStderr : private externalprogram::EarlyPipe, public ExternalProgram
+  {
+    public:
+      ExternalProgramWithStderr( const Arguments & argv_r, bool defaultLocale_r = false, const Pathname & root_r = "" )
+      : ExternalProgram( argv_r, Stderr_To_FileDesc, /*use_pty*/false, _fds[W], defaultLocale_r, root_r )
+      { _initStdErr(); }
+      /** \overlocad Convenience taking just the \a root_r. */
+      ExternalProgramWithStderr( const Arguments & argv_r, const Pathname & root_r )
+      : ExternalProgramWithStderr( argv_r, false, root_r )
+      {}
+
+      ExternalProgramWithStderr( const Arguments & argv_r, const Environment & environment_r, bool defaultLocale_r = false, const Pathname & root_r = "" )
+      : ExternalProgram( argv_r, environment_r, Stderr_To_FileDesc, /*use_pty*/false, _fds[W], defaultLocale_r, root_r )
+      { _initStdErr(); }
+      /** \overlocad Convenience taking just the \a root_r.  */
+      ExternalProgramWithStderr( const Arguments & argv_r, const Environment & environment_r, const Pathname & root_r )
+      : ExternalProgramWithStderr( argv_r, environment_r, false, root_r )
+      {}
+  public:
+      /** Return \c FILE* to read programms stderr (O_NONBLOCK set). */
+      using externalprogram::EarlyPipe::fStdErr;
+
+      /** Read data up to \c delim_r from stderr (nonblocking).
+       * \note If \c delim_r is '\0', we read as much data as possible.
+       * \return \c false if data are not yet available (\c retval_r remains untouched then).
+       */
+      bool stderrGetUpTo( std::string & retval_r, const char delim_r, bool returnDelim_r = false );
+
+      /** Read next complete line from stderr (nonblocking).
+       * \return \c false if data are not yet available (\c retval_r remains untouched then).
+       */
+      bool stderrGetline( std::string & retval_r, bool returnDelim_r = false  )
+      { return stderrGetUpTo( retval_r, '\n', returnDelim_r ); }
+
+    private:
+      /** Close write end of the pipe (childs end). */
+      void _initStdErr()
+      { closeW(); }
+
+    private:
+      std::string _buffer;
+  };
+
+  /** ExternalProgram extended to change the progress group ID after forking.
+   * \see \ref ExternalProgram
+   */
+  class ZYPP_LOCAL ExternalProgramWithSeperatePgid : public ExternalProgram
+  {
+    public:
+      ExternalProgramWithSeperatePgid (const char *const *argv,
+                   Stderr_Disposition stderr_disp = Normal_Stderr,
+                   int stderr_fd = -1, bool default_locale = false,
+                   const Pathname& root = "") : ExternalProgram()
+      {
+        start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), true );
+      }
+
+  };
+
+} // namespace zypp
+
+#endif // ZYPP_EXTERNALPROGRAM_H
diff --git a/zypp-core/Globals.h b/zypp-core/Globals.h
new file mode 100644 (file)
index 0000000..a8f19d8
--- /dev/null
@@ -0,0 +1,103 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/APIConfig.h
+ *  \brief     Provides API related macros.
+ */
+#ifndef ZYPP_GLOBALS_H
+#define ZYPP_GLOBALS_H
+
+#include <zypp-core/base/Easy.h>       // some macros used almost everywhere
+
+/**
+ * Legacy code we still support.
+ *
+ * Deprecated items we can't drop immediately because YAST/PK still
+ * refer to them or they break binary compatibility, should be
+ * enclosed in `#if LEGACY(#)` where # is either a minor number(<=99),
+ * a soversion [<=9999] or numversion [<=999999].
+ *
+ */
+#define LEGACY(CL) ( CL < 100 && LIBZYPP_VERSION_MAJOR <= CL ) || ( CL < 10000 && LIBZYPP_SOVERSION <= CL ) || LIBZYPP_VERSION <= CL
+
+/**
+ * Generic helper definitions for shared library support.
+ *
+ * \see e.g. http://gcc.gnu.org/wiki/Visibility
+ * \code
+ *   extern "C" ZYPP_API void function(int a);
+ *   class ZYPP_API SomeClass
+ *   {
+ *      int c;
+ *      ZYPP_LOCAL void privateMethod();  // Only for use within this DSO
+ *   public:
+ *      Person(int _c) : c(_c) { }
+ *      static void foo(int a);
+ *   };
+ * \endcode
+};*/
+#if __GNUC__ >= 4
+  #define ZYPP_DECL_EXPORT __attribute__ ((visibility ("default")))
+  #define ZYPP_DECL_IMPORT __attribute__ ((visibility ("default")))
+  #define ZYPP_DECL_HIDDEN __attribute__ ((visibility ("hidden")))
+#else
+  #define ZYPP_DECL_EXPORT
+  #define ZYPP_DECL_IMPORT
+  #define ZYPP_DECL_HIDDEN
+#endif
+
+#ifdef ZYPP_DLL        //defined if zypp is compiled as DLL
+  #define ZYPP_API     ZYPP_DECL_EXPORT
+  #define ZYPP_LOCAL   ZYPP_DECL_HIDDEN
+#else
+  #define ZYPP_API      ZYPP_DECL_IMPORT
+  #define ZYPP_LOCAL
+#endif
+
+/**
+ * The ZYPP_DEPRECATED macro can be used to trigger compile-time warnings
+ * with gcc >= 3.2 when deprecated functions are used.
+ *
+ * For non-inline functions, the macro is used at the very end of the
+ * function declaration, right before the semicolon, unless it's pure
+ * virtual:
+ *
+ * int deprecatedFunc() const ZYPP_DEPRECATED;
+ * virtual int deprecatedPureVirtualFunc() const ZYPP_DEPRECATED = 0;
+ *
+ * Functions which are implemented inline are handled differently:
+ * the ZYPP_DEPRECATED macro is used at the front, right before the
+ * return type, but after "static" or "virtual":
+ *
+ * ZYPP_DEPRECATED void deprecatedFuncA() { .. }
+ * virtual ZYPP_DEPRECATED int deprecatedFuncB() { .. }
+ * static  ZYPP_DEPRECATED bool deprecatedFuncC() { .. }
+ *
+ * You can also mark whole structs or classes as deprecated, by inserting
+ * the ZYPP_DEPRECATED macro after the struct/class keyword, but before
+ * the name of the struct/class:
+ *
+ * class ZYPP_DEPRECATED DeprecatedClass { };
+ * struct ZYPP_DEPRECATED DeprecatedStruct { };
+ *
+ * However, deprecating a struct/class doesn't create a warning for gcc
+ * versions <= 3.3 (haven't tried 3.4 yet).  If you want to deprecate a class,
+ * also deprecate all member functions as well (which will cause warnings).
+ *
+ */
+#if __GNUC__ - 0 > 3 || (__GNUC__ - 0 == 3 && __GNUC_MINOR__ - 0 >= 2)
+  #ifndef ZYPP_DEPRECATED
+  #define ZYPP_DEPRECATED __attribute__ ((deprecated))
+  #endif
+#else
+  #ifndef ZYPP_DEPRECATED
+  #define ZYPP_DEPRECATED
+  #endif
+#endif
+
+#endif
diff --git a/zypp-core/ManagedFile.h b/zypp-core/ManagedFile.h
new file mode 100644 (file)
index 0000000..2892fa9
--- /dev/null
@@ -0,0 +1,32 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/ManagedFile.h
+ *
+*/
+#ifndef ZYPP_MANAGEDFILE_H
+#define ZYPP_MANAGEDFILE_H
+
+#include <iosfwd>
+
+#include <zypp/Pathname.h>
+#include <zypp/AutoDispose.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  /** A Pathname plus associated cleanup code to be executed when
+   *  path is no longer needed.
+   */
+  typedef AutoDispose<const Pathname> ManagedFile;
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_MANAGEDFILE_H
similarity index 98%
rename from zypp/Pathname.cc
rename to zypp-core/Pathname.cc
index d81a472..1d085a2 100644 (file)
@@ -11,9 +11,9 @@
 */
 #include <iostream>
 
-#include <zypp/base/String.h>
-#include <zypp/Pathname.h>
-#include <zypp/Url.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/Pathname.h>
+#include <zypp-core/Url.h>
 
 using std::string;
 
diff --git a/zypp-core/Pathname.h b/zypp-core/Pathname.h
new file mode 100644 (file)
index 0000000..d387807
--- /dev/null
@@ -0,0 +1,217 @@
+
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/Pathname.h
+ *
+*/
+#ifndef ZYPP_PATHNAME_H
+#define ZYPP_PATHNAME_H
+
+#include <iosfwd>
+#include <string>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  class Url;
+
+  ///////////////////////////////////////////////////////////////////
+  namespace filesystem
+  { /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : Pathname
+    //
+    /** Pathname.
+     *
+     * \note For convenience Pathname is available as zypp::Pathname too.
+     *
+     * Always stores normalized paths (no inner '.' or '..' components
+     * and no consecutive '/'es). Concatenation automatically adds
+     * the path separator '/'.
+     *
+     * \todo Add support for handling extensions incl. stripping
+     * extensions from basename (basename("/path/foo.baa", ".baa") ==> "foo")
+    */
+    class Pathname
+    {
+    public:
+      /** Default ctor: an empty path. */
+      Pathname()
+      {}
+
+      /** Ctor from string. */
+      Pathname( const std::string & name_r )
+      { _assign( name_r ); }
+
+      /** Ctor from char*. */
+      Pathname( const char * name_r )
+      { _assign( name_r ? name_r : "" ); }
+
+      /** Copy Ctor */
+      Pathname( const Pathname & rhs )
+      : _name( rhs._name )
+      {}
+
+      /** Swap */
+      friend void swap( Pathname & lhs, Pathname & rhs )
+      {
+       using std::swap;
+       swap( lhs._name, rhs._name );
+      }
+
+      /** Move Ctor */
+      Pathname( Pathname && tmp )
+      : _name( std::move( tmp._name ) )
+      {}
+
+      /** Assign */
+      Pathname & operator=( Pathname rhs )
+      { swap( *this, rhs ); return *this; }
+
+      /** Concatenate and assign. \see cat */
+      Pathname & operator/=( const Pathname & path_tv )
+      { return( *this = cat( *this, path_tv ) ); }
+
+      /** Concatenate and assign. \see cat
+       * \deprecated: use /=
+      */
+      Pathname & operator+=( const Pathname & path_tv )
+      { return( *this = cat( *this, path_tv ) ); }
+
+      /** String representation. */
+      const std::string & asString() const
+      { return _name; }
+
+      /** String representation as "(root)/path" */
+      static std::string showRoot( const Pathname & root_r, const Pathname & path_r );
+
+      /** String representation as "(root)/path", unless \a root is \c "/" or empty. */
+      static std::string showRootIf( const Pathname & root_r, const Pathname & path_r );
+
+      /** Url representation using \c scheme_r schema . */
+      Url asUrl( const std::string & scheme_r ) const;
+      /** \overload using \c dir schema. */
+      Url asUrl() const;
+      /** \overload using \c dir schema. */
+      Url asDirUrl() const;
+      /** \overload using \c file schema. */
+      Url asFileUrl() const;
+
+      /** String representation. */
+      const char * c_str() const
+      { return _name.c_str(); }
+
+      /** Test for an empty path. */
+      bool empty()    const { return _name.empty(); }
+      /** Test for an absolute path. */
+      bool absolute() const { return *_name.c_str() == '/'; }
+      /** Test for a relative path. */
+      bool relative() const { return !( absolute() || empty() ); }
+
+      /** Test for "" or "/". */
+      bool emptyOrRoot() const { return( _name.empty() || _name == "/" ); }
+
+      /** Return all but the last component od this path. */
+      Pathname dirname() const { return dirname( *this ); }
+      static Pathname dirname( const Pathname & name_r );
+
+      /** Return the last component of this path. */
+      std::string basename() const { return basename( *this ); }
+      static std::string basename( const Pathname & name_r );
+
+      /** Return all of the characters in name after and including
+       * the last dot in the last element of name.  If there is no dot
+       * in the last element of name then returns the empty string.
+      */
+      std::string extension() const { return extension( *this ); }
+      static std::string extension( const Pathname & name_r );
+
+      /** Return this path, adding a leading '/' if relative. */
+      Pathname absolutename() const { return absolutename( *this ); }
+      static Pathname absolutename( const Pathname & name_r )
+      { return name_r.relative() ? cat( "/", name_r ) : name_r; }
+
+      /** Return this path, removing a leading '/' if absolute.*/
+      Pathname relativename() const { return relativename( *this ); }
+      static Pathname relativename( const Pathname & name_r )
+      { return name_r.absolute() ? cat( ".", name_r ) : name_r; }
+
+      /** Return \c path_r prefixed with \c root_r, unless it is already prefixed. */
+      static Pathname assertprefix( const Pathname & root_r, const Pathname & path_r );
+
+      /** Return \c path_r with any \c root_r dir prefix striped. */
+      static Pathname stripprefix( const Pathname & root_r, const Pathname & path_r );
+
+      /** Concatenation of pathnames.
+       * \code
+       *   "foo"  / "baa"  ==> "foo/baa"
+       *   "foo/" / "baa"  ==> "foo/baa"
+       *   "foo"  / "/baa" ==> "foo/baa"
+       *   "foo/" / "/baa" ==> "foo/baa"
+       * \endcode
+      */
+      Pathname cat( const Pathname & r ) const { return cat( *this, r ); }
+      static Pathname cat( const Pathname & l, const Pathname & r );
+
+      /** Append string \a r to the last component of the path.
+       * \code
+       *   "foo/baa".extend( ".h" ) ==> "foo/baa.h"
+       * \endcode
+      */
+      Pathname extend( const std::string & r ) const { return extend( *this, r ); }
+      static Pathname extend( const Pathname & l, const std::string & r );
+
+    private:
+      std::string _name;
+      void _assign( const std::string & name_r );
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates Pathname */
+    inline bool operator==( const Pathname & l, const Pathname & r )
+    { return l.asString() == r.asString(); }
+
+    /** \relates Pathname */
+    inline bool operator!=( const Pathname & l, const Pathname & r )
+    { return l.asString() != r.asString(); }
+
+    /** \relates Pathname Concatenate two Pathname. */
+    inline Pathname operator/( const Pathname & l, const Pathname & r )
+    { return Pathname::cat( l, r ); }
+
+    /** \relates Pathname Concatenate two Pathname.
+     * \deprecated: use /
+    */
+    inline Pathname operator+( const Pathname & l, const Pathname & r )
+    { return Pathname::cat( l, r ); }
+
+    /** \relates Pathname */
+    inline bool operator<( const Pathname & l, const Pathname & r )
+    { return l.asString() < r.asString(); }
+
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates Pathname Stream output */
+    inline std::ostream & operator<<( std::ostream & str, const Pathname & obj )
+    { return str << obj.asString(); }
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace filesystem
+  ///////////////////////////////////////////////////////////////////
+
+  /** Dragged into namespace zypp. */
+  using filesystem::Pathname;
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_PATHNAME_H
diff --git a/zypp-core/TriBool.h b/zypp-core/TriBool.h
new file mode 100644 (file)
index 0000000..f2c5cfe
--- /dev/null
@@ -0,0 +1,74 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/TriBool.h
+ *
+*/
+#ifndef ZYPP_TRIBOOL_H
+#define ZYPP_TRIBOOL_H
+
+#include <iosfwd>
+#include <string>
+#include <boost/logic/tribool.hpp>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  /** 3-state boolean logic (\c true, \c false and \c indeterminate).
+   * \code
+   * namespace zypp
+   * {
+   *   typedef boost::logic::tribool TriBool;
+   *   using   boost::logic::tribool;
+   *   using   boost::logic::indeterminate;
+   * }
+   * \endcode
+   *
+   * \warning Be carefull.esp. when comparing \ref TriBool using
+   * \c operator==, as <b><tt>( indeterminate == indeterminate )</tt></b>
+   * does \b not evaluate \b true. It's \c indeterminate.
+   *
+   * \see http://www.boost.org/doc/html/tribool.html
+   * \ingroup BOOST
+  */
+  typedef boost::logic::tribool TriBool;
+  using   boost::logic::tribool;
+  using   boost::logic::indeterminate;
+
+  inline std::string asString( const TriBool & val_r, const std::string & istr_r = std::string(),
+                                                     const std::string & tstr_r = std::string(),
+                                                     const std::string & fstr_r = std::string() )
+  {
+    std::string ret;
+    if (indeterminate(val_r))
+      ret = ( istr_r.empty() ? "indeterminate" : istr_r );
+    else if (val_r)
+      ret = ( tstr_r.empty() ? "true" : tstr_r );
+    else
+      ret = ( fstr_r.empty() ? "false" : fstr_r );
+    return ret;
+  }
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+namespace boost
+{
+    namespace logic
+    {
+      /** \relates TriBool stream output */
+      inline std::ostream & operator<<(std::ostream & s, const tribool & obj)
+      { return s << zypp::asString( obj ); }
+
+      /** \relates TriBool whether 2 tribool have the same state (this is NOT ==) */
+      inline bool sameTriboolState( tribool lhs, tribool rhs )
+      { return( ( indeterminate(lhs) && indeterminate(rhs) ) || ( bool )( lhs == rhs ) ); }
+    }
+}
+#endif // ZYPP_TRIBOOL_H
similarity index 99%
rename from zypp/Url.cc
rename to zypp-core/Url.cc
index 4572e75..359ace7 100644 (file)
  * \file zypp/Url.cc
  */
 
-#include <zypp/Url.h>
-#include <zypp/Pathname.h>
-#include <zypp/base/Gettext.h>
-#include <zypp/base/String.h>
-#include <zypp/base/Regex.h>
+#include <zypp-core/Url.h>
+#include <zypp-core/Pathname.h>
+#include <zypp-core/base/Gettext.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/Regex.h>
 #include <stdexcept>
 #include <iostream>
 
diff --git a/zypp-core/Url.h b/zypp-core/Url.h
new file mode 100644 (file)
index 0000000..2f75c13
--- /dev/null
@@ -0,0 +1,854 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/**
+ * \file zypp/Url.h
+ */
+#ifndef   ZYPP_URL_H
+#define   ZYPP_URL_H
+
+#include <zypp-core/url/UrlBase.h>
+#include <zypp-core/url/UrlUtils.h>
+
+
+//////////////////////////////////////////////////////////////////////
+namespace zypp
+{ ////////////////////////////////////////////////////////////////////
+
+  class Url;
+  namespace hotfix1050625 {
+    std::string asString( const Url & url_r );
+  }
+  namespace filesystem {
+    class Pathname;
+  }
+  using filesystem::Pathname;
+
+  /**
+   * \class Url
+   * \brief Url manipulation class.
+   *
+   * The generic URL (URI) syntax and its main components are defined in
+   * RFC3986 (http://rfc.net/rfc3986.html) Section 3, "Syntax Components".
+   * The scheme specific URL syntax and semantics is defined in the
+   * specification of the particular scheme. See also RFC1738
+   * (http://rfc.net/rfc1738.html), that defines specific syntax for
+   * several URL schemes.
+   *
+   * This class provides methods to access and manipulate generic and
+   * common scheme-specific URL components (or using the more general
+   * term, URI components).
+   * To consider the scheme-specifics of a URL, the Url class contains
+   * a reference object pointing to a UrlBase or derived object, that
+   * implements the scheme specifics.
+   *
+   * Using the Url::registerScheme() method, it is possible to register
+   * a preconfigured or derived UrlBase object for a specific scheme
+   * name. The registered object will be cloned to handle all URLs
+   * containing the specified scheme name.
+   *
+   * \par RFC3986, Syntax Components:
+   *
+   * The generic URI syntax consists of a hierarchical sequence of
+   * components referred to as the scheme, authority, path, query,
+   * and fragment.
+   *
+   * \code
+   *    URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
+   *
+   *    hier-part   = "//" authority path-abempty
+   *                / path-absolute
+   *                / path-rootless
+   *                / path-empty
+   * \endcode
+   *
+   * The scheme and path components are required, though the path may be
+   * empty (no characters).
+   * When authority is present, the path must either be empty or begin
+   * with a slash ("/") character.
+   * When authority is not present, the path cannot begin with two slash
+   * characters ("//").
+   * These restrictions result in five different ABNF rules for a path
+   * (Section 3.3), only one of which will match any given URI reference.
+   *
+   * The following are two example URIs and their component parts:
+   * \code
+   *      foo://example.com:8042/over/there?name=ferret#nose
+   *      \_/   \______________/\_________/ \_________/ \__/
+   *       |           |            |            |        |
+   *    scheme     authority       path        query   fragment
+   *       |   _____________________|__
+   *      / \ /                        \
+   *      urn:example:animal:ferret:nose
+   * \endcode
+   *
+   */
+  class Url
+  {
+  public:
+    /**
+     * Encoding flags.
+     */
+    typedef zypp::url::EEncoding    EEncoding;
+
+    /**
+     * View options.
+     */
+    typedef zypp::url::ViewOptions  ViewOptions;
+
+
+    ~Url();
+    Url();
+
+    /**
+     * Create a new Url object as shared copy of the given one.
+     *
+     * Upon return, both objects will point to the same underlying
+     * object. This state will remain until one of the object is
+     * modified.
+     *
+     * \param url The Url object to make a copy of.
+     * \throws url::UrlException if copy fails (should not happen).
+     */
+    Url(const Url &url);
+
+
+    /**
+     * Create a new Url object as shared copy of the given reference.
+     *
+     * Upon return, both objects will point to the same underlying
+     * object. This state will remain until one of the object is
+     * modified.
+     *
+     * \param url The URL implementation reference to make a copy of.
+     * \throws url::UrlException if reference is empty.
+     */
+    Url(const zypp::url::UrlRef &url);
+
+
+    /**
+     * \brief Construct a Url object from percent-encoded URL string.
+     *
+     * Parses the \p encodedUrl string using the parseUrl() method
+     * and assigns the result to the newly created object.
+     *
+     * \param encodedUrl A percent-encoded URL string.
+     * \throws url::UrlParsingException if parsing of the url fails.
+     * \throws url::UrlNotAllowedException if one of the components
+     *         is not allowed for the scheme.
+     * \throws url::UrlBadComponentException if one of the components
+     *         contains an invalid character.
+     */
+    Url(const std::string &encodedUrl);
+
+
+    // -----------------
+    /**
+     * \brief Parse a percent-encoded URL string.
+     *
+     * Tries to parse the given string into generic URL components
+     * and creates a clone of a scheme-specialized object or a new
+     * UrlBase object.
+     *
+     * \param encodedUrl A percent-encoded URL string.
+     * \return           A reference to a (derived) UrlBase object or
+     *                   empty reference if the \p encodedUrl string
+     *                   does not match the generic URL syntax.
+     * \throws url::UrlNotAllowedException if one of the components
+     *         is not allowed for the scheme.
+     * \throws url::UrlBadComponentException if one of the components
+     *         contains an invalid character.
+     */
+    static url::UrlRef
+    parseUrl(const std::string &encodedUrl);
+
+
+    // -----------------
+    /**
+     * \brief Assigns parsed percent-encoded URL string to the object.
+     *
+     * Parses \p encodedUrl string using the parseUrl() method
+     * and assigns the result to the current object.
+     *
+     * \param encodedUrl A percent-encoded URL string.
+     * \return A reference to this Url object.
+     * \throws url::UrlParsingException if parsing of the url fails.
+     * \throws url::UrlNotAllowedException if one of the components
+     *         is not allowed for the scheme.
+     * \throws url::UrlBadComponentException if one of the components
+     *         contains an invalid character.
+     */
+    Url&
+    operator = (const std::string &encodedUrl);
+
+
+    /**
+     * \brief Assign a shared copy of \p url to the current object.
+     *
+     * Upon return, both objects will point to the same underlying
+     * object. This state will remain until one of the objects is
+     * modified.
+     *
+     * \param url The Url object to make a copy of.
+     * \return A reference to this Url object.
+     */
+    Url&
+    operator = (const Url &url);
+
+
+    // -----------------
+    /**
+     * \brief Register a scheme-specific implementation.
+     *
+     * \param scheme  A name of a scheme.
+     * \param urlImpl A UrlBase object specialized for this scheme.
+     * \return True, if the object claims to implement the scheme.
+     */
+    static bool
+    registerScheme(const std::string &scheme,
+                   url::UrlRef       urlImpl);
+
+    /**
+     * \brief Returns all registered scheme names.
+     * \return A vector with registered URL scheme names.
+     */
+    static zypp::url::UrlSchemes
+    getRegisteredSchemes();
+
+    /**
+     * \brief Returns if scheme name is registered.
+     * \return True, if scheme name is registered.
+     */
+    static bool
+    isRegisteredScheme(const std::string &scheme);
+
+
+    // -----------------
+    /**
+     * \brief Returns scheme names known to this object.
+     * \return A vector with scheme names known by this object.
+     */
+    zypp::url::UrlSchemes
+    getKnownSchemes() const;
+
+
+    /**
+     * \brief Verifies the specified scheme name.
+     *
+     * Verifies the generic syntax of the specified \p scheme name
+     * and if it is contained in the current object's list of known
+     * schemes (see getKnownSchemes()) if the list is not empty.
+     *
+     * The default implementation in the UrlBase class returns an
+     * emtpy list of known schemes, causing a check of the generic
+     * syntax only.
+     *
+     * \return True, if generic scheme name syntax is valid and
+     *         the scheme name is known to the current object.
+     */
+    bool
+    isValidScheme(const std::string &scheme) const;
+
+
+    /** hd cd dvd dir file iso */
+    static bool schemeIsLocal( const std::string & scheme_r );
+    /** \overload nonstatic version */
+    bool schemeIsLocal() const { return schemeIsLocal( getScheme() ); }
+
+    /** nfs nfs4 smb cifs http https ftp sftp tftp */
+    static bool schemeIsRemote( const std::string & scheme_r );
+    /** \overload nonstatic version */
+    bool schemeIsRemote() const { return schemeIsRemote( getScheme() ); }
+
+    /** cd dvd */
+    static bool schemeIsVolatile( const std::string & scheme_r );
+    /** \overload nonstatic version */
+    bool schemeIsVolatile() const { return schemeIsVolatile( getScheme() ); }
+
+    /** http https ftp sftp tftp */
+    static bool schemeIsDownloading( const std::string & scheme_r );
+    /** \overload nonstatic version */
+    bool schemeIsDownloading() const { return schemeIsDownloading( getScheme() ); }
+
+    /**
+     * \brief Verifies the Url.
+     *
+     * Verifies if the current object contains a non-empty scheme
+     * name. Additional semantical URL checks may be performed by
+     * derived UrlBase objects.
+     *
+     * \return True, if the Url seems to be valid.
+     */
+    bool
+    isValid() const;
+
+
+    // -----------------
+    /**
+     * Returns a default string representation of the Url object.
+     *
+     * By default, a password in the URL will be hidden.
+     *
+     * \return A default string representation of the Url object.
+     */
+    std::string
+    asString() const;
+
+    /**
+     * Returns a string representation of the Url object.
+     *
+     * To include a password in the resulting Url string, use:
+     * \code
+     *    url.asString(url.getViewOptions() +
+     *                 url::ViewOptions::WITH_PASSWORD);
+     * \endcode
+     *
+     * \param opts  A combination of view options.
+     * \return A string representation of the Url object.
+     */
+    std::string
+    asString(const ViewOptions &opts) const;
+
+    /**
+     * Returns a complete string representation of the Url object.
+     *
+     * This function ignores the configuration of the view options
+     * in the current object (see setViewOption()) and forces to
+     * return a string with all URL components included.
+     *
+     * \return A complete string representation of the Url object.
+     */
+    std::string
+    asCompleteString() const;
+
+
+    // -----------------
+    /**
+     * Returns the scheme name of the URL.
+     * \return Scheme name of the current Url object.
+     */
+    std::string
+    getScheme() const;
+
+
+    // -----------------
+    /**
+     * Returns the encoded authority component of the URL.
+     *
+     * The returned authority string does not contain the leading
+     * "//" separator characters, but just its "user:pass@host:port"
+     * content only.
+     *
+     * \return The encoded authority component string.
+     */
+    std::string
+    getAuthority() const;
+
+    /**
+     * Returns the username from the URL authority.
+     * \param eflag Flag if the usename should be percent-decoded or not.
+     * \return The username sub-component from the URL authority.
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    std::string
+    getUsername(EEncoding eflag = zypp::url::E_DECODED) const;
+
+    /**
+     * Returns the password from the URL authority.
+     * \param eflag Flag if the password should be percent-decoded or not.
+     * \return The password sub-component from the URL authority.
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    std::string
+    getPassword(EEncoding eflag = zypp::url::E_DECODED) const;
+
+    /**
+     * Returns \c true if username \b and password are encoded in the authority component.
+     */
+    bool hasCredentialsInAuthority() const
+    { return ! ( getUsername().empty() || getPassword().empty() ); }
+
+    /**
+     * Returns the hostname or IP from the URL authority.
+     *
+     * In case the Url contains an IP number, it may be surrounded
+     * by "[" and "]" characters, for example "[::1]" for an IPv6
+     * localhost address.
+     *
+     * \param eflag Flag if the host should be percent-decoded or not.
+     * \return The host sub-component from the URL authority.
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    std::string
+    getHost(EEncoding eflag = zypp::url::E_DECODED) const;
+
+    /**
+     * Returns the port from the URL authority.
+     * \return The port sub-component from the URL authority.
+     */
+    std::string
+    getPort() const;
+
+
+    // -----------------
+    /**
+     * Returns the encoded path component of the URL.
+     *
+     * The path data contains the path name, optionally
+     * followed by path parameters separated with a ";"
+     * character, for example "/foo/bar;version=1.1".
+     *
+     * \return The encoded path component of the URL.
+     */
+    std::string
+    getPathData() const;
+
+    /**
+     * Returns the path name from the URL.
+     * \param eflag Flag if the path should be decoded or not.
+     * \return The path name sub-component without path parameters
+     *  from Path-Data component of the URL.
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    std::string
+    getPathName(EEncoding eflag = zypp::url::E_DECODED) const;
+
+    /**
+     * Returns the path parameters from the URL.
+     * \return The encoded path parameters from the URL.
+     */
+    std::string
+    getPathParams() const;
+
+    /**
+     * Returns a vector with path parameter substrings.
+     *
+     * The default path parameter separator is the \c ',' character.
+     * A schema specific object may overide the default separators.
+     *
+     * For example, the path parameters string "foo=1,bar=2" is splited
+     * by default into a vector containing the substrings "foo=1" and
+     * "bar=2".
+     *
+     * \return The path parameters splited into a vector of substrings.
+     */
+    zypp::url::ParamVec
+    getPathParamsVec() const;
+
+    /**
+     * Returns a string map with path parameter keys and values.
+     *
+     * The default path parameter separator is the \c ',' character,
+     * the default key/value separator for the path parameters is
+     * the \c '=' character.
+     * A schema specific object may overide the default separators.
+     *
+     * For example, the path parameters string "foo=1,bar=2" is splited
+     * into a map containing "foo" = "1" and "bar" = "2" by default.
+     *
+     * \param eflag Flag if the path parameter keys and values should
+     *               be decoded or not.
+     * \return The path parameters key and values as a string map.
+     * \throws url::UrlNotSupportedException if parameter parsing
+     *         is not supported for a URL (scheme).
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    zypp::url::ParamMap
+    getPathParamsMap(EEncoding eflag = zypp::url::E_DECODED) const;
+
+    /**
+     * Return the value for the specified path parameter.
+     *
+     * For example, if the path parameters string is "foo=1,bar=2"
+     * the method will return the substring "1" for the param key
+     * "foo" and "2" for the param key "bar".
+     *
+     * \param param The path parameter key.
+     * \param eflag Flag if the path parameter keys and values should
+     *              be decoded or not.
+     * \return The value for the path parameter key or empty string.
+     * \throws url::UrlNotSupportedException if parameter parsing
+     *         is not supported for a URL (scheme).
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    std::string
+    getPathParam(const std::string &param,
+                 EEncoding eflag = zypp::url::E_DECODED) const;
+
+
+    // -----------------
+    /**
+     * Returns the encoded query string component of the URL.
+     *
+     * The query string is returned without first "?" (separator)
+     * character. Further "?" characters as in e.g. LDAP URLs
+     * remain in the returned string.
+     *
+     * \return The encoded query string component of the URL.
+     */
+    std::string
+    getQueryString() const;
+
+    /**
+     * Returns a vector with query string parameter substrings.
+     *
+     * The default query string parameter separator is the \c '&'
+     * character.
+     * A schema specific object may overide the default separators.
+     *
+     * For example, the query string "foo=1&bar=2" is splited by
+     * default into a vector containing the substrings "foo=1" and
+     * "bar=2".
+     *
+     * \return The query string splited into a vector of substrings.
+     */
+    zypp::url::ParamVec
+    getQueryStringVec() const;
+
+    /**
+     * Returns a string map with query parameter and their values.
+     *
+     * The default query string parameter separator is the \c ','
+     * character, the default key/value separator the \c '=' character.
+     * A schema specific object may overide the default separators.
+     *
+     * For example, the query string "foo=1&bar=2" is splited by
+     * default into a map containing "foo" = "1" and "bar" = "2".
+     *
+     * \param eflag Flag if the query string keys and values should
+     *               be decoded or not.
+     * \return The query string as a key/value string map.
+     * \throws url::UrlNotSupportedException if parameter parsing
+     *         is not supported for a URL (scheme).
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    zypp::url::ParamMap
+    getQueryStringMap(EEncoding eflag = zypp::url::E_DECODED) const;
+
+    /**
+     * Return the value for the specified query parameter.
+     *
+     * For example, if the query string is "foo=1,bar=2" the method
+     * will return the substring "1" for the param key "foo" and
+     * "2" for the param key "bar".
+     *
+     * \param param The query parameter key.
+     * \param eflag Flag if the query parameter keys and values should
+     *              be decoded or not.
+     * \return The value for the query parameter key or empty string.
+     * \throws url::UrlNotSupportedException if parameter parsing
+     *         is not supported for a URL (scheme).
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    std::string
+    getQueryParam(const std::string &param,
+                  EEncoding eflag = zypp::url::E_DECODED) const;
+
+
+    // -----------------
+    /**
+     * Returns the encoded fragment component of the URL.
+     * \param eflag Flag if the fragment should be percent-decoded or not.
+     * \return The encoded fragment component of the URL.
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    std::string
+    getFragment(EEncoding eflag = zypp::url::E_DECODED) const;
+
+
+    // -----------------
+    /**
+     * \brief Set the scheme name in the URL.
+     * \param scheme The new scheme name.
+     * \throws url::UrlBadComponentException if the \p scheme
+     *         contains an invalid character or is empty.
+     */
+    void
+    setScheme(const std::string &scheme);
+
+
+    // -----------------
+    /**
+     * \brief Set the authority component in the URL.
+     *
+     * The \p authority string shoud contain the "user:pass@host:port"
+     * sub-components without any leading "//" separator characters.
+     *
+     * \param authority The encoded authority component string.
+     * \throws url::UrlNotAllowedException if the \p authority
+     *         has to be empty in for the current scheme.
+     * \throws url::UrlBadComponentException if the \p authority
+     *         contains an invalid character.
+     * \throws url::UrlParsingException if \p authority parsing fails.
+     */
+    void
+    setAuthority(const std::string &authority);
+
+    /**
+     * \brief Set the username in the URL authority.
+     * \param user  The new username.
+     * \param eflag If the \p username is encoded or not.
+     * \throws url::UrlNotAllowedException if the \p user
+     *         has to be empty in for the current scheme
+     * \throws url::UrlBadComponentException if the \p user
+     *         contains an invalid character.
+     */
+    void
+    setUsername(const std::string &user,
+                EEncoding         eflag = zypp::url::E_DECODED);
+
+    /**
+     * \brief Set the password in the URL authority.
+     * \param pass  The new password.
+     * \param eflag If the \p password is encoded or not.
+     * \throws url::UrlNotAllowedException if the \p pass
+     *         has to be empty in for the current scheme.
+     * \throws url::UrlBadComponentException if the \p pass
+     *         contains an invalid character.
+     */
+    void
+    setPassword(const std::string &pass,
+                EEncoding         eflag = zypp::url::E_DECODED);
+
+    /**
+     * \brief Set the hostname or IP in the URL authority.
+     *
+     * The \p host parameter may contain a hostname, an IPv4 address
+     * in dotted-decimal form or an IPv6 address literal encapsulated
+     * within square brackets (RFC3513, Sect. 2.2).
+     *
+     * A hostname may contain national alphanumeric UTF8 characters
+     * (letters other than ASCII a-z0-9), that will be encoded.
+     * This function allows to specify both, a encoded or decoded
+     * hostname.
+     *
+     * Other IP literals in "[v ... ]" square bracket format are not
+     * supported by the implementation in UrlBase class.
+     *
+     * \param host The new hostname or IP address.
+     * \throws url::UrlNotAllowedException if the \p host (authority)
+     *         has to be empty in for the current scheme.
+     * \throws url::UrlBadComponentException if the \p host is invalid.
+     */
+    void
+    setHost(const std::string &host);
+
+    /**
+     * \brief Set the port number in the URL authority.
+     * \param port The new port number.
+     * \throws url::UrlNotAllowedException if the \p port (authority)
+     *         has to be empty in for the current scheme.
+     * \throws url::UrlBadComponentException if the \p port is invalid.
+     */
+    void
+    setPort(const std::string &port);
+
+
+    // -----------------
+    /**
+     * \brief Set the path data component in the URL.
+     *
+     * By default, the \p pathdata string may include path
+     * parameters separated by the ";" separator character.
+     *
+     * \param pathdata The encoded path data component string.
+     * \throws url::UrlBadComponentException if the \p pathdata
+     *         contains an invalid character.
+     */
+    void
+    setPathData(const std::string &pathdata);
+
+    /**
+     * \brief Set the path name.
+     * \param path  The new path name.
+     * \param eflag If the \p path name is encoded or not.
+     * \throws url::UrlBadComponentException if the \p path name
+     *         contains an invalid character.
+     */
+    void
+    setPathName(const std::string &path,
+                EEncoding         eflag = zypp::url::E_DECODED);
+    /** \overload */
+    void
+    setPathName(const Pathname &path,
+                EEncoding         eflag = zypp::url::E_DECODED);
+    /** \overload */
+    void
+    setPathName(const char *path,
+                EEncoding         eflag = zypp::url::E_DECODED);
+
+    /**
+     * \brief Extend the path name.
+     */
+    void appendPathName( const Pathname & path_r, EEncoding eflag_r = zypp::url::E_DECODED );
+
+    /**
+     * \brief Set the path parameters.
+     * \param params The new encoded path parameter string.
+     * \throws url::UrlBadComponentException if the path \p params
+     *         contains an invalid character.
+     */
+    void
+    setPathParams(const std::string &params);
+
+    /**
+     * \brief Set the path parameters.
+     * \param pvec The vector with encoded path parameters.
+     * \throws url::UrlBadComponentException if the \p pvec
+     *         contains an invalid character.
+     */
+    void
+    setPathParamsVec(const zypp::url::ParamVec &pvec);
+
+    /**
+     * \brief Set the path parameters.
+     * \param pmap The map with decoded path parameters.
+     * \throws url::UrlNotSupportedException if parameter parsing
+     *         is not supported for a URL (scheme).
+     */
+    void
+    setPathParamsMap(const zypp::url::ParamMap &pmap);
+
+    /**
+     * \brief Set or add value for the specified path parameter.
+     * \param param The decoded path parameter name.
+     * \param value The decoded path parameter value.
+     * \throws url::UrlNotSupportedException if parameter parsing
+     *         is not supported for a URL (scheme).
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    void
+    setPathParam(const std::string &param, const std::string &value);
+
+
+    // -----------------
+    /**
+     * \brief Set the query string in the URL.
+     * \param querystr The new encoded query string.
+     * \throws url::UrlBadComponentException if the \p querystr
+     *         contains an invalid character.
+     */
+    void
+    setQueryString(const std::string &querystr);
+
+    /**
+     * \brief Set the query parameters.
+     * \param qvec The vector with encoded query parameters.
+     * \throws url::UrlBadComponentException if the \p qvec
+     *         contains an invalid character.
+     */
+    void
+    setQueryStringVec(const zypp::url::ParamVec &qvec);
+
+    /**
+     * \brief Set the query parameters.
+     * \param qmap The map with decoded query parameters.
+     * \throws url::UrlNotSupportedException if parameter parsing
+     *         is not supported for a URL (scheme).
+     */
+    void
+    setQueryStringMap(const zypp::url::ParamMap &qmap);
+
+    /**
+     * \brief Set or add value for the specified query parameter.
+     * \param param The decoded query parameter name.
+     * \param value The decoded query parameter value.
+     * \throws url::UrlNotSupportedException if parameter parsing
+     *         is not supported for a URL (scheme).
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    void
+    setQueryParam(const std::string &param, const std::string &value);
+
+    /**
+     * \brief remove the specified query parameter.
+     * \param param The decoded query parameter name.
+     * \throws url::UrlNotSupportedException if parameter parsing
+     *         is not supported for a URL (scheme).
+     * \throws url::UrlDecodingException if the decoded result string
+     *         would contain a '\\0' character.
+     */
+    void
+    delQueryParam(const std::string &param);
+
+
+    // -----------------
+    /**
+     * \brief Set the fragment string in the URL.
+     * \param fragment The new fragment string.
+     * \param eflag If the \p fragment is encoded or not.
+     * \throws url::UrlBadComponentException if the \p fragment
+     *         contains an invalid character.
+     */
+    void
+    setFragment(const std::string &fragment,
+                EEncoding         eflag = zypp::url::E_DECODED);
+
+
+    // -----------------
+    /**
+     * Return the view options of the current object.
+     *
+     * This method is used to query the view options
+     * used by the asString() method.
+     *
+     * \return The current view option combination.
+     */
+    ViewOptions
+    getViewOptions() const;
+
+    /**
+     * Change the view options of the current object.
+     *
+     * This method is used to change the view options
+     * used by the asString() method.
+     *
+     * \param vopts New view options combination.
+     */
+    void
+    setViewOptions(const ViewOptions &vopts);
+
+  private:
+    friend std::string hotfix1050625::asString( const Url & url_r );
+    url::UrlRef m_impl;
+  };
+
+  std::ostream & operator<<( std::ostream & str, const Url & url );
+
+  /**
+   * needed for std::set
+   */
+  bool operator<( const Url &lhs, const Url &rhs );
+
+  /**
+   * needed for find
+   */
+  bool operator==( const Url &lhs, const Url &rhs );
+
+
+  bool operator!=( const Url &lhs, const Url &rhs );
+
+  ////////////////////////////////////////////////////////////////////
+} // namespace zypp
+//////////////////////////////////////////////////////////////////////
+
+#endif /* ZYPP_URL_H */
+/*
+** vim: set ts=2 sts=2 sw=2 ai et:
+*/
similarity index 85%
rename from zypp/base/CleanerThread.cc
rename to zypp-core/base/CleanerThread.cc
index 67b9296..8c68d33 100644 (file)
@@ -9,7 +9,9 @@
 /** \file      zypp/base/CleanerThread.cc
  */
 
-#include <zypp/base/CleanerThread_p.h>
+#include <zypp-core/base/CleanerThread_p.h>
+#include <zypp-core/zyppng/base/private/threaddata_p.h>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
 #include <algorithm>
 #include <thread>
 #include <mutex>
@@ -39,6 +41,11 @@ struct CleanerData
 
   void run ()
   {
+    // force the kernel to pick another thread to handle those signals
+    zyppng::blockSignalsForCurrentThread( { SIGTERM, SIGINT, SIGPIPE, } );
+
+    zyppng::ThreadData::current().setName("Zypp-Cleaner");
+
     std::unique_lock<std::mutex> lk( _m );
 
     while ( true )
similarity index 96%
rename from zypp/base/CleanerThread_p.h
rename to zypp-core/base/CleanerThread_p.h
index 3e194dd..d5669ae 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <unistd.h>
 
-#include <zypp/APIConfig.h>
+#include <zypp-core/Globals.h>
 
 namespace zypp
 {
diff --git a/zypp-core/base/Easy.h b/zypp-core/base/Easy.h
new file mode 100644 (file)
index 0000000..0b1898d
--- /dev/null
@@ -0,0 +1,116 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Easy.h
+ *
+*/
+#ifndef ZYPP_BASE_EASY_H
+#define ZYPP_BASE_EASY_H
+
+#include <cstdio>
+#include <type_traits>
+
+/** Convenient for-loops using iterator.
+ * \code
+ *  std::set<std::string>; _store;
+ *  for_( it, _store.begin(), _store.end() )
+ *  {
+ *    cout << *it << endl;
+ *  }
+ * \endcode
+*/
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
+#define for_(IT,BEG,END) for ( __typeof__(BEG) IT = BEG, _for_end = END; IT != _for_end; ++IT )
+#else
+#define for_(IT,BEG,END) for ( auto IT = BEG, _for_end = END; IT != _for_end; ++IT )
+#endif
+#define for_each_(IT,CONT) for_( IT, (CONT).begin(), (CONT).end() )
+
+/** Simple C-array iterator
+ * \code
+ *  const char * defstrings[] = { "",  "a", "default", "two words" };
+ *  for_( it, arrayBegin(defstrings), arrayEnd(defstrings) )
+ *    cout << *it << endl;
+ * \endcode
+*/
+#define arrayBegin(A) (&A[0])
+#define arraySize(A)  (sizeof(A)/sizeof(*A))
+#define arrayEnd(A)   (&A[0] + arraySize(A))
+
+/**
+ * \code
+ * defConstStr( strANY(), "ANY" );
+ * std::str str = strANY();
+ * \endcode
+ */
+#define defConstStr(FNC,STR) inline const std::string & FNC { static const std::string val( STR ); return val; }
+
+#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100  + __GNUC_PATCHLEVEL__)
+#if GCC_VERSION < 40600 || not defined(__GXX_EXPERIMENTAL_CXX0X__)
+#define nullptr NULL
+#endif
+
+/** Delete copy ctor and copy assign */
+#define NON_COPYABLE(CLASS)                    \
+  CLASS( const CLASS & ) = delete;             \
+  CLASS & operator=( const CLASS & ) = delete
+
+/** Default copy ctor and copy assign */
+#define DEFAULT_COPYABLE(CLASS)                        \
+  CLASS( const CLASS & ) = default;            \
+  CLASS & operator=( const CLASS & ) = default
+
+/** Delete move ctor and move assign */
+#define NON_MOVABLE(CLASS)                     \
+  CLASS( CLASS && ) = delete;                  \
+  CLASS & operator=( CLASS && ) = delete
+
+/** Default move ctor and move assign */
+#define DEFAULT_MOVABLE(CLASS)                 \
+  CLASS( CLASS && ) = default;                 \
+  CLASS & operator=( CLASS && ) = default
+
+/** Delete copy ctor and copy assign but enable default move */
+#define NON_COPYABLE_BUT_MOVE( CLASS )                 \
+  NON_COPYABLE(CLASS);                         \
+  DEFAULT_MOVABLE(CLASS)
+
+/** Default move ctor and move assign but enable default copy */
+#define NON_MOVABLE_BUT_COPY( CLASS )          \
+  NON_MOVABLE(CLASS);                          \
+  DEFAULT_COPYABLE(CLASS)
+
+
+/** Prevent an universal ctor to be chosen as copy ctor.
+ * \code
+ *  struct FeedStrings
+ *  {
+ *    template<typename TARG, typename X = disable_use_as_copy_ctor<FeedStrings,TARG>>
+ *    FeedStrings( TARG && arg_r )
+ *    : _value { std::forward<TARG>( arg_r ) }
+ *    {}
+ *
+ *    // Same with variadic template. Could be chosen as copy_ctor.
+ *    template<typename ... Us>
+ *    FeedStrings( Us &&... us )
+ *    : ...
+ *
+ *  private:
+ *    std::string _value;
+ * \endcode
+ */
+template<typename TBase, typename TDerived>
+using disable_use_as_copy_ctor = typename std::enable_if<!std::is_base_of<TBase,typename std::remove_reference<TDerived>::type>::value>::type;
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_EASY_H
diff --git a/zypp-core/base/EnumClass.h b/zypp-core/base/EnumClass.h
new file mode 100644 (file)
index 0000000..fbcc37e
--- /dev/null
@@ -0,0 +1,91 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/EnumClass.h
+ */
+#ifndef ZYPP_BASE_ENUMCLASS_H
+#define ZYPP_BASE_ENUMCLASS_H
+
+#include <iosfwd>
+
+#include <zypp-core/base/PtrTypes.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{
+  ///////////////////////////////////////////////////////////////////
+  namespace base
+  {
+    ///////////////////////////////////////////////////////////////////
+    /// \class EnumClass
+    /// \brief Type safe enum (workaround SWIG not supporting enum class)
+    /// \code
+    /// struct EColorDef { enum Enum { R, G ,B }; };
+    /// typedef EnumClass<EColorDef> Color;
+    /// \endcode
+    /// Conversion to from string can be easily added, e.g. like this:
+    /// \code
+    /// struct EColorDef {
+    ///   enum Enum { R, G ,B };
+    ///   static Enum fromString( const std::string & val_r );
+    ///   static const std::string & asString( Enum val_r );
+    /// };
+    /// std::ostream & operator<<( std::ostream & str, const EColorDef & obj )
+    /// { return str << EColorDef::asString( obj.inSwitch() ); }
+    ///
+    /// typedef EnumClass<EColorDef> Color;
+    /// Color red = Color::fromString("red");
+    /// cout << red << endl; // "red"
+    /// \endcode
+    ///////////////////////////////////////////////////////////////////
+    template<typename TEnumDef>
+    class EnumClass : public TEnumDef
+    {
+    public:
+      typedef typename TEnumDef::Enum Enum;            ///< The underlying enum type
+      typedef typename std::underlying_type<Enum>::type Integral;///< The underlying integral type
+
+      EnumClass( Enum val_r ) : _val( val_r ) {}
+
+      /** Underlying enum value for use in switch
+       * \code
+       * struct EColorDef { enum Enum { R, G ,B }; }
+       * typedef EnumClass<EColorDef> Color;
+       *
+       * Color a;
+       * switch ( a.asEnum() )
+       * \endcode
+       */
+      Enum asEnum() const { return _val; }
+
+      /** Underlying integral value (e.g. array index)
+       * \code
+       * struct EColorDef { enum Enum { R, G ,B }; }
+       * typedef EnumClass<EColorDef> Color;
+       *
+       * Color a;
+       * std::string table[] = { "red", "green", "blue" };
+       * std::cout << table[a.asIntegral()] << std::endl;
+       */
+      Integral asIntegral() const { return static_cast<Integral>(_val); }
+
+      friend bool operator==( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val == rhs._val; }
+      friend bool operator!=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val != rhs._val; }
+      friend bool operator< ( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val <  rhs._val; }
+      friend bool operator<=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val <= rhs._val; }
+      friend bool operator> ( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val >  rhs._val; }
+      friend bool operator>=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val >= rhs._val; }
+
+    private:
+      Enum _val;
+    };
+  } // namespace base
+  ///////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_ENUMCLASS_H
diff --git a/zypp-core/base/Errno.h b/zypp-core/base/Errno.h
new file mode 100644 (file)
index 0000000..aecc31c
--- /dev/null
@@ -0,0 +1,65 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Errno.h
+ *
+*/
+#ifndef ZYPP_BASE_ERRNO_H
+#define ZYPP_BASE_ERRNO_H
+
+#include <cerrno>
+#include <iosfwd>
+
+#include <zypp-core/base/String.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  /** Convenience \c errno wrapper. */
+  class Errno
+  {
+    public:
+      /** Default ctor: \c errno */
+      Errno() : _errno( errno ) {}
+
+      /** Ctor set to \c errno if error condition, else \c 0.
+       * \code
+       *  int ret = ::write( fd, buffer, size );
+       *  DBG << "write returns: " << Errno( ret != size ) << end;
+       *  // on success:    "write returns: [0-Success]"
+       *  // on error e.g.: "write returns: [11-Resource temporarily unavailable]"
+       * \endcode
+       */
+      Errno( bool error_r ) : _errno( error_r ? errno : 0 ) {}
+
+      /** Ctor taking an explicit errno value. */
+      Errno( int errno_r ) : _errno( errno_r ) {}
+
+    public:
+      /** Return the stored errno. */
+      int get() const { return _errno; }
+
+      /** Allow implicit conversion to \c int. */
+      operator int() const { return get(); }
+
+      /** Return human readable error string. */
+      std::string asString() const { return str::form( "[%d-%s]", _errno, ::strerror(_errno) ); }
+
+    private:
+      int _errno;
+  };
+
+  /** \relates Errno Stream output */
+  inline std::ostream & operator<<( std::ostream & str, const Errno & obj )
+  { return str << obj.asString(); }
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_ERRNO_H
similarity index 96%
rename from zypp/base/Exception.cc
rename to zypp-core/base/Exception.cc
index e6341f5..7a8f6a6 100644 (file)
 #include <iostream>
 #include <sstream>
 
-#include <zypp/base/Logger.h>
-#include <zypp/base/LogTools.h>
-#include <zypp/base/Gettext.h>
-#include <zypp/base/String.h>
-#include <zypp/base/Exception.h>
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/LogTools.h>
+#include <zypp-core/base/Gettext.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/Exception.h>
 
 using std::endl;
 
diff --git a/zypp-core/base/Exception.h b/zypp-core/base/Exception.h
new file mode 100644 (file)
index 0000000..0cce99f
--- /dev/null
@@ -0,0 +1,428 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/base/Exception.h
+ *
+*/
+#ifndef ZYPP_BASE_EXCEPTION_H
+#define ZYPP_BASE_EXCEPTION_H
+
+#include <iosfwd>
+#include <string>
+#include <list>
+#include <stdexcept>
+#include <typeinfo>
+#include <type_traits>
+
+#include <zypp-core/base/Errno.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace exception_detail
+  { /////////////////////////////////////////////////////////////////
+
+    /** Keep _FILE_, _FUNCTION_ and _LINE_.
+     * Construct it using the \ref ZYPP_EX_CODELOCATION macro.
+    */
+    struct CodeLocation
+    {
+      friend std::ostream & operator<<( std::ostream & str, const CodeLocation & obj );
+
+      /** Ctor */
+      CodeLocation()
+      : _line( 0 )
+      {}
+
+      /** Ctor */
+      CodeLocation( const std::string & file_r,
+                    const std::string & func_r,
+                    unsigned            line_r )
+      : _file( file_r ), _func( func_r ), _line( line_r )
+      {}
+
+      /** Location as string */
+      std::string asString() const;
+
+    private:
+      std::string _file;
+      std::string _func;
+      unsigned    _line;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /** Create CodeLocation object storing the current location. */
+    //#define ZYPP_EX_CODELOCATION ::zypp::exception_detail::CodeLocation(__FILE__,__FUNCTION__,__LINE__)
+#define ZYPP_EX_CODELOCATION ::zypp::exception_detail::CodeLocation(( *__FILE__ == '/' ? strrchr( __FILE__, '/' ) + 1 : __FILE__ ),__FUNCTION__,__LINE__)
+
+    /** \relates CodeLocation Stream output */
+    std::ostream & operator<<( std::ostream & str, const CodeLocation & obj );
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace exception_detail
+  ///////////////////////////////////////////////////////////////////
+
+  ///////////////////////////////////////////////////////////////////
+  //
+  //   CLASS NAME : Exception
+  /** Base class for Exception.
+   *
+   * Exception offers to store a message string passed to the ctor.
+   * Derived classes may provide additional information. Overload
+   * \ref dumpOn to provide a proper error text.
+   *
+   * \li Use \ref ZYPP_THROW to throw exceptions.
+   * \li Use \ref ZYPP_CAUGHT If you caught an exceptions in order to handle it.
+   * \li Use \ref ZYPP_RETHROW to rethrow a caught exception.
+   *
+   * The use of these macros is not mandatory. but \c ZYPP_THROW and
+   * \c ZYPP_RETHROW will adjust the code location information stored in
+   * the Exception. All three macros will drop a line in the logfile.
+
+   * \code
+   *  43   try
+   *  44     {
+   *  45       try
+   *  46         {
+   *  47           ZYPP_THROW( Exception("Something bad happened.") );
+   *  48         }
+   *  49       catch ( Exception & excpt )
+   *  50         {
+   *  51           ZYPP_RETHROW( excpt );
+   *  52         }
+   *  53
+   *  54     }
+   *  55   catch ( Exception & excpt )
+   *  56     {
+   *  57       ZYPP_CAUGHT( excpt );
+   *  58     }
+   * \endcode
+   * The above produces the following log lines:
+   * \code
+   *  Main.cc(main):47 THROW:    Main.cc(main):47: Something bad happened.
+   *  Main.cc(main):51 RETHROW:  Main.cc(main):47: Something bad happened.
+   *  Main.cc(main):57 CAUGHT:   Main.cc(main):51: Something bad happened.
+   * \endcode
+   *
+   *
+   * Class Exception now offers a history list of message strings.
+   * These messages should describe what lead to the exception.
+   *
+   * The Exceptions message itself is NOT included in the history.
+   *
+   * Rethrow, remembering an old exception:
+   * \code
+   * try
+   * {
+   *   ....
+   * }
+   * catch( const Exception & olderr_r )
+   * {
+   *    ZYPP_CAUGHT( olderr_r )
+   *    HighLevelException newerr( "Something failed." );
+   *    newerr.rember( olderr_r );
+   *    ZYPP_THROW( newerr );
+   * }
+   * \endcode
+   *
+   * Print an Exception followed by it's history if available:
+   * \code
+   * Exception error;
+   * ERR << error << endl << error.historyAsString();
+   * \endcode
+   *
+   * \todo That's a draft to have a common way of throwing exceptions.
+   * Most probabely we'll finally use blocxx exceptions. Here, but not
+   * in the remaining code of zypp. If we can we should try to wrap
+   * the blocxx macros and typedef the classes in here.
+   **/
+  class Exception : public std::exception
+  {
+    friend std::ostream & operator<<( std::ostream & str, const Exception & obj );
+
+  public:
+    typedef exception_detail::CodeLocation CodeLocation;
+    typedef std::list<std::string>         History;
+    typedef History::const_iterator        HistoryIterator;
+    typedef History::size_type             HistorySize;
+
+    /** Default ctor.
+     * Use \ref ZYPP_THROW to throw exceptions.
+    */
+    Exception();
+
+    /** Ctor taking a message.
+     * Use \ref ZYPP_THROW to throw exceptions.
+    */
+    Exception( const std::string & msg_r );
+    /** \overload */
+    Exception( std::string && msg_r );
+
+    /** Ctor taking a message and an exception to remember as history
+     * \see \ref remember
+     * Use \ref ZYPP_THROW to throw exceptions.
+    */
+    Exception( const std::string & msg_r, const Exception & history_r );
+    /** \overload moving */
+    Exception( std::string && msg_r, const Exception & history_r );
+    /** \overload moving */
+    Exception( const std::string & msg_r, Exception && history_r );
+    /** \overload moving */
+    Exception( std::string && msg_r, Exception && history_r );
+
+    /** Dtor. */
+    virtual ~Exception() throw();
+
+    /** Return CodeLocation. */
+    const CodeLocation & where() const
+    { return _where; }
+
+    /** Exchange location on rethrow. */
+    void relocate( const CodeLocation & where_r ) const
+    { _where = where_r; }
+
+    /** Return the message string provided to the ctor.
+     * \note This is not necessarily the complete error message.
+     * The whole error message is provided by \ref asString or
+     * \ref dumpOn.
+    */
+    const std::string & msg() const
+    { return _msg; }
+
+    /** Error message provided by \ref dumpOn as string. */
+    std::string asString() const;
+
+    /** Translated error message as string suitable for the user.
+     * \see \ref asUserStringHistory
+    */
+    std::string asUserString() const;
+
+  public:
+    /** \name History list of message strings.
+     * Maintain a simple list of individual error messages, that lead
+     * to this Exception. The Exceptions message itself is not included
+     * in the history. The History list stores the most recent message
+     * fist.
+     */
+    //@{
+
+    /** Store an other Exception as history. */
+    void remember( const Exception & old_r );
+    /** \overload moving */
+    void remember( Exception && old_r );
+
+    /** Add some message text to the history. */
+    void addHistory( const std::string & msg_r );
+    /** \overload moving */
+    void addHistory( std::string && msg_r );
+
+    /** \ref addHistory from string container types (oldest first) */
+    template<class TContainer>
+    void addToHistory( const TContainer & msgc_r )
+    {
+      for ( const std::string & el : msgc_r )
+       addHistory( el );
+    }
+    /** \ref addHistory from string container types (oldest first) moving */
+    template<class TContainer>
+    void moveToHistory( TContainer && msgc_r )
+    {
+      for ( std::string & el : msgc_r )
+       addHistory( std::move(el) );
+    }
+
+    /** Iterator pointing to the most recent message. */
+    HistoryIterator historyBegin() const
+    { return _history.begin(); }
+
+    /** Iterator pointing behind the last message. */
+    HistoryIterator historyEnd() const
+    { return _history.end(); }
+
+    /** Whether the history list is empty. */
+    bool historyEmpty() const
+    { return _history.empty(); }
+
+    /** The size of the history list. */
+    HistorySize historySize() const
+    { return _history.size(); }
+
+    /** The history as string. Empty if \ref historyEmpty.
+     * Otherwise:
+     * \code
+     * History:
+     *  - most recent message
+     *  - 2nd message
+     * ...
+     *  - oldest message
+     * \endcode
+    */
+    std::string historyAsString() const;
+
+    /** A single (multiline) string composed of \ref asUserString  and  \ref historyAsString. */
+    std::string asUserHistory() const;
+    //@}
+
+  protected:
+
+    /** Overload this to print a proper error message. */
+    virtual std::ostream & dumpOn( std::ostream & str ) const;
+
+  public:
+     /** Make a string from \a errno_r. */
+    static std::string strErrno( int errno_r );
+     /** Make a string from \a errno_r and \a msg_r. */
+    static std::string strErrno( int errno_r, const std::string & msg_r );
+    /** \overload moving */
+    static std::string strErrno( int errno_r, std::string && msg_r );
+
+  public:
+    /** Drop a logline on throw, catch or rethrow.
+     * Used by \ref ZYPP_THROW macros.
+    */
+    static void log( const Exception & excpt_r, const CodeLocation & where_r,
+                     const char *const prefix_r );
+    /** \overrload for not-Exception types thrown via ZYPP_THROW */
+    static void log( const char * typename_r, const CodeLocation & where_r,
+                     const char *const prefix_r );
+  private:
+    mutable CodeLocation _where;
+    std::string          _msg;
+    History              _history;
+
+    /** Return message string. */
+    virtual const char * what() const throw()
+    { return _msg.c_str(); }
+
+    /** Called by <tt>std::ostream & operator\<\<</tt>.
+     * Prints \ref CodeLocation and the error message provided by
+     * \ref dumpOn.
+    */
+    std::ostream & dumpError( std::ostream & str ) const;
+  };
+  ///////////////////////////////////////////////////////////////////
+
+  /** \relates Exception Stream output */
+  std::ostream & operator<<( std::ostream & str, const Exception & obj );
+
+  ///////////////////////////////////////////////////////////////////
+  namespace exception_detail
+  {
+    /** SFINAE: Hide template signature unless \a TExcpt is derived from \ref Exception. */
+    template<class TExcpt>
+    using EnableIfIsException = typename std::enable_if< std::is_base_of<Exception,TExcpt>::value, int>::type;
+
+    /** SFINAE: Hide template signature if \a TExcpt is derived from  \ref Exception. */
+    template<class TExcpt>
+    using EnableIfNotException = typename std::enable_if< !std::is_base_of<Exception,TExcpt>::value, int>::type;
+
+
+    /** Helper for \ref ZYPP_THROW( Exception ). */
+    template<class TExcpt, EnableIfIsException<TExcpt> = 0>
+    void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn));
+    template<class TExcpt, EnableIfIsException<TExcpt>>
+    void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r )
+    {
+      excpt_r.relocate( where_r );
+      Exception::log( excpt_r, where_r, "THROW:   " );
+      throw( excpt_r );
+    }
+
+    /** Helper for \ref ZYPP_THROW( not Exception ). */
+    template<class TExcpt, EnableIfNotException<TExcpt> = 0>
+    void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn));
+    template<class TExcpt, EnableIfNotException<TExcpt>>
+    void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r )
+    {
+      Exception::log( typeid(excpt_r).name(), where_r, "THROW:   " );
+      throw( excpt_r );
+    }
+
+
+    /** Helper for \ref ZYPP_THROW( Exception ). */
+    template<class TExcpt, EnableIfIsException<TExcpt> = 0>
+    void do_ZYPP_CAUGHT( const TExcpt & excpt_r, const CodeLocation & where_r )
+    {
+      Exception::log( excpt_r, where_r, "CAUGHT:  " );
+    }
+
+    /** Helper for \ref ZYPP_THROW( not Exception ). */
+    template<class TExcpt, EnableIfNotException<TExcpt> = 0>
+    void do_ZYPP_CAUGHT( const TExcpt & excpt_r, const CodeLocation & where_r )
+    {
+      Exception::log( typeid(excpt_r).name(), where_r, "CAUGHT:  " );
+    }
+
+
+    /** Helper for \ref ZYPP_THROW( Exception ). */
+    template<class TExcpt, EnableIfIsException<TExcpt> = 0>
+    void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn));
+    template<class TExcpt, EnableIfIsException<TExcpt>>
+    void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r )
+    {
+      Exception::log( excpt_r, where_r, "RETHROW: " );
+      excpt_r.relocate( where_r );
+      throw;
+    }
+
+    /** Helper for \ref ZYPP_THROW( not Exception ). */
+    template<class TExcpt, EnableIfNotException<TExcpt> = 0>
+    void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn));
+    template<class TExcpt, EnableIfNotException<TExcpt>>
+    void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r )
+    {
+      Exception::log( excpt_r, where_r, "RETHROW: " );
+      throw;
+    }
+  } // namespace exception_detail
+  ///////////////////////////////////////////////////////////////////
+
+  /** \defgroup ZYPP_THROW ZYPP_THROW macros
+   * Macros for throwing Exception.
+   * \see \ref zypp::Exception for an example.
+  */
+  //@{
+  /** Drops a logline and throws the Exception. */
+#define ZYPP_THROW(EXCPT)\
+  ::zypp::exception_detail::do_ZYPP_THROW( EXCPT, ZYPP_EX_CODELOCATION )
+
+  /** Drops a logline telling the Exception was caught (in order to handle it). */
+#define ZYPP_CAUGHT(EXCPT)\
+  ::zypp::exception_detail::do_ZYPP_CAUGHT( EXCPT, ZYPP_EX_CODELOCATION )
+
+  /** Drops a logline and rethrows, updating the CodeLocation. */
+#define ZYPP_RETHROW(EXCPT)\
+  ::zypp::exception_detail::do_ZYPP_RETHROW( EXCPT, ZYPP_EX_CODELOCATION )
+
+
+  /** Throw Exception built from a message string. */
+#define ZYPP_THROW_MSG(EXCPTTYPE, MSG)\
+  ZYPP_THROW( EXCPTTYPE( MSG ) )
+
+  /** Throw Exception built from errno. */
+#define ZYPP_THROW_ERRNO(EXCPTTYPE)\
+  ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(errno) ) )
+
+  /** Throw Exception built from errno provided as argument. */
+#define ZYPP_THROW_ERRNO1(EXCPTTYPE, ERRNO)\
+  ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(ERRNO) ) )
+
+  /** Throw Exception built from errno and a message string. */
+#define ZYPP_THROW_ERRNO_MSG(EXCPTTYPE, MSG)\
+  ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(errno,MSG) ) )
+
+  /** Throw Exception built from errno provided as argument and a message string */
+#define ZYPP_THROW_ERRNO_MSG1(EXCPTTYPE, ERRNO,MSG)\
+  ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(ERRNO,MSG) ) )
+  //@}
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_EXCEPTION_H
similarity index 96%
rename from zypp/base/ExternalDataSource.cc
rename to zypp-core/base/ExternalDataSource.cc
index 69a30b7..3a12e22 100644 (file)
@@ -22,9 +22,9 @@
 #include <sstream>
 #include <string>
 
-#include <zypp/base/Logger.h>
-#include <zypp/base/ExternalDataSource.h>
-#include <zypp/AutoDispose.h>
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/ExternalDataSource.h>
+#include <zypp-core/AutoDispose.h>
 
 using std::endl;
 
diff --git a/zypp-core/base/ExternalDataSource.h b/zypp-core/base/ExternalDataSource.h
new file mode 100644 (file)
index 0000000..53db998
--- /dev/null
@@ -0,0 +1,130 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/base/ExternalDataSource.h
+ */
+
+#ifndef ZYPP_EXTERNALDATASOURCE_H
+#define ZYPP_EXTERNALDATASOURCE_H
+
+#include <stdio.h>
+
+#include <string>
+#include <optional>
+#include <zypp-core/base/IOTools.h>
+
+namespace zypp {
+  namespace externalprogram {
+
+    /**
+     * @short Bidirectional stream to external data
+     */
+    class ExternalDataSource
+    {
+    protected:
+      FILE *inputfile;
+      FILE *outputfile;
+
+    private:
+      char *linebuffer;
+      size_t linebuffer_size;
+
+    public:
+      /**
+       * Create a new instance.
+       * @param inputfile The stream for reading
+       * @param outputfile The stream for writing
+       * Either can be NULL if no reading/writing is allowed.
+       */
+      ExternalDataSource( FILE *inputfile = 0, FILE *outputfile = 0 );
+
+      /**
+       * Implicitly close the connection.
+       */
+      virtual ~ExternalDataSource ();
+
+      /**
+       * Send some data to the output stream.
+       * @param buffer The data to send
+       * @param length The size of it
+       */
+      bool send( const char *buffer, size_t length );
+
+      /**
+       * Send some data down the stream.
+       * @param string The data to send
+       */
+      bool send( std::string s );
+
+      /**
+       * Read some data from the input stream.
+       * @param buffer Where to put the data
+       * @param length How much to read at most
+       * Returns the amount actually received
+       */
+      size_t receive( char *buffer, size_t length );
+
+      /**
+       * Read one line from the input stream.
+       * Returns the line read, including the terminator.
+       */
+      std::string receiveLine();
+
+      /**
+       * Read one line from the input stream.
+       * Returns the line read, including the terminator.
+       * \note The delimiter is not removed from the string.
+       * \note The \a timeout value is to be specified in milliseconds.
+       * \throws io::TimeoutException if the timeout is reached
+       */
+      std::string receiveLine( io::timeout_type timeout );
+
+      /**
+       * Read characters into a string until delimiter \a c or EOF is
+       * read.
+       * \note The delimiter is not removed from the string.
+       */
+      std::string receiveUpto( char c );
+
+      /**
+       * Read characters into a string until delimiter \a c or EOF is
+       * read or the \a timeout is reached.
+       * \note The delimiter is not removed from the string.
+       * \note The \a timeout value is to be specified in milliseconds.
+       * \throws io::TimeoutException if the timeout is reached
+       */
+      std::string receiveUpto( char c, io::timeout_type timeout );
+
+      /**
+       * Set the blocking mode of the input stream.
+       * @param mode True if the reader should be blocked waiting for input.
+       * This is the initial default.
+       */
+      void setBlocking( bool mode );
+
+      /**
+       * Close the input and output streams.
+       */
+      virtual int close();
+
+      /**
+       * Return the input stream.
+       */
+      FILE *inputFile() const  { return inputfile; }
+
+      /**
+       * Return the output stream.
+       */
+      FILE *outputFile() const { return outputfile; }
+    };
+
+  } // namespace externalprogram
+} // namespace zypp
+
+#endif // ZYPP_EXTERNALDATASOURCE_H
+
diff --git a/zypp-core/base/Flags.h b/zypp-core/base/Flags.h
new file mode 100644 (file)
index 0000000..701acd3
--- /dev/null
@@ -0,0 +1,199 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Flags.h
+ *
+*/
+#ifndef ZYPP_BASE_FLAGS_H
+#define ZYPP_BASE_FLAGS_H
+
+#include <zypp-core/base/String.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace base
+  { /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : Flags<Enum>
+    //
+    /** A type-safe way of storing OR-combinations of enum values (like QTs QFlags).
+     * \see <a href="http://doc.trolltech.com/4.1/qflags.html">QFlags Class Reference</a>
+     * \code
+     *  class RpmDb
+     *  {
+     *    public:
+     *      enum DbStateInfoBits {
+     *        DbSI_NO_INIT     = 0x0000,
+     *        DbSI_HAVE_V4     = 0x0001,
+     *        DbSI_MADE_V4     = 0x0002,
+     *        DbSI_MODIFIED_V4 = 0x0004,
+     *        DbSI_HAVE_V3     = 0x0008,
+     *        DbSI_HAVE_V3TOV4 = 0x0010,
+     *        DbSI_MADE_V3TOV4 = 0x0020
+     *      };
+     *
+     *      ZYPP_DECLARE_FLAGS(DbStateInfo,DbStateInfoBits);
+     *  };
+     *  ZYPP_DECLARE_OPERATORS_FOR_FLAGS(RpmDb::DbStateInfo);
+     *
+     *  ...
+     *  enum Other { OTHERVAL = 13 };
+     *  {
+     *    XRpmDb::DbStateInfo s;
+     *    s = XRpmDb::DbSI_MODIFIED_V4|XRpmDb::DbSI_HAVE_V4;
+     *    // s |= OTHERVAL; // As desired: it does not compile
+     *  }
+     * \endcode
+     */
+    template<typename TEnum>
+    class Flags
+    {
+      public:
+        typedef TEnum Enum;    ///< The underlying enum type
+        typedef typename std::underlying_type<Enum>::type Integral;    ///< The underlying integral type
+
+      public:
+        constexpr Flags()                              : _val( 0 ) {}
+        constexpr Flags( Enum flag_r )                 : _val( integral(flag_r) ) {}
+        constexpr explicit Flags( Integral flag_r )    : _val( flag_r ) {}
+
+        constexpr static Flags none()                  { return Flags( Integral(0) ); }
+        constexpr static Flags all()                   { return Flags( ~Integral(0) ); }
+
+        constexpr bool isNone() const                  { return _val == Integral(0); }
+        constexpr bool isAll() const                   { return _val == ~Integral(0); }
+
+        Flags & operator&=( Flags rhs )                        { _val &= integral(rhs); return *this; }
+        Flags & operator&=( Enum rhs )                 { _val &= integral(rhs); return *this; }
+
+        Flags & operator|=( Flags rhs )                        { _val |= integral(rhs); return *this; }
+        Flags & operator|=( Enum rhs )                 { _val |= integral(rhs); return *this; }
+
+        Flags & operator^=( Flags rhs )                        { _val ^= integral(rhs); return *this; }
+        Flags & operator^=( Enum rhs )                 { _val ^= integral(rhs); return *this; }
+
+      public:
+        constexpr operator Integral() const            { return _val; }
+
+        constexpr Flags operator&( Flags rhs ) const   { return Flags( _val & integral(rhs) ); }
+        constexpr Flags operator&( Enum rhs ) const    { return Flags( _val & integral(rhs) ); }
+
+        constexpr Flags operator|( Flags rhs ) const   { return Flags( _val | integral(rhs) ); }
+        constexpr Flags operator|( Enum rhs ) const    { return Flags( _val | integral(rhs) ); }
+
+        constexpr Flags operator^( Flags rhs ) const   { return Flags( _val ^ integral(rhs) ); }
+        constexpr Flags operator^( Enum rhs ) const    { return Flags( _val ^ integral(rhs) ); }
+
+        constexpr Flags operator~() const              { return Flags( ~_val ); }
+
+        constexpr bool operator==( Enum rhs ) const    {  return( _val == integral(rhs) ); }
+        constexpr bool operator!=( Enum rhs ) const    {  return( _val != integral(rhs) ); }
+
+      public:
+        Flags & setFlag( Flags flag_r, bool newval_r ) { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); }
+        Flags & setFlag( Enum flag_r, bool newval_r )  { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); }
+
+        Flags & setFlag( Flags flag_r )                        { _val |= integral(flag_r); return *this; }
+        Flags & setFlag( Enum flag_r )                 { _val |= integral(flag_r); return *this; }
+
+        Flags & unsetFlag( Flags flag_r )              { _val &= ~integral(flag_r); return *this; }
+        Flags & unsetFlag( Enum flag_r )               { _val &= ~integral(flag_r); return *this; }
+
+        constexpr bool testFlag( Flags flag_r ) const  { return testFlag( integral(flag_r) ); }
+        constexpr bool testFlag( Enum flag_r ) const   { return testFlag( integral(flag_r) ); }
+
+      private:
+       constexpr bool testFlag( Integral flag ) const  { return flag ? ( _val & flag ) == flag : !_val; }
+
+       constexpr static Integral integral( Flags obj ) { return obj._val; }
+       constexpr static Integral integral( Enum obj )  { return static_cast<Integral>(obj); }
+
+        Integral _val;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates Flags Stringify
+     * Build a string of OR'ed names of each flag value set in \a flag_r.
+     * Remaining bits in \a flag_r are added as hexstring.
+     * \code
+     *          enum E { a=1, b=2, c=4 };
+     *   ZYPP_DECLARE_FLAGS( E, MyFlags );
+     *
+     *   MyFlags f = a|b|c;
+     *   cout << f << " = " << stringify( f, { {a,"A"}, {b,"B"} } ) << endl;
+     *   // prints: 0x0007 = [A|B|0x4]
+     * \endcode
+     */
+    template<typename Enum>
+    std::string stringify( const Flags<Enum> & flag_r, const std::initializer_list<std::pair<Flags<Enum>,std::string> > & flaglist_r = {},
+                          std::string intro_r = "[", std::string sep_r = "|", std::string extro_r = "]" )
+    {
+      std::string ret( std::move(intro_r) );
+      std::string sep;
+
+      Flags<Enum> mask;
+      for ( const auto & pair : flaglist_r )
+      {
+       if ( flag_r.testFlag( pair.first ) )
+       {
+         mask |= pair.first;
+         ret += sep;
+         ret += pair.second;
+         if ( sep.empty() && !sep_r.empty() )
+         { sep = std::move(sep_r); }
+       }
+      }
+      mask = flag_r & ~mask;
+      if ( mask )
+      {
+       ret += sep;
+       ret += str::hexstring( mask, 0 );
+      }
+      ret += std::move(extro_r);
+      return ret;
+    }
+
+    template<typename TEnum>
+    inline std::ostream & operator<<( std::ostream & str, const Flags<TEnum> & obj )
+    { return str << str::hexstring(obj); }
+
+    template<typename TEnum>
+    inline std::ostream & operator<<( std::ostream & str, const typename Flags<TEnum>::Enum & obj )
+    { return str << Flags<TEnum>(obj); }
+
+    /** \relates Flags */
+#define ZYPP_DECLARE_FLAGS(Name,Enum) typedef zypp::base::Flags<Enum> Name
+
+    /** \relates Flags */
+#define ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name) \
+inline constexpr bool operator==( Name::Enum lhs, Name rhs )           { return( rhs == lhs ); }       \
+inline constexpr bool operator!=(Name:: Enum lhs, Name rhs )           { return( rhs != lhs ); }       \
+inline constexpr Name operator&( Name::Enum lhs, Name::Enum rhs )      { return Name( lhs ) & rhs; }   \
+inline constexpr Name operator&( Name::Enum lhs, Name rhs )            { return rhs & lhs; }           \
+inline constexpr Name operator|( Name::Enum lhs, Name::Enum rhs )      { return Name( lhs ) | rhs; }   \
+inline constexpr Name operator|( Name::Enum lhs, Name rhs )            { return rhs | lhs; }           \
+inline constexpr Name operator^( Name::Enum lhs, Name::Enum rhs )      { return Name( lhs ) ^ rhs; }   \
+inline constexpr Name operator^( Name::Enum lhs, Name rhs )            { return rhs ^ lhs; }           \
+inline constexpr Name operator~( Name::Enum lhs )                      { return ~Name( lhs ); }
+
+    /** \relates Flags */
+#define ZYPP_DECLARE_FLAGS_AND_OPERATORS(Name,Enum) \
+    ZYPP_DECLARE_FLAGS(Name,Enum); \
+    ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name)
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace base
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_FLAGS_H
diff --git a/zypp-core/base/Function.h b/zypp-core/base/Function.h
new file mode 100644 (file)
index 0000000..3750cf1
--- /dev/null
@@ -0,0 +1,79 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Function.h
+ *
+*/
+#ifndef ZYPP_BASE_FUNCTION_H
+#define ZYPP_BASE_FUNCTION_H
+
+#include <boost/function.hpp>
+#define BOOST_BIND_GLOBAL_PLACEHOLDERS
+#include <boost/bind.hpp>
+#include <boost/ref.hpp>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  /* http://www.boost.org/doc/html/function.html
+
+   The Boost.Function library contains a family of class templates
+   that are function object wrappers. The notion is similar to a
+   generalized callback. It shares features with function pointers
+   in that both define a call interface (e.g., a function taking
+   two integer arguments and returning a floating-point value)
+   through which some implementation can be called, and the
+   implementation that is invoked may change throughout the
+   course of the program.
+
+   Generally, any place in which a function pointer would be used
+   to defer a call or make a callback, Boost.Function can be used
+   instead to allow the user greater flexibility in the implementation
+   of the target. Targets can be any 'compatible' function object
+   (or function pointer), meaning that the arguments to the interface
+   designated by Boost.Function can be converted to the arguments of
+   the target function object.
+  */
+  using boost::function;
+
+  /* http://www.boost.org/libs/bind/bind.html
+
+   boost::bind is a generalization of the standard functions std::bind1st
+   and std::bind2nd. It supports arbitrary function objects, functions,
+   function pointers, and member function pointers, and is able to bind
+   any argument to a specific value or route input arguments into arbitrary
+   positions. bind  does not place any requirements on the function object;
+   in particular, it does not need the result_type, first_argument_type and
+   second_argument_type  standard typedefs.
+  */
+  using boost::bind;
+
+  /* http://www.boost.org/doc/html/ref.html
+
+   The Ref library is a small library that is useful for passing references
+   to function templates (algorithms) that would usually take copies of their
+   arguments. It defines the class template boost::reference_wrapper<T>, the
+   two functions boost::ref and boost::cref that return instances of
+   boost::reference_wrapper<T>, and the two traits classes
+   boost::is_reference_wrapper<T>  and boost::unwrap_reference<T>.
+
+   The purpose of boost::reference_wrapper<T> is to contain a reference to an
+   object of type T. It is primarily used to "feed" references to function
+   templates (algorithms) that take their parameter by value.
+
+   To support this usage, boost::reference_wrapper<T> provides an implicit
+   conversion to T&. This usually allows the function templates to work on
+   references unmodified.
+  */
+  using boost::ref;
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_FUNCTION_H
similarity index 98%
rename from zypp/base/Gettext.cc
rename to zypp-core/base/Gettext.cc
index 49eb96c..8e88ebb 100644 (file)
@@ -17,7 +17,7 @@ extern "C" {
 #include <libintl.h>
 }
 
-#include <zypp/base/Gettext.h>
+#include <zypp-core/base/Gettext.h>
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
diff --git a/zypp-core/base/Gettext.h b/zypp-core/base/Gettext.h
new file mode 100644 (file)
index 0000000..4457131
--- /dev/null
@@ -0,0 +1,65 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Gettext.h
+ *
+ * Interface to gettext.
+ *
+*/
+#ifndef ZYPP_BASE_GETTEXT_H
+#define ZYPP_BASE_GETTEXT_H
+
+#ifdef ZYPP_DLL //defined if zypp is compiled as DLL
+
+/** Just tag text for translation. */
+#undef N_
+#define N_(MSG) MSG
+
+/** Return translated text. */
+#undef _
+#define _(MSG) ::zypp::gettext::dgettext( MSG )
+
+/** Return translated text (plural form). */
+#undef PL_
+#define PL_(MSG1,MSG2,N) ::zypp::gettext::dngettext( MSG1, MSG2, N )
+
+#else
+
+#ifndef N_
+#define N_(MSG) MSG
+#endif
+#ifndef _
+#define _(MSG) ::gettext( MSG )
+#endif
+#ifndef PL_
+#define PL_(MSG1,MSG2,N) ::ngettext( MSG1, MSG2, N )
+#endif
+
+#endif
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace gettext
+  { /////////////////////////////////////////////////////////////////
+
+    /** Return translated text. */
+    const char * dgettext( const char * msgid );
+
+    /** Return translated text (plural form). */
+    const char * dngettext( const char * msgid1, const char * msgid2,
+                            unsigned long n );
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace gettext
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_GETTEXT_H
diff --git a/zypp-core/base/Hash.h b/zypp-core/base/Hash.h
new file mode 100644 (file)
index 0000000..382e283
--- /dev/null
@@ -0,0 +1,50 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Hash.h
+ *
+*/
+#ifndef ZYPP_BASE_HASH_H
+#define ZYPP_BASE_HASH_H
+
+#include <iosfwd>
+#include <unordered_set>
+#include <unordered_map>
+
+/** Define hash function for id based classes.
+ * Class has to provide a method \c id() retuning a unique number.
+ * \code
+ *  // in global namespace define:
+ *  ZYPP_DEFINE_ID_HASHABLE( ::zypp::sat::Solvable )
+ * \endcode
+ */
+#define ZYPP_DEFINE_ID_HASHABLE(C)             \
+namespace std {                                        \
+  template<class Tp> struct hash;              \
+  template<> struct hash<C>                    \
+  {                                            \
+    size_t operator()( const C & __s ) const   \
+    { return __s.id(); }                       \
+  };                                           \
+}
+
+///////////////////////////////////////////////////////////////////
+namespace std
+{
+  /** clone function for RW_pointer */
+  template<class D>
+  inline unordered_set<D> * rwcowClone( const std::unordered_set<D> * rhs )
+  { return new std::unordered_set<D>( *rhs ); }
+
+  /** clone function for RW_pointer */
+  template<class K, class V>
+  inline std::unordered_map<K,V> * rwcowClone( const std::unordered_map<K,V> * rhs )
+  { return new std::unordered_map<K,V>( *rhs ); }
+} // namespace std
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_HASH_H
similarity index 97%
rename from zypp/base/IOStream.cc
rename to zypp-core/base/IOStream.cc
index 9a68d02..eb2bba0 100644 (file)
 #include <iostream>
 #include <boost/mpl/assert.hpp>
 #include <boost/mpl/int.hpp>
-//#include <zypp/base/Logger.h>
+//#include <zypp-core/base/Logger.h>
 
-#include <zypp/base/IOStream.h>
-#include <zypp/base/String.h>
+#include <zypp-core/base/IOStream.h>
+#include <zypp-core/base/String.h>
 
 using std::endl;
 ///////////////////////////////////////////////////////////////////
diff --git a/zypp-core/base/IOStream.h b/zypp-core/base/IOStream.h
new file mode 100644 (file)
index 0000000..d34ce32
--- /dev/null
@@ -0,0 +1,212 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/IOStream.h
+ *
+*/
+#ifndef ZYPP_BASE_IOSTREAM_H
+#define ZYPP_BASE_IOSTREAM_H
+
+#include <iosfwd>
+#include <boost/io/ios_state.hpp>
+
+#include <zypp-core/base/Flags.h>
+#include <zypp-core/base/PtrTypes.h>
+#include <zypp-core/base/Function.h>
+#include <zypp-core/base/NonCopyable.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  /** Iostream related utilities.
+  */
+  namespace iostr
+  { /////////////////////////////////////////////////////////////////
+
+    /** Save and restore streams \c width, \c precision
+     * and \c fmtflags.
+     */
+    typedef boost::io::ios_base_all_saver IosFmtFlagsSaver;
+
+
+    /** Read one line from stream.
+     *
+     * Reads everything up to the next newline or EOF. newline
+     * is read but not returned.
+     *
+     * \see \ref forEachLine
+     */
+    std::string getline( std::istream & str );
+
+    /** Copy istream to ostream.
+     * \return reference to the ostream.
+     */
+    inline std::ostream & copy( std::istream & from_r, std::ostream & to_r )
+    {
+      if ( from_r && to_r )
+      {
+        char ch;
+        while ( from_r && from_r.get( ch ) )
+          to_r.put( ch );
+      }
+      return to_r;
+    }
+
+    /** Copy istream to ostream, prefixing each line with \a indent_r (default <tt>"> "</tt> ).
+     * \return reference to the ostream.
+     */
+    inline std::ostream & copyIndent( std::istream & from_r, std::ostream & to_r, const std::string & indent_r = "> " )
+    {
+      if ( from_r && to_r )
+      {
+        char ch;
+        bool indent = true;
+        while ( from_r && from_r.get( ch ) )
+        {
+          if ( indent )
+            to_r << indent_r;
+          indent = ( ch == '\n' );
+          to_r.put( ch );
+        }
+      }
+      return to_r;
+    }
+
+    /** Copy istream to ostream, prefixing each line with \a indent_r (default <tt>"> "</tt> ).
+     * \return reference to the ostream.
+     */
+    inline void tee( std::istream & from_r, std::ostream & to1_r, std::ostream & to2_r )
+    {
+      if ( from_r && ( to1_r ||to2_r ) )
+      {
+        char ch;
+        while ( from_r && from_r.get( ch ) )
+        {
+          to1_r.put( ch );
+          to2_r.put( ch );
+        }
+      }
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : EachLine
+    //
+    /** Simple lineparser: Traverse each line in a file.
+     *
+     * \code
+     * std::ifstream infile( "somefile" );
+     * for( iostr::EachLine in( infile ); in; in.next() )
+     * {
+     *   DBG << *in << endl;
+     * }
+     * \endcode
+     */
+    class EachLine : private base::NonCopyable
+    {
+      public:
+       /** Ctor taking a stream and reading the 1st line from it. */
+       EachLine( std::istream & str_r, unsigned lineNo_r = 0 );
+
+       /** Whether \c this contains a valid line to consume. */
+       bool valid() const
+       { return _valid; }
+
+       /** Evaluate class in a boolean context. */
+       explicit operator bool() const
+       { return _valid; }
+
+       /** Return the current line number. */
+       unsigned lineNo() const
+       { return _lineNo; }
+
+       std::streamoff lineStart() const
+       { return _lineStart; };
+
+       /** Set current line number. */
+       void setLineNo( unsigned lineNo_r )
+       { _lineNo = lineNo_r; }
+
+       /** Access the current line. */
+       const std::string & operator*() const
+       { return _line; }
+       /** \overload non const access */
+       std::string & operator*()
+       { return _line; }
+
+       /** Access the current line. */
+       const std::string * operator->() const
+       { return &_line; }
+
+       /** Advance to next line. */
+       bool next();
+
+       /** Advance \a num_r lines. */
+       bool next( unsigned num_r )
+       {
+         while ( num_r-- && next() )
+           ; /* EMPTY */
+         return valid();
+       }
+
+      private:
+       std::istream & _str;
+       std::string    _line;
+       std::streamoff _lineStart;
+       unsigned       _lineNo;
+       bool           _valid;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /** Simple lineparser: Call functor \a consume_r for each line.
+     *
+     * \param str_r istream to read from.
+     * \param consume_r callback function taking linenumber and content
+     *
+     * The loop is aborted if the callback  returns \c false.
+     *
+     * \code
+     *   iostr::forEachLine( InputStream( "/my/file/to/read.txt" ),
+     *                       []( int num_r, std::string line_r )->bool
+     *                       {
+     *                         MIL << " [" num_r << "]'" << line_r << "'" << endl;
+     *                         return true;
+     *                       } );
+     * \endcode
+     *
+     * \return Number if lines consumed (negative if aborted by callback).
+     */
+     int forEachLine( std::istream & str_r, function<bool(int, std::string)> consume_r );
+
+     /** \ref simpleParseFile modifications before consuming a line. */
+     enum ParseFlag
+     {
+       PF_LTRIM                        = 1 << 0,               //< left trim whitespace
+       PF_RTRIM                        = 1 << 1,               //< right trim whitespace
+       PF_TRIM                 = PF_LTRIM | PF_RTRIM,  //< trim whitespace
+       PF_SKIP_EMPTY           = 1 << 2,               //< skip lines containing whitespace only
+       PF_SKIP_SHARP_COMMENT   = 1 << 3                //< skip lines beginning with '#'
+     };
+     ZYPP_DECLARE_FLAGS( ParseFlags, ParseFlag );
+     ZYPP_DECLARE_OPERATORS_FOR_FLAGS( ParseFlags );
+
+     /** Simple lineparser optionally trimming and skipping comments. */
+     int simpleParseFile( std::istream & str_r, ParseFlags flags_r, function<bool(int, std::string)> consume_r );
+
+     /** \overload trimming lines, skipping '#'-comments and empty lines. */
+     inline int simpleParseFile( std::istream & str_r, function<bool(int, std::string)> consume_r )
+     { return simpleParseFile( str_r, PF_TRIM | PF_SKIP_EMPTY | PF_SKIP_SHARP_COMMENT , consume_r ); }
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace iostr
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_IOSTREAM_H
similarity index 80%
rename from zypp/base/IOTools.cc
rename to zypp-core/base/IOTools.cc
index c5ef798..908052a 100644 (file)
 #include <iostream>
 #include <glib.h>
 
-#include <zypp/AutoDispose.h>
-#include <zypp/base/IOTools.h>
-#include <zypp/base/LogTools.h>
+#include <zypp-core/AutoDispose.h>
+#include <zypp-core/base/IOTools.h>
+#include <zypp-core/base/LogTools.h>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
 
 namespace zypp::io {
 
   BlockingMode setFILEBlocking (FILE * file, bool mode )
   {
     if ( !file ) return BlockingMode::FailedToSetMode;
+    return setFDBlocking( ::fileno( file ), mode );
+  }
 
-    int fd = ::fileno( file );
-
+  BlockingMode setFDBlocking(int fd, bool mode)
+  {
     if ( fd == -1 )
     { ERR << strerror( errno ) << std::endl; return BlockingMode::FailedToSetMode; }
 
@@ -49,6 +52,36 @@ namespace zypp::io {
     return oldMode;
   }
 
+  bool writeAll(int fd, void *buf, size_t size)
+  {
+    char *tmpBuf = ( char *) buf;
+
+    size_t written = 0;
+    while ( written < size ) {
+      const auto res = zyppng::eintrSafeCall( ::write, fd, tmpBuf+written, size-written );
+      if ( res < 0 ) // error
+        return false;
+      written += res;
+    }
+    return true;
+  }
+
+  ReadAllResult readAll (int fd, void *buf, size_t size )
+  {
+    char *tmpBuf = (char *)buf;
+    size_t read = 0;
+    while ( read != size ) {
+      const auto r = zyppng::eintrSafeCall( ::read, fd, tmpBuf+read, size - read );
+      if ( r == 0 )
+                               return ReadAllResult::Eof;
+                       if ( r < 0 )
+        return ReadAllResult::Error;
+
+      read += r;
+    }
+    return ReadAllResult::Ok;
+  }
+
   std::pair<ReceiveUpToResult, std::string> receiveUpto(FILE *file, char c, timeout_type timeout, bool failOnUnblockError )
   {
     FILE * inputfile = file;
@@ -130,4 +163,5 @@ namespace zypp::io {
 
   TimeoutException::~TimeoutException() noexcept
   { }
+
 }
diff --git a/zypp-core/base/IOTools.h b/zypp-core/base/IOTools.h
new file mode 100644 (file)
index 0000000..54d563d
--- /dev/null
@@ -0,0 +1,89 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/IOTools.h
+ *
+*/
+#ifndef ZYPP_BASE_IOTOOLS_H
+#define ZYPP_BASE_IOTOOLS_H
+
+#include <stdio.h>
+#include <utility>
+#include <string>
+#include <zypp-core/base/Exception.h>
+
+namespace zypp::io {
+
+  enum class BlockingMode{
+    FailedToSetMode = -1, ///< Failed to block or unblock the fd
+    WasBlocking,          ///< FD was blocking before
+    WasNonBlocking        ///< FD was non blocking before
+  };
+
+  /**
+   * Enables or disabled non blocking mode on a file descriptor.
+   * The return value is one of the \ref zypp::io::BlockingMode values
+   */
+  BlockingMode setFILEBlocking ( FILE *file, bool mode = true );
+  BlockingMode setFDBlocking ( int fd, bool mode = true );
+
+  /*!
+    Blocks until all data in buf was written to the fd or a error occured
+   */
+  bool writeAll ( int fd, void *buf, size_t size );
+
+  /*!
+    Blocks until the number of bytes passed via \a size was received
+   */
+       enum class ReadAllResult {
+               Error,
+               Eof,
+               Ok
+       };
+  ReadAllResult readAll ( int fd, void *buf, size_t size );
+
+  class TimeoutException : public Exception
+  {
+  public:
+    /** Ctor taking message.
+       * Use \ref ZYPP_THROW to throw exceptions.
+      */
+    TimeoutException() : Exception( "Timeout Exception" )
+    {}
+    /** Ctor taking message.
+       * Use \ref ZYPP_THROW to throw exceptions.
+      */
+    TimeoutException( const std::string & msg_r )
+      : Exception( msg_r )
+    {}
+
+    /** Dtor. */
+    virtual ~TimeoutException() noexcept override;
+  };
+
+  enum ReceiveUpToResult {
+    Success,
+    Timeout,
+    EndOfFile,
+    Error,
+  };
+
+  using timeout_type = size_t;
+  static const timeout_type no_timeout = static_cast<timeout_type>(-1);
+
+  /*!
+   * Reads data from \a file until it finds a seperator \a c, hits the end of the file or times out.
+   * The \a timeout value is specified in milliseconds, a timeout of -1 means no timeout.
+   * If \a failOnUnblockError is set to false the function will not error out if unblocking
+   * the file descriptor did not work. The default is to fail if it's not possible to unblock the file.
+   */
+  std::pair<ReceiveUpToResult, std::string> receiveUpto( FILE * file, char c, timeout_type timeout, bool failOnUnblockError = true );
+}
+
+#endif
+
diff --git a/zypp-core/base/Iterable.h b/zypp-core/base/Iterable.h
new file mode 100644 (file)
index 0000000..8bf5533
--- /dev/null
@@ -0,0 +1,97 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Iterable.h
+ */
+#ifndef ZYPP_BASE_ITERABLE_H
+#define ZYPP_BASE_ITERABLE_H
+
+#include <iterator>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{
+  ///////////////////////////////////////////////////////////////////
+  /// \class Iterable
+  /// \brief
+  /// \code
+  ///   struct Foo
+  ///   {
+  ///     class Iterator;
+  ///     typedef Iterable<Iterator> IterableType;
+  ///
+  ///     Iterator myBegin();
+  ///     Iterator myEnd();
+  ///
+  ///     IterableType iterate() { return makeIterable( myBegin(), myEnd() ); }
+  ///   };
+  /// \endcode
+  ///////////////////////////////////////////////////////////////////
+  template <class TIterator>
+  class Iterable
+  {
+  public:
+    typedef size_t size_type;
+    typedef TIterator iterator_type;
+    typedef typename std::iterator_traits<iterator_type>::value_type           value_type;
+    typedef typename std::iterator_traits<iterator_type>::difference_type      difference_type;
+    typedef typename std::iterator_traits<iterator_type>::pointer              pointer;
+    typedef typename std::iterator_traits<iterator_type>::reference            reference;
+    typedef typename std::iterator_traits<iterator_type>::iterator_category    iterator_category;
+
+    /** Ctor taking the iterator pair */
+    Iterable()
+    {}
+
+    /** Ctor taking the iterator pair */
+    Iterable( iterator_type begin_r, iterator_type end_r )
+    : _begin( std::move(begin_r) )
+    , _end( std::move(end_r) )
+    {}
+
+    /** Ctor taking the iterator pair */
+    Iterable( std::pair<iterator_type,iterator_type> range_r )
+    : _begin( std::move(range_r.first) )
+    , _end( std::move(range_r.second) )
+    {}
+
+    iterator_type begin() const
+    { return _begin; }
+
+    iterator_type end() const
+    { return _end; }
+
+    bool empty() const
+    { return( _begin == _end ); }
+
+    size_type size() const
+    { size_type ret = 0; for ( iterator_type i = _begin; i != _end; ++i ) ++ret; return ret; }
+
+    bool contains( const value_type & val_r ) const
+    { return( find( val_r ) != _end ); }
+
+    iterator_type find( const value_type & val_r ) const
+    { iterator_type ret = _begin; for ( ; ret != _end; ++ret ) if ( *ret == val_r ) break; return ret; }
+
+  private:
+    iterator_type _begin;
+    iterator_type _end;
+  };
+
+  /** \relates Iterable convenient construction. */
+  template <class TIterator>
+  Iterable<TIterator> makeIterable( TIterator && begin_r, TIterator && end_r )
+  { return Iterable<TIterator>( std::forward<TIterator>(begin_r), std::forward<TIterator>(end_r) ); }
+
+  /** \relates Iterable convenient construction. */
+  template <class TIterator>
+  Iterable<TIterator> makeIterable( std::pair<TIterator,TIterator> && range_r )
+  { return Iterable<TIterator>( std::forward<std::pair<TIterator,TIterator>>(range_r) ); }
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_ITERABLE_H
diff --git a/zypp-core/base/Iterator.h b/zypp-core/base/Iterator.h
new file mode 100644 (file)
index 0000000..fa45e43
--- /dev/null
@@ -0,0 +1,299 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Iterator.h
+ *
+*/
+#ifndef ZYPP_BASE_ITERATOR_H
+#define ZYPP_BASE_ITERATOR_H
+
+#include <iterator>
+#include <utility>
+
+#include <boost/functional.hpp>
+#include <boost/iterator/filter_iterator.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/iterator/function_output_iterator.hpp>
+
+#include <zypp-core/base/Iterable.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  /** \defgroup ITERATOR Boost.Iterator Library
+   *
+   * \see http://www.boost.org/libs/iterator/doc/index.html
+   *
+   * \li \b counting_iterator: an iterator over a sequence of
+   *        consecutive values. Implements a "lazy sequence"
+   * \li \b filter_iterator: an iterator over the subset of elements
+   *        of some sequence which satisfy a given predicate
+   * \li \b function_output_iterator: an output iterator wrapping a
+   *        unary function object; each time an element is written into
+   *        the dereferenced iterator, it is passed as a parameter to
+   *        the function object.
+   * \li \b indirect_iterator: an iterator over the objects pointed-to
+   *        by the elements of some sequence.
+   * \li \b permutation_iterator: an iterator over the elements of
+   *        some random-access sequence, rearranged according to some
+   *        sequence of integer indices.
+   * \li \b reverse_iterator: an iterator which traverses the elements
+   *        of some bidirectional sequence in reverse. Corrects many of the shortcomings of C++98's std::reverse_iterator.
+   * \li \b shared_container_iterator: an iterator over elements of
+   *        a container whose lifetime is maintained by a shared_ptr
+   *        stored in the iterator.
+   * \li \b transform_iterator: an iterator over elements which are
+   *        the result of applying some functional transformation to
+   *        the elements of an underlying sequence. This component
+   *        also replaces the old projection_iterator_adaptor.
+   * \li \b zip_iterator: an iterator over tuples of the elements
+   *        at corresponding positions of heterogeneous underlying
+   *        iterators.
+   *
+   * There are in fact more interesting iterator concepts
+   * available than the ones listed above. Have a look at them.
+   *
+   * Some of the iterator types are already dragged into namespace
+   * zypp. Feel free to add what's missing.
+   *
+   * \todo Separate them into individual zypp header files.
+  */
+  //@{
+
+  /** \class filter_iterator
+   * An iterator over the subset of elements of some sequence
+   * which satisfy a given predicate.
+   *
+   * Provides boost::filter_iterator and boost::make_filter_iterator
+   * convenience function.
+   * \see http://www.boost.org/libs/iterator/doc/filter_iterator.html
+   * \code
+   * template <class Predicate, class Iterator>
+   *   filter_iterator<Predicate,Iterator>
+   *   make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
+   *
+   * template <class Predicate, class Iterator>
+   *   filter_iterator<Predicate,Iterator>
+   *   make_filter_iterator(Iterator x, Iterator end = Iterator());
+   * \endcode
+   * Remember the deduction rules for template arguments.
+   * \code
+   * struct MyDefaultConstructibleFilter;
+   * make_filter_iterator<MyDefaultConstructibleFilter>( c.begin(), c.end() );
+   * make_filter_iterator( MyDefaultConstructibleFilter(), c.begin(), c.end() );
+   * ...
+   * make_filter_iterator( resfilter::ByName("foo"), c.begin(), c.end() );
+   *
+   * \endcode
+  */
+  using boost::filter_iterator;
+  using boost::make_filter_iterator;
+
+  /** Convenience to create filter_iterator from container::begin(). */
+  template<class TFilter, class TContainer>
+    filter_iterator<TFilter, typename TContainer::const_iterator>
+    make_filter_begin( TFilter f, const TContainer & c )
+    {
+      return make_filter_iterator( f, c.begin(), c.end() );
+    }
+
+  /** Convenience to create filter_iterator from container::begin(). */
+  template<class TFilter, class TContainer>
+    filter_iterator<TFilter, typename TContainer::const_iterator>
+    make_filter_begin( const TContainer & c )
+    {
+      return make_filter_iterator( TFilter(), c.begin(), c.end() );
+    }
+
+  /** Convenience to create filter_iterator from container::end(). */
+  template<class TFilter, class TContainer>
+    filter_iterator<TFilter, typename TContainer::const_iterator>
+    make_filter_end( TFilter f, const TContainer & c )
+    {
+      return make_filter_iterator( f, c.end(), c.end() );
+    }
+
+  /** Convenience to create filter_iterator from container::end(). */
+  template<class TFilter, class TContainer>
+    filter_iterator<TFilter, typename TContainer::const_iterator>
+    make_filter_end( const TContainer & c )
+    {
+      return make_filter_iterator( TFilter(), c.end(), c.end() );
+    }
+
+  /** \class transform_iterator
+   * An iterator over elements which are the result of applying
+   * some functional transformation to the elements of an underlying
+   * sequence.
+   *
+   * Provides boost::transform_iterator and boost::make_transform_iterator
+   * convenience function.
+   * \see http://www.boost.org/libs/iterator/doc/transform_iterator.html
+   * \code
+   * template <class UnaryFunction, class Iterator>
+   *   transform_iterator<UnaryFunction, Iterator>
+   *   make_transform_iterator(Iterator it, UnaryFunction fun);
+   *
+   * template <class UnaryFunction, class Iterator>
+   *   transform_iterator<UnaryFunction, Iterator>
+   *   make_transform_iterator(Iterator it);
+   * \endcode
+  */
+  using boost::transform_iterator;
+  using boost::make_transform_iterator;
+
+  /** Functor taking a \c std::pair returning \c std::pair.first.
+   * \see MapKVIteratorTraits
+  */
+  template<class TPair>
+    struct GetPairFirst : public std::unary_function<TPair, const typename TPair::first_type &>
+    {
+      const typename TPair::first_type & operator()( const TPair & pair_r ) const
+      { return pair_r.first; }
+    };
+
+  /** Functor taking a \c std::pair returning \c std::pair.second .
+   * \see MapKVIteratorTraits
+  */
+  template<class TPair>
+    struct GetPairSecond : public std::unary_function<TPair, const typename TPair::second_type &>
+    {
+      const typename TPair::second_type & operator()( const TPair & pair_r ) const
+      { return pair_r.second; }
+    };
+
+  /** Traits for std::map key and value iterators.
+   *
+   * \ref GetPairFirst and \ref GetPairSecond help building a transform_iterator
+   * that iterates over keys or values of a std::map. Class MapKVIteratorTraits
+   * provides some typedefs, you usg. do not want to write explicitly.
+   *
+   * \code
+   * // typedefs
+   * typedef std::map<K,V> MapType;
+   *
+   * // transform_iterator<GetPairFirst<MapType::value_type>,  MapType::const_iterator>
+   * typedef MapKVIteratorTraits<MapType>::Key_const_iterator MapTypeKey_iterator;
+   * // transform_iterator<GetPairSecond<MapType::value_type>, MapType::const_iterator>
+   * typedef MapKVIteratorTraits<MapType>::Value_const_iterator  MapTypeValue_iterator;
+   *
+   * // usage
+   * MapType mymap;
+   *
+   * MapTypeKey_const_iterator keyBegin( make_map_key_begin( mymap ) );
+   * MapTypeKey_const_iterator keyEnd  ( make_map_key_end( mymap ) );
+   *
+   * MapTypeValue_const_iterator valBegin( make_map_value_begin( mymap ) );
+   * MapTypeValue_const_iterator valEnd  ( make_map_value_end( mymap ) );
+   *
+   * std::for_each( keyBegin, keyEnd, DoSomething() );
+   * std::for_each( valBegin, valEnd, DoSomething() );
+   * \endcode
+   *
+   * Or short:
+   *
+   * \code
+   * typedef std::map<K,V> MapType;
+   * MapType mymap;
+   *
+   * std::for_each( make_map_key_begin( mymap ),   make_map_key_end( mymap ),   DoSomething() );
+   * std::for_each( make_map_value_begin( mymap ), make_map_value_end( mymap ), DoSomething() );
+   * \endcode
+   */
+  template<class TMap>
+    struct MapKVIteratorTraits
+    {
+      /** The map type */
+      typedef TMap                       MapType;
+      /** The maps key type */
+      typedef typename TMap::key_type    KeyType;
+      /** The key iterator type */
+      typedef transform_iterator<GetPairFirst<typename MapType::value_type>,
+                                 typename MapType::const_iterator> Key_const_iterator;
+      /** The maps value (mapped) type */
+      typedef typename TMap::mapped_type ValueType;
+      /** The value iterator type */
+      typedef transform_iterator<GetPairSecond<typename MapType::value_type>,
+                                 typename MapType::const_iterator> Value_const_iterator;
+    };
+
+  /** Convenience to create the key iterator from container::begin() */
+  template<class TMap>
+    inline typename MapKVIteratorTraits<TMap>::Key_const_iterator make_map_key_begin( const TMap & map_r )
+    { return make_transform_iterator( map_r.begin(), GetPairFirst<typename TMap::value_type>() ); }
+
+  /** Convenience to create the key iterator from container::end() */
+  template<class TMap>
+    inline typename MapKVIteratorTraits<TMap>::Key_const_iterator make_map_key_end( const TMap & map_r )
+    { return make_transform_iterator( map_r.end(), GetPairFirst<typename TMap::value_type>() ); }
+
+  /** Convenience to create the value iterator from container::begin() */
+  template<class TMap>
+    inline typename MapKVIteratorTraits<TMap>::Value_const_iterator make_map_value_begin( const TMap & map_r )
+    { return make_transform_iterator( map_r.begin(), GetPairSecond<typename TMap::value_type>() ); }
+
+  /** Convenience to create the value iterator from container::end() */
+  template<class TMap>
+    inline typename MapKVIteratorTraits<TMap>::Value_const_iterator make_map_value_end( const TMap & map_r )
+    { return make_transform_iterator( map_r.end(), GetPairSecond<typename TMap::value_type>() ); }
+
+  /** Convenience to create the key iterator from container::lower_bound() */
+  template<class TMap>
+    inline typename MapKVIteratorTraits<TMap>::Key_const_iterator make_map_key_lower_bound( const TMap & map_r, const typename TMap::key_type & key_r )
+    { return make_transform_iterator( map_r.lower_bound( key_r ), GetPairFirst<typename TMap::value_type>() ); }
+
+  /** Convenience to create the key iterator from container::upper_bound() */
+  template<class TMap>
+    inline typename MapKVIteratorTraits<TMap>::Key_const_iterator make_map_key_upper_bound( const TMap & map_r, const typename TMap::key_type & key_r )
+    { return make_transform_iterator( map_r.upper_bound( key_r ), GetPairFirst<typename TMap::value_type>() ); }
+
+  /** Convenience to create the value iterator from container::lower_bound() */
+  template<class TMap>
+    inline typename MapKVIteratorTraits<TMap>::Value_const_iterator make_map_value_lower_bound( const TMap & map_r, const typename TMap::key_type & key_r )
+    { return make_transform_iterator( map_r.lower_bound( key_r ), GetPairSecond<typename TMap::value_type>() ); }
+
+  /** Convenience to create the value iterator from container::upper_bound() */
+  template<class TMap>
+    inline typename MapKVIteratorTraits<TMap>::Value_const_iterator make_map_value_upper_bound( const TMap & map_r, const typename TMap::key_type & key_r )
+    { return make_transform_iterator( map_r.upper_bound( key_r ), GetPairSecond<typename TMap::value_type>() ); }
+
+
+  /** Convenience to create an \ref Iterable over the container keys */
+  template<class TMap>
+  inline Iterable<typename MapKVIteratorTraits<TMap>::Key_const_iterator> make_map_key_Iterable( const TMap & map_r )
+  { return makeIterable( make_map_key_begin( map_r ), make_map_key_end( map_r ) ); }
+
+  /** Convenience to create an \ref Iterable over the container values */
+  template<class TMap>
+  inline Iterable<typename MapKVIteratorTraits<TMap>::Value_const_iterator> make_map_value_Iterable( const TMap & map_r )
+  { return makeIterable( make_map_value_begin( map_r ), make_map_value_end( map_r ) ); }
+
+
+  /** \class function_output_iterator
+   * An output iterator wrapping a unary function object; each time an
+   * element is written into the dereferenced iterator, it is passed as
+   * a parameter to the function object.
+   *
+   * Provides boost::function_output_iterator and boost::make_function_output_iterator
+   * convenience function.
+   * \see http://www.boost.org/libs/iterator/doc/function_output_iterator.html
+   * \code
+   * template <class UnaryFunction>
+   *   function_output_iterator<UnaryFunction>
+   *   make_function_output_iterator(const UnaryFunction& f = UnaryFunction());
+   * \endcode
+  */
+  using boost::function_output_iterator;
+  using boost::make_function_output_iterator;
+
+  //@}
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_ITERATOR_H
similarity index 54%
rename from zypp/base/LogControl.cc
rename to zypp-core/base/LogControl.cc
index 8ca8646..cc5a9d6 100644 (file)
 #include <iostream>
 #include <fstream>
 #include <string>
-
-#include <zypp/base/Logger.h>
-#include <zypp/base/LogControl.h>
-#include <zypp/base/ProfilingFormater.h>
-#include <zypp/base/String.h>
-#include <zypp/Date.h>
-#include <zypp/PathInfo.h>
+#include <mutex>
+#include <map>
+
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/LogControl.h>
+#include <zypp-core/base/ProfilingFormater.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/Date.h>
+#include <zypp-core/TriBool.h>
+#include <zypp-core/AutoDispose.h>
+
+#include <zypp-core/zyppng/io/Socket>
+#include <zypp-core/zyppng/io/SockAddr>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/Timer>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <zypp-core/zyppng/thread/Wakeup>
+#include <zypp-core/zyppng/base/private/threaddata_p.h>
+#include <zypp-core/zyppng/base/SocketNotifier>
+
+#include <thread>
+#include <variant>
+#include <atomic>
+#include <csignal>
+
+extern "C"
+{
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <dirent.h>
+}
 
 using std::endl;
 
-///////////////////////////////////////////////////////////////////
+std::once_flag flagReadEnvAutomatically;
+
 namespace zypp
-{ /////////////////////////////////////////////////////////////////
+{
+  constexpr std::string_view ZYPP_MAIN_THREAD_NAME( "Zypp-main" );
+
+  template<class> inline constexpr bool always_false_v = false;
+
+  /*!
+   * \internal Provides a very simply lock that is using atomics so it can be
+   * safely used in signal handlers
+   */
+  class SpinLock {
+  public:
+    void lock () {
+      // acquire lock
+      while ( _atomicLock.test_and_set())
+        // reschedule the current thread while we wait, maybe when its our next turn the lock is free again
+        std::this_thread::yield();
+    }
+
+    void unlock() {
+      _atomicLock.clear();
+    }
+
+  private:
+    // we use a lock free atomic flag here so this lock can be safely obtained in a signal handler as well
+    std::atomic_flag _atomicLock = ATOMIC_FLAG_INIT;
+  };
+
+  class LogThread
+  {
+
+  public:
+
+    ~LogThread() {
+      stop();
+    }
+
+    static LogThread &instance () {
+      static LogThread t;
+      return t;
+    }
+
+    void setLineWriter ( boost::shared_ptr<log::LineWriter> writer ) {
+      std::lock_guard lk( _lineWriterLock );
+      _lineWriter = writer;
+    }
+
+    boost::shared_ptr<log::LineWriter> getLineWriter () {
+      std::lock_guard lk( _lineWriterLock );
+      auto lw = _lineWriter;
+      return lw;
+    }
+
+    void stop () {
+      _stopSignal.notify();
+      if ( _thread.get_id() != std::this_thread::get_id() )
+        _thread.join();
+    }
+
+    std::thread::id threadId () {
+      return _thread.get_id();
+    }
+
+    static std::string sockPath () {
+      static std::string path = zypp::str::Format("zypp-logsocket-%1%") % getpid();
+      return path;
+    }
+
+  private:
+
+    LogThread ()
+    {
+      // Name the thread that started the logger assuming it's main thread.
+      zyppng::ThreadData::current().setName(ZYPP_MAIN_THREAD_NAME);
+      _thread = std::thread( [this] () {
+        workerMain();
+      });
+    }
+
+    void workerMain () {
+
+      // force the kernel to pick another thread to handle those signals
+      zyppng::blockSignalsForCurrentThread( { SIGTERM, SIGINT, SIGPIPE, } );
+
+      zyppng::ThreadData::current().setName("Zypp-Log");
+
+      auto ev = zyppng::EventLoop::create();
+      auto server = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+      auto stopNotifyWatch = _stopSignal.makeNotifier( );
+
+      std::vector<zyppng::Socket::Ptr> clients;
+
+      // bind to a abstract unix domain socket address, which means we do not need to care about cleaning it up
+      server->bind( std::make_shared<zyppng::UnixSockAddr>( sockPath(), true ) );
+      server->listen();
+
+      // wait for incoming connections from other threads
+      server->connectFunc( &zyppng::Socket::sigIncomingConnection, [&](){
+
+        auto cl = server->accept();
+        if ( !cl ) return;
+        clients.push_back( cl );
+
+        // wait until data is available, we operate line by line so we only
+        // log a string once we encounter \n
+        cl->connectFunc( &zyppng::Socket::sigReadyRead, [ this, sock = cl.get() ](){
+          auto writer = getLineWriter();
+          if ( !writer ) return;
+          while ( sock->canReadLine() ) {
+            auto br = sock->readLine();
+            writer->writeOut( std::string( br.data(), br.size() - 1 ) );
+          }
+        }, *cl);
+
+        // once a client disconnects we remove it from the std::vector so that the socket is not leaked
+        cl->connectFunc( &zyppng::Socket::sigDisconnected, [&clients, sock = std::weak_ptr(cl)](){
+          auto lock = sock.lock();
+          if ( !lock  )
+            return;
+
+          auto idx = std::find_if( clients.begin(), clients.end(), [lock]( const auto &s ){ return lock.get() == s.get(); } );
+          clients.erase( idx );
+        });
+
+      });
+
+      stopNotifyWatch->connectFunc( &zyppng::SocketNotifier::sigActivated, [&ev]( const auto &, auto ) {
+        ev->quit();
+      });
+
+      ev->run();
+
+      // make sure we have written everything
+      auto writer = getLineWriter();
+      if ( writer ) {
+        for ( auto &sock : clients ){
+          while ( sock->canReadLine() ) {
+            auto br = sock->readLine();
+            writer->writeOut( std::string( br.data(), br.size() - 1 ) );
+          }
+        }
+      }
+    }
+
+  private:
+    std::thread _thread;
+    zyppng::Wakeup _stopSignal;
+
+    // since the public API uses boost::shared_ptr we can not use the atomic
+    // functionalities provided in std.
+    // this lock type can be used safely in signals
+    SpinLock _lineWriterLock;
+    // boost shared_ptr has a lock free implementation of reference counting so it can be used from signal handlers as well
+    boost::shared_ptr<log::LineWriter> _lineWriter{ nullptr };
+  };
+
+  class LogClient
+  {
+   public:
+    LogClient(){
+      // make sure the thread is running
+      LogThread::instance();
+    }
+
+    ~LogClient() {
+      ::close( _sockFD );
+    }
+
+    /*!
+     * Tries to connect to the log threads socket, returns true on success or
+     * if the socket is already connected
+     */
+    bool ensureConnection () {
+      if ( _sockFD >= 0 )
+        return true;
+
+      _sockFD = ::socket( AF_UNIX, SOCK_STREAM, 0 );
+      if ( _sockFD == -1 )
+        return false;
+
+      zyppng::UnixSockAddr addr( LogThread::sockPath(), true );
+      return zyppng::trySocketConnection( _sockFD, addr, 100 );
+    }
+
+    /*!
+     * Sends a message to the log thread.
+     */
+    void pushMessage ( std::string &&msg ) {
+      if ( inPushMessage ) {
+        return;
+      }
+
+      // make sure we do not end up in a busy loop
+      zypp::AutoDispose<bool *> res( &inPushMessage, [](auto val){
+        *val = false;
+      });
+      inPushMessage = true;
+
+      // if we are in the same thread as the Log worker we can directly push our messages out, no need to use the socket
+      if ( std::this_thread::get_id() == LogThread::instance().threadId() ) {
+        auto writer = LogThread::instance().getLineWriter();
+        writer->writeOut( msg );
+        return;
+      }
+
+      if(!ensureConnection())
+        return;
+
+      if ( msg.back() != '\n' )
+        msg.push_back('\n');
+
+      size_t written = 0;
+      while ( written < msg.size() ) {
+        const auto res = zyppng::eintrSafeCall( ::send, _sockFD, msg.data() + written, msg.size() - written, MSG_NOSIGNAL );
+        if ( res == -1 ) {
+          //assume broken socket
+          ::close( _sockFD );
+          _sockFD = -1;
+          return;
+        }
+        written += res;
+      }
+    }
+
+    private:
+      int _sockFD = -1;
+      bool inPushMessage = false;
+  };
 
 #ifndef ZYPP_NDEBUG
   namespace debug
@@ -132,29 +386,6 @@ namespace zypp
   ///////////////////////////////////////////////////////////////////
   namespace base
   { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    // LineFormater
-    ///////////////////////////////////////////////////////////////////
-    std::string LogControl::LineFormater::format( const std::string & group_r,
-                                                  logger::LogLevel    level_r,
-                                                  const char *        file_r,
-                                                  const char *        func_r,
-                                                  int                 line_r,
-                                                  const std::string & message_r )
-    {
-      static char hostname[1024];
-      static char nohostname[] = "unknown";
-      std::string now( Date::now().form( "%Y-%m-%d %H:%M:%S" ) );
-      return str::form( "%s <%d> %s(%d) [%s] %s(%s):%d %s",
-                        now.c_str(), level_r,
-                        ( gethostname( hostname, 1024 ) ? nohostname : hostname ),
-                        getpid(),
-                        group_r.c_str(),
-                        file_r, func_r, line_r,
-                        message_r.c_str() );
-    }
-
     ///////////////////////////////////////////////////////////////////
     namespace logger
     { /////////////////////////////////////////////////////////////////
@@ -273,11 +504,28 @@ namespace zypp
       };
       ///////////////////////////////////////////////////////////////////
 
+      struct LogControlImpl;
+
+      /*
+       * Horrible ugly hack to prevent the use of LogControlImpl when libzypp is shutting down.
+       * Due to the c++ std thread_local static instances are cleaned up before the first global static
+       * destructor is called. So all classes that use logging after that point in time would crash the
+       * application because its accessing a variable that has already been destroyed.
+       *
+       * This does not check if the current thread requesting a instance actually has one, it just keeps count
+       * of how many instances are still available. Usually only the main thread should run into the condition
+       * of getting a nullptr back.
+       */
+      static std::atomic_int & logControlImplReg() {
+        static std::atomic_int instCount;
+        return instCount;
+      }
+
       ///////////////////////////////////////////////////////////////////
       //
       //       CLASS NAME : LogControlImpl
       //
-      /** LogControl implementation (Singleton).
+      /** LogControl implementation (thread_local Singleton).
        *
        * \note There is a slight difference in using the _lineFormater and _lineWriter!
        * \li \c _lineFormater must not be NULL (create default LogControl::LineFormater)
@@ -289,18 +537,43 @@ namespace zypp
       struct LogControlImpl
       {
       public:
-       bool isExcessive()
+       bool isExcessive() const
        { return _excessive; }
 
         void excessive( bool onOff_r )
         { _excessive = onOff_r; }
 
+
+        /** Hint for Formater whether to hide the thread name. */
+       bool hideThreadName() const
+       {
+         if ( indeterminate(_hideThreadName) )
+           _hideThreadName = ( zyppng::ThreadData::current().name() == ZYPP_MAIN_THREAD_NAME );
+         return bool(_hideThreadName);
+       }
+       /** \overload Setter */
+        void hideThreadName( bool onOff_r )
+        { _hideThreadName = onOff_r; }
+        /** \overload Static getter */
+       static bool instanceHideThreadName()
+       {
+         auto impl = LogControlImpl::instance();
+         return impl ? impl->hideThreadName() : false;
+       }
+       /** \overload Static setter */
+        static void instanceHideThreadName( bool onOff_r )
+        {
+         auto impl = LogControlImpl::instance();
+         if ( impl ) impl->hideThreadName( onOff_r );
+       }
+
+
         /** NULL _lineWriter indicates no loggin. */
         void setLineWriter( const shared_ptr<LogControl::LineWriter> & writer_r )
-        { _lineWriter = writer_r; }
+        { LogThread::instance().setLineWriter( writer_r ); }
 
         shared_ptr<LogControl::LineWriter> getLineWriter() const
-        { return _lineWriter; }
+        { return LogThread::instance().getLineWriter(); }
 
         /** Assert \a _lineFormater is not NULL. */
         void setLineFormater( const shared_ptr<LogControl::LineFormater> & format_r )
@@ -322,11 +595,12 @@ namespace zypp
         }
 
       private:
+        LogClient    _logClient;
         std::ostream _no_stream;
         bool         _excessive;
+       mutable TriBool _hideThreadName = indeterminate;        ///< Hint for Formater whether to hide the thread name.
 
         shared_ptr<LogControl::LineFormater> _lineFormater;
-        shared_ptr<LogControl::LineWriter>   _lineWriter;
 
       public:
         /** Provide the log stream to write (logger interface) */
@@ -336,7 +610,7 @@ namespace zypp
                                   const char *        func_r,
                                   const int           line_r )
         {
-          if ( ! _lineWriter )
+          if ( ! getLineWriter() )
             return _no_stream;
           if ( level_r == E_XXX && !_excessive )
             return _no_stream;
@@ -362,10 +636,9 @@ namespace zypp
                         int                 line_r,
                         const std::string & message_r )
         {
-          if ( _lineWriter )
-            _lineWriter->writeOut( _lineFormater->format( group_r, level_r,
-                                                          file_r, func_r, line_r,
-                                                          message_r ) );
+          _logClient.pushMessage( _lineFormater->format( group_r, level_r,
+                                                                    file_r, func_r, line_r,
+                                                                    message_r ) );
         }
 
       private:
@@ -374,16 +647,11 @@ namespace zypp
         typedef std::map<std::string,StreamSet>  StreamTable;
         /** one streambuffer per group and level */
         StreamTable _streamtable;
+        zyppng::Socket::Ptr _sock;
 
       private:
-        /** Singleton ctor.
-         * No logging per default, unless enabled via $ZYPP_LOGFILE.
-        */
-        LogControlImpl()
-        : _no_stream( NULL )
-        , _excessive( getenv("ZYPP_FULLLOG") )
-        , _lineFormater( new LogControl::LineFormater )
-        {
+
+        void readEnvVars () {
           if ( getenv("ZYPP_LOGFILE") )
             logfile( getenv("ZYPP_LOGFILE") );
 
@@ -393,34 +661,48 @@ namespace zypp
             setLineFormater(formater);
           }
         }
+        /** Singleton ctor.
+         * No logging per default, unless enabled via $ZYPP_LOGFILE.
+        */
+        LogControlImpl()
+        : _no_stream( NULL )
+        , _excessive( getenv("ZYPP_FULLLOG") )
+        , _lineFormater( new LogControl::LineFormater )
+        {
+          logControlImplReg().fetch_add(1);
+          std::call_once( flagReadEnvAutomatically, &LogControlImpl::readEnvVars, this);
+        }
+
+      public:
 
         ~LogControlImpl()
         {
-          _lineWriter.reset();
+          logControlImplReg().fetch_sub(1);
         }
 
-      public:
         /** The LogControlImpl singleton
          * \note As most dtors log, it is inportant that the
          * LogControlImpl instance is the last static variable
          * destructed. At least destucted after all statics
          * which log from their dtor.
         */
-        static LogControlImpl instance();
+        static LogControlImpl *instance();
       };
       ///////////////////////////////////////////////////////////////////
 
       // 'THE' LogControlImpl singleton
-      inline LogControlImpl LogControlImpl::instance()
+      inline LogControlImpl *LogControlImpl::instance()
       {
-        static LogControlImpl _instance;
-        return _instance;
+        thread_local static LogControlImpl _instance;
+        if ( logControlImplReg().load() > 0 )
+          return &_instance;
+        return nullptr;
       }
 
       ///////////////////////////////////////////////////////////////////
 
       /** \relates LogControlImpl Stream output */
-      inline std::ostream & operator<<( std::ostream & str, const LogControlImpl & obj )
+      inline std::ostream & operator<<( std::ostream & str, const LogControlImpl & )
       {
         return str << "LogControlImpl";
       }
@@ -437,11 +719,19 @@ namespace zypp
                                 const char * func_r,
                                 const int    line_r )
       {
-        return LogControlImpl::instance().getStream( group_r,
-                                                   level_r,
-                                                   file_r,
-                                                   func_r,
-                                                   line_r );
+        static std::ostream nstream(NULL);
+        auto control = LogControlImpl::instance();
+        if ( !control || !group_r || strlen(group_r ) == 0 ) {
+          return nstream;
+        }
+
+
+
+        return control->getStream( group_r,
+                                   level_r,
+                                   file_r,
+                                   func_r,
+                                   line_r );
       }
 
       /** That's what Loglinebuf calls.  */
@@ -449,18 +739,63 @@ namespace zypp
                              const char * file_r, const char * func_r, int line_r,
                              const std::string & buffer_r )
       {
-        LogControlImpl::instance().putStream( group_r, level_r,
-                                            file_r, func_r, line_r,
-                                            buffer_r );
+        auto control = LogControlImpl::instance();
+        if ( !control )
+          return;
+
+        control->putStream( group_r, level_r,
+                            file_r, func_r, line_r,
+                            buffer_r );
       }
 
       bool isExcessive()
-      { return LogControlImpl::instance().isExcessive(); }
+      {
+        auto impl = LogControlImpl::instance();
+        if ( !impl )
+          return false;
+        return impl->isExcessive();
+      }
 
       /////////////////////////////////////////////////////////////////
     } // namespace logger
     ///////////////////////////////////////////////////////////////////
 
+    using logger::LogControlImpl;
+
+    ///////////////////////////////////////////////////////////////////
+    // LineFormater
+    ///////////////////////////////////////////////////////////////////
+    std::string LogControl::LineFormater::format( const std::string & group_r,
+                                                  logger::LogLevel    level_r,
+                                                  const char *        file_r,
+                                                  const char *        func_r,
+                                                  int                 line_r,
+                                                  const std::string & message_r )
+    {
+      static char hostname[1024];
+      static char nohostname[] = "unknown";
+      std::string now( Date::now().form( "%Y-%m-%d %H:%M:%S" ) );
+      std::string ret;
+      if ( LogControlImpl::instanceHideThreadName() )
+       ret = str::form( "%s <%d> %s(%d) [%s] %s(%s):%d %s",
+                        now.c_str(), level_r,
+                        ( gethostname( hostname, 1024 ) ? nohostname : hostname ),
+                        getpid(),
+                        group_r.c_str(),
+                        file_r, func_r, line_r,
+                        message_r.c_str() );
+      else
+       ret = str::form( "%s <%d> %s(%d) [%s] %s(%s):%d {T:%s} %s",
+                        now.c_str(), level_r,
+                        ( gethostname( hostname, 1024 ) ? nohostname : hostname ),
+                        getpid(),
+                        group_r.c_str(),
+                        file_r, func_r, line_r,
+                        zyppng::ThreadData::current().name().c_str(),
+                        message_r.c_str() );
+      return ret;
+    }
+
     ///////////////////////////////////////////////////////////////////
     //
     // CLASS NAME : LogControl
@@ -468,28 +803,70 @@ namespace zypp
     //
     ///////////////////////////////////////////////////////////////////
 
-    using logger::LogControlImpl;
 
     void LogControl::logfile( const Pathname & logfile_r )
-    { LogControlImpl::instance().logfile( logfile_r ); }
+    {
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return;
+
+      impl->logfile( logfile_r );
+    }
 
     void LogControl::logfile( const Pathname & logfile_r, mode_t mode_r )
-    { LogControlImpl::instance().logfile( logfile_r, mode_r ); }
+    {
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return;
+
+      impl->logfile( logfile_r, mode_r );
+    }
 
     shared_ptr<LogControl::LineWriter> LogControl::getLineWriter() const
-    { return LogControlImpl::instance().getLineWriter(); }
+    {
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return nullptr;
+
+      return impl->getLineWriter();
+    }
 
     void LogControl::setLineWriter( const shared_ptr<LineWriter> & writer_r )
-    { LogControlImpl::instance().setLineWriter( writer_r ); }
+    {
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return;
+      impl->setLineWriter( writer_r );
+    }
 
     void LogControl::setLineFormater( const shared_ptr<LineFormater> & formater_r )
-    { LogControlImpl::instance().setLineFormater( formater_r ); }
+    {
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return;
+      impl->setLineFormater( formater_r );
+    }
 
     void LogControl::logNothing()
-    { LogControlImpl::instance().setLineWriter( shared_ptr<LineWriter>() ); }
+    {
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return;
+      impl->setLineWriter( shared_ptr<LineWriter>() );
+    }
 
     void LogControl::logToStdErr()
-    { LogControlImpl::instance().setLineWriter( shared_ptr<LineWriter>( new log::StderrLineWriter ) ); }
+    {
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return;
+      impl->setLineWriter( shared_ptr<LineWriter>( new log::StderrLineWriter ) );
+    }
+
+    void base::LogControl::emergencyShutdown()
+    {
+      LogThread::instance().stop();
+    }
 
     ///////////////////////////////////////////////////////////////////
     //
@@ -497,18 +874,31 @@ namespace zypp
     //
     ///////////////////////////////////////////////////////////////////
     LogControl::TmpExcessive::TmpExcessive()
-    { LogControlImpl::instance().excessive( true ); }
+    {
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return;
+      impl->excessive( true );
+    }
     LogControl::TmpExcessive::~TmpExcessive()
-    { LogControlImpl::instance().excessive( false );  }
+    {
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return;
+      impl->excessive( false );
+    }
 
     /******************************************************************
      **
      **        FUNCTION NAME : operator<<
      **        FUNCTION TYPE : std::ostream &
     */
-    std::ostream & operator<<( std::ostream & str, const LogControl & obj )
+    std::ostream & operator<<( std::ostream & str, const LogControl & )
     {
-      return str << LogControlImpl::instance();
+      auto impl = LogControlImpl::instance();
+      if ( !impl )
+        return str;
+      return str << *impl;
     }
 
     /////////////////////////////////////////////////////////////////
diff --git a/zypp-core/base/LogControl.h b/zypp-core/base/LogControl.h
new file mode 100644 (file)
index 0000000..730c8d2
--- /dev/null
@@ -0,0 +1,212 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/LogControl.h
+ *
+*/
+#ifndef ZYPP_BASE_LOGCONTROL_H
+#define ZYPP_BASE_LOGCONTROL_H
+
+#include <iosfwd>
+#include <ostream> //for std::endl
+
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/PtrTypes.h>
+#include <zypp-core/Pathname.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  ///////////////////////////////////////////////////////////////////
+  namespace log
+  { /////////////////////////////////////////////////////////////////
+
+    /** If you want to log the (formated) loglines by yourself,
+     *  derive from this, and overload \c writeOut.
+     * Expect \a formated_r to be a formated log line without trailing \c NL.
+     * Ready to be written to the log.
+     */
+    struct LineWriter
+    {
+      virtual void writeOut( const std::string & /*formated_r*/ )
+      {}
+      virtual ~LineWriter()
+      {}
+    };
+
+    /** Base class for ostream based \ref LineWriter */
+    struct StreamLineWriter : public LineWriter
+    {
+      StreamLineWriter( std::ostream & str_r ) : _str( &str_r ) {}
+
+      virtual void writeOut( const std::string & formated_r )
+      { (*_str) << formated_r << std::endl; }
+
+      protected:
+        StreamLineWriter() : _str( 0 ) {}
+        std::ostream *_str;
+    };
+
+    /** \ref LineWriter to stdout. */
+    struct StdoutLineWriter : public StreamLineWriter
+    {
+      StdoutLineWriter();
+    };
+
+    /** \ref LineWriter to stderr. */
+    struct StderrLineWriter : public StreamLineWriter
+    {
+      StderrLineWriter();
+    };
+
+    /** \ref LineWriter to file.
+     * If \c mode_r is not \c 0, \c file_r persissions are changed
+     * accordingly. \c "-" logs to \c cerr.
+    */
+    struct FileLineWriter : public StreamLineWriter
+    {
+      FileLineWriter( const Pathname & file_r, mode_t mode_r = 0 );
+      protected:
+        shared_ptr<void> _outs;
+    };
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace log
+  ///////////////////////////////////////////////////////////////////
+
+
+  ///////////////////////////////////////////////////////////////////
+  namespace base
+  { /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : LogControl
+    //
+    /** Maintain logfile related options.
+     * \note A Singleton using a Singleton implementation class,
+     * that's why there is no _pimpl like in other classes.
+    */
+    class LogControl
+    {
+      friend std::ostream & operator<<( std::ostream & str, const LogControl & obj );
+
+    public:
+      /** Singleton access. */
+      static LogControl instance()
+      { return LogControl(); }
+
+
+      /** \see \ref log::LineWriter */
+      typedef log::LineWriter LineWriter;
+
+      /** If you want to format loglines by yourself,
+       *  derive from this, and overload \c format.
+       * Return a formated logline without trailing \c NL.
+       * Ready to be written to the log.
+      */
+      struct LineFormater
+      {
+        virtual std::string format( const std::string & /*group_r*/,
+                                    logger::LogLevel    /*level_r*/,
+                                    const char *        /*file_r*/,
+                                    const char *        /*func_r*/,
+                                    int                 /*line_r*/,
+                                    const std::string & /*message_r*/ );
+        virtual ~LineFormater() {}
+      };
+
+    public:
+      /** Assign a LineFormater.
+       * If you want to format loglines by yourself. NULL installs the
+       * default formater.
+      */
+      void setLineFormater( const shared_ptr<LineFormater> & formater_r );
+
+    public:
+      /** Set path for the logfile.
+       * Permission for logfiles is set to 0640 unless an explicit mode_t
+       * value is given. An empty pathname turns off logging. <tt>"-"</tt>
+       * logs to std::err.
+       * \throw if \a logfile_r is not usable.
+      */
+      void logfile( const Pathname & logfile_r );
+      void logfile( const Pathname & logfile_r, mode_t mode_r );
+
+      /** Turn off logging. */
+      void logNothing();
+
+      /** Log to std::err. */
+      void logToStdErr();
+
+      /** will cause the log thread to exit and flush all sockets */
+      void emergencyShutdown();
+
+    public:
+      /** Get the current LineWriter */
+      shared_ptr<LineWriter> getLineWriter() const;
+
+      /** Assign a LineWriter.
+       * If you want to log the (formated) loglines by yourself.
+       * NULL turns off logging (same as logNothing)
+       * \see \ref log::LineWriter
+       */
+      void setLineWriter( const shared_ptr<LineWriter> & writer_r );
+
+    public:
+      /** Turn on excessive logging for the lifetime of this object.*/
+      struct TmpExcessive
+      {
+        TmpExcessive();
+        ~TmpExcessive();
+      };
+
+      /** Exchange LineWriter for the lifetime of this object.
+       * \see \ref log::LineWriter
+      */
+      struct TmpLineWriter
+      {
+        TmpLineWriter( const shared_ptr<LineWriter> & writer_r = shared_ptr<LineWriter>() )
+          : _writer( LogControl::instance().getLineWriter() )
+        { LogControl::instance().setLineWriter( writer_r ); }
+
+        /** Convenience ctor taking over ownership of an allocated LineWriter.
+         *\code
+         * TmpLineWriter mylw( new log::StderrLineWriter );
+         * \endcode
+        */
+        template<class TLineWriter>
+        TmpLineWriter( TLineWriter * _allocated_r )
+          : _writer( LogControl::instance().getLineWriter() )
+        { LogControl::instance().setLineWriter( shared_ptr<LineWriter>( _allocated_r ) ); }
+
+        ~TmpLineWriter()
+        { LogControl::instance().setLineWriter( _writer ); }
+
+      private:
+        shared_ptr<LineWriter> _writer;
+      };
+
+    private:
+      /** Default ctor: Singleton */
+      LogControl()
+      {}
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates LogControl Stream output */
+    std::ostream & operator<<( std::ostream & str, const LogControl & obj );
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace base
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_LOGCONTROL_H
diff --git a/zypp-core/base/LogTools.h b/zypp-core/base/LogTools.h
new file mode 100644 (file)
index 0000000..0ca7f6a
--- /dev/null
@@ -0,0 +1,440 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/LogTools.h
+ *
+*/
+#ifndef ZYPP_BASE_LOGTOOLS_H
+#define ZYPP_BASE_LOGTOOLS_H
+
+#include <iostream>
+#include <string>
+#include <vector>
+#include <list>
+#include <set>
+#include <map>
+
+#include <zypp-core/base/Hash.h>
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/Iterator.h>
+#include <zypp-core/Globals.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  using std::endl;
+
+  /** Print range defined by iterators (multiline style).
+   * \code
+   * intro [ pfx ITEM [ { sep ITEM }+ ] sfx ] extro
+   * \endcode
+   *
+   * The defaults print the range enclosed in \c {}, one item per
+   * line indented by 2 spaces.
+   * \code
+   * {
+   *   item1
+   *   item2
+   * }
+   * {} // on empty range
+   * \endcode
+   *
+   * A comma separated list enclosed in \c () would be:
+   * \code
+   * dumpRange( stream, begin, end, "(", "", ", ", "", ")" );
+   * // or shorter:
+   * dumpRangeLine( stream, begin, end );
+   * \endcode
+   *
+   * \note Some special handling is required for printing std::maps.
+   * Therefore iomaipulators \ref dumpMap, \ref dumpKeys and \ref dumpValues
+   * are provided.
+   * \code
+   * std::map<string,int> m;
+   * m["a"]=1;
+   * m["b"]=2;
+   * m["c"]=3;
+   *
+   * dumpRange( DBG, dumpMap(m).begin(), dumpMap(m).end() ) << endl;
+   * // {
+   * //   [a] = 1
+   * //   [b] = 2
+   * //   [c] = 3
+   * // }
+   * dumpRange( DBG, dumpKeys(m).begin(), dumpKeys(m).end() ) << endl;
+   * // {
+   * //   a
+   * //   b
+   * //   c
+   * // }
+   * dumpRange( DBG, dumpValues(m).begin(), dumpValues(m).end() ) << endl;
+   * // {
+   * //   1
+   * //   2
+   * //   3
+   * // }
+   * dumpRangeLine( DBG, dumpMap(m).begin(), dumpMap(m).end() ) << endl;
+   * // ([a] = 1, [b] = 2, [c] = 3)
+   * dumpRangeLine( DBG, dumpKeys(m).begin(), dumpKeys(m).end() ) << endl;
+   * // (a, b, c)
+   * dumpRangeLine( DBG, dumpValues(m).begin(), dumpValues(m).end() ) << endl;
+   * // (1, 2, 3)
+   * \endcode
+  */
+  template<class TIterator>
+    std::ostream & dumpRange( std::ostream & str,
+                              TIterator begin, TIterator end,
+                              const std::string & intro = "{",
+                              const std::string & pfx   = "\n  ",
+                              const std::string & sep   = "\n  ",
+                              const std::string & sfx   = "\n",
+                              const std::string & extro = "}" )
+    {
+      str << intro;
+      if ( begin != end )
+        {
+          str << pfx << *begin;
+          for (  ++begin; begin != end; ++begin )
+            str << sep << *begin;
+          str << sfx;
+        }
+      return str << extro;
+    }
+
+  /** Print range defined by iterators (single line style).
+   * \see dumpRange
+   */
+  template<class TIterator>
+    std::ostream & dumpRangeLine( std::ostream & str,
+                                  TIterator begin, TIterator end )
+    { return dumpRange( str, begin, end, "(", "", ", ", "", ")" ); }
+  /** \overload for container */
+  template<class TContainer>
+    std::ostream & dumpRangeLine( std::ostream & str, const TContainer & cont )
+    { return dumpRangeLine( str, cont.begin(), cont.end() ); }
+
+
+  ///////////////////////////////////////////////////////////////////
+  namespace iomanip
+  {
+    ///////////////////////////////////////////////////////////////////
+    /// \class RangeLine<TIterator>
+    /// \brief Iomanip helper printing dumpRangeLine style
+    ///////////////////////////////////////////////////////////////////
+    template<class TIterator>
+    struct RangeLine
+    {
+      RangeLine( TIterator begin, TIterator end )
+      : _begin( begin )
+      , _end( end )
+      {}
+      TIterator _begin;
+      TIterator _end;
+    };
+
+    /** \relates RangeLine<TIterator> */
+    template<class TIterator>
+    std::ostream & operator<<( std::ostream & str, const RangeLine<TIterator> & obj )
+    { return dumpRangeLine( str, obj._begin, obj._end ); }
+
+  } // namespce iomanip
+  ///////////////////////////////////////////////////////////////////
+
+  /** Iomanip printing dumpRangeLine style
+   * \code
+   *   std::vector<int> c( { 1, 1, 2, 3, 5, 8 } );
+   *   std::cout << rangeLine(c) << std::endl;
+   *   -> (1, 1, 2, 3, 5, 8)
+   * \endcode
+   */
+  template<class TIterator>
+  iomanip::RangeLine<TIterator> rangeLine( TIterator begin, TIterator end )
+  { return iomanip::RangeLine<TIterator>( begin, end ); }
+  /** \overload for container */
+  template<class TContainer>
+  auto rangeLine( const TContainer & cont ) -> decltype( rangeLine( cont.begin(), cont.end() ) )
+  { return rangeLine( cont.begin(), cont.end() ); }
+
+  template<class Tp>
+    std::ostream & operator<<( std::ostream & str, const std::vector<Tp> & obj )
+    { return dumpRange( str, obj.begin(), obj.end() ); }
+
+  template<class Tp, class TCmp, class TAlloc>
+    std::ostream & operator<<( std::ostream & str, const std::set<Tp,TCmp,TAlloc> & obj )
+    { return dumpRange( str, obj.begin(), obj.end() ); }
+
+  template<class Tp>
+    std::ostream & operator<<( std::ostream & str, const std::unordered_set<Tp> & obj )
+    { return dumpRange( str, obj.begin(), obj.end() ); }
+
+  template<class Tp>
+    std::ostream & operator<<( std::ostream & str, const std::multiset<Tp> & obj )
+    { return dumpRange( str, obj.begin(), obj.end() ); }
+
+  template<class Tp>
+    std::ostream & operator<<( std::ostream & str, const std::list<Tp> & obj )
+    { return dumpRange( str, obj.begin(), obj.end() ); }
+
+  template<class Tp>
+    std::ostream & operator<<( std::ostream & str, const Iterable<Tp> & obj )
+    { return dumpRange( str, obj.begin(), obj.end() ); }
+
+  ///////////////////////////////////////////////////////////////////
+  namespace _logtoolsdetail
+  { /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    // mapEntry
+    ///////////////////////////////////////////////////////////////////
+
+    /** std::pair wrapper for std::map output.
+     * Just because we want a special output format for std::pair
+     * used in a std::map. The mapped std::pair is printed as
+     * <tt>[key] = value</tt>.
+    */
+    template<class TPair>
+      class MapEntry
+      {
+      public:
+        MapEntry( const TPair & pair_r )
+        : _pair( &pair_r )
+        {}
+
+        const TPair & pair() const
+        { return *_pair; }
+
+      private:
+        const TPair *const _pair;
+      };
+
+    /** \relates MapEntry Stream output. */
+    template<class TPair>
+      std::ostream & operator<<( std::ostream & str, const MapEntry<TPair> & obj )
+      {
+        return str << '[' << obj.pair().first << "] = " << obj.pair().second;
+      }
+
+    /** \relates MapEntry Convenience function to create MapEntry from std::pair. */
+    template<class TPair>
+      MapEntry<TPair> mapEntry( const TPair & pair_r )
+      { return MapEntry<TPair>( pair_r ); }
+
+    ///////////////////////////////////////////////////////////////////
+    // dumpMap
+    ///////////////////////////////////////////////////////////////////
+
+    /** std::map wrapper for stream output.
+     * Uses a transform_iterator to wrap the std::pair into MapEntry.
+     *
+     */
+    template<class TMap>
+      class DumpMap
+      {
+      public:
+        typedef TMap                        MapType;
+        typedef typename TMap::value_type   PairType;
+        typedef MapEntry<PairType>          MapEntryType;
+
+        struct Transformer : public std::unary_function<PairType, MapEntryType>
+        {
+          MapEntryType operator()( const PairType & pair_r ) const
+          { return mapEntry( pair_r ); }
+        };
+
+        typedef transform_iterator<Transformer, typename MapType::const_iterator>
+                MapEntry_const_iterator;
+
+      public:
+        DumpMap( const TMap & map_r )
+        : _map( &map_r )
+        {}
+
+        const TMap & map() const
+        { return *_map; }
+
+        MapEntry_const_iterator begin() const
+        { return make_transform_iterator( map().begin(), Transformer() ); }
+
+        MapEntry_const_iterator end() const
+        { return make_transform_iterator( map().end(), Transformer() );}
+
+      private:
+        const TMap *const _map;
+      };
+
+    /** \relates DumpMap Stream output. */
+    template<class TMap>
+      std::ostream & operator<<( std::ostream & str, const DumpMap<TMap> & obj )
+      { return dumpRange( str, obj.begin(), obj.end() ); }
+
+    /** \relates DumpMap Convenience function to create DumpMap from std::map. */
+    template<class TMap>
+      DumpMap<TMap> dumpMap( const TMap & map_r )
+      { return DumpMap<TMap>( map_r ); }
+
+    ///////////////////////////////////////////////////////////////////
+    // dumpKeys
+    ///////////////////////////////////////////////////////////////////
+
+    /** std::map wrapper for stream output of keys.
+     * Uses MapKVIterator iterate and write the key values.
+     * \code
+     * std::map<...> mymap;
+     * std::cout << dumpKeys(mymap) << std::endl;
+     * \endcode
+     */
+    template<class TMap>
+      class DumpKeys
+      {
+      public:
+        typedef typename MapKVIteratorTraits<TMap>::Key_const_iterator MapKey_const_iterator;
+
+      public:
+        DumpKeys( const TMap & map_r )
+        : _map( &map_r )
+        {}
+
+        const TMap & map() const
+        { return *_map; }
+
+        MapKey_const_iterator begin() const
+        { return make_map_key_begin( map() ); }
+
+        MapKey_const_iterator end() const
+        { return make_map_key_end( map() ); }
+
+      private:
+        const TMap *const _map;
+      };
+
+    /** \relates DumpKeys Stream output. */
+    template<class TMap>
+      std::ostream & operator<<( std::ostream & str, const DumpKeys<TMap> & obj )
+      { return dumpRange( str, obj.begin(), obj.end() ); }
+
+    /** \relates DumpKeys Convenience function to create DumpKeys from std::map. */
+    template<class TMap>
+      DumpKeys<TMap> dumpKeys( const TMap & map_r )
+      { return DumpKeys<TMap>( map_r ); }
+
+    ///////////////////////////////////////////////////////////////////
+    // dumpValues
+    ///////////////////////////////////////////////////////////////////
+
+    /** std::map wrapper for stream output of values.
+     * Uses MapKVIterator iterate and write the values.
+     * \code
+     * std::map<...> mymap;
+     * std::cout << dumpValues(mymap) << std::endl;
+     * \endcode
+     */
+    template<class TMap>
+      class DumpValues
+      {
+      public:
+        typedef typename MapKVIteratorTraits<TMap>::Value_const_iterator MapValue_const_iterator;
+
+      public:
+        DumpValues( const TMap & map_r )
+        : _map( &map_r )
+        {}
+
+        const TMap & map() const
+        { return *_map; }
+
+        MapValue_const_iterator begin() const
+        { return make_map_value_begin( map() ); }
+
+        MapValue_const_iterator end() const
+        { return make_map_value_end( map() ); }
+
+      private:
+        const TMap *const _map;
+      };
+
+    /** \relates DumpValues Stream output. */
+    template<class TMap>
+      std::ostream & operator<<( std::ostream & str, const DumpValues<TMap> & obj )
+      { return dumpRange( str, obj.begin(), obj.end() ); }
+
+    /** \relates DumpValues Convenience function to create DumpValues from std::map. */
+    template<class TMap>
+      DumpValues<TMap> dumpValues( const TMap & map_r )
+      { return DumpValues<TMap>( map_r ); }
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace _logtoolsdetail
+  ///////////////////////////////////////////////////////////////////
+
+  // iomanipulator
+  using _logtoolsdetail::mapEntry;   // std::pair as '[key] = value'
+  using _logtoolsdetail::dumpMap;    // dumpRange '[key] = value'
+  using _logtoolsdetail::dumpKeys;   // dumpRange keys
+  using _logtoolsdetail::dumpValues; // dumpRange values
+
+  template<class TKey, class Tp>
+    std::ostream & operator<<( std::ostream & str, const std::map<TKey, Tp> & obj )
+    { return str << dumpMap( obj ); }
+
+  template<class TKey, class Tp>
+    std::ostream & operator<<( std::ostream & str, const std::unordered_map<TKey, Tp> & obj )
+    { return str << dumpMap( obj ); }
+
+  template<class TKey, class Tp>
+    std::ostream & operator<<( std::ostream & str, const std::multimap<TKey, Tp> & obj )
+    { return str << dumpMap( obj ); }
+
+  /** Print stream status bits.
+   * Prints the values of a streams \c good, \c eof, \c failed and \c bad bit.
+   *
+   * \code
+   *  [g___] - good
+   *  [_eF_] - eof and fail bit set
+   *  [__FB] - fail and bad bit set
+   * \endcode
+  */
+  inline std::ostream & operator<<( std::ostream & str, const std::basic_ios<char> & obj )
+  {
+    std::string ret( "[" );
+    ret += ( obj.good() ? 'g' : '_' );
+    ret += ( obj.eof()  ? 'e' : '_' );
+    ret += ( obj.fail() ? 'F' : '_' );
+    ret += ( obj.bad()  ? 'B' : '_' );
+    ret += "]";
+    return str << ret;
+  }
+
+  ///////////////////////////////////////////////////////////////////
+  // iomanipulator: str << dump(val) << ...
+  // calls:         std::ostream & dumpOn( std::ostream & str, const Type & obj )
+  ///////////////////////////////////////////////////////////////////
+
+  namespace detail
+  {
+    template<class Tp>
+    struct Dump
+    {
+      Dump( const Tp & obj_r ) : _obj( obj_r ) {}
+      const Tp & _obj;
+    };
+
+    template<class Tp>
+    std::ostream & operator<<( std::ostream & str, const Dump<Tp> & obj )
+    { return dumpOn( str, obj._obj ); }
+  }
+
+  template<class Tp>
+  detail::Dump<Tp> dump( const Tp & obj_r )
+  { return detail::Dump<Tp>(obj_r); }
+
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_LOGTOOLS_H
diff --git a/zypp-core/base/Logger.h b/zypp-core/base/Logger.h
new file mode 100644 (file)
index 0000000..52c1168
--- /dev/null
@@ -0,0 +1,183 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/base/Logger.h
+ *
+*/
+#ifndef ZYPP_BASE_LOGGER_H
+#define ZYPP_BASE_LOGGER_H
+#include <cstring>
+#include <iosfwd>
+#include <string>
+
+///////////////////////////////////////////////////////////////////
+#ifndef ZYPP_NDEBUG
+namespace zypp
+{
+  namespace debug
+  { // impl in LogControl.cc
+
+    // Log code loacaton and block leave
+    // Indent if nested
+    struct TraceLeave
+    {
+      TraceLeave( const TraceLeave & ) =delete;
+      TraceLeave & operator=( const TraceLeave & ) =delete;
+      TraceLeave( const char * file_r, const char * fnc_r, int line_r );
+      ~TraceLeave();
+    private:
+      static unsigned _depth;
+      const char *    _file;
+      const char *    _fnc;
+      int             _line;
+    };
+#define TRACE ::zypp::debug::TraceLeave _TraceLeave( __FILE__, __FUNCTION__, __LINE__ )
+
+    // OnScreenDebug messages colored to stderr
+    struct Osd
+    {
+      Osd( std::ostream &, int = 0 );
+      ~Osd();
+
+      template<class Tp>
+      Osd & operator<<( Tp && val )
+      {
+       _strout << std::forward<Tp>(val);
+       _strlog << std::forward<Tp>(val);
+       return *this;
+      }
+
+      Osd & operator<<( std::ostream& (*iomanip)( std::ostream& ) );
+
+    private:
+      std::ostream & _strout;
+      std::ostream & _strlog;
+    };
+#define OSD ::zypp::debug::Osd(L_USR("OSD"))
+  }
+}
+#endif // ZYPP_NDEBUG
+///////////////////////////////////////////////////////////////////
+
+/** \defgroup ZYPP_BASE_LOGGER_MACROS ZYPP_BASE_LOGGER_MACROS
+ *  Convenience macros for logging.
+ *
+ * The macros finaly call @ref getStream, providing appropriate arguments,
+ * to return the log stream.
+ *
+ * @code
+ * L_DBG("foo") << ....
+ * @endcode
+ * Logs a debug message for group @a "foo".
+ *
+ * @code
+ * #undef ZYPP_BASE_LOGGER_LOGGROUP
+ * #define ZYPP_BASE_LOGGER_LOGGROUP "foo"
+ *
+ * DBG << ....
+ * @endcode
+ * Defines group @a "foo" as default for log messages and logs a
+ * debug message.
+ */
+/*@{*/
+
+#ifndef ZYPP_BASE_LOGGER_LOGGROUP
+/** Default log group if undefined. */
+#define ZYPP_BASE_LOGGER_LOGGROUP "DEFINE_LOGGROUP"
+#endif
+
+#define XXX L_XXX( ZYPP_BASE_LOGGER_LOGGROUP )
+#define DBG L_DBG( ZYPP_BASE_LOGGER_LOGGROUP )
+#define MIL L_MIL( ZYPP_BASE_LOGGER_LOGGROUP )
+#define WAR L_WAR( ZYPP_BASE_LOGGER_LOGGROUP )
+#define ERR L_ERR( ZYPP_BASE_LOGGER_LOGGROUP )
+#define SEC L_SEC( ZYPP_BASE_LOGGER_LOGGROUP )
+#define INT L_INT( ZYPP_BASE_LOGGER_LOGGROUP )
+#define USR L_USR( ZYPP_BASE_LOGGER_LOGGROUP )
+
+#define L_XXX(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_XXX )
+#define L_DBG(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP"++", zypp::base::logger::E_MIL )
+#define L_MIL(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_MIL )
+#define L_WAR(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_WAR )
+#define L_ERR(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_ERR )
+#define L_SEC(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_SEC )
+#define L_INT(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_INT )
+#define L_USR(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_USR )
+
+#define L_ENV_CONSTR_DEFINE_FUNC(ENV) \
+    const char *empty_or_group_if_##ENV ( const char *group ) \
+    { \
+      static bool has_##ENV = (::getenv(#ENV) != NULL); \
+      return has_##ENV ? group : nullptr; \
+    }
+
+#define L_ENV_CONSTR_FWD_DECLARE_FUNC(ENV) const char *empty_or_group_if_##ENV ( const char *group )
+#define L_ENV_CONSTR(ENV,GROUP,LEVEL) ZYPP_BASE_LOGGER_LOG( zypp::empty_or_group_if_##ENV( #GROUP ), LEVEL )
+
+#define L_BASEFILE ( *__FILE__ == '/' ? strrchr( __FILE__, '/' ) + 1 : __FILE__ )
+
+/** Actual call to @ref getStream. */
+#define ZYPP_BASE_LOGGER_LOG(GROUP,LEVEL) \
+        zypp::base::logger::getStream( GROUP, LEVEL, L_BASEFILE, __FUNCTION__, __LINE__ )
+
+/*@}*/
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace base
+  { /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    namespace logger
+    { /////////////////////////////////////////////////////////////////
+
+      /** Definition of log levels.
+       *
+       * @see getStream
+      */
+      enum LogLevel {
+        E_XXX = 999, /**< Excessive logging. */
+        E_DBG = 0,   /**< Debug or verbose. */
+        E_MIL,       /**< Milestone. */
+        E_WAR,       /**< Warning. */
+        E_ERR,       /**< Error. */
+        E_SEC,       /**< Secutrity related. */
+        E_INT,       /**< Internal error. */
+        E_USR        /**< User log. */
+      };
+
+      /** Return a log stream to write on.
+       *
+       * The returned log stream is determined by @a group_r and
+       * @a level_r. The remaining arguments @a file_r, @a func_r
+       * and @a line_r are expected to denote the location in the
+       * source code that issued the message.
+       *
+       * @note You won't call @ref getStream directly, but use the
+       * @ref ZYPP_BASE_LOGGER_MACROS.
+      */
+      extern std::ostream & getStream( const char * group_r,
+                                       LogLevel     level_r,
+                                       const char * file_r,
+                                       const char * func_r,
+                                       const int    line_r );
+      extern bool isExcessive();
+
+      /////////////////////////////////////////////////////////////////
+    } // namespace logger
+    ///////////////////////////////////////////////////////////////////
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace base
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_LOGGER_H
diff --git a/zypp-core/base/NonCopyable.h b/zypp-core/base/NonCopyable.h
new file mode 100644 (file)
index 0000000..78d2cfb
--- /dev/null
@@ -0,0 +1,34 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/base/NonCopyable.h
+*/
+#ifndef ZYPP_BASE_NONCOPYABLE_H
+#define ZYPP_BASE_NONCOPYABLE_H
+
+#include <boost/noncopyable.hpp>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace base
+  { /////////////////////////////////////////////////////////////////
+
+    /** Ensure derived classes cannot be copied.
+     * Use private inheritance.
+    */
+    typedef boost::noncopyable NonCopyable;
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace base
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_NONCOPYABLE_H
similarity index 92%
rename from zypp/base/ProfilingFormater.cc
rename to zypp-core/base/ProfilingFormater.cc
index c165d95..56ea773 100644 (file)
 #include <fstream>
 #include <string>
 
-#include <zypp/base/Logger.h>
-#include <zypp/base/LogControl.h>
-#include <zypp/base/String.h>
-#include <zypp/Date.h>
-#include <zypp/PathInfo.h>
+#include <zypp-core/base/String.h>
 
-
-#include <zypp/base/ProfilingFormater.h>
+#include <zypp-core/base/ProfilingFormater.h>
 
 using std::endl;
 
diff --git a/zypp-core/base/ProfilingFormater.h b/zypp-core/base/ProfilingFormater.h
new file mode 100644 (file)
index 0000000..b09cc50
--- /dev/null
@@ -0,0 +1,44 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/ProfilingFormater.h
+ *
+*/
+#ifndef ZYPP_BASE_PROFILINGFORMATER_H
+#define ZYPP_BASE_PROFILINGFORMATER_H
+
+#include <iosfwd>
+#include <string>
+#include <zypp-core/base/LogControl.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace base
+  { /////////////////////////////////////////////////////////////////
+
+    struct ProfilingFormater : public LogControl::LineFormater
+    {
+      virtual std::string format( const std::string & /*group_r*/,
+                                  logger::LogLevel    /*level_r*/,
+                                  const char *        /*file_r*/,
+                                  const char *        /*func_r*/,
+                                  int                 /*line_r*/,
+                                  const std::string & /*message_r*/ );
+      virtual ~ProfilingFormater() {}
+    };
+
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace base
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_PROFILINGFORMATER_H
diff --git a/zypp-core/base/PtrTypes.h b/zypp-core/base/PtrTypes.h
new file mode 100644 (file)
index 0000000..d0a6cf4
--- /dev/null
@@ -0,0 +1,631 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/base/PtrTypes.h
+ *  \ingroup ZYPP_SMART_PTR
+ *  \see ZYPP_SMART_PTR
+*/
+#ifndef ZYPP_BASE_PTRTYPES_H
+#define ZYPP_BASE_PTRTYPES_H
+
+#include <iosfwd>
+#include <string>
+
+#include <boost/scoped_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+#include <boost/intrusive_ptr.hpp>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  namespace str
+  {
+    // printing void* (prevents us from including <ostream>)
+    std::string form( const char * format, ... ) __attribute__ ((format (printf, 1, 2)));
+  }
+
+    /** \defgroup ZYPP_SMART_PTR Smart pointer types
+     *  Smart pointer types.
+     *
+     * Namespace zypp provides 3 smart pointer types \b using the
+     * boost smart pointer library.
+     *
+     * \li \c scoped_ptr Simple sole ownership of single objects. Noncopyable.
+     *
+     * \li \c shared_ptr Object ownership shared among multiple pointers
+     *
+     * \li \c weak_ptr Non-owning observers of an object owned by shared_ptr.
+     *
+     * And \ref zypp::RW_pointer, as wrapper around a smart pointer,
+     * poviding \c const correct read/write access to the object it refers.
+    */
+    /*@{*/
+
+    /** shared_ptr custom deleter doing nothing.
+     * A custom deleter is a function being called when the
+     * last shared_ptr goes out of score. Per default the
+     * object gets deleted, but you can insall custom deleters
+     * as well. This one does nothing.
+     *
+     * \code
+     *  // Some class providing a std::istream
+     *  struct InpuStream
+     * {
+     *   // Per deafult use std::cin.
+     *   InputStream()
+     *   : _stream( &std::cin, NullDeleter() )
+     *   {}
+     *   // Or read from a file.
+     *   InputStream( const Pathname & file_r )
+     *   : _stream( new ifgzstream( _path.asString().c_str() ) )
+     *   {}
+     *   // Or use a stream priovided by the application.
+     *   InputStream( std::istream & stream_r )
+     *   : _stream( &stream_r, NullDeleter() )
+     *   {}
+     *
+     *   std::istream & stream()
+     *   { return *_stream; }
+     *
+     * private:
+     *   shared_ptr<std::istream> _stream;
+     * };
+     * \endcode
+    */
+    struct NullDeleter
+    {
+      void operator()( const void *const ) const
+      {}
+    };
+
+    /** \class scoped_ptr */
+    using boost::scoped_ptr;
+
+    /** \class shared_ptr */
+    using boost::shared_ptr;
+
+    /** \class weak_ptr */
+    using boost::weak_ptr;
+
+    /** \class intrusive_ptr */
+    using boost::intrusive_ptr;
+
+    /** */
+    using boost::static_pointer_cast;
+    /**  */
+    using boost::const_pointer_cast;
+    /**  */
+    using boost::dynamic_pointer_cast;
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////
+namespace std
+{ /////////////////////////////////////////////////////////////////
+
+  // namespace sub {
+  //    class Foo;
+  //    typedef zypp::intrusive_ptr<Foo> Foo_Ptr; // see DEFINE_PTR_TYPE(NAME) macro below
+  // }
+
+  // Defined in namespace std g++ finds the output operator (König-Lookup),
+  // even if we typedef the pointer in a different namespace than ::zypp.
+  // Otherwise we had to define an output operator always in the same namespace
+  // as the typedef (else g++ will just print the pointer value).
+
+  /** \relates zypp::shared_ptr Stream output. */
+  template<class D>
+  inline std::ostream & operator<<( std::ostream & str, const zypp::shared_ptr<D> & obj )
+  {
+    if ( obj )
+      return str << *obj;
+    return str << std::string("NULL");
+  }
+  /** \overload specialize for void */
+  template<>
+  inline std::ostream & operator<<( std::ostream & str, const zypp::shared_ptr<void> & obj )
+  {
+    if ( obj )
+      return str << zypp::str::form( "%p", (void*)obj.get() );
+    return str << std::string("NULL");
+  }
+
+  /** \relates zypp::shared_ptr Stream output. */
+  template<class D>
+  inline std::ostream & dumpOn( std::ostream & str, const zypp::shared_ptr<D> & obj )
+  {
+    if ( obj )
+      return dumpOn( str, *obj );
+    return str << std::string("NULL");
+  }
+  /** \overload specialize for void */
+  template<>
+  inline std::ostream & dumpOn( std::ostream & str, const zypp::shared_ptr<void> & obj )
+  { return str << obj; }
+
+  /** \relates zypp::intrusive_ptr Stream output. */
+  template<class D>
+  inline std::ostream & operator<<( std::ostream & str, const zypp::intrusive_ptr<D> & obj )
+  {
+    if ( obj )
+      return str << *obj;
+    return str << std::string("NULL");
+  }
+  /** \relates zypp::intrusive_ptr Stream output. */
+  template<class D>
+  inline std::ostream & dumpOn( std::ostream & str, const zypp::intrusive_ptr<D> & obj )
+  {
+    if ( obj )
+      return dumpOn( str, *obj );
+    return str << std::string("NULL");
+  }
+  /////////////////////////////////////////////////////////////////
+} // namespace std
+///////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // RW_pointer traits
+    //
+    ///////////////////////////////////////////////////////////////////
+    /**
+     * Don't forgett to provide versions for PtrType and constPtrType,
+     * esp. if creation a of temporary is not acceptable (eg. when
+     * checking the ref count value).
+    */
+    namespace rw_pointer {
+
+      template<class D>
+        struct Shared
+        {
+          typedef shared_ptr<D>       PtrType;
+          typedef shared_ptr<const D> constPtrType;
+          /** Check whether pointer is not shared. */
+          bool unique( const constPtrType & ptr_r )
+          { return !ptr_r || ptr_r.unique(); }
+          bool unique( const PtrType & ptr_r )
+          { return !ptr_r || ptr_r.unique(); }
+          /** Return number of references. */
+          long use_count( const constPtrType & ptr_r ) const
+          { return ptr_r.use_count(); }
+          long use_count( const PtrType & ptr_r ) const
+          { return ptr_r.use_count(); }
+        };
+
+      template<class D>
+        struct Intrusive
+        {
+          typedef intrusive_ptr<D>       PtrType;
+          typedef intrusive_ptr<const D> constPtrType;
+          /** Check whether pointer is not shared. */
+          bool unique( const constPtrType & ptr_r )
+          { return !ptr_r || (ptr_r->refCount() <= 1); }
+          bool unique( const PtrType & ptr_r )
+          { return !ptr_r || (ptr_r->refCount() <= 1); }
+          /** Return number of references. */
+          long use_count( const constPtrType & ptr_r ) const
+          { return ptr_r ? ptr_r->refCount() : 0; }
+          long use_count( const PtrType & ptr_r ) const
+          { return ptr_r ? ptr_r->refCount() : 0; }
+        };
+
+       template<class D>
+        struct Scoped
+        {
+          typedef scoped_ptr<D>       PtrType;
+          typedef scoped_ptr<const D> constPtrType;
+          /** Check whether pointer is not shared. */
+          bool unique( const constPtrType & ptr_r )
+          { return true; }
+          bool unique( const PtrType & ptr_r )
+          { return true; }
+          /** Return number of references. */
+          long use_count( const constPtrType & ptr_r ) const
+          { return ptr_r ? 1 : 0; }
+          long use_count( const PtrType & ptr_r ) const
+          { return ptr_r ? 1 : 0; }
+        };
+
+   }
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : RW_pointer
+    //
+    /** Wrapper for \c const correct access via \ref ZYPP_SMART_PTR.
+     *
+     * zypp::RW_pointer<tt>\<D,DTraits></tt> stores a \ref ZYPP_SMART_PTR
+     * of type \c DTraits::PtrType, which must be convertible into a <tt>D *</tt>.
+     * Pointer style access (via \c -> and \c *) offers a <tt>const D *</tt> in const
+     * a context, otherwise a <tt>D *</tt>. Thus \em RW_ means \em read/write,
+     * as you get a different type, dependent on whether you're allowed to
+     * read or write.
+     *
+     * Forwarding access from an interface to an implemantation class, an
+     * RW_pointer prevents const interface methods from accidentally calling
+     * nonconst implementation methods.
+     *
+     * The second template argument defaults to
+     * <tt>DTraits = rw_pointer::Shared<D></tt> thus wraping a
+     * <tt>shared_ptr<D></tt>. To wrap an <tt>intrusive_ptr<D></tt>
+     * use <tt>rw_pointer::Intrusive<D></tt>.
+     *
+     * \see zypp::RWCOW_pointer for 'copy on write' functionality.
+     *
+     * \code
+     * #include "zypp/base/PtrTypes.h"
+     *
+     * class Foo
+     * {
+     *   ...
+     *   private:
+     *     // Implementation class
+     *     struct Impl;
+     *     // Pointer to implementation; actually a shared_ptr<Impl>
+     *     RW_pointer<Impl> _pimpl;
+     *
+     *     void baa()       { _pimpl->... } // is Impl *
+     *     void baa() const { _pimpl->... } // is Impl const *
+     * };
+     * \endcode
+    */
+    template<class D, class DTraits = rw_pointer::Shared<D> >
+      struct RW_pointer
+      {
+        typedef typename DTraits::PtrType               PtrType;
+        typedef typename DTraits::constPtrType          constPtrType;
+
+        RW_pointer()
+        {}
+
+        RW_pointer( std::nullptr_t )
+        {}
+
+        explicit
+        RW_pointer( typename PtrType::element_type * dptr )
+        : _dptr( dptr )
+        {}
+
+        explicit
+        RW_pointer( PtrType dptr )
+        : _dptr( dptr )
+        {}
+
+        RW_pointer & operator=( std::nullptr_t )
+       { reset(); return *this; }
+
+        void reset()
+        { PtrType().swap( _dptr ); }
+
+        void reset( typename PtrType::element_type * dptr )
+        { PtrType( dptr ).swap( _dptr ); }
+
+        void swap( RW_pointer & rhs )
+        { _dptr.swap( rhs._dptr ); }
+
+        void swap( PtrType & rhs )
+        { _dptr.swap( rhs ); }
+
+        explicit operator bool() const
+        { return _dptr.get() != nullptr; }
+
+        const D & operator*() const
+        { return *_dptr; };
+
+        const D * operator->() const
+        { return _dptr.operator->(); }
+
+        const D * get() const
+        { return _dptr.get(); }
+
+        D & operator*()
+        { return *_dptr; }
+
+        D * operator->()
+        { return _dptr.operator->(); }
+
+        D * get()
+        { return _dptr.get(); }
+
+      public:
+        bool unique() const
+       { return DTraits().unique( _dptr ); }
+
+       long use_count() const
+       { return DTraits().use_count( _dptr ); }
+
+        constPtrType getPtr() const
+        { return _dptr; }
+
+        PtrType getPtr()
+        { return _dptr; }
+
+        constPtrType cgetPtr()
+        { return _dptr; }
+
+      private:
+        PtrType _dptr;
+      };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates RW_pointer Stream output.
+     *
+     * Print the \c D object the RW_pointer refers, or \c "NULL"
+     * if the pointer is \c NULL.
+     */
+    template<class D, class DPtr>
+      inline std::ostream & operator<<( std::ostream & str, const RW_pointer<D, DPtr> & obj )
+      {
+        if ( obj.get() )
+          return str << *obj.get();
+        return str << std::string("NULL");
+      }
+
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const RW_pointer<D, DPtr> & lhs, const RW_pointer<D, DPtr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const RW_pointer<D, DPtr> & lhs, const typename DPtr::PtrType & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const typename DPtr::PtrType & lhs, const RW_pointer<D, DPtr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const RW_pointer<D, DPtr> & lhs, const typename DPtr::constPtrType & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const typename DPtr::constPtrType & lhs, const RW_pointer<D, DPtr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const RW_pointer<D, DPtr> & lhs, std::nullptr_t )
+      { return( lhs.get() == nullptr ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( std::nullptr_t, const RW_pointer<D, DPtr> & rhs )
+      { return( nullptr == rhs.get() ); }
+
+
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const RW_pointer<D, DPtr> & lhs, const RW_pointer<D, DPtr> & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const RW_pointer<D, DPtr> & lhs, const typename DPtr::PtrType & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const typename DPtr::PtrType & lhs, const RW_pointer<D, DPtr> & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const RW_pointer<D, DPtr> & lhs, const typename DPtr::constPtrType & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const typename DPtr::constPtrType & lhs, const RW_pointer<D, DPtr> & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const RW_pointer<D, DPtr> & lhs, std::nullptr_t )
+      { return( lhs.get() != nullptr ); }
+    /** \relates RW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( std::nullptr_t, const RW_pointer<D, DPtr> & rhs )
+      { return( nullptr != rhs.get() ); }
+
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates RWCOW_pointer Clone the underlying object.
+     * Calls \a rhs <tt>-\>clone()</tt>. Being defined as a
+     * function outside \ref RWCOW_pointer allows to overload
+     * it, in case a specific \a D does not have <tt>clone()</tt>.
+     */
+    template<class D>
+      inline D * rwcowClone( const D * rhs )
+      { return rhs->clone(); }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : RWCOW_pointer
+    //
+    /** \ref RW_pointer supporting 'copy on write' functionality.
+     *
+     * \em Write access to the underlying object creates a copy, iff
+     * the object is shared.
+     *
+     * See \ref RW_pointer.
+    */
+    template<class D, class DTraits = rw_pointer::Shared<D> >
+      struct RWCOW_pointer
+      {
+        typedef typename DTraits::PtrType               PtrType;
+        typedef typename DTraits::constPtrType          constPtrType;
+
+       RWCOW_pointer()
+       {}
+
+       RWCOW_pointer( std::nullptr_t )
+       {}
+
+        explicit
+        RWCOW_pointer( typename PtrType::element_type * dptr )
+        : _dptr( dptr )
+        {}
+
+        explicit
+        RWCOW_pointer( PtrType dptr )
+        : _dptr( dptr )
+        {}
+
+        RWCOW_pointer & operator=( std::nullptr_t )
+       { reset(); return *this; }
+
+        void reset()
+        { PtrType().swap( _dptr ); }
+
+        void reset( typename PtrType::element_type * dptr )
+        { PtrType( dptr ).swap( _dptr ); }
+
+        void swap( RWCOW_pointer & rhs )
+        { _dptr.swap( rhs._dptr ); }
+
+        void swap( PtrType & rhs )
+        { _dptr.swap( rhs ); }
+
+        explicit operator bool() const
+       { return _dptr.get() != nullptr; }
+
+        const D & operator*() const
+        { return *_dptr; };
+
+        const D * operator->() const
+        { return _dptr.operator->(); }
+
+        const D * get() const
+        { return _dptr.get(); }
+
+        D & operator*()
+        { assertUnshared(); return *_dptr; }
+
+        D * operator->()
+        { assertUnshared(); return _dptr.operator->(); }
+
+        D * get()
+        { assertUnshared(); return _dptr.get(); }
+
+      public:
+        bool unique() const
+       { return DTraits().unique( _dptr ); }
+
+       long use_count() const
+       { return DTraits().use_count( _dptr ); }
+
+        constPtrType getPtr() const
+        { return _dptr; }
+
+        PtrType getPtr()
+        { assertUnshared(); return _dptr; }
+
+        constPtrType cgetPtr()
+        { return _dptr; }
+
+      private:
+
+        void assertUnshared()
+        {
+          if ( !unique() )
+            PtrType( rwcowClone( _dptr.get() ) ).swap( _dptr );
+        }
+
+      private:
+        PtrType _dptr;
+      };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates RWCOW_pointer Stream output.
+     *
+     * Print the \c D object the RWCOW_pointer refers, or \c "NULL"
+     * if the pointer is \c NULL.
+     */
+    template<class D, class DPtr>
+      inline std::ostream & operator<<( std::ostream & str, const RWCOW_pointer<D, DPtr> & obj )
+      {
+        if ( obj.get() )
+          return str << *obj.get();
+        return str << std::string("NULL");
+      }
+
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const RWCOW_pointer<D, DPtr> & lhs, const RWCOW_pointer<D, DPtr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const RWCOW_pointer<D, DPtr> & lhs, const typename DPtr::PtrType & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const typename DPtr::PtrType & lhs, const RWCOW_pointer<D, DPtr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const RWCOW_pointer<D, DPtr> & lhs, const typename DPtr::constPtrType & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const typename DPtr::constPtrType & lhs, const RWCOW_pointer<D, DPtr> & rhs )
+      { return( lhs.get() == rhs.get() ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( const RWCOW_pointer<D, DPtr> & lhs, std::nullptr_t )
+      { return( lhs.get() == nullptr ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator==( std::nullptr_t, const RWCOW_pointer<D, DPtr> & rhs )
+      { return( nullptr == rhs.get() ); }
+
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const RWCOW_pointer<D, DPtr> & lhs, const RWCOW_pointer<D, DPtr> & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const RWCOW_pointer<D, DPtr> & lhs, const typename DPtr::PtrType & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const typename DPtr::PtrType & lhs, const RWCOW_pointer<D, DPtr> & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const RWCOW_pointer<D, DPtr> & lhs, const typename DPtr::constPtrType & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const typename DPtr::constPtrType & lhs, const RWCOW_pointer<D, DPtr> & rhs )
+      { return ! ( lhs == rhs ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( const RWCOW_pointer<D, DPtr> & lhs, std::nullptr_t )
+      { return( lhs.get() != nullptr ); }
+    /** \relates RWCOW_pointer */
+    template<class D, class DPtr>
+      inline bool operator!=( std::nullptr_t, const RWCOW_pointer<D, DPtr> & rhs )
+      { return( nullptr != rhs.get() ); }
+
+    ///////////////////////////////////////////////////////////////////
+
+    /*@}*/
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+
+/** Forward declaration of Ptr types */
+#define DEFINE_PTR_TYPE(NAME) \
+class NAME;                                                      \
+extern void intrusive_ptr_add_ref( const NAME * );               \
+extern void intrusive_ptr_release( const NAME * );               \
+typedef zypp::intrusive_ptr<NAME>       NAME##_Ptr;        \
+typedef zypp::intrusive_ptr<const NAME> NAME##_constPtr;
+
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_PTRTYPES_H
similarity index 92%
rename from zypp/base/ReferenceCounted.cc
rename to zypp-core/base/ReferenceCounted.cc
index fde8c48..a2f0c0d 100644 (file)
@@ -6,14 +6,14 @@
 |                         /_____||_| |_| |_|                           |
 |                                                                      |
 \---------------------------------------------------------------------*/
-/** \file      zypp/base/ReferenceCounted.cc
+/** \file      zypp-core/base/ReferenceCounted.cc
  *
 */
 #include <iostream>
 
-#include <zypp/base/Logger.h>
-#include <zypp/base/Exception.h>
-#include <zypp/base/ReferenceCounted.h>
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/Exception.h>
+#include <zypp-core/base/ReferenceCounted.h>
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
diff --git a/zypp-core/base/ReferenceCounted.h b/zypp-core/base/ReferenceCounted.h
new file mode 100644 (file)
index 0000000..78b2f58
--- /dev/null
@@ -0,0 +1,143 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp-core/base/ReferenceCounted.h
+ *
+*/
+#ifndef ZYPP_CORE_BASE_REFERENCECOUNTED_H
+#define ZYPP_CORE_BASE_REFERENCECOUNTED_H
+
+#include <iosfwd>
+
+#include <zypp-core/base/PtrTypes.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace base
+  { /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : ReferenceCounted
+    //
+    /** Base class for reference counted objects.
+     * \todo Make counter thread safe.
+    */
+    class ReferenceCounted
+    {
+      /** Stream output via dumpOn. */
+      friend std::ostream & operator<<( std::ostream & str, const ReferenceCounted & obj );
+
+    public:
+      /** Default ctor.
+       * Initial reference count is zero.
+      */
+      ReferenceCounted();
+
+      /** Copy ctor.
+       * Initial reference count is zero.
+      */
+      ReferenceCounted( const ReferenceCounted & rhs );
+
+      /** Dtor.
+       * \throw std::out_of_range if reference count is not zero.
+      */
+      virtual ~ReferenceCounted();
+
+      /** Assignment.
+       * Reference count remains untouched.
+      */
+      ReferenceCounted & operator=( const ReferenceCounted & )
+      { return *this; }
+
+    public:
+      /** Return reference counter value. */
+      unsigned refCount() const
+      { return _counter; }
+
+      /** Add a reference. */
+      void ref() const
+      { ref_to( ++_counter ); }
+
+      /** Release a reference.
+       * Deletes the object if reference count gets zero.
+       * \throw std::out_of_range if reference count is zero.
+      */
+      void unref() const
+      {
+        if ( !_counter )
+          unrefException(); // will throw!
+        if ( --_counter )
+          unref_to( _counter );
+        else
+          delete this;
+      }
+
+      /** Called by zypp::intrusive_ptr to add a reference.
+       * \see ZYPP_SMART_PTR
+      */
+      static void add_ref( const ReferenceCounted * ptr_r )
+      { if( ptr_r ) ptr_r->ref(); }
+
+      /** Called by zypp::intrusive_ptr to add a reference.
+       * \see ZYPP_SMART_PTR
+      */
+      static void release( const ReferenceCounted * ptr_r )
+      { if( ptr_r ) ptr_r->unref(); }
+
+    protected:
+      /** Overload to realize std::ostream & operator\<\<. */
+      virtual std::ostream & dumpOn( std::ostream & str ) const;
+
+      /** Trigger derived classes after refCount was increased. */
+      virtual void ref_to( unsigned /* rep_cnt_r */ ) const {}
+
+      /** Trigger derived classes after refCount was decreased.
+       * No trigger is sent, if refCount got zero (i.e. the
+       * object is deleted).
+       **/
+      virtual void unref_to( unsigned /* rep_cnt_r */ ) const {}
+
+    private:
+      /** The reference counter. */
+      mutable unsigned _counter;
+
+      /** Throws Exception on unref. */
+      void unrefException() const;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates ReferenceCounted intrusive_ptr hook to add_ref. */
+    inline void intrusive_ptr_add_ref( const ReferenceCounted * ptr_r )
+    { ReferenceCounted::add_ref( ptr_r ); }
+
+    /** \relates ReferenceCounted intrusive_ptr hook to release. */
+    inline void intrusive_ptr_release( const ReferenceCounted * ptr_r )
+    { ReferenceCounted::release( ptr_r ); }
+
+    /** \relates ReferenceCounted Stream output. */
+    inline std::ostream & operator<<( std::ostream & str, const ReferenceCounted & obj )
+    { return obj.dumpOn( str ); }
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace base
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+
+#define IMPL_PTR_TYPE(NAME) \
+void intrusive_ptr_add_ref( const NAME * ptr_r )               \
+{ zypp::base::ReferenceCounted::add_ref( ptr_r ); }                  \
+void intrusive_ptr_release( const NAME * ptr_r )               \
+{ zypp::base::ReferenceCounted::release( ptr_r ); }
+
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_CORE_BASE_REFERENCECOUNTED_H
similarity index 98%
rename from zypp/base/Regex.cc
rename to zypp-core/base/Regex.cc
index ce4d9ee..0ceea33 100644 (file)
@@ -14,8 +14,8 @@
 
 #include <iostream>
 
-#include <zypp/base/Regex.h>
-#include <zypp/base/StringV.h>
+#include <zypp-core/base/Regex.h>
+#include <zypp-core/base/StringV.h>
 
 using namespace zypp;
 using namespace zypp::str;
diff --git a/zypp-core/base/Regex.h b/zypp-core/base/Regex.h
new file mode 100644 (file)
index 0000000..f0d555c
--- /dev/null
@@ -0,0 +1,193 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/base/Regex.h
+ *
+*/
+#ifndef ZYPP_BASE_REGEX_H
+#define ZYPP_BASE_REGEX_H
+
+#include <iosfwd>
+#include <string>
+#include <regex.h>
+
+#include <zypp-core/base/Exception.h>
+
+//////////////////////////////////////////////////////////////////
+namespace zypp
+{
+  //////////////////////////////////////////////////////////////////
+  /// \namespace str
+  /// \brief String related utilities and \ref ZYPP_STR_REGEX.
+  namespace str
+  {
+    //////////////////////////////////////////////////////////////////
+    /// \defgroup ZYPP_STR_REGEX Regular expression matching
+    /// \brief Regular expressions using the glibc regex library.
+    ///
+    /// \see also \ref StrMatcher string matcher also supporting globing, etc.
+    ///
+    /// \code
+    ///  str::regex rxexpr( "^(A)?([0-9]*) im" );
+    ///  str::smatch what;
+    ///
+    ///  std::string mytext( "Y123 imXXXX" );
+    ///  if ( str::regex_match( mytext, what, rxexpr ) )
+    ///  {
+    ///    MIL << "MATCH '" << what[0] << "'" << endl;
+    ///    MIL << " subs: " << what.size()-1 << endl;
+    ///    for_( i, 1U, what.size() )
+    ///      MIL << "      [" << i << "] " << what[i] << endl;
+    ///  }
+    ///  else
+    ///  {
+    ///    WAR << "NO MATCH '" << rxexpr << "' in '" <<  mytext << endl;
+    ///  }
+    /// \endcode
+    //////////////////////////////////////////////////////////////////
+
+    typedef Exception regex_error;
+
+    class smatch;
+    class regex;
+
+    //////////////////////////////////////////////////////////////////
+    /// \brief Regular expression matching
+    ///
+    /// \ingroup ZYPP_STR_REGEX
+    /// \relates regex
+    /// Return whether a \ref regex matches a specific string. An optionally
+    /// passed \ref smatch object will contain the match reults.
+    //////////////////////////////////////////////////////////////////
+    bool regex_match( const char * s, smatch & matches, const regex & regex );
+
+    /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */
+    inline bool regex_match(const std::string & s, smatch & matches, const regex & regex)
+    { return regex_match( s.c_str(), matches, regex ); }
+
+    /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */
+    bool regex_match( const char * s, const regex & regex );
+
+    /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */
+    inline bool regex_match( const std::string & s, const regex & regex )
+    { return regex_match( s.c_str(), regex ); }
+
+    /**
+     * Replaces the matched regex with the string passed in \a replacement.
+     * If \a global is set the search continues after the first match
+     *
+     * \note Using backreferences in the replacement string is NOT supported.
+     */
+    std::string regex_substitute ( const std::string & s, const regex & regex, const std::string &replacement, bool global = true );
+
+    //////////////////////////////////////////////////////////////////
+    /// \class regex
+    /// \brief Regular expression
+    ///
+    /// \ingroup ZYPP_STR_REGEX
+    //////////////////////////////////////////////////////////////////
+    class regex
+    {
+    public:
+
+      enum RegFlags {
+        icase          = REG_ICASE,    ///< Do not differentiate case
+        nosubs         = REG_NOSUB,    ///< Support for substring addressing of matches is not required
+        match_extended = REG_EXTENDED, ///< Use POSIX Extended Regular Expression syntax when interpreting regex.
+        newline         = REG_NEWLINE,  ///< Match newline
+        rxdefault       = match_extended|newline ///< These are enforced even if you don't pass them as flag argument
+      };
+
+      enum MatchFlags {
+        none    = 0,
+        not_bol = REG_NOTBOL ///< Do not match begin of line
+      };
+
+      regex();
+      regex( const std::string & s, int flags = rxdefault );
+      regex( const char* s, int flags = rxdefault ) : regex( std::string(s?s:""), flags ) {}
+      ~regex();
+
+      regex( const regex & rhs )
+      { assign( rhs.m_str, rhs.m_flags ); }
+
+      regex & operator=( const regex & rhs )
+      { assign( rhs.m_str, rhs.m_flags ); return *this; }
+
+      /**
+       * string representation of the regular expression
+       */
+      std::string asString() const
+      { return m_str; }
+
+      bool matches( const char * s, str::smatch & matches, int flags = none ) const;
+      bool matches( const std::string & s_r, str::smatch & matches_r, int flags_r = none ) const
+      { return matches( s_r.c_str(), matches_r, flags_r ); }
+
+      bool matches( const char * s ) const;
+      bool matches( const std::string & s_r ) const
+      { return matches( s_r.c_str() ); }
+
+    public:
+      /** Expert backdoor. Returns pointer to the compiled regex for direct use in regexec() */
+      regex_t * get()
+      { return & m_preg; }
+
+    private:
+      void assign( const std::string & s, int flags );
+
+    private:
+      friend class smatch;
+      std::string m_str;
+      int m_flags;
+      regex_t m_preg;
+      bool m_valid = false;
+    };
+
+    /** \relates regex Stream output */
+    inline std::ostream & operator<<( std::ostream & str, const regex & obj )
+    { return str << obj.asString(); }
+
+    //////////////////////////////////////////////////////////////////
+    /// \class smatch
+    /// \brief Regular expression match result
+    ///
+    /// \ingroup ZYPP_STR_REGEX
+    ///
+    /// Index \c n=0 returns the string object representing the character
+    /// sequence that matched the whole regular expression.
+    /// If \c n is out of range, or if \c n is an unmatched sub-expression,
+    /// then an empty string is returned.
+    //////////////////////////////////////////////////////////////////
+    class smatch
+    {
+    public:
+      smatch();
+
+      std::string operator[](unsigned i) const;
+
+      unsigned size() const;
+
+      /** Begin index of subexpression \c i in \a match_str (or std::string::npos) */
+      std::string::size_type begin( unsigned i ) const;
+
+      /** End index of subexpression \c i in \a match_str (or std::string::npos) */
+      std::string::size_type end( unsigned i ) const;
+
+      /** Size of subexpression \c i (or std::string::npos) */
+      std::string::size_type size( unsigned i ) const;
+
+      std::string match_str;
+      std::vector<regmatch_t> pmatch;
+    };
+
+  } // namespace str
+  //////////////////////////////////////////////////////////////////
+} // namespace zypp
+//////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_STRING_H
similarity index 99%
rename from zypp/base/String.cc
rename to zypp-core/base/String.cc
index 0cd357c..393fd34 100644 (file)
 
 #include <iostream>
 
-#include <zypp/base/String.h>
-#include <zypp/base/LogTools.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/LogTools.h>
 
-#include <zypp/TriBool.h>
+#include <zypp-core/TriBool.h>
 
 using std::string;
 
diff --git a/zypp-core/base/String.h b/zypp-core/base/String.h
new file mode 100644 (file)
index 0000000..11807b9
--- /dev/null
@@ -0,0 +1,1106 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/base/String.h
+ *
+*/
+#ifndef ZYPP_BASE_STRING_H
+#define ZYPP_BASE_STRING_H
+
+#include <cstring>
+
+#include <iosfwd>
+#include <vector>
+#include <string>
+#include <sstream>
+#include <boost/format.hpp>
+#include <boost/utility/string_ref.hpp>
+
+#include <zypp-core/base/Easy.h>
+#include <zypp-core/base/PtrTypes.h>
+#include <zypp-core/base/Function.h>
+
+///////////////////////////////////////////////////////////////////
+namespace boost { namespace logic { class tribool; } }
+namespace zypp { typedef boost::logic::tribool TriBool; }
+///////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{
+  /** Request a human readable (translated) string representation of Tp [Tp.asUserString()]
+   * Classes may implement a default as member function.
+   */
+  template <class Tp>
+  std::string asUserString( const Tp & val_r )
+  { return val_r.asUserString(); }
+
+}// namespace zypp
+///////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  /** Convenience \c char* constructible from \c std::string and \c char*,
+   *  it maps \c (char*)0 to an empty string.
+   *
+   * \code
+   * bool hasPrefix( const std::string & str_r, const std::string & prefix_r )
+   * { return( ::strncmp( str_r.c_str(), prefix_r.c_str(), prefix_r.size() ) == 0 ); }
+   * \endcode
+   *
+   * Called with a plain \c char* as argument, the \c std::string is created form
+   * for nothing. The implementation actually does not use the \c std::string.
+   *
+   * Best would be to implement \c hasPrefix for each combination of \c char*
+   * and \c std::string arguments:
+   *
+   * \code
+   * bool hasPrefix( const std::string & str_r, const std::string & prefix_r )
+   * { return( ::strncmp( str_r.c_str(), prefix_r.c_str(), prefix_r.size() ) == 0 ); }
+   *
+   * bool hasPrefix( const std::string & str_r, const char * prefix_r )
+   * { return( !prefix_r || ::strncmp( str_r.c_str(), prefix_r, ::strlen(prefix_r) ) == 0 ); }
+   *
+   * bool hasPrefix( const char * str_r, const std::string & prefix_r )
+   * { return( str_r ? ::strncmp( str_r, prefix_r.c_str(), prefix_r.size() ) == 0 : prefix_r.empty() ); }
+   *
+   * bool hasPrefix( const char * str_r, const char * prefix_r )
+   * { return( str && prefix_r ? ::strncmp( str_r, prefix_r, ::strlen(prefix_r) ) == 0
+   *                           : !((str_r && *str_r) || (prefix_r && *prefix_r)); }
+   * \endcode
+   *
+   * This is where \ref C_Str can help. Constructible from \c std::string and \c char*,
+   * it \e reduces the \c std::string to it's \c char*. At the same time it converts
+   * \c (char*)0 into an \c "" string.
+   *
+   * \code
+   * bool hasPrefix( const C_Str & str_r, const C_Str & prefix_r )
+   * { return( ::strncmp( str_r, prefix_r, prefix_r.size() ) == 0 ); }
+   * \endcode
+   *
+   * \todo Check whether to replace by boost::string_ref
+   */
+  class C_Str
+  {
+    public:
+      typedef std::string::size_type size_type;
+
+    public:
+      C_Str()                            : _val( 0 ),             _sze( 0 ) {}
+      C_Str( char * c_str_r )            : _val( c_str_r ),       _sze( std::string::npos ) {}
+      C_Str( const char * c_str_r )      : _val( c_str_r ),       _sze( std::string::npos ) {}
+      C_Str( const std::string & str_r ) : _val( str_r.c_str() ), _sze( str_r.size() ) {}
+      C_Str( const boost::string_ref & str_r ) : _val( str_r.data() ), _sze( str_r.size() ) {}
+#ifdef __cpp_lib_string_view
+      C_Str( const std::string_view & str_r ) : _val( str_r.data() ), _sze( str_r.size() ) {}
+#endif
+
+    public:
+      bool      isNull()       const { return !_val; }
+      bool      empty()        const { return !(_val && *_val); }
+      size_type size()         const
+      {
+        if ( _sze == std::string::npos )
+        { _sze = _val ? ::strlen( _val ) : 0; }
+        return _sze;
+      };
+
+      operator const char *() const { return c_str(); }
+      const char * c_str()    const { return _val ? _val : ""; }
+
+    private:
+      const char *const _val;
+      mutable size_type _sze;
+  };
+
+  /** \relates C_Str Stream output */
+  inline std::ostream & operator<<( std::ostream & str, const C_Str & obj )
+  { return str << obj.c_str(); }
+
+  ///////////////////////////////////////////////////////////////////
+  /** String related utilities and \ref ZYPP_STR_REGEX.
+   \see \ref ZYPP_STR_REGEX
+  */
+
+  namespace str
+  { /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    /**
+     * Global asString() that works with std::string too
+     */
+    inline const std::string & asString( const std::string & t )
+    { return t; }
+
+    inline std::string && asString( std::string && t )
+    { return std::move(t); }
+
+    inline std::string asString( const char * t )
+    { return t == nullptr ? std::string() : t; }
+
+    inline std::string asString( char * t )
+    { return t == nullptr ? std::string() : t; }
+
+    template<class Tp>
+        inline std::string asString( const Tp &t )
+        { return t.asString(); }
+
+    template<class Tp>
+        inline std::string asString( const intrusive_ptr<Tp> &p )
+        { return p->asString(); }
+
+    template<class Tp>
+        inline std::string asString( const weak_ptr<Tp> &p )
+        { return p->asString(); }
+
+    template<>
+        inline std::string asString( const bool &t )
+        { return t ? "true" : "false"; }
+
+    ///////////////////////////////////////////////////////////////////
+    /** Printf style construction of std::string. */
+    std::string form( const char * format, ... )
+    __attribute__ ((format (printf, 1, 2)));
+
+    ///////////////////////////////////////////////////////////////////
+    /** Return string describing the \a error_r code.
+     * Like ::strerror, but the numerical value is included in
+     * the string as well.
+    */
+    std::string strerror( int errno_r );
+
+    ///////////////////////////////////////////////////////////////////
+    /** Assert \c free called for allocated <tt>char *</tt>.
+     * \code
+     * ...
+     * SafeBuf safe;
+     * vasprintf( &safe._buf, format, ap );
+     * return safe.asString();
+     * \endcode
+     *
+     * \ingroup g_RAII
+    */
+    struct SafeBuf
+    {
+      char * _buf;
+      SafeBuf() : _buf( 0 ) {}
+      ~SafeBuf() { if ( _buf ) free( _buf ); }
+      std::string asString() const
+      { return _buf ? std::string(_buf) : std::string(); }
+    };
+
+    ///////////////////////////////////////////////////////////////////
+    /// \class Str
+    /// \brief Convenient building of std::string via \ref std::ostringstream
+    /// Basically a \ref std::ostringstream autoconvertible to \ref std::string
+    /// for building string arguments.
+    /// \code
+    ///   void fnc( const std::string & txt_r );
+    ///   fnc( str::Str() << "Hello " << 13 );
+    ///
+    ///   std::string txt( str::Str() << 45 );
+    /// \endcode
+    ///////////////////////////////////////////////////////////////////
+    struct Str
+    {
+      template<class Tp>
+      Str & operator<<( Tp && val )
+      { _str << std::forward<Tp>(val); return *this; }
+
+      Str & operator<<( std::ostream& (*iomanip)( std::ostream& ) )
+      { _str << iomanip; return *this; }
+
+      operator std::string() const             { return _str.str(); }
+      std::string asString() const             { return _str.str(); }
+      std::string str() const                  { return _str.str(); }
+
+      const std::ostream & stream() const      { return _str; }
+      std::ostream & stream()                  { return _str; }
+
+      void clear()                             { _str.str( std::string() ); }
+
+    private:
+      std::ostringstream _str;
+    };
+
+    /** \relates Str Stream output */
+    inline std::ostream & operator<<( std::ostream & str, const Str & obj )
+    { return str << obj.str(); }
+
+    ///////////////////////////////////////////////////////////////////
+    /// \class Format
+    /// \brief Convenient building of std::string with \ref boost::format.
+    /// Basically a \ref boost::format autoconvertible to \ref std::string
+    /// for building string arguments.
+    /// \note It won't complain about malformed or incomplete format
+    /// strings. Usefull when dealing with translations or classes
+    /// providing a default formater.
+    /// \code
+    ///   void fnc( const std::string & txt_r );
+    ///   fnc( str::Format("Hello %1%") % 13 );
+    ///
+    ///   std::string txt( str::Format("Hello %1%") % 13 );
+    /// \endcode
+    ///////////////////////////////////////////////////////////////////
+    struct Format
+    {
+      Format() { _fmter.exceptions( boost::io::no_error_bits ); }
+      Format( const std::string & format_r ) : Format() { _fmter.parse( format_r ); }
+
+      template<class Tp>
+      Format & operator%( Tp && arg )
+      { _fmter % std::forward<Tp>(arg); return *this; }
+
+      operator std::string() const             { return _fmter.str(); }
+      std::string asString() const             { return _fmter.str(); }
+      std::string str() const                  { return _fmter.str(); }
+
+      const boost::format & fmter() const      { return _fmter; }
+      boost::format & fmter()                  { return _fmter; }
+
+    protected:
+      boost::format _fmter;
+    };
+
+    /** \relates Format Stream output */
+    inline std::ostream & operator<<( std::ostream & str, const Format & obj )
+    { return str << obj.fmter(); }
+
+    /** \name String representation of number.
+     *
+     * Optional second argument sets the minimal string width (' ' padded).
+     * Negative values will cause the number to be left adjusted within the string.
+     *
+     * Default width is 0.
+     * \code
+     * numstring(42)           -> "42"
+     * numstring(42, 4)        -> "  42"
+     * numstring(42,-4)        -> "42  "
+     * \endcode
+     **/
+    //@{
+    inline std::string numstring( char n,               int w = 0 ) { return form( "%*hhd",  w, n ); }
+    inline std::string numstring( unsigned char n,      int w = 0 ) { return form( "%*hhu",  w, n ); }
+    inline std::string numstring( short n,              int w = 0 ) { return form( "%*hd",   w, n ); }
+    inline std::string numstring( unsigned short n,     int w = 0 ) { return form( "%*hu",   w, n ); }
+    inline std::string numstring( int n,                int w = 0 ) { return form( "%*d",    w, n ); }
+    inline std::string numstring( unsigned n,           int w = 0 ) { return form( "%*u",    w, n ); }
+    inline std::string numstring( long n,               int w = 0 ) { return form( "%*ld",   w, n ); }
+    inline std::string numstring( unsigned long n,      int w = 0 ) { return form( "%*lu",   w, n ); }
+    inline std::string numstring( long long n,          int w = 0 ) { return form( "%*lld",  w, n ); }
+    inline std::string numstring( unsigned long long n, int w = 0 ) { return form( "%*llu",  w, n ); }
+
+    template<> inline std::string asString( const char & t )                   { return numstring( t ); }
+    template<> inline std::string asString( const unsigned char & t )          { return numstring( t ); }
+    template<> inline std::string asString( const short & t )                  { return numstring( t ); }
+    template<> inline std::string asString( const unsigned short & t )         { return numstring( t ); }
+    template<> inline std::string asString( const int & t )                    { return numstring( t ); }
+    template<> inline std::string asString( const unsigned & t )               { return numstring( t ); }
+    template<> inline std::string asString( const long & t )                   { return numstring( t ); }
+    template<> inline std::string asString( const unsigned long & t )          { return numstring( t ); }
+    template<> inline std::string asString( const long long & t )              { return numstring( t ); }
+    template<> inline std::string asString( const unsigned long long & t )     { return numstring( t ); }
+    //@}
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name String representation of number as hex value with leading '0x'.
+     * Optional second argument sets the minimal
+     * string width (0 padded). Negative values will cause the number to be left adjusted
+     * within the string. Default width is 10 (4 for char).
+     * <PRE>
+     * hexstring(42)           -> "0x0000002a"
+     * hexstring(42, 4)        -> "0x2a"
+     * hexstring(42,-4)        -> "0x2a"
+     * </PRE>
+     **/
+    //@{
+    inline std::string hexstring( char n,               int w = 4 ) { return form( "%#0*hhx", w, n ); }
+    inline std::string hexstring( unsigned char n,      int w = 4 ) { return form( "%#0*hhx", w, n ); }
+    inline std::string hexstring( short n,              int w = 10 ){ return form( "%#0*hx",  w, n ); }
+    inline std::string hexstring( unsigned short n,     int w = 10 ){ return form( "%#0*hx",  w, n ); }
+    inline std::string hexstring( int n,                int w = 10 ){ return form( "%#0*x",   w, n ); }
+    inline std::string hexstring( unsigned n,           int w = 10 ){ return form( "%#0*x",   w, n ); }
+    inline std::string hexstring( long n,               int w = 10 ){ return form( "%#0*lx",  w, n ); }
+    inline std::string hexstring( unsigned long n,      int w = 10 ){ return form( "%#0*lx",  w, n ); }
+    inline std::string hexstring( long long n,          int w = 0 ) { return form( "%#0*llx", w, n ); }
+    inline std::string hexstring( unsigned long long n, int w = 0 ) { return form( "%#0*llx", w, n ); }
+    //@}
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name String representation of number as octal value with leading '0'.
+     * Optional second argument sets the minimal
+     * string width (0 padded). Negative values will cause the number to be left adjusted
+     * within the string. Default width is 5 (4 for char).
+     * <PRE>
+     * octstring(42)           -> "00052"
+     * octstring(42, 4)        -> "0052"
+     * octstring(42,-4)        -> "052 "
+     * </PRE>
+     **/
+    //@{
+    inline std::string octstring( char n,               int w = 4 ) { return form( "%#0*hho",  w, n ); }
+    inline std::string octstring( unsigned char n,      int w = 4 ) { return form( "%#0*hho",  w, n ); }
+    inline std::string octstring( short n,              int w = 5 ) { return form( "%#0*ho",   w, n ); }
+    inline std::string octstring( unsigned short n,     int w = 5 ) { return form( "%#0*ho",   w, n ); }
+    inline std::string octstring( int n,                int w = 5 ) { return form( "%#0*o",    w, n ); }
+    inline std::string octstring( unsigned n,           int w = 5 ) { return form( "%#0*o",    w, n ); }
+    inline std::string octstring( long n,               int w = 5 ) { return form( "%#0*lo",   w, n ); }
+    inline std::string octstring( unsigned long n,      int w = 5 ) { return form( "%#0*lo",   w, n ); }
+    inline std::string octstring( long long n,          int w = 0 ) { return form( "%#0*llo",  w, n ); }
+    inline std::string octstring( unsigned long long n, int w = 0 ) { return form( "%#0*llo",  w, n ); }
+    //@}
+
+
+    ///////////////////////////////////////////////////////////////////
+    /** String representation of number as bit-string with leading '0's. */
+    template <typename TInt>
+    std::string binstring( TInt val_r )
+    {
+      constexpr unsigned bits = sizeof(TInt)*8;
+      std::string ret( bits, ' ' );
+      TInt bit = 1;
+      for ( unsigned pos = bits; pos > 0; )
+      { --pos; ret[pos] = ((val_r & bit)?'1':'0'); bit = bit<<1; }
+      return ret;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    /** Parsing numbers from string.
+    */
+    //@{
+    /** String to integer type determined by template arg.
+     * \note Only specializations are defined.
+     * \code
+     * time_t t = strtonum<time_t>( "42" );
+     * \endcode
+    */
+    template<typename TInt>
+      TInt strtonum( const C_Str & str );
+
+    template<>
+      inline short              strtonum( const C_Str & str ) { return ::strtol  ( str, NULL, 0 ); }
+    template<>
+      inline int                strtonum( const C_Str & str ) { return ::strtol  ( str, NULL, 0 ); }
+    template<>
+      inline long               strtonum( const C_Str & str ) { return ::strtol  ( str, NULL, 0 ); }
+    template<>
+      inline long long          strtonum( const C_Str & str ) { return ::strtoll ( str, NULL, 0 ); }
+
+    template<>
+      inline unsigned short     strtonum( const C_Str & str ) { return ::strtoul ( str, NULL, 0 ); }
+    template<>
+      inline unsigned           strtonum( const C_Str & str ) { return ::strtoul ( str, NULL, 0 ); }
+    template<>
+      inline unsigned long      strtonum( const C_Str & str ) { return ::strtoul ( str, NULL, 0 ); }
+    template<>
+      inline unsigned long long strtonum( const C_Str & str ) { return ::strtoull( str, NULL, 0 ); }
+
+    /** String to integer type detemined 2nd function arg \a i.
+     * \code
+     * time_t t; strtonum( "42", t );
+     * \endcode
+    */
+    template<typename TInt>
+      inline TInt strtonum( const C_Str & str, TInt & i )
+      { return i = strtonum<TInt>( str ); }
+    //@}
+
+    ///////////////////////////////////////////////////////////////////
+    /** Parsing boolean from string.
+    */
+    //@{
+    /** Return \c true if str is <tt>1, true, yes, on, always</tt> (or a nonzero number). */
+    bool strToTrue( const C_Str & str );
+
+    /** Return \c false if str is <tt>0, false, no, off, never</tt>. */
+    bool strToFalse( const C_Str & str );
+
+    /** Parse \c str into a bool depending on the default value.
+     * If the \c default is true, look for a legal \c false string.
+     * If the \c default is false, look for a legal \c true string.
+     */
+    inline bool strToBool( const C_Str & str, bool default_r )
+    { return( default_r ? strToFalse( str ) : strToTrue( str ) ); }
+
+    /** Parse \c str into a bool if it's a legal \c true or \c false string.
+     * If \c str is not a recognized \c true or \c false string, \a return_r
+     * is left unchanged.
+     */
+    inline bool strToBoolNodefault( const C_Str & str, bool & return_r )
+    {
+      if ( strToTrue( str ) ) return (return_r = true);
+      if ( !strToFalse( str ) ) return (return_r = false);
+      return return_r;
+    }
+
+    /** Parse \c str into a bool if it's a legal \c true or \c false string; else \c indterminate. */
+    TriBool strToTriBool( const C_Str & str );
+
+    //@}
+
+    /**
+     * \short Return a string with all occurrences of \c from_r replaced with \c to_r.
+     */
+    std::string gsub( const std::string & str_r, const std::string & from_r, const std::string & to_r );
+
+    /** \overload A function is called on demand to compute each replacement value.
+     */
+    std::string gsubFun( const std::string & str_r, const std::string & from_r, function<std::string()> to_r );
+
+    /**
+     * \short Replace all occurrences of \c from_r with \c to_r in \c str_r (inplace).
+     * A reference to \c str_r is also returned for convenience.
+     */
+    std::string & replaceAll( std::string & str_r, const std::string & from_r, const std::string & to_r );
+
+    /** \overload A function is called on demand to compute each replacement value.
+     */
+    std::string & replaceAllFun( std::string & str_r, const std::string & from_r, function<std::string()> to_r );
+
+    /** Enhance readability: insert gaps at regular distance
+     * \code
+     *   // no gaps
+     *   Key Fingerprint:  22C07BA534178CD02EFE22AAB88B2FD43DBDC284
+     *   // gapify 8
+     *   Key Fingerprint:  22C07BA5 34178CD0 2EFE22AA B88B2FD4 3DBDC284
+     *   // gapify 4
+     *   Key Fingerprint:  22C0 7BA5 3417 8CD0 2EFE 22AA B88B 2FD4 3DBD C284
+     *   // gapify 4, '-'
+     *   Key Fingerprint:  22C0-7BA5-3417-8CD0-2EFE-22AA-B88B-2FD4-3DBD-C284
+     * \endcode
+     */
+    inline std::string gapify( std::string inp_r, std::string::size_type gap_r = 1, char gapchar = ' ' )
+    {
+      if ( gap_r &&  inp_r.size() > gap_r )
+      {
+       inp_r.reserve( inp_r.size() + (inp_r.size()-1)/gap_r );
+       for ( std::string::size_type pos = gap_r; pos < inp_r.size(); pos += gap_r+1 )
+         inp_r.insert( pos, 1, gapchar );
+      }
+      return inp_r;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name Trimming whitepace.
+     * \todo optimize l/r trim.
+    */
+    //@{
+    /** To define how to trim. */
+    enum Trim {
+      NO_TRIM = 0x00,
+      L_TRIM  = 0x01,
+      R_TRIM  = 0x02,
+      TRIM    = (L_TRIM|R_TRIM)
+    };
+
+    std::string trim( const std::string & s, const Trim trim_r = TRIM );
+    std::string trim( std::string && s, const Trim trim_r = TRIM );
+
+    inline std::string ltrim( const std::string & s )
+    { return trim( s, L_TRIM ); }
+    inline std::string ltrim( std::string && s )
+    { return trim( std::move(s), L_TRIM ); }
+
+    inline std::string rtrim( const std::string & s )
+    { return trim( s, R_TRIM ); }
+    inline std::string rtrim( std::string && s )
+    { return trim( std::move(s), R_TRIM ); }
+    //@}
+
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name Split. */
+    //@{
+    /** Split \a line_r into words.
+     * Any sequence of characters in \a sepchars_r is treated as
+     * delimiter. The words are passed to OutputIterator \a result_r.
+     * \code
+     * std::vector<std::string> words;
+     * str::split( "some line", std::back_inserter(words) )
+     * \endcode
+     *
+    */
+    template<class TOutputIterator>
+      unsigned split( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = " \t", const Trim trim_r = NO_TRIM )
+      {
+        const char * beg = line_r;
+        const char * cur = beg;
+        // skip leading sepchars
+        while ( *cur && ::strchr( sepchars_r, *cur ) )
+          ++cur;
+        unsigned ret = 0;
+        for ( beg = cur; *beg; beg = cur, ++result_r, ++ret )
+          {
+            // skip non sepchars
+            while( *cur && !::strchr( sepchars_r, *cur ) )
+              ++cur;
+            // build string
+            *result_r = trim( std::string( beg, cur-beg ), trim_r );
+            // skip sepchars
+            while ( *cur && ::strchr( sepchars_r, *cur ) )
+              ++cur;
+          }
+        return ret;
+      }
+
+    template<class TOutputIterator>
+      unsigned split( const C_Str & line_r, TOutputIterator result_r, const Trim trim_r )
+      { return split( line_r, result_r, " \t", trim_r ); }
+
+
+    /** Split \a line_r into words with respect to escape delimeters.
+     * Any sequence of characters in \a sepchars_r is treated as
+     * delimiter if not inside \c "" or \c '' or escaped by \c \.
+     *
+     * \li A non-quoted backslash (\) preserves the literal value of the next character.
+     * \li Enclosing characters in single quotes preserves the literal value of each
+     *     character within the quotes.  A single quote may not occur between single
+     *     quotes, even when preceded by a backslash.
+     * \li Enclosing characters in double quotes preserves the literal value of all
+     *     characters within the quotes, with the exception of \c \. The backslash
+     *     retains its special meaning only when followed by \c " or \c \.
+     *
+     * The words are passed to OutputIterator \a result_r.
+     *
+     * \see \ref splitEscaped
+     *
+     * \code
+     * std::vector<std::string> words;
+     * str::splitEscaped( "some line", std::back_inserter(words) )
+     * \endcode
+     *
+     * \code
+     * example splitted strings
+     * normal line -> 2 elements ( "normal", "line" )
+     * escaped\ line -> 1 element(escaped line)
+     * "quoted line" -> 1 element same as above
+     * 'quoted line' -> 1 element same as above
+     * "escaped quote\"" -> 1 element (escaped quote")
+     *
+     * \param line_r   The string to parse.
+     * \param result_r
+     * \param sepchars_r  String of separator characters.
+     * \param withEmpty   Whether to include empty fields between separators in the result.
+     *
+     * \endcode
+     */
+    template<class TOutputIterator>
+      unsigned splitEscaped( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = " \t", bool withEmpty = false)
+      {
+        const char * beg = line_r;
+        const char * cur = beg;
+        unsigned ret = 0;
+
+        // skip leading sepchars
+        while ( *cur && ::strchr( sepchars_r, *cur ) )
+        {
+          ++cur;
+          if (withEmpty)
+          {
+            *result_r = "";
+            ++ret;
+          }
+        }
+
+        // there were only sepchars in the string
+        if (!*cur && withEmpty)
+        {
+          *result_r = "";
+          return ++ret;
+        }
+
+        // after the leading sepchars
+       enum class Quote { None, Slash, Single, Double, DoubleSlash };
+       std::vector<char> buf;
+       Quote quoting = Quote::None;
+        for ( beg = cur; *beg; beg = cur, ++result_r, ++ret )
+       {
+         // read next value until unquoted sepchar
+         buf.clear();
+         quoting = Quote::None;
+         do {
+           switch ( quoting )
+           {
+             case Quote::None:
+               switch ( *cur )
+               {
+                 case '\\':    quoting = Quote::Slash;         break;
+                 case '\'':    quoting = Quote::Single;        break;
+                 case '"':     quoting = Quote::Double;        break;
+                 default:      buf.push_back( *cur );          break;
+               }
+               break;
+
+             case Quote::Slash:
+               buf.push_back( *cur );
+               quoting = Quote::None;
+               break;
+
+             case Quote::Single:
+               switch ( *cur )
+               {
+                 case '\'':    quoting = Quote::None;          break;
+                 default:      buf.push_back( *cur );          break;
+               }
+               break;
+
+             case Quote::Double:
+               switch ( *cur )
+               {
+                 case '\"':    quoting = Quote::None;          break;
+                 case '\\':    quoting = Quote::DoubleSlash;   break;
+                 default:      buf.push_back( *cur );          break;
+               }
+               break;
+
+             case Quote::DoubleSlash:
+               switch ( *cur )
+               {
+                 case '\"':    /*fallthrough*/
+                 case '\\':    buf.push_back( *cur );          break;
+                 default:
+                   buf.push_back( '\\' );
+                   buf.push_back( *cur );
+                   break;
+               }
+               quoting = Quote::Double;
+               break;
+           }
+           ++cur;
+         } while ( *cur && ( quoting != Quote::None || !::strchr( sepchars_r, *cur ) ) );
+         *result_r = std::string( buf.begin(), buf.end() );
+
+
+         // skip sepchars
+         if ( *cur && ::strchr( sepchars_r, *cur ) )
+           ++cur;
+         while ( *cur && ::strchr( sepchars_r, *cur ) )
+         {
+           ++cur;
+           if (withEmpty)
+           {
+             *result_r = "";
+             ++ret;
+           }
+         }
+         // the last was a separator => one more field
+         if ( !*cur && withEmpty && ::strchr( sepchars_r, *(cur-1) ) )
+         {
+           *result_r = "";
+           ++ret;
+         }
+       }
+        return ret;
+      }
+
+    /** Split \a line_r into fields.
+     * Any single character in \a sepchars_r is treated as a
+     * field separator unless \-escaped. The words are passed
+     * to OutputIterator.
+     * \a result_r.
+     * \code
+     * ""        -> words 0
+     * ":"       -> words 2  |||
+     * "a"       -> words 1  |a|
+     * ":a"      -> words 2  ||a|
+     * "a:"      -> words 2  |a||
+     * ":a:"     -> words 3  ||a||
+     *
+     * \endcode
+     *
+     * \code
+     * std::vector<std::string> words;
+     * str::split( "some line", std::back_inserter(words) )
+     * \endcode
+     *
+    */
+    template<class TOutputIterator>
+      unsigned splitFields( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = ":" )
+      {
+        const char * beg = line_r;
+        const char * cur = beg;
+        unsigned ret = 0;
+        for ( beg = cur; *beg; beg = cur, ++result_r )
+          {
+            // skip non sepchars
+            while( *cur && !::strchr( sepchars_r, *cur ) )
+           {
+             if ( *cur == '\\' && *(cur+1) )
+               ++cur;
+              ++cur;
+           }
+            // build string
+            *result_r = std::string( beg, cur-beg );
+            ++ret;
+            // skip sepchar
+            if ( *cur )
+            {
+              ++cur;
+              if ( ! *cur )                // ending with sepchar
+              {
+                *result_r = std::string(); // add final empty field
+                ++ret;
+                break;
+              }
+            }
+          }
+        return ret;
+      }
+
+    /**
+     * Split \a line_r into fields handling also escaped separators.
+     *
+     * \see splitFields()
+     * \see splitEscaped()
+     */
+    template<class TOutputIterator>
+      unsigned splitFieldsEscaped( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = ":" )
+      {
+        return splitEscaped( line_r, result_r, sepchars_r, true /* withEmpty */ );
+      }
+
+    //@}
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name Join. */
+    //@{
+    /** Join strings using separator \a sep_r (defaults to BLANK). */
+    template <class TIterator>
+      std::string join( TIterator begin, TIterator end, const C_Str & sep_r = " " )
+      {
+        std::string res;
+        for ( TIterator iter = begin; iter != end; ++ iter )
+          {
+            if ( iter != begin )
+              res += sep_r;
+            res += asString(*iter);
+          }
+        return res;
+      }
+
+    /** Join strings using separator \a sep_r (defaults to BLANK). */
+    template <class TContainer>
+      std::string join( const TContainer & cont_r, const C_Str & sep_r = " " )
+      { return join( cont_r.begin(), cont_r.end(), sep_r ); }
+
+    /** Join strings using separator \a sep_r, quoting or escaping the values.
+     * Separator defaults to BLANK. Use \ref splitEscaped to restore the
+     * values.
+     */
+    template <class TIterator>
+      std::string joinEscaped( TIterator begin, TIterator end, const char sep_r = ' ' )
+      {
+        std::vector<char> buf;
+        for ( TIterator iter = begin; iter != end; ++ iter )
+        {
+          if ( iter != begin )
+            buf.push_back( sep_r );
+
+          if ( iter->empty() )
+          {
+            // empty string goes ""
+            buf.push_back( '"' );
+            buf.push_back( '"' );
+          }
+          else
+          {
+            std::string toadd( asString(*iter) );
+            for_( ch, toadd.begin(), toadd.end() )
+            {
+              switch ( *ch )
+              {
+                case '"':
+                case '\'':
+                case '\\':
+                  buf.push_back( '\\' );
+                  buf.push_back( *ch );
+                  break;
+                default:
+                  if ( *ch == sep_r )
+                    buf.push_back( '\\' );
+                  buf.push_back( *ch );
+              }
+            }
+          }
+        }
+        return std::string( buf.begin(), buf.end() );
+      }
+    //@}
+
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name Indent. */
+    //@{
+      /** Indent by string ["  "] optionally wrap.
+       * Prints nothing for an empty string. Asserts a trainling '\n' on
+       * the last line. Optionally wrap lines at ' ' at a given length.
+       */
+      inline std::ostream & printIndented( std::ostream & str, const std::string & text_r, const std::string & indent_r = "  ", unsigned maxWitdh_r = 0 )
+      {
+       if ( maxWitdh_r )
+       {
+         if ( indent_r.size() >= maxWitdh_r )
+           maxWitdh_r = 0;     // nonsense: indent larger than line witdh
+         else
+           maxWitdh_r -= indent_r.size();
+       }
+       unsigned width = 0;
+       for ( const char * e = text_r.c_str(), * s = e; *e; s = ++e )
+       {
+         for ( ; *e && *e != '\n'; ++e ) ;/*searching*/
+         width = e-s;
+         if ( maxWitdh_r && width > maxWitdh_r )
+         {
+           // must break line
+           width = maxWitdh_r;
+           for ( e = s+width; e > s && *e != ' '; --e ) ;/*searching*/
+           if ( e > s )
+             width = e-s;      // on a ' ', replaced by '\n'
+           else
+             e = s+width-1;    // cut line;
+         }
+         str << indent_r;
+         str.write( s, width );
+         str << "\n";
+         if ( !*e )    // on '\0'
+           break;
+       }
+       return str;
+      }
+      /** \overload Indent by number of chars [' '] optionally wrap. */
+      inline std::ostream & printIndented( std::ostream & str, const std::string & text_r, unsigned indent_r, char indentch_r = ' ', unsigned maxWitdh_r = 0 )
+      { return printIndented( str, text_r, std::string( indent_r, indentch_r ), maxWitdh_r ); }
+      /** \overload Indent by number of chars [' '] wrap. */
+      inline std::ostream & printIndented( std::ostream & str, const std::string & text_r, unsigned indent_r, unsigned maxWitdh_r, char indentch_r = ' ' )
+      { return printIndented( str, text_r, std::string( indent_r, indentch_r ), maxWitdh_r ); }
+
+      /** Prefix lines by string computed by function taking line begin/end [std::string(const char*, const char*)]
+       * Prints nothing for an empty string. Asserts a trainling '\n' on the last line.
+       */
+      inline std::ostream & autoPrefix( std::ostream & str, const std::string & text_r, function<std::string(const char*, const char*)> fnc_r )
+      {
+       for ( const char * e = text_r.c_str(); *e; ++e )
+       {
+         const char * s = e;
+         for ( ; *e && *e != '\n'; ++e ) /*searching*/;
+         str << fnc_r( s, e );
+         str.write( s, e-s );
+         str << "\n";
+         if ( !*e )    // on '\0'
+           break;
+       }
+       return str;
+      }
+      /** \overload Prefix lines by string generated by function [std::string()] */
+      inline std::ostream & autoPrefix0( std::ostream & str, const std::string & text_r, function<std::string()> fnc_r )
+      {
+       auto wrap = [&fnc_r]( const char*, const char* )-> std::string {
+         return fnc_r();
+       };
+       return autoPrefix( str, text_r, wrap );
+      }
+    //@}
+    ///////////////////////////////////////////////////////////////////
+    /** \name Escape. */
+    //@{
+      /**
+       * Escape desired character \a c using a backslash.
+       *
+       * For use when printing \a c separated values, and where
+       * \ref joinEscaped() is too heavy.
+       */
+      std::string escape( const C_Str & str_r, const char c = ' ' );
+
+      /** Escape \a next_r and append it to \a str_r using separator \a sep_r. */
+      inline void appendEscaped( std::string & str_r, const C_Str & next_r, const char sep_r = ' ' )
+      {
+        if ( ! str_r.empty() )
+          str_r += sep_r;
+        if ( next_r.empty() )
+          str_r += "\"\"";
+        else
+          str_r += escape( next_r, sep_r );
+      }
+
+      /** Return \a str_r with '\'-escaped chars occurring in \a special_r (and '\'). */
+      std::string bEscape( std::string str_r, const C_Str & special_r );
+
+      /** Escape plain STRING \a str_r for use in a regex (not anchored by "^" or "$"). */
+      std::string rxEscapeStr( std::string str_r );
+
+      /** Escape GLOB \a str_r for use in a regex (not anchored by "^" or "$"). */
+      std::string rxEscapeGlob( std::string str_r );
+
+      //! \todo unsecape()
+
+    //@}
+    ///////////////////////////////////////////////////////////////////
+    ///////////////////////////////////////////////////////////////////
+    /** \name Hexencode.
+     * Encode all characters other than [a-zA-Z0-9] as %XX.
+     * This includes the % character itself, which becomes %25.
+     */
+    //@{
+    /** Encode all characters other than [a-zA-Z0-9] as %XX.
+     * This includes the % character itself, which becomes %25.
+     */
+    std::string hexencode( const C_Str & str_r );
+    /** Decode hexencoded %XX sequences. */
+    std::string hexdecode( const C_Str & str_r );
+    //@}
+    ///////////////////////////////////////////////////////////////////
+
+    /** \name Case conversion. */
+    //@{
+    /** Return lowercase version of \a s
+     * \todo improve
+    */
+    std::string toLower( const std::string & s );
+    std::string toLower( std::string && s );
+    /** \overload */
+    inline std::string toLower( const char * s )
+    { return( s ? toLower( std::string(s) ) : std::string() ); }
+
+    /** Return uppercase version of \a s
+     * \todo improve
+    */
+    std::string toUpper( const std::string & s );
+    std::string toUpper( std::string && s );
+    /** \overload */
+    inline std::string toUpper( const char * s )
+    { return( s ? toUpper( std::string(s) ) : std::string() ); }
+    //@}
+
+
+    /** \name Case insensitive comparison. */
+    //@{
+    inline int compareCI( const C_Str & lhs, const C_Str & rhs )
+    { return ::strcasecmp( lhs, rhs ); }
+    //@}
+
+    /** \name Locate substring. */
+    //@{
+    /** Locate substring case sensitive. */
+    inline bool contains( const C_Str & str_r, const C_Str & val_r )
+    { return ::strstr( str_r, val_r ); }
+    /** Locate substring case insensitive. */
+    inline bool containsCI( const C_Str & str_r, const C_Str & val_r )
+    { return ::strcasestr( str_r, val_r ); }
+    //@}
+
+    std::string stripFirstWord( std::string & line, const bool ltrim_first = true );
+
+    std::string stripLastWord( std::string & line, const bool rtrim_first = true );
+
+    /** Return stream content up to (but not returning) the next newline.
+     * \see \ref receiveUpTo
+     */
+    std::string getline( std::istream & str, bool trim = false );
+
+    /** Return stream content up to (but not returning) the next newline.
+     * \see \ref receiveUpTo
+     */
+    std::string getline( std::istream & str, const Trim trim_r );
+
+    /** Return stream content up to the next ocurrence of \c delim_r or EOF
+     * \c delim_r, if found, is always read from the stream. Whether it is
+     * also returned in the string depends on \c returnDelim_r.
+     * If the stream status is \c good, \c delim_r was found in the stream.
+     * If we reached EOF while looking for \c delim_r, \c eof is set; and
+     * also \c fail, if we did not read any data before.
+     */
+    std::string receiveUpTo( std::istream & str, const char delim_r, bool returnDelim_r = false );
+
+    ///////////////////////////////////////////////////////////////////
+
+    /** \name String prefix/suffix handling.
+     */
+    //@{
+    /** Return whether \a str_r has prefix \a prefix_r. */
+    inline bool hasPrefix( const C_Str & str_r, const C_Str & prefix_r )
+    { return( ::strncmp( str_r, prefix_r, prefix_r.size() ) == 0 ); }
+    /** \overload Case insensitive */
+    inline bool hasPrefixCI( const C_Str & str_r, const C_Str & prefix_r )
+    { return( ::strncasecmp( str_r, prefix_r, prefix_r.size() ) == 0 ); }
+
+    /** Strip a \a prefix_r from \a str_r and return the resulting string. */
+    inline std::string stripPrefix( const C_Str & str_r, const C_Str & prefix_r )
+    { return( hasPrefix( str_r, prefix_r ) ? str_r + prefix_r.size() : str_r.c_str() ); }
+    /** \overload Case insensitive */
+    inline std::string stripPrefixCI( const C_Str & str_r, const C_Str & prefix_r )
+    { return( hasPrefixCI( str_r, prefix_r ) ? str_r + prefix_r.size() : str_r.c_str() ); }
+
+    /** Return whether \a str_r has suffix \a suffix_r. */
+    inline bool hasSuffix( const C_Str & str_r, const C_Str & suffix_r )
+    { return( str_r.size() >= suffix_r.size() && ::strncmp( str_r + str_r.size() - suffix_r.size() , suffix_r, suffix_r.size() ) == 0 ); }
+    /** \overload Case insensitive */
+    inline bool hasSuffixCI( const C_Str & str_r, const C_Str & suffix_r )
+    { return( str_r.size() >= suffix_r.size() && ::strncasecmp( str_r + str_r.size() - suffix_r.size() , suffix_r, suffix_r.size() ) == 0 ); }
+
+    /** Strip a \a suffix_r from \a str_r and return the resulting string. */
+    inline std::string stripSuffix( const C_Str & str_r, const C_Str & suffix_r )
+    {
+      if ( hasSuffix( str_r, suffix_r ) )
+        return std::string( str_r, str_r.size() - suffix_r.size() );
+      return str_r.c_str();
+    }
+    /** \overload Case insensitive */
+    inline std::string stripSuffixCI( const C_Str & str_r, const C_Str & suffix_r )
+    {
+      if ( hasSuffixCI( str_r, suffix_r ) )
+        return std::string( str_r, str_r.size() - suffix_r.size() );
+      return str_r.c_str();
+    }
+
+    /** Return size of the common prefix of \a lhs and \a rhs. */
+    inline std::string::size_type commonPrefix( const C_Str & lhs, const C_Str & rhs )
+    {
+      const char * lp = lhs.c_str();
+      const char * rp = rhs.c_str();
+      std::string::size_type ret = 0;
+      while ( *lp == *rp && *lp != '\0' )
+      { ++lp, ++rp, ++ret; }
+      return ret;
+    }
+    /** \overload Case insensitive */
+    inline std::string::size_type commonPrefixCI( const C_Str & lhs, const C_Str & rhs )
+    {
+      const char * lp = lhs.c_str();
+      const char * rp = rhs.c_str();
+      std::string::size_type ret = 0;
+      while ( tolower(*lp) == tolower(*rp) && *lp != '\0' )
+      { ++lp, ++rp, ++ret; }
+      return ret;
+    }
+
+
+    /** alias for \ref hasPrefix */
+    inline bool startsWith( const C_Str & str_r, const C_Str & prefix_r )
+    { return hasPrefix( str_r, prefix_r ); }
+    /** \overload Case insensitive */
+    inline bool startsWithCI( const C_Str & str_r, const C_Str & prefix_r )
+    { return hasPrefixCI( str_r, prefix_r ); }
+
+    /** alias for \ref hasSuffix */
+    inline bool endsWith( const C_Str & str_r, const C_Str & prefix_r )
+    { return hasSuffix( str_r, prefix_r ); }
+    /** \overload Case insensitive */
+    inline bool endsWithCI( const C_Str & str_r, const C_Str & prefix_r )
+    { return hasSuffixCI( str_r, prefix_r ); }
+    //@}
+  } // namespace str
+  ///////////////////////////////////////////////////////////////////
+
+  // drag into zypp:: namespace
+  using str::asString;
+
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_STRING_H
similarity index 99%
rename from zypp/base/StringV.cc
rename to zypp-core/base/StringV.cc
index 07ef519..14ea425 100644 (file)
@@ -9,7 +9,7 @@
 /** \file zypp/base/StringV.cc
  */
 #include <iostream>
-#include <zypp/base/StringV.h>
+#include <zypp-core/base/StringV.h>
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
diff --git a/zypp-core/base/StringV.h b/zypp-core/base/StringV.h
new file mode 100644 (file)
index 0000000..a32276c
--- /dev/null
@@ -0,0 +1,285 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/base/StringV.h
+ * c++17: std::string_view tools
+ */
+#ifndef ZYPP_BASE_STRINGV_H
+#define ZYPP_BASE_STRINGV_H
+#include <string_view>
+#ifdef __cpp_lib_string_view
+
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/Regex.h>
+#include <zypp-core/base/Flags.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{
+  namespace strv
+  {
+    using regex = str::regex;
+    using smatch = str::smatch;
+
+    /** Define how to trim. */
+    enum class Trim {
+      notrim = 0,
+      left   = 1<<0,
+      right  = 1<<1,
+      trim   = (left|right),
+    };
+
+    ZYPP_DECLARE_FLAGS_AND_OPERATORS( TrimFlag, Trim );
+
+    /** The default blank. */
+    inline constexpr std::string_view blank = " \t";
+
+    /** Trim \a chars_r at the beginning of \a str_r. */
+    inline std::string_view ltrim( std::string_view str_r, std::string_view chars_r = blank )
+    {
+      if ( str_r.empty() )
+       return str_r;
+      auto pos = str_r.find_first_not_of( chars_r );
+      if ( pos == str_r.npos )
+       str_r.remove_prefix( str_r.size() );
+      else if ( pos )
+       str_r.remove_prefix( pos );
+      return str_r;
+    }
+
+    /** Trim \a chars_r at the end of \a str_r. */
+    inline std::string_view rtrim( std::string_view str_r, std::string_view chars_r = blank )
+    {
+      if ( str_r.empty() )
+       return str_r;
+      auto pos = str_r.find_last_not_of( chars_r );
+      if ( pos == str_r.npos )
+       str_r.remove_suffix( str_r.size() );
+      else if ( (pos = str_r.size()-1-pos) )
+       str_r.remove_suffix( pos );
+      return str_r;
+    }
+
+    /** Trim \a chars_r at both sides of \a str_r. */
+    inline std::string_view trim( std::string_view str_r, std::string_view chars_r = blank )
+    {
+      if ( str_r.empty() )
+       return str_r;
+      str_r = ltrim( std::move(str_r), chars_r );
+      str_r = rtrim( std::move(str_r), chars_r );
+      return str_r;
+    }
+
+    /** Trim \a chars_r at \a trim_r sides of \a str_r. */
+    inline std::string_view trim( std::string_view str_r, std::string_view chars_r, TrimFlag trim_r )
+    {
+      if ( str_r.empty() || trim_r == Trim::notrim )
+       return str_r;
+      if ( trim_r.testFlag( Trim::left ) )
+       str_r = ltrim( std::move(str_r), chars_r );
+      if ( trim_r.testFlag( Trim::right ) )
+       str_r = rtrim( std::move(str_r), chars_r );
+      return str_r;
+    }
+    /** \overload Trimming blanks at \a trim_r sides of \a str_r. */
+    inline std::string_view trim( std::string_view str_r, TrimFlag trim_r )
+    { return trim( std::move(str_r), blank, std::move(trim_r) ); }
+
+    ///////////////////////////////////////////////////////////////////
+    namespace detail
+    {
+      /** Split* functions working horse callback. */
+      using WordConsumer = std::function<bool(std::string_view,unsigned,bool)>;
+
+      /** \name Split* callback signatures accepted for convenience.
+       *
+       * Details may vary for specific split* functions, but basically each separator found
+       * in line will be enclosed by 2 words being reported. The working horse callback
+       * offers the \a word, the \a index of word (starting with 0) and a boolean indicating whether
+       * this is going to be the \a last report.
+       *
+       * A callback may optionally return a value convertible to \c bool. Returning \c false
+       * usually causes split* to stop looking further separators and to finish the reporting.
+       *
+       * Accepted callbacks: [bool|void] callback( [std::string_view[, unsigned[, bool]]] )
+       * (or no callback at all )
+       */
+      //@{
+      /** bool(std::string_view,unsigned,bool) */
+      template <typename Callable, std::enable_if_t<
+      std::is_invocable_r_v<bool,Callable,std::string_view,unsigned,bool>
+      , bool> = true>
+      WordConsumer wordConsumer( Callable && fnc_r )
+      { return std::forward<Callable>(fnc_r); }
+      /** void(std::string_view,unsigned,bool) */
+      template <typename Callable, std::enable_if_t<
+      ! std::is_invocable_r_v<bool,Callable,std::string_view,unsigned,bool>
+      && std::is_invocable_r_v<void,Callable,std::string_view,unsigned,bool>
+      , bool> = true>
+      WordConsumer wordConsumer( Callable && fnc_r )
+      { return [&fnc_r](std::string_view a1,unsigned a2,bool a3)->bool { fnc_r(a1,a2,a3); return true; }; }
+
+      /** bool(std::string_view,unsigned) */
+      template <typename Callable, std::enable_if_t<
+      std::is_invocable_r_v<bool,Callable,std::string_view,unsigned>
+      , bool> = true>
+      WordConsumer wordConsumer( Callable && fnc_r )
+      { return [&fnc_r](std::string_view a1,unsigned a2,bool)->bool { return fnc_r(a1,a2); }; }
+      /** void(std::string_view,unsigned) */
+      template <typename Callable, std::enable_if_t<
+      ! std::is_invocable_r_v<bool,Callable,std::string_view,unsigned>
+      && std::is_invocable_r_v<void,Callable,std::string_view,unsigned>
+      , bool> = true>
+      WordConsumer wordConsumer( Callable && fnc_r )
+      { return [&fnc_r](std::string_view a1,unsigned a2,bool)->bool { fnc_r(a1,a2); return true; }; }
+
+      /** bool(std::string_view) */
+      template <typename Callable, std::enable_if_t<
+      std::is_invocable_r_v<bool,Callable,std::string_view>
+      , bool> = true>
+      WordConsumer wordConsumer( Callable && fnc_r )
+      { return [&fnc_r](std::string_view a1,unsigned,bool)->bool { return fnc_r(a1); }; }
+      /** void(std::string_view) */
+      template <typename Callable, std::enable_if_t<
+      ! std::is_invocable_r_v<bool,Callable,std::string_view>
+      && std::is_invocable_r_v<void,Callable,std::string_view>
+      , bool> = true>
+      WordConsumer wordConsumer( Callable && fnc_r )
+      { return [&fnc_r](std::string_view a1,unsigned,bool)->bool { fnc_r(a1); return true; }; }
+
+      /** bool() */
+      template <typename Callable, std::enable_if_t<
+      std::is_invocable_r_v<bool,Callable>
+      , bool> = true>
+      WordConsumer wordConsumer( Callable && fnc_r )
+      { return [&fnc_r](std::string_view,unsigned,bool)->bool { return fnc_r(); }; }
+      /** void() */
+      template <typename Callable, std::enable_if_t<
+      ! std::is_invocable_r_v<bool,Callable>
+      && std::is_invocable_r_v<void,Callable>
+      , bool> = true>
+      WordConsumer wordConsumer( Callable && fnc_r )
+      { return [&fnc_r](std::string_view,unsigned,bool)->bool { fnc_r(); return true; }; }
+      //@}
+
+      /** \ref split working horse */
+      unsigned _split( std::string_view line_r, std::string_view sep_r, Trim trim_r, WordConsumer && fnc_r );
+
+      /** \ref splitRx working horse */
+      unsigned _splitRx( const std::string & line_r, const regex & rx_r, WordConsumer && fnc_r );
+
+    }  // namespace detail
+    ///////////////////////////////////////////////////////////////////
+
+    /** Split \a line_r into words separated by the regular expression \a rx_r and invoke \a fnc_r with each word.
+     *
+     * Each separator match found in \a line_r will be enclosed by 2 words being reported.
+     * Words may be empty if the separator match is located at the beginning or at the end
+     * of \a line_r, or it there are consecutive separator match occurrences.
+     *
+     * Accepted callbacks: [bool|void]( [std::string_view[, unsigned[, bool]]] )
+     * (or no callback at all)
+     *
+     * A callback may take the \a word, the \a index of word (starting with 0) and a boolean
+     * indicating whether this is going to be the \a last report.
+     *
+     * A callback may optionally return a value convertible to \c bool. Returning \c false
+     * causes split to stop looking further separators. The final report will contain the
+     * remaining part of the \a line_r then.
+     *
+     * If the separator does not occur on the line the whole string is reported.
+     *
+     * \returns the number of words reported.
+     */
+    template <typename Callable = detail::WordConsumer>
+    unsigned splitRx( const std::string & line_r, const regex & rx_r, Callable && fnc_r = Callable() )
+    { return detail::_splitRx( line_r, rx_r, detail::wordConsumer( std::forward<Callable>(fnc_r) ) ); }
+
+
+    /** Split \a line_r into words separated by \a sep_r and invoke \a fnc_r with each word.
+     *
+     * - If \a sep_r is not empty, each separator found in \a line_r will be enclosed by 2
+     * words being reported. Words may be empty if the separator is located at the beginning
+     * or the end of \a line_r or it there are consecutive occurrences.
+     *
+     * - If \a sep_r is unspecified or empty, it splits on whitespace /[BLANK,TAB]+/. In this
+     * case only the (not empty) words found on the line are reported (trimmed).
+     *
+     * The optional \a trim_r argument tells whether whitespace around the words found
+     * should be trimmed before reporting them. The default is not to trim.
+     *
+     * Accepted callbacks: [bool|void]( [std::string_view[, unsigned[, bool]]] )
+     * (or no callback at all)
+     *
+     * A callback may take the \a word, the \a index of word (starting with 0) and a boolean
+     * indicating whether this is going to be the \a last report.
+     *
+     * A callback may optionally return a value convertible to \c bool. Returning \c false
+     * causes split to stop looking further separators. The final report will contain the
+     * remaining part of the \a line_r then.
+     *
+     * If the separator does not occur on the line the whole string is reported.
+     *
+     * \returns the number of words reported.
+     *
+     * \code
+     *   str = ""
+     *
+     *   split( str, fnc );
+     *   // []
+     *
+     *   split( str, " ", fnc );
+     *   // ['']
+     *
+     *
+     *   str = " "
+     *
+     *   split( str, fnc );
+     *   // []
+     *
+     *   split( str, " ", fnc );
+     *   // ['', '']
+     *
+     *
+     *   str = " 1 2 3 4 5 ";
+     *
+     *   split( str, fnc );
+     *   // ['1', '2', '3', '4', '5']
+     *
+     *   split( str, " ", fnc );
+     *   // ['', '1', '2', '3', '4', '5', '']
+     *
+     *   split( str, " 2", fnc );
+     *   // [' 1', ' 3 4 5 ']
+     *
+     *   split( str, " 2", Trim::all, fnc );
+     *   // ['1', '3 4 5']
+     * \endcode
+     */
+    template <typename Callable = detail::WordConsumer>
+    unsigned split( std::string_view line_r, std::string_view sep_r, Trim trim_r, Callable && fnc_r = Callable() )
+    { return detail::_split( line_r, sep_r, trim_r, detail::wordConsumer( std::forward<Callable>(fnc_r) ) ); }
+
+    /** \overload  Split at \a sep_r and Trim::notrim */
+    template <typename Callable = detail::WordConsumer>
+    inline unsigned split( std::string_view line_r, std::string_view sep_r, Callable && fnc_r = Callable() )
+    { return detail::_split( line_r, sep_r, Trim::notrim, detail::wordConsumer( std::forward<Callable>(fnc_r) ) ); }
+
+    /** \overload  Split at whitespace */
+    template <typename Callable = detail::WordConsumer>
+    inline unsigned split( std::string_view line_r, Callable && fnc_r = Callable() )
+    { return detail::_split( line_r, std::string_view(), Trim::notrim, detail::wordConsumer( std::forward<Callable>(fnc_r) ) ); }
+
+    inline std::string_view asStringView( const char * t )
+    { return t == nullptr ? std::string_view() : t; }
+
+  } // namespace strv
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // __cpp_lib_string_view
+#endif // ZYPP_BASE_STRINGV_H
similarity index 96%
rename from zypp/base/Unit.cc
rename to zypp-core/base/Unit.cc
index 84672de..cb60338 100644 (file)
@@ -9,9 +9,9 @@
 /** \file      zypp/base/Unit.cc
  *
 */
-#include <zypp/base/String.h>
+#include <zypp-core/base/String.h>
 
-#include <zypp/base/Unit.h>
+#include <zypp-core/base/Unit.h>
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
diff --git a/zypp-core/base/Unit.h b/zypp-core/base/Unit.h
new file mode 100644 (file)
index 0000000..5fb7ac8
--- /dev/null
@@ -0,0 +1,103 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Unit.h
+ *
+*/
+#ifndef ZYPP_BASE_UNIT_H
+#define ZYPP_BASE_UNIT_H
+
+#include <iosfwd>
+#include <string>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace base
+  { /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : Unit
+    //
+    /** Simple handling of Units.
+     *
+     * Unit stores factor and symbol, and a precision value for printing.
+     * \ref form builds a string from a value according to the format
+     * specification.
+     * \code
+     * static const Unit B( 1, "B", 0 );
+     * static const Unit K( 1024, "K", 1 );
+     * static const Unit M( 1048576, "M", 1 );
+     * static const Unit G( 1073741824, "G", 2 );
+     * static const Unit T( 1099511627776, "T", 3 );
+     * \endcode
+    */
+      class Unit
+      {
+      public:
+        typedef long long ValueType;
+
+        /** Default ctor */
+        Unit()
+        : _factor( 1 )
+        , _prec( 0 )
+        {}
+
+        /** ctor */
+        Unit( ValueType factor_r, std::string symbol_r, unsigned prec_r )
+        : _factor( factor_r )
+        , _symbol( symbol_r )
+        , _prec( prec_r )
+        {}
+
+        ValueType factor() const
+        { return _factor; }
+
+        const std::string & symbol() const
+        { return _symbol; }
+
+        unsigned prec() const
+        { return _prec; }
+
+        /** Build string representation of \a val_r. */
+        std::string form( ValueType val_r,
+                          unsigned field_width_r = 0,
+                          unsigned unit_width_r  = 1 ) const
+        { return form( val_r, field_width_r, unit_width_r, _prec ); }
+
+        std::string form( ValueType val_r,
+                          unsigned field_width_r,
+                          unsigned unit_width_r,
+                          unsigned prec_r ) const
+        { return form( double(val_r)/_factor, _symbol,
+                       field_width_r, unit_width_r, prec_r ); }
+
+
+        static std::string form( double val_r,
+                                 const std::string & symbol_r,
+                                 unsigned field_width_r,
+                                 unsigned unit_width_r,
+                                 unsigned prec_r );
+
+      private:
+        ValueType   _factor;
+        std::string _symbol;
+        unsigned    _prec;
+      };
+    ///////////////////////////////////////////////////////////////////
+
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace base
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_UNIT_H
similarity index 100%
rename from zypp/base/Xml.cc
rename to zypp-core/base/Xml.cc
diff --git a/zypp-core/base/Xml.h b/zypp-core/base/Xml.h
new file mode 100644 (file)
index 0000000..97b72b0
--- /dev/null
@@ -0,0 +1,224 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/base/Xml.h
+ *
+*/
+#ifndef ZYPP_BASE_XML_H
+#define ZYPP_BASE_XML_H
+
+#include <iosfwd>
+#include <string>
+#include <vector>
+#include <list>
+#include <set>
+#include <map>
+
+#include <zypp-core/base/Easy.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/parser/xml/XmlEscape.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{
+  ///////////////////////////////////////////////////////////////////
+  namespace xmlout
+  {
+    using xml::escape;
+    using xml::unescape;
+
+    /** \relates NodeAttr NODE ATTRIBUTE representation of types [asString] */
+    template <class Tp>
+    std::string asXmlNodeAttr( const Tp & val_r )
+    { return asString( val_r ); }
+
+    ///////////////////////////////////////////////////////////////////
+    /// \class NodeAttr
+    /// \brief (Key, Value) string pair of XML node attributes
+    struct NodeAttr : public std::pair<std::string,std::string>
+    {
+      typedef std::pair<std::string,std::string> Pair;
+
+      template <typename Tp>
+      NodeAttr( std::string key_r, const Tp & val_r )
+      : Pair( std::move(key_r), asXmlNodeAttr(val_r) )
+      {}
+
+      NodeAttr( std::string key_r, std::string val_r )
+      : Pair( std::move(key_r), std::move(val_r) )
+      {}
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    /// \class Node
+    /// \brief RAII writing a nodes start/end tag
+    /// \code
+    /// {
+    ///   Node node( std::cout, "node", { "attr", "val" } ); // <node attr="val">
+    ///   *node << "write nodes body...."
+    /// }                                                    // </node>
+    /// \endcode
+    /// \note If the \ref optionalContent flag is passed to the \c ctor, the start
+    /// node is kept open, until the first call to \ref operator*. The start node
+    /// is closed before returning the stream.
+    /// \code
+    /// {
+    ///   Node node( std::cout, "node", Node::optionalContent, { "attr", "val" } );
+    ///                                                      // <node attr="val"
+    /// }                                                    // />
+    /// {
+    ///   Node node( std::cout, "node", Node::optionalContent, { "attr", "val" } );
+    ///                                                      // <node attr="val"
+    ///   *node << "write nodes body...."                    // />write nodes body...
+    /// }                                                    // </node>
+    /// \endcode
+    ///
+    /// \note If the nodename is empty or starts with an \c !, a comment is written.
+    ///
+    struct Node
+    {
+      NON_COPYABLE_BUT_MOVE( Node );
+      typedef NodeAttr Attr;
+
+      struct OptionalContentType {};   ///< Ctor arg type
+      static constexpr OptionalContentType optionalContent = OptionalContentType();
+
+      /** Ctor taking nodename and attribute list */
+      Node( std::ostream & out_r, std::string name_r, const std::initializer_list<Attr> & attrs_r = {} )
+      : _out( out_r ), _name( std::move(name_r) ), _hasContent( true )
+      { printStart( attrs_r ); }
+
+      /** Convenience ctor for one attribute pair */
+      Node( std::ostream & out_r, std::string name_r, Attr attr_r )
+      : Node( out_r, std::move(name_r), { attr_r } )
+      {}
+
+      /** Optional content ctor taking nodename and attribute list */
+      Node( std::ostream & out_r, std::string name_r, OptionalContentType, const std::initializer_list<Attr> & attrs_r = {} )
+      : _out( out_r ), _name( std::move(name_r) ), _hasContent( false )
+      { printStart( attrs_r ); }
+
+      /** Optional content Convenience ctor for one attribute pair */
+      Node( std::ostream & out_r, std::string name_r, OptionalContentType, Attr attr_r )
+      : Node( out_r, std::move(name_r), optionalContent, { attr_r } )
+      {}
+
+      /** Dtor wrting end tag */
+      ~Node()
+      {
+       if ( isComment() )
+         _out << "-->";
+       else
+       {
+         if ( _hasContent )
+           _out << "</" << _name << ">";
+         else
+           _out << "/>";
+       }
+      }
+
+      /** Exception type thrown if attributes are added to a closed start node. */
+      struct HasContentException{};
+
+       /** Add additional attributes (requires OptionalContentType)
+       * \throw HasContentException If start node is already closed
+       */
+      Node & addAttr( const std::initializer_list<Attr> & attrs_r = {} )
+      {
+       if ( _hasContent )
+         throw HasContentException();
+       printAttr( attrs_r );
+       return *this;
+      }
+
+      /** \overload for one */
+      Node & addAttr( const Attr & attr_r )
+      { return addAttr( { attr_r } ); }
+
+
+      /** Return the output stream */
+      std::ostream & operator*()
+      {
+       if ( ! _hasContent )
+       {
+         _hasContent = true;
+         if ( isComment() )
+           _out << "|";
+         else
+           _out << ">";
+       }
+       return _out;
+      }
+
+    private:
+      void printStart( const std::initializer_list<Attr> & attrs_r )
+      {
+       if ( _name.empty() || _name[0] == '!' )
+       {
+         _out << "<!--" << _name;
+         _name.clear();        // a comment
+       }
+       else
+         _out << "<" << _name;
+
+       printAttr( attrs_r );
+
+       if ( !isComment() && _hasContent )
+         _out << ">";
+      }
+
+      void printAttr( const std::initializer_list<Attr> & attrs_r )
+      {
+       for ( const auto & pair : attrs_r )
+         _out << " " << pair.first << "=\"" << xml::escape( pair.second ) << "\"";
+      }
+
+      bool isComment() const
+      { return _name.empty();  }
+
+    private:
+      std::ostream & _out;
+      std::string _name;
+      bool _hasContent;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates Node Write a leaf node without PCDATA
+     * \code
+     * <node attr="val"/>
+     * \endcode
+     */
+    inline std::ostream & node( std::ostream & out_r, const std::string & name_r, const std::initializer_list<Node::Attr> & attrs_r = {} )
+    {
+      Node( out_r, name_r, Node::optionalContent, attrs_r );
+      return out_r;
+    }
+    /** \overload for one attribute pair */
+    inline std::ostream & node( std::ostream & out_r, const std::string & name_r, Node::Attr attr_r )
+    { return node( out_r, name_r, { attr_r } ); }
+
+  } // namespace xmlout
+  ///////////////////////////////////////////////////////////////////
+
+  /// \name Default dumpAsXmlOn based on asString.
+  ///
+  //@{
+  template <class Tp>
+  inline std::ostream & dumpAsXmlOn( std::ostream & str, const Tp & obj, const std::string & name_r )
+  {
+    xmlout::Node guard( str, name_r, xmlout::Node::optionalContent );
+    const std::string & content( asString( obj ) );
+    if ( ! content.empty() ) *guard << xml::escape( content );
+    return str;
+  }
+  //@}
+  //
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_XML_H
diff --git a/zypp-core/fs/PathInfo.cc b/zypp-core/fs/PathInfo.cc
new file mode 100644 (file)
index 0000000..7766d46
--- /dev/null
@@ -0,0 +1,1191 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/PathInfo.cc
+ *
+*/
+
+#include <utime.h>     // for ::utime
+#include <sys/statvfs.h>
+#include <sys/sysmacros.h> // for ::minor, ::major macros
+
+#include <iostream>
+#include <fstream>
+#include <iomanip>
+
+#include <zypp-core/fs/PathInfo.h>
+#include <zypp-core/base/LogTools.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/IOStream.h>
+#include <zypp-core/base/Errno.h>
+
+#include <zypp-core/AutoDispose.h>
+#include <zypp-core/ExternalProgram.h>
+#include <zypp-core/Digest.h>
+#include <zypp-core/fs/TmpPath.h>
+
+using std::endl;
+using std::string;
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace filesystem
+  { /////////////////////////////////////////////////////////////////
+
+    /******************************************************************
+     **
+     **        FUNCTION NAME : operator<<
+     **        FUNCTION TYPE : std::ostream &
+    */
+    std::ostream & operator<<( std::ostream & str, FileType obj )
+    {
+      switch ( obj ) {
+#define EMUMOUT(T) case T: return str << #T; break
+        EMUMOUT( FT_NOT_AVAIL );
+        EMUMOUT( FT_NOT_EXIST );
+        EMUMOUT( FT_FILE );
+        EMUMOUT( FT_DIR );
+        EMUMOUT( FT_CHARDEV );
+        EMUMOUT( FT_BLOCKDEV );
+        EMUMOUT( FT_FIFO );
+        EMUMOUT( FT_LINK );
+        EMUMOUT( FT_SOCKET );
+#undef EMUMOUT
+      }
+      return str;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : StatMode::fileType
+    // METHOD TYPE : FileType
+    //
+    FileType StatMode::fileType() const
+    {
+      if ( isFile() )
+        return FT_FILE;
+      if ( isDir() )
+        return FT_DIR;
+      if ( isLink() )
+        return FT_LINK;
+      if ( isChr() )
+        return FT_CHARDEV;
+      if ( isBlk() )
+        return FT_BLOCKDEV;
+      if ( isFifo() )
+        return FT_FIFO;
+      if ( isSock() )
+        return FT_SOCKET ;
+
+      return FT_NOT_AVAIL;
+    }
+
+    /******************************************************************
+     **
+     **        FUNCTION NAME : operator<<
+     **        FUNCTION TYPE : std::ostream &
+    */
+    std::ostream & operator<<( std::ostream & str, const StatMode & obj )
+    {
+      iostr::IosFmtFlagsSaver autoResoreState( str );
+
+      char t = '?';
+      if ( obj.isFile() )
+        t = '-';
+      else if ( obj.isDir() )
+        t = 'd';
+      else if ( obj.isLink() )
+        t = 'l';
+      else if ( obj.isChr() )
+        t = 'c';
+      else if ( obj.isBlk() )
+        t = 'b';
+      else if ( obj.isFifo() )
+        t = 'p';
+      else if ( obj.isSock() )
+        t = 's';
+
+      str << t << " " << std::setfill( '0' ) << std::setw( 4 ) << std::oct << obj.perm();
+      return str;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // Class : PathInfo
+    //
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : PathInfo::PathInfo
+    // METHOD TYPE : Constructor
+    //
+    PathInfo::PathInfo()
+    : mode_e( STAT )
+    , error_i( -1 )
+    {}
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : PathInfo::PathInfo
+    // METHOD TYPE : Constructor
+    //
+    PathInfo::PathInfo( const Pathname & path, Mode initial )
+    : path_t( path )
+    , mode_e( initial )
+    , error_i( -1 )
+    {
+      operator()();
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : PathInfo::PathInfo
+    // METHOD TYPE : Constructor
+    //
+    PathInfo::PathInfo( const std::string & path, Mode initial )
+    : path_t( path )
+    , mode_e( initial )
+    , error_i( -1 )
+    {
+      operator()();
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : PathInfo::PathInfo
+    // METHOD TYPE : Constructor
+    //
+    PathInfo::PathInfo( const char * path, Mode initial )
+    : path_t( path )
+    , mode_e( initial )
+    , error_i( -1 )
+    {
+      operator()();
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : PathInfo::~PathInfo
+    // METHOD TYPE : Destructor
+    //
+    PathInfo::~PathInfo()
+    {
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : PathInfo::operator()
+    // METHOD TYPE : bool
+    //
+    bool PathInfo::operator()()
+    {
+      if ( path_t.empty() ) {
+        error_i = -1;
+      } else {
+        switch ( mode_e ) {
+        case STAT:
+          error_i = ::stat( path_t.asString().c_str(), &statbuf_C );
+          break;
+        case LSTAT:
+          error_i = ::lstat( path_t.asString().c_str(), &statbuf_C );
+          break;
+        }
+        if ( error_i == -1 )
+          error_i = errno;
+      }
+      return !error_i;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : PathInfo::fileType
+    // METHOD TYPE : File_type
+    //
+    FileType PathInfo::fileType() const
+    {
+      if ( isExist() )
+        return asStatMode().fileType();
+      return FT_NOT_EXIST;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : PathInfo::userMay
+    // METHOD TYPE : mode_t
+    //
+    mode_t PathInfo::userMay() const
+    {
+      if ( !isExist() )
+        return 0;
+      if ( owner() == geteuid() ) {
+        return( uperm()/0100 );
+      } else if ( group() == getegid() ) {
+        return( gperm()/010 );
+      }
+      return operm();
+    }
+
+    /******************************************************************
+     **
+     **        FUNCTION NAME : PathInfo::devMajor
+     **        FUNCTION TYPE : unsigned int
+     */
+    unsigned int PathInfo::devMajor() const
+    {
+      return isBlk() || isChr() ? major(statbuf_C.st_rdev) : 0;
+    }
+
+    /******************************************************************
+     **
+     **        FUNCTION NAME : PathInfo::devMinor
+     **        FUNCTION TYPE : unsigned int
+     */
+    unsigned int PathInfo::devMinor() const
+    {
+      return isBlk() || isChr() ? minor(statbuf_C.st_rdev) : 0;
+    }
+
+    /******************************************************************
+     **
+     **        FUNCTION NAME : operator<<
+     **        FUNCTION TYPE :  std::ostream &
+    */
+    std::ostream & operator<<( std::ostream & str, const PathInfo & obj )
+    {
+      iostr::IosFmtFlagsSaver autoResoreState( str );
+
+      str << obj.asString() << "{";
+      if ( !obj.isExist() ) {
+        str << Errno( obj.error() );
+      } else {
+        str << obj.asStatMode() << " " << std::dec << obj.owner() << "/" << obj.group();
+
+        if ( obj.isFile() )
+          str << " size " << obj.size();
+      }
+
+      return str << "}";
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // filesystem utilities
+    //
+    ///////////////////////////////////////////////////////////////////
+
+#define logResult MIL << endl, doLogResult
+    namespace {
+      /**  Helper function to log return values. */
+      inline int doLogResult( const int res, const char * rclass = 0 /*errno*/ )
+      {
+       if ( res )
+       {
+         if ( rclass )
+           WAR << " FAILED: " << rclass << " " << res << endl;
+         else
+           WAR << " FAILED: " << str::strerror( res ) << endl;
+       }
+       return res;
+      }
+    } // namespace
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : PathInfo::mkdir
+    // METHOD TYPE : int
+    //
+    int mkdir( const Pathname & path, unsigned mode )
+    {
+      MIL << "mkdir " << path << ' ' << str::octstring( mode );
+      if ( ::mkdir( path.asString().c_str(), mode ) == -1 ) {
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : assert_dir()
+    // METHOD TYPE : int
+    //
+    int assert_dir( const Pathname & path, unsigned mode )
+    {
+      if ( path.empty() )
+        return ENOENT;
+
+      { // Handle existing paths in advance.
+        PathInfo pi( path );
+        if ( pi.isDir() )
+          return 0;
+        if ( pi.isExist() )
+          return EEXIST;
+      }
+
+      string spath = path.asString()+"/";
+      std::string::size_type lastpos = ( path.relative() ? 2 : 1 ); // skip leasding './' or '/'
+      std::string::size_type pos = std::string::npos;
+      int ret = 0;
+
+      while ( (pos = spath.find('/',lastpos)) != std::string::npos )
+      {
+        string dir( spath.substr(0,pos) );
+        ret = ::mkdir( dir.c_str(), mode );
+        if ( ret == -1 )
+        {
+          if ( errno == EEXIST ) // ignore errors about already existing paths
+            ret = 0;
+          else
+          {
+            ret = errno;
+            WAR << " FAILED: mkdir " << dir << ' ' << str::octstring( mode ) << " errno " << ret << endl;
+          }
+        }
+        else
+        {
+          MIL << "mkdir " << dir << ' ' << str::octstring( mode ) << endl;
+        }
+        lastpos = pos+1;
+      }
+
+      return ret;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : rmdir
+    // METHOD TYPE : int
+    //
+    int rmdir( const Pathname & path )
+    {
+      MIL << "rmdir " << path;
+      if ( ::rmdir( path.asString().c_str() ) == -1 ) {
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : recursive_rmdir
+    // METHOD TYPE : int
+    //
+    static int recursive_rmdir_1( const Pathname & dir, bool removeDir = true )
+    {
+      DIR * dp;
+      struct dirent * d;
+
+      if ( ! (dp = opendir( dir.c_str() )) )
+        return logResult( errno );
+
+      while ( (d = readdir(dp)) )
+      {
+        std::string direntry = d->d_name;
+        if ( direntry == "." || direntry == ".." )
+          continue;
+        Pathname new_path( dir / d->d_name );
+
+        struct stat st;
+        if ( ! lstat( new_path.c_str(), &st ) )
+        {
+          if ( S_ISDIR( st.st_mode ) )
+            recursive_rmdir_1( new_path );
+          else
+            ::unlink( new_path.c_str() );
+        }
+      }
+      closedir( dp );
+
+      if ( removeDir && ::rmdir( dir.c_str() ) < 0 )
+        return errno;
+
+      return 0;
+    }
+    ///////////////////////////////////////////////////////////////////
+    int recursive_rmdir( const Pathname & path )
+    {
+      MIL << "recursive_rmdir " << path << ' ';
+      PathInfo p( path );
+
+      if ( !p.isExist() ) {
+        return logResult( 0 );
+      }
+
+      if ( !p.isDir() ) {
+        return logResult( ENOTDIR );
+      }
+
+      p.lstat();       // get dir symlinks
+      if ( !p.isDir() ) {
+       MIL << "unlink symlink ";
+       if ( ::unlink( path.asString().c_str() ) == -1 ) {
+         return logResult( errno );
+       }
+       return logResult( 0 );
+      }
+
+      return logResult( recursive_rmdir_1( path ) );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : clean_dir
+    // METHOD TYPE : int
+    //
+    int clean_dir( const Pathname & path )
+    {
+      MIL << "clean_dir " << path << ' ';
+      PathInfo p( path );
+
+      if ( !p.isExist() ) {
+        return logResult( 0 );
+      }
+
+      if ( !p.isDir() ) {
+        return logResult( ENOTDIR );
+      }
+
+      return logResult( recursive_rmdir_1( path, false/* don't remove path itself */ ) );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : copy_dir
+    // METHOD TYPE : int
+    //
+    int copy_dir( const Pathname & srcpath, const Pathname & destpath )
+    {
+      MIL << "copy_dir " << srcpath << " -> " << destpath << ' ';
+
+      PathInfo sp( srcpath );
+      if ( !sp.isDir() ) {
+        return logResult( ENOTDIR );
+      }
+
+      PathInfo dp( destpath );
+      if ( !dp.isDir() ) {
+        return logResult( ENOTDIR );
+      }
+
+      PathInfo tp( destpath + srcpath.basename() );
+      if ( tp.isExist() ) {
+        return logResult( EEXIST );
+      }
+
+
+      const char *const argv[] = {
+        "/bin/cp",
+        "-dR",
+        "--",
+        srcpath.asString().c_str(),
+        destpath.asString().c_str(),
+        NULL
+      };
+      ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
+      for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
+        MIL << "  " << output;
+      }
+      int ret = prog.close();
+      return logResult( ret, "returned" );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : copy_dir_content
+    // METHOD TYPE : int
+    //
+    int copy_dir_content(const Pathname & srcpath, const Pathname & destpath)
+    {
+      MIL << "copy_dir " << srcpath << " -> " << destpath << ' ';
+
+      PathInfo sp( srcpath );
+      if ( !sp.isDir() ) {
+        return logResult( ENOTDIR );
+      }
+
+      PathInfo dp( destpath );
+      if ( !dp.isDir() ) {
+        return logResult( ENOTDIR );
+      }
+
+      if ( srcpath == destpath ) {
+        return logResult( EEXIST );
+      }
+
+      std::string src( srcpath.asString());
+      src += "/.";
+      const char *const argv[] = {
+        "/bin/cp",
+        "-dR",
+        "--",
+        src.c_str(),
+        destpath.asString().c_str(),
+        NULL
+      };
+      ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
+      for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
+        MIL << "  " << output;
+      }
+      int ret = prog.close();
+      return logResult( ret, "returned" );
+    }
+
+    ///////////////////////////////////////////////////////////////////////
+    // dirForEach
+    ///////////////////////////////////////////////////////////////////////
+
+    int dirForEach( const Pathname & dir_r, function<bool(const Pathname &, const char *const)> fnc_r )
+    {
+      if ( ! fnc_r )
+       return 0;
+
+      AutoDispose<DIR *> dir( ::opendir( dir_r.c_str() ),
+                             []( DIR * dir_r ) { if ( dir_r ) ::closedir( dir_r ); } );
+
+      MIL << "readdir " << dir_r << ' ';
+      if ( ! dir )
+       return logResult( errno );
+      MIL << endl; // close line before callbacks are invoked.
+
+      int ret = 0;
+      for ( struct dirent * entry = ::readdir( dir ); entry; entry = ::readdir( dir ) )
+      {
+        if ( entry->d_name[0] == '.' && ( entry->d_name[1] == '\0' || ( entry->d_name[1] == '.' && entry->d_name[2] == '\0' ) ) )
+         continue; // omitt . and ..
+
+       if ( ! fnc_r( dir_r, entry->d_name ) )
+       {
+         ret = -1;
+         break;
+       }
+      }
+      return ret;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    // readdir
+    ///////////////////////////////////////////////////////////////////
+
+    int readdir( std::list<std::string> & retlist_r, const Pathname & path_r, bool dots_r )
+    {
+      retlist_r.clear();
+      return dirForEach( path_r,
+                        [&]( const Pathname & dir_r, const char *const name_r )->bool
+                        {
+                          if ( dots_r || name_r[0] != '.' )
+                            retlist_r.push_back( name_r );
+                          return true;
+                        } );
+    }
+
+
+    int readdir( std::list<Pathname> & retlist_r, const Pathname & path_r, bool dots_r )
+    {
+      retlist_r.clear();
+      return dirForEach( path_r,
+                        [&]( const Pathname & dir_r, const char *const name_r )->bool
+                        {
+                          if ( dots_r || name_r[0] != '.' )
+                            retlist_r.push_back( dir_r/name_r );
+                          return true;
+                        } );
+    }
+
+    bool DirEntry::operator==( const DirEntry &rhs ) const
+    {
+      // if one of the types is not known, use the name only
+      if ( type == FT_NOT_AVAIL || rhs.type == FT_NOT_AVAIL )
+        return ( name == rhs.name );
+      return ((name == rhs.name ) && (type == rhs.type));
+    }
+
+    int readdir( DirContent & retlist_r, const Pathname & path_r, bool dots_r, PathInfo::Mode statmode_r )
+    {
+      retlist_r.clear();
+      return dirForEach( path_r,
+                        [&]( const Pathname & dir_r, const char *const name_r )->bool
+                        {
+                          if ( dots_r || name_r[0] != '.' )
+                            retlist_r.push_back( DirEntry( name_r, PathInfo( dir_r/name_r, statmode_r ).fileType() ) );
+                          return true;
+                        } );
+    }
+
+    std::ostream & operator<<( std::ostream & str, const DirContent & obj )
+    { return dumpRange( str, obj.begin(), obj.end() ); }
+
+    ///////////////////////////////////////////////////////////////////
+    // is_empty_dir
+    ///////////////////////////////////////////////////////////////////
+
+    int is_empty_dir( const Pathname & path_r )
+    {
+      return dirForEach( path_r,
+                        [&]( const Pathname & dir_r, const char *const name_r )->bool
+                        { return false; } );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : unlink
+    // METHOD TYPE : int
+    //
+    int unlink( const Pathname & path )
+    {
+      MIL << "unlink " << path;
+      if ( ::unlink( path.asString().c_str() ) == -1 ) {
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    namespace
+    {
+      int safe_rename( const Pathname & oldpath, const Pathname & newpath )
+      {
+        int ret = ::rename( oldpath.asString().c_str(), newpath.asString().c_str() );
+
+        // rename(2) can fail on OverlayFS. Fallback to using mv(1), which is
+        // explicitly mentioned in the kernel docs to deal correctly with OverlayFS.
+        if ( ret == -1 && errno == EXDEV ) {
+          const char *const argv[] = {
+            "/usr/bin/mv",
+            oldpath.asString().c_str(),
+            newpath.asString().c_str(),
+            NULL
+          };
+          ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
+          for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
+            MIL << "  " << output;
+          }
+          ret = prog.close();
+        }
+
+        return ret;
+      }
+    } // namespace
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : rename
+    // METHOD TYPE : int
+    //
+    int rename( const Pathname & oldpath, const Pathname & newpath )
+    {
+      MIL << "rename " << oldpath << " -> " << newpath;
+      if ( safe_rename( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) {
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : exchange
+    // METHOD TYPE : int
+    //
+    int exchange( const Pathname & lpath, const Pathname & rpath )
+    {
+      MIL << "exchange " << lpath << " <-> " << rpath;
+      if ( lpath.empty() || rpath.empty() )
+        return logResult( EINVAL );
+
+      PathInfo linfo( lpath );
+      PathInfo rinfo( rpath );
+
+      if ( ! linfo.isExist() )
+      {
+        if ( ! rinfo.isExist() )
+          return logResult( 0 ); // both don't exist.
+
+        // just rename rpath -> lpath
+        int ret = assert_dir( lpath.dirname() );
+        if ( ret != 0 )
+          return logResult( ret );
+        if ( safe_rename( rpath.c_str(), lpath.c_str() ) == -1 ) {
+          return logResult( errno );
+        }
+        return logResult( 0 );
+      }
+
+      // HERE: lpath exists:
+      if ( ! rinfo.isExist() )
+      {
+        // just rename lpath -> rpath
+        int ret = assert_dir( rpath.dirname() );
+        if ( ret != 0 )
+          return logResult( ret );
+        if ( safe_rename( lpath.c_str(), rpath.c_str() ) == -1 ) {
+          return logResult( errno );
+        }
+        return logResult( 0 );
+      }
+
+      // HERE: both exist
+      TmpFile tmpfile( TmpFile::makeSibling( rpath ) );
+      if ( ! tmpfile )
+        return logResult( errno );
+      Pathname tmp( tmpfile.path() );
+      ::unlink( tmp.c_str() );
+
+      if ( safe_rename( lpath.c_str(), tmp.c_str() ) == -1 ) {
+        return logResult( errno );
+      }
+      if ( safe_rename( rpath.c_str(), lpath.c_str() ) == -1 ) {
+        safe_rename( tmp.c_str(), lpath.c_str() );
+        return logResult( errno );
+      }
+      if ( safe_rename( tmp.c_str(), rpath.c_str() ) == -1 ) {
+        safe_rename( lpath.c_str(), rpath.c_str() );
+        safe_rename( tmp.c_str(), lpath.c_str() );
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : copy
+    // METHOD TYPE : int
+    //
+    int copy( const Pathname & file, const Pathname & dest )
+    {
+      MIL << "copy " << file << " -> " << dest << ' ';
+
+      PathInfo sp( file );
+      if ( !sp.isFile() ) {
+        return logResult( EINVAL );
+      }
+
+      PathInfo dp( dest );
+      if ( dp.isDir() ) {
+        return logResult( EISDIR );
+      }
+
+      const char *const argv[] = {
+        "/bin/cp",
+        "--remove-destination",
+        "--",
+        file.asString().c_str(),
+        dest.asString().c_str(),
+        NULL
+      };
+      ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
+      for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
+        MIL << "  " << output;
+      }
+      int ret = prog.close();
+      return logResult( ret, "returned" );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : symlink
+    // METHOD TYPE : int
+    //
+    int symlink( const Pathname & oldpath, const Pathname & newpath )
+    {
+      MIL << "symlink " << newpath << " -> " << oldpath;
+      if ( ::symlink( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) {
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : hardlink
+    // METHOD TYPE : int
+    //
+    int hardlink( const Pathname & oldpath, const Pathname & newpath )
+    {
+      MIL << "hardlink " << newpath << " -> " << oldpath;
+      if ( ::link( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) {
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : hardlink
+    // METHOD TYPE : int
+    //
+    int hardlinkCopy( const Pathname & oldpath, const Pathname & newpath )
+    {
+      MIL << "hardlinkCopy " << oldpath << " -> " << newpath;
+
+      PathInfo pi( oldpath, PathInfo::LSTAT );
+      if ( pi.isLink() )
+      {
+       // dont hardlink symlinks!
+       MIL << " => copy" << endl;
+       return copy( oldpath, newpath );
+      }
+
+      pi.lstat( newpath );
+      if ( pi.isExist() )
+      {
+       int res = unlink( newpath );
+       if ( res != 0 )
+         return logResult( res );
+      }
+
+      // Here: no symlink, no newpath
+      if ( ::link( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 )
+      {
+        switch ( errno )
+        {
+         case EPERM: // /proc/sys/fs/protected_hardlink in proc(5)
+          case EXDEV: // oldpath  and  newpath are not on the same mounted file system
+           MIL << " => copy" << endl;
+            return copy( oldpath, newpath );
+            break;
+        }
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : readlink
+    // METHOD TYPE : int
+    //
+    int readlink( const Pathname & symlink_r, Pathname & target_r )
+    {
+      static const ssize_t bufsiz = 2047;
+      static char buf[bufsiz+1];
+      ssize_t ret = ::readlink( symlink_r.c_str(), buf, bufsiz );
+      if ( ret == -1 )
+      {
+        target_r = Pathname();
+        MIL << "readlink " << symlink_r;
+        return logResult( errno );
+      }
+      buf[ret] = '\0';
+      target_r = buf;
+      return 0;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    //  METHOD NAME : expandlink
+    //  METHOD TYPE : Pathname
+    //
+    Pathname expandlink( const Pathname & path_r )
+    {
+      static const unsigned int level_limit = 256;
+      static unsigned int count;
+      Pathname path(path_r);
+      PathInfo info(path_r, PathInfo::LSTAT);
+
+      for (count = level_limit; info.isLink() && count; count--)
+      {
+        DBG << "following symlink " << path;
+        path = path.dirname() / readlink(path);
+        DBG << "->" << path << std::endl;
+        info = PathInfo(path, PathInfo::LSTAT);
+      }
+
+      // expand limit reached
+      if (count == 0)
+      {
+        ERR << "Expand level limit reached. Probably a cyclic symbolic link." << endl;
+        return Pathname();
+      }
+      // symlink
+      else if (count < level_limit)
+      {
+        // check for a broken link
+        if (PathInfo(path).isExist())
+          return path;
+        // broken link, return an empty path
+        else
+        {
+          ERR << path << " is broken (expanded from " << path_r << ")" << endl;
+          return Pathname();
+        }
+      }
+
+      // not a symlink, return the original pathname
+      DBG << "not a symlink" << endl;
+      return path;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : copy_file2dir
+    // METHOD TYPE : int
+    //
+    int copy_file2dir( const Pathname & file, const Pathname & dest )
+    {
+      MIL << "copy_file2dir " << file << " -> " << dest << ' ';
+
+      PathInfo sp( file );
+      if ( !sp.isFile() ) {
+        return logResult( EINVAL );
+      }
+
+      PathInfo dp( dest );
+      if ( !dp.isDir() ) {
+        return logResult( ENOTDIR );
+      }
+
+      const char *const argv[] = {
+        "/bin/cp",
+        "--",
+        file.asString().c_str(),
+        dest.asString().c_str(),
+        NULL
+      };
+      ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
+      for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
+        MIL << "  " << output;
+      }
+      int ret = prog.close();
+      return logResult( ret, "returned" );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : md5sum
+    // METHOD TYPE : std::string
+    //
+    std::string md5sum( const Pathname & file )
+    {
+      if ( ! PathInfo( file ).isFile() ) {
+        return string();
+      }
+      std::ifstream istr( file.asString().c_str() );
+      if ( ! istr ) {
+        return string();
+      }
+      return Digest::digest( "MD5", istr );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : sha1sum
+    // METHOD TYPE : std::string
+    //
+    std::string sha1sum( const Pathname & file )
+    {
+      return checksum(file, "SHA1");
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    //  METHOD NAME : checksum
+    //  METHOD TYPE : std::string
+    //
+    std::string checksum( const Pathname & file, const std::string &algorithm )
+    {
+      if ( ! PathInfo( file ).isFile() ) {
+        return string();
+      }
+      std::ifstream istr( file.asString().c_str() );
+      if ( ! istr ) {
+        return string();
+      }
+      return Digest::digest( algorithm, istr );
+    }
+
+    bool is_checksum( const Pathname & file, const CheckSum &checksum )
+    {
+      return ( filesystem::checksum(file,  checksum.type()) == checksum.checksum() );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : erase
+    // METHOD TYPE : int
+    //
+    int erase( const Pathname & path )
+    {
+      int res = 0;
+      PathInfo p( path, PathInfo::LSTAT );
+      if ( p.isExist() )
+        {
+          if ( p.isDir() )
+            res = recursive_rmdir( path );
+          else
+            res = unlink( path );
+        }
+      return res;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : chmod
+    // METHOD TYPE : int
+    //
+    int chmod( const Pathname & path, mode_t mode )
+    {
+      MIL << "chmod " << path << ' ' << str::octstring( mode );
+      if ( ::chmod( path.asString().c_str(), mode ) == -1 ) {
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    int addmod( const Pathname & path, mode_t mode )
+    {
+      mode_t omode( PathInfo( path ).st_mode() );
+      mode_t tmode( omode | mode );
+      if ( omode != mode )
+        return chmod( path, tmode );
+      return 0;
+    }
+
+    int delmod( const Pathname & path, mode_t mode )
+    {
+      mode_t omode( PathInfo( path ).st_mode() );
+      mode_t tmode( omode & ~mode );
+      if ( omode != mode )
+        return chmod( path, tmode );
+      return 0;
+    }
+
+   //////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : zipType
+    // METHOD TYPE : ZIP_TYPE
+    //
+    ZIP_TYPE zipType( const Pathname & file )
+    {
+      ZIP_TYPE ret = ZT_NONE;
+
+      int fd = open( file.asString().c_str(), O_RDONLY|O_CLOEXEC );
+
+      if ( fd != -1 ) {
+        const int magicSize = 5;
+        unsigned char magic[magicSize];
+        memset( magic, 0, magicSize );
+        if ( read( fd, magic, magicSize ) == magicSize ) {
+          if ( magic[0] == 0037 && magic[1] == 0213 ) {
+            ret = ZT_GZ;
+          } else if ( magic[0] == 'B' && magic[1] == 'Z' && magic[2] == 'h' ) {
+            ret = ZT_BZ2;
+          } else if ( magic[0] == '\0' && magic[1] == 'Z' && magic[2] == 'C' && magic[3] == 'K' && magic[4] == '1') {
+            ret = ZT_ZCHNK;
+
+          }
+        }
+        close( fd );
+      }
+
+      return ret;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : df
+    // METHOD TYPE : ByteCount
+    //
+    ByteCount df( const Pathname & path_r )
+    {
+      ByteCount ret( -1 );
+      struct statvfs sb;
+      if ( statvfs( path_r.c_str(), &sb ) == 0 )
+        {
+          ret = sb.f_bfree * sb.f_bsize;
+        }
+      return ret;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : getUmask
+    // METHOD TYPE : mode_t
+    //
+    mode_t getUmask()
+    {
+      mode_t mask = ::umask( 0022 );
+      ::umask( mask );
+      return mask;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : getUmask
+    // METHOD TYPE : mode_t
+    //
+    int assert_file( const Pathname & path, unsigned mode )
+    {
+      int ret = assert_dir( path.dirname() );
+      MIL << "assert_file " << str::octstring( mode ) << " " << path;
+      if ( ret != 0 )
+        return logResult( ret );
+
+      PathInfo pi( path );
+      if ( pi.isExist() )
+        return logResult( pi.isFile() ? 0 : EEXIST );
+
+      int fd = ::creat( path.c_str(), mode );
+      if ( fd == -1 )
+        return logResult( errno );
+
+      ::close( fd );
+      return logResult( 0 );
+    }
+
+    int assert_file_mode( const Pathname & path, unsigned mode )
+    {
+      int ret = assert_dir( path.dirname() );
+      MIL << "assert_file_mode " << str::octstring( mode ) << " " << path;
+      if ( ret != 0 )
+        return logResult( ret );
+
+      PathInfo pi( path );
+      if ( pi.isExist() )
+      {
+       if ( ! pi.isFile() )
+         return logResult( EEXIST );
+
+       mode = applyUmaskTo( mode );
+       if ( pi.st_mode() != mode )
+         return chmod( path, mode );
+
+       return logResult( 0 );
+      }
+
+      int fd = ::creat( path.c_str(), mode );
+      if ( fd == -1 )
+        return logResult( errno );
+      ::close( fd );
+      return logResult( 0 );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    //  METHOD NAME : touch
+    //  METHOD TYPE : int
+    //
+    int touch (const Pathname & path)
+    {
+      MIL << "touch " << path;
+      struct ::utimbuf times;
+      times.actime = ::time( 0 );
+      times.modtime = ::time( 0 );
+      if ( ::utime( path.asString().c_str(), &times ) == -1 ) {
+        return logResult( errno );
+      }
+      return logResult( 0 );
+    }
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace filesystem
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
diff --git a/zypp-core/fs/PathInfo.h b/zypp-core/fs/PathInfo.h
new file mode 100644 (file)
index 0000000..57fb3ac
--- /dev/null
@@ -0,0 +1,794 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/PathInfo.h
+ *
+*/
+#ifndef ZYPP_CORE_FS_PATHINFO_H
+#define ZYPP_CORE_FS_PATHINFO_H
+
+extern "C"
+{
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <dirent.h>
+}
+
+#include <cerrno>
+#include <iosfwd>
+#include <list>
+#include <set>
+#include <map>
+
+#include <zypp-core/Pathname.h>
+#include <zypp-core/ByteCount.h>
+#include <zypp-core/CheckSum.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  ///////////////////////////////////////////////////////////////////
+  /** Types and functions for filesystem operations.
+   * \todo move zypp::filesystem stuff into separate header
+   * \todo Add tmpfile and tmpdir handling.
+   * \todo think about using Exceptions in zypp::filesystem
+   * \todo provide a readdir iterator; at least provide an interface
+   * using an insert_iterator to be independent from std::container.
+  */
+  namespace filesystem
+  { /////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    /** File type information.
+     * \todo Think about an \ref g_EnumerationClass
+    */
+    enum FileType
+      {
+        FT_NOT_AVAIL = 0x00, // no typeinfo available
+        FT_NOT_EXIST = 0x01, // file does not exist
+        FT_FILE      = 0x02,
+        FT_DIR       = 0x04,
+        FT_CHARDEV   = 0x08,
+        FT_BLOCKDEV  = 0x10,
+        FT_FIFO      = 0x20,
+        FT_LINK      = 0x40,
+        FT_SOCKET    = 0x80
+      };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates FileType Stram output. */
+    extern std::ostream & operator<<( std::ostream & str, FileType obj );
+
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : StatMode
+    /**
+     * @short Wrapper class for mode_t values as derived from ::stat
+     **/
+    class StatMode
+    {
+      friend std::ostream & operator<<( std::ostream & str, const StatMode & obj );
+
+    public:
+      /** Ctor taking  mode_t value from ::stat. */
+      StatMode( const mode_t & mode_r = 0 )
+      : _mode( mode_r )
+      {}
+
+    public:
+
+      /** \name Query FileType. */
+      //@{
+      FileType fileType() const;
+
+      bool   isFile()  const { return S_ISREG( _mode ); }
+      bool   isDir ()  const { return S_ISDIR( _mode ); }
+      bool   isLink()  const { return S_ISLNK( _mode ); }
+      bool   isChr()   const { return S_ISCHR( _mode ); }
+      bool   isBlk()   const { return S_ISBLK( _mode ); }
+      bool   isFifo()  const { return S_ISFIFO( _mode ); }
+      bool   isSock()  const { return S_ISSOCK( _mode ); }
+      //@}
+
+      /** \name Query user permissions. */
+      //@{
+      bool   isRUsr()  const { return (_mode & S_IRUSR); }
+      bool   isWUsr()  const { return (_mode & S_IWUSR); }
+      bool   isXUsr()  const { return (_mode & S_IXUSR); }
+
+      /** Short for isRUsr().*/
+      bool   isR()     const { return isRUsr(); }
+      /** Short for isWUsr().*/
+      bool   isW()     const { return isWUsr(); }
+      /** Short for isXUsr().*/
+      bool   isX()     const { return isXUsr(); }
+      //@}
+
+      /** \name Query group permissions. */
+      //@{
+      bool   isRGrp()  const { return (_mode & S_IRGRP); }
+      bool   isWGrp()  const { return (_mode & S_IWGRP); }
+      bool   isXGrp()  const { return (_mode & S_IXGRP); }
+      //@}
+
+      /** \name Query others permissions. */
+      //@{
+      bool   isROth()  const { return (_mode & S_IROTH); }
+      bool   isWOth()  const { return (_mode & S_IWOTH); }
+      bool   isXOth()  const { return (_mode & S_IXOTH); }
+      //@}
+
+      /** \name Query special permissions. */
+      //@{
+      /** Set UID bit. */
+      bool   isUid()   const { return (_mode & S_ISUID); }
+      /** Set GID bit. */
+      bool   isGid()   const { return (_mode & S_ISGID); }
+      /** Sticky bit. */
+      bool   isVtx()   const { return (_mode & S_ISVTX); }
+      //@}
+
+      /** \name Query permission */
+      //@{
+      /** Test for equal permission bits. */
+      bool   isPerm ( mode_t m ) const { return (m == perm()); }
+      /** Test for set permission bits. */
+      bool   hasPerm( mode_t m ) const { return (m == (m & perm())); }
+      //@}
+
+      /** \name Extract permission bits only. */
+      //@{
+      mode_t uperm()   const { return (_mode & S_IRWXU); }
+      mode_t gperm()   const { return (_mode & S_IRWXG); }
+      mode_t operm()   const { return (_mode & S_IRWXO); }
+      mode_t perm()    const { return (_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)); }
+      //@}
+
+      /** Return the mode_t value. */
+      mode_t st_mode() const { return _mode; }
+
+    private:
+      mode_t _mode;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates StatMode Stream output. */
+    extern std::ostream & operator<<( std::ostream & str, const StatMode & obj );
+
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : DevInoCache
+    /** Simple cache remembering device/inode to detect hardlinks.
+     * \code
+     *     DevInoCache trace;
+     *     for ( all files ) {
+     *       if ( trace.insert( file.device, file.inode ) ) {
+     *         // 1st occurance of file
+     *       }
+     *         // else: hardlink; already counted this device/inode
+     *       }
+     *     }
+     * \endcode
+     **/
+    class DevInoCache
+    {
+    public:
+      /** Ctor */
+      DevInoCache() {}
+
+      /** Clear cache. */
+      void clear() { _devino.clear(); }
+
+      /** Remember dev/ino.
+       * \Return <code>true</code> if it's inserted the first
+       * time, <code>false</code> if alredy present in cache
+       * (a hardlink to a previously remembered file).
+       **/
+      bool insert( const dev_t & dev_r, const ino_t & ino_r ) {
+        return _devino[dev_r].insert( ino_r ).second;
+      }
+
+    private:
+      std::map<dev_t,std::set<ino_t> > _devino;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : PathInfo
+    /** Wrapper class for ::stat/::lstat.
+     *
+     * \note All attribute quieries test for isExist(), and return \c false or
+     * \c 0, if stat was not successful.
+     *
+     * \note For convenience PathInfo is available as zypp::PathInfo too.
+     **/
+    class PathInfo
+    {
+      friend std::ostream & operator<<( std::ostream & str, const PathInfo & obj );
+
+    public:
+      /** stat() or lstat() */
+      enum Mode { STAT, LSTAT };
+
+    public:
+      /** \name Construct from Pathname.
+       * Default mode is \c STAT.
+      */
+      //@{
+      PathInfo();
+      explicit
+      PathInfo( const Pathname & path, Mode initial = STAT );
+      explicit
+      PathInfo( const std::string & path, Mode initial = STAT );
+      explicit
+      PathInfo( const char * path, Mode initial = STAT );
+      //@}
+
+      /**Dtor */
+      ~PathInfo();
+
+      /** Return current Pathname. */
+      const Pathname &    path()     const { return path_t; }
+      /** Return current Pathname as String. */
+      const std::string & asString() const { return path_t.asString(); }
+      /** Return current Pathname as C-string. */
+      const char * c_str()           const { return path_t.asString().c_str(); }
+      /** Return current stat Mode. */
+      Mode                mode()     const { return mode_e; }
+      /** Return error returned from last stat/lstat call. */
+      int                 error()    const { return error_i; }
+
+      /** Set a new Pathname. */
+      void setPath( const Pathname & path ) { if ( path != path_t ) error_i = -1; path_t = path; }
+      /** Set a new Mode . */
+      void setMode( Mode mode )             { if ( mode != mode_e ) error_i = -1; mode_e = mode; }
+
+      /** STAT \a path. */
+      bool stat      ( const Pathname & path ) { setPath( path ); setMode( STAT );  return operator()(); }
+      /** LSTAT \a path. */
+      bool lstat     ( const Pathname & path ) { setPath( path ); setMode( LSTAT ); return operator()(); }
+      /** Restat \a path using current mode. */
+      bool operator()( const Pathname & path ) { setPath( path ); return operator()(); }
+
+      /** STAT current path. */
+      bool stat()   { setMode( STAT );  return operator()(); }
+      /** LSTAT current path. */
+      bool lstat()  { setMode( LSTAT ); return operator()(); }
+      /** Restat current path using current mode. */
+      bool operator()();
+
+    public:
+
+      /** Return whether valid stat info exists.
+       * That's usg. whether the file exist and you had permission to
+       * stat it.
+      */
+      bool   isExist() const { return !error_i; }
+
+      /** \name Query StatMode attibutes.
+       * Combines \ref zypp::PathInfo::isExist and \ref zypp::filesystem::StatMode query.
+      */
+      //@{
+      FileType fileType() const;
+
+      bool   isFile()  const { return isExist() && S_ISREG( statbuf_C.st_mode ); }
+      bool   isDir ()  const { return isExist() && S_ISDIR( statbuf_C.st_mode ); }
+      bool   isLink()  const { return isExist() && S_ISLNK( statbuf_C.st_mode ); }
+      bool   isChr()   const { return isExist() && S_ISCHR( statbuf_C.st_mode ); }
+      bool   isBlk()   const { return isExist() && S_ISBLK( statbuf_C.st_mode ); }
+      bool   isFifo()  const { return isExist() && S_ISFIFO( statbuf_C.st_mode ); }
+      bool   isSock()  const { return isExist() && S_ISSOCK( statbuf_C.st_mode ); }
+
+      // permission
+      bool   isRUsr()  const { return isExist() && (statbuf_C.st_mode & S_IRUSR); }
+      bool   isWUsr()  const { return isExist() && (statbuf_C.st_mode & S_IWUSR); }
+      bool   isXUsr()  const { return isExist() && (statbuf_C.st_mode & S_IXUSR); }
+
+      bool   isR()     const { return isRUsr(); }
+      bool   isW()     const { return isWUsr(); }
+      bool   isX()     const { return isXUsr(); }
+
+      bool   isRGrp()  const { return isExist() && (statbuf_C.st_mode & S_IRGRP); }
+      bool   isWGrp()  const { return isExist() && (statbuf_C.st_mode & S_IWGRP); }
+      bool   isXGrp()  const { return isExist() && (statbuf_C.st_mode & S_IXGRP); }
+
+      bool   isROth()  const { return isExist() && (statbuf_C.st_mode & S_IROTH); }
+      bool   isWOth()  const { return isExist() && (statbuf_C.st_mode & S_IWOTH); }
+      bool   isXOth()  const { return isExist() && (statbuf_C.st_mode & S_IXOTH); }
+
+      bool   isUid()   const { return isExist() && (statbuf_C.st_mode & S_ISUID); }
+      bool   isGid()   const { return isExist() && (statbuf_C.st_mode & S_ISGID); }
+      bool   isVtx()   const { return isExist() && (statbuf_C.st_mode & S_ISVTX); }
+
+      bool   isPerm ( mode_t m ) const { return isExist() && (m == perm()); }
+      bool   hasPerm( mode_t m ) const { return isExist() && (m == (m & perm())); }
+
+      mode_t uperm()   const { return isExist() ? (statbuf_C.st_mode & S_IRWXU) : 0; }
+      mode_t gperm()   const { return isExist() ? (statbuf_C.st_mode & S_IRWXG) : 0; }
+      mode_t operm()   const { return isExist() ? (statbuf_C.st_mode & S_IRWXO) : 0; }
+      mode_t perm()    const { return isExist() ? (statbuf_C.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)) : 0; }
+
+      mode_t st_mode() const { return isExist() ? statbuf_C.st_mode : 0; }
+      //@}
+
+      /** Return st_mode() as filesystem::StatMode. */
+      StatMode asStatMode() const { return st_mode(); }
+
+      nlink_t nlink()  const { return isExist() ? statbuf_C.st_nlink : 0; }
+
+      /** \name Owner and group */
+      //@{
+      uid_t  owner()   const { return isExist() ? statbuf_C.st_uid : 0; }
+      gid_t  group()   const { return isExist() ? statbuf_C.st_gid : 0; }
+      //@}
+
+      /** \name Permission according to current uid/gid. */
+      //@{
+      /** Returns current users permission (<tt>[0-7]</tt>)*/
+      mode_t userMay() const;
+
+      bool   userMayR() const { return( userMay() & 04 ); }
+      bool   userMayW() const { return( userMay() & 02 ); }
+      bool   userMayX() const { return( userMay() & 01 ); }
+
+      bool   userMayRW()  const { return( (userMay() & 06) == 06 ); }
+      bool   userMayRX()  const { return( (userMay() & 05) == 05 ); }
+      bool   userMayWX()  const { return( (userMay() & 03) == 03 ); }
+
+      bool   userMayRWX() const { return( userMay() == 07 ); }
+      //@}
+
+      /** \name Device and inode info. */
+      //@{
+      ino_t  ino()     const { return isExist() ? statbuf_C.st_ino  : 0; }
+      dev_t  dev()     const { return isExist() ? statbuf_C.st_dev  : 0; }
+      dev_t  rdev()    const { return isExist() ? statbuf_C.st_rdev : 0; }
+
+      unsigned int devMajor() const;
+      unsigned int devMinor() const;
+      //@}
+
+      /** \name Size info. */
+      //@{
+      off_t         size()    const { return isExist() ? statbuf_C.st_size : 0; }
+      unsigned long blksize() const { return isExist() ? statbuf_C.st_blksize : 0; }
+      unsigned long blocks()  const { return isExist() ? statbuf_C.st_blocks  : 0; }
+      //@}
+
+      /** \name Time stamps. */
+      //@{
+      time_t atime()   const { return isExist() ? statbuf_C.st_atime : 0; } /* time of last access */
+      time_t mtime()   const { return isExist() ? statbuf_C.st_mtime : 0; } /* time of last modification */
+      time_t ctime()   const { return isExist() ? statbuf_C.st_ctime : 0; }
+      //@}
+
+    private:
+      Pathname    path_t;
+      struct stat statbuf_C;
+      Mode        mode_e;
+      int         error_i;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /** \relates PathInfo Stream output. */
+    extern std::ostream & operator<<( std::ostream & str, const PathInfo & obj );
+
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name Directory related functions. */
+    //@{
+    /**
+     * Like '::mkdir'. Attempt to create a new directory named path. mode
+     * specifies the permissions to use. It is modified by the process's
+     * umask in the usual way.
+     *
+     * @return 0 on success, errno on failure
+     **/
+    int mkdir( const Pathname & path, unsigned mode = 0755 );
+
+    /**
+     * Like 'mkdir -p'. No error if directory exists. Make parent directories
+     * as needed. mode specifies the permissions to use, if directories have to
+     * be created. It is modified by the process's umask in the usual way.
+     *
+     * @return 0 on success, errno on failure
+     **/
+    int assert_dir( const Pathname & path, unsigned mode = 0755 );
+
+    /**
+     * Like '::rmdir'. Delete a directory, which must be empty.
+     *
+     * @return 0 on success, errno on failure
+     **/
+    int rmdir( const Pathname & path );
+
+    /**
+     * Like 'rm -r DIR'. Delete a directory, recursively removing its contents.
+     *
+     * @return 0 on success, ENOTDIR if path is not a directory, otherwise the
+     * commands return value.
+     **/
+    int recursive_rmdir( const Pathname & path );
+
+    /**
+     * Like 'rm -r DIR/ *'. Delete directory contents, but keep the directory itself.
+     *
+     * @return 0 on success, ENOTDIR if path is not a directory, otherwise the
+     * commands return value.
+     **/
+    int clean_dir( const Pathname & path );
+
+    /**
+     * Like 'cp -a srcpath destpath'. Copy directory tree. srcpath/destpath must be
+     * directories. 'basename srcpath' must not exist in destpath.
+     *
+     * @return 0 on success, ENOTDIR if srcpath/destpath is not a directory, EEXIST if
+     * 'basename srcpath' exists in destpath, otherwise the commands return value.
+     **/
+    int copy_dir( const Pathname & srcpath, const Pathname & destpath );
+
+    /**
+     * Like 'cp -a srcpath/. destpath'. Copy the content of srcpath recursively
+     * into destpath. Both \p srcpath and \p destpath has to exists.
+     *
+     * @return 0 on success, ENOTDIR if srcpath/destpath is not a directory,
+     * EEXIST if srcpath and destpath are equal, otherwise the commands
+     * return value.
+     */
+    int copy_dir_content( const Pathname & srcpath, const Pathname & destpath);
+
+    /**
+     * Invoke callback function \a fnc_r for each entry in directory \a dir_r.
+     *
+     * If \a fnc_r is a \c NULL function \c 0 is returned immediately without even
+     * testing or accessing \a dir_r.
+     *
+     * Otherwise \c ::readdir is used to read the name of every entry in \a dir_r,
+     * omitting  \c '.' and \c '..'. \a dir_r and the current entries name are passed
+     * as arguments to \a fnc_r. If \a fnc_r returns \c false processing is aborted.
+     *
+     * @return 0 on success, -1 if aborted by callback, errno > 0 on ::readdir failure.
+     */
+    int dirForEach( const Pathname & dir_r, function<bool(const Pathname &, const char *const)> fnc_r );
+
+    /**
+     * Return content of directory via retlist. If dots is false
+     * entries starting with '.' are not reported. "." and ".."
+     * are never reported.
+     *
+     * Returns just the directory entries as string.
+     *
+     * @return 0 on success, errno on failure.
+     *
+     * \todo provide some readdirIterator.
+     **/
+
+    int readdir( std::list<std::string> & retlist,
+                 const Pathname & path, bool dots = true );
+
+    /**
+     * Return content of directory via retlist. If dots is false
+     * entries starting with '.' are not reported. "." and ".."
+     * are never reported.
+     *
+     * Returns the directory entries prefixed with \a path.
+     *
+     * @return 0 on success, errno on failure.
+     *
+     * \todo provide some readdirIterator.
+     **/
+
+    int readdir( std::list<Pathname> & retlist,
+                 const Pathname & path, bool dots = true );
+
+    /** Listentry returned by readdir. */
+    struct DirEntry {
+      std::string name;
+      FileType    type;
+      DirEntry( const std::string & name_r = std::string(), FileType type_r = FT_NOT_AVAIL )
+      : name( name_r )
+      , type( type_r )
+      {}
+
+      bool operator==( const DirEntry &rhs ) const;
+    };
+
+    inline std::ostream & operator<<( std::ostream & str, const DirEntry & obj )
+    { return str << '[' << obj.type << "] " << obj.name; }
+
+    /** Returned by readdir. */
+    typedef std::list<DirEntry> DirContent;
+
+    std::ostream & operator<<( std::ostream & str, const DirContent & obj );
+
+    /**
+     * Return content of directory via retlist. If dots is false
+     * entries starting with '.' are not reported. "." and ".."
+     * are never reported.
+     *
+     * The type of individual directory entries is determined accoding to
+     * statmode (i.e. via stat or lstat).
+     *
+     * @return 0 on success, errno on failure.
+     **/
+    int readdir( DirContent & retlist, const Pathname & path,
+                 bool dots = true, PathInfo::Mode statmode = PathInfo::STAT );
+
+    /**
+     * Check if the specified directory is empty.
+     * \param path The path of the directory to check.
+     * \return 0 if directory is empty, -1 if not, errno > 0 on failure.
+     */
+    int is_empty_dir(const Pathname & path);
+
+    //@}
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name File related functions. */
+    //@{
+    /**
+     * Create an empty file if it does not yet exist. Make parent directories
+     * as needed. mode specifies the permissions to use. It is modified by the
+     * process's umask in the usual way.
+     *
+     * @return 0 on success, errno on failure
+     **/
+    int assert_file( const Pathname & path, unsigned mode = 0644 );
+    /**
+     * Like \ref assert_file but enforce \a mode even if the file already exists.
+     */
+    int assert_file_mode( const Pathname & path, unsigned mode = 0644 );
+
+    /**
+     * Change file's modification and access times.
+     *
+     * \return 0 on success, errno on failure
+     * \see man utime
+     */
+    int touch (const Pathname & path);
+
+    /**
+     * Like '::unlink'. Delete a file (symbolic link, socket, fifo or device).
+     *
+     * @return 0 on success, errno on failure
+     **/
+    int unlink( const Pathname & path );
+
+    /**
+     * Like '::rename'. Renames a file, moving it between directories if
+     * required. It falls back to using mv(1) in case errno is set to
+     * EXDEV, indicating a cross-device rename, which is likely to happen when
+     * oldpath and newpath are not on the same OverlayFS layer.
+     *
+     * @return 0 on success, errno on failure
+     **/
+    int rename( const Pathname & oldpath, const Pathname & newpath );
+
+    /** Exchanges two files or directories.
+     *
+     * Most common use is when building a new config file (or dir)
+     * in a tempfile. After the job is done, configfile and tempfile
+     * are exchanged. This includes moving away the configfile in case
+     * the tempfile does not exist. Parent directories are created as
+     * needed.
+     *
+     * \note Paths are exchanged using \c ::rename, so take care both paths
+     * are located on the same filesystem.
+     *
+     * \code
+     * Pathname configfile( "/etc/myconfig" );
+     * TmpFile  newconfig( TmpFile::makeSibling( configfile ) );
+     * // now write the new config:
+     * std::ofstream o( newconfig.path().c_str() );
+     * o << "mew values << endl;
+     * o.close();
+     * // If everything is fine, exchange the files:
+     * exchange( newconfig.path(), configfile );
+     * // Now the old configfile is still available at newconfig.path()
+     * // until newconfig goes out of scope.
+     * \endcode
+     *
+     * @return 0 on success, errno on failure
+     */
+    int exchange( const Pathname & lpath, const Pathname & rpath );
+
+    /**
+     * Like 'cp file dest'. Copy file to destination file.
+     *
+     * @return 0 on success, EINVAL if file is not a file, EISDIR if
+     * destiantion is a directory, otherwise the commands return value.
+     **/
+    int copy( const Pathname & file, const Pathname & dest );
+
+    /**
+     * Like '::symlink'. Creates a symbolic link named newpath which contains
+     * the string oldpath. If newpath exists it will not be overwritten.
+     *
+     * @return 0 on success, errno on failure.
+     **/
+    int symlink( const Pathname & oldpath, const Pathname & newpath );
+
+    /**
+     * Like '::link'. Creates a hard link named newpath to an existing file
+     * oldpath. If newpath exists it will not be overwritten.
+     *
+     * @return 0 on success, errno on failure.
+     **/
+    int hardlink( const Pathname & oldpath, const Pathname & newpath );
+
+    /**
+     * Create \a newpath as hardlink or copy of \a oldpath.
+     *
+     * @return 0 on success, errno on failure.
+     */
+    int hardlinkCopy( const Pathname & oldpath, const Pathname & newpath );
+
+    /**
+     * Like '::readlink'. Return the contents of the symbolic link
+     * \a symlink_r via \a target_r.
+     *
+     * @return 0 on success, errno on failure.
+     */
+    int readlink( const Pathname & symlink_r, Pathname & target_r );
+    /** \overload Return an empty Pathname on error. */
+    inline Pathname readlink( const Pathname & symlink_r )
+    {
+      Pathname target;
+      readlink( symlink_r, target );
+      return target;
+    }
+
+    /**
+     * Recursively follows the symlink pointed to by \a path_r and returns
+     * the Pathname to the real file or directory pointed to by the link.
+     *
+     * There is a recursion limit of 256 iterations to protect against a cyclic
+     * link.
+     *
+     * @return Pathname of the file or directory pointed to by the given link
+     *   if it is a valid link. If \a path_r is not a link, an exact copy of
+     *   it is returned. If \a path_r is a broken or a cyclic link, an empty
+     *   Pathname is returned and the event logged.
+     */
+    Pathname expandlink( const Pathname & path_r );
+
+    /**
+     * Like 'cp file dest'. Copy file to dest dir.
+     *
+     * @return 0 on success, EINVAL if file is not a file, ENOTDIR if dest
+     * is no directory, otherwise the commands return value.
+     **/
+    int copy_file2dir( const Pathname & file, const Pathname & dest );
+    //@}
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name Digest computaion.
+     * \todo check cooperation with zypp::Digest
+    */
+    //@{
+    /**
+     * Compute a files md5sum.
+     *
+     * @return the files md5sum on success, otherwise an empty string..
+     **/
+    std::string md5sum( const Pathname & file );
+
+    /**
+     * Compute a files sha1sum.
+     *
+     * @return the files sha1sum on success, otherwise an empty string..
+     **/
+    std::string sha1sum( const Pathname & file );
+    //@}
+
+    /**
+     * Compute a files checksum
+     *
+     * @return the files checksum on success, otherwise an empty string..
+     **/
+    std::string checksum( const Pathname & file, const std::string &algorithm );
+
+    /**
+     * check files checksum
+     *
+     * @return true if the checksum matches (an empty Checksum always matches!)
+     **/
+    bool is_checksum( const Pathname & file, const CheckSum &checksum );
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name Changing permissions. */
+    //@{
+    /**
+     * Like '::chmod'. The mode of the file given by path is changed.
+     *
+     * @return 0 on success, errno on failure
+     **/
+    int chmod( const Pathname & path, mode_t mode );
+
+    /**
+     * Add the \c mode bits to the file given by path.
+     *
+     * @return 0 on success, errno on failure
+     */
+    int addmod( const Pathname & path, mode_t mode );
+
+    /**
+     * Remove the \c mode bits from the file given by path.
+     *
+     * @return 0 on success, errno on failure
+     */
+    int delmod( const Pathname & path, mode_t mode );
+    //@}
+
+    ///////////////////////////////////////////////////////////////////
+    /** \name Misc. */
+    //@{
+    /**
+     * Test whether a file is compressed (gzip/bzip2).
+     *
+     * @return ZT_GZ, ZT_BZ2 if file is compressed, otherwise ZT_NONE.
+     **/
+    enum ZIP_TYPE { ZT_NONE, ZT_GZ, ZT_BZ2, ZT_ZCHNK };
+
+    ZIP_TYPE zipType( const Pathname & file );
+
+    /**
+     * Erase whatever happens to be located at path (file or directory).
+     *
+     * @return 0 on success.
+     *
+     * \todo check cooperation with zypp::TmpFile and zypp::TmpDir
+     **/
+    int erase( const Pathname & path );
+
+    /**
+     * Report free disk space on a mounted file system.
+     *
+     * path is the path name of any file within the mounted filesystem.
+     *
+     * @return Free disk space or -1 on error.
+     **/
+    ByteCount df( const Pathname & path );
+
+    /**
+     * Get the current umask (file mode creation mask)
+     *
+     * @return The current umask
+     **/
+    mode_t getUmask();
+
+     /**
+     * Modify \c mode_r according to the current umask
+     * <tt>( mode_r & ~getUmask() )</tt>.
+     * \see \ref getUmask.
+     * @return The resulting permissions.
+     **/
+    inline mode_t applyUmaskTo( mode_t mode_r )
+    { return mode_r & ~getUmask(); }
+    //@}
+
+    /////////////////////////////////////////////////////////////////
+  } // namespace filesystem
+  ///////////////////////////////////////////////////////////////////
+
+  /** Dragged into namespace zypp. */
+  using filesystem::PathInfo;
+
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_PATHINFO_H
diff --git a/zypp-core/fs/TmpPath.cc b/zypp-core/fs/TmpPath.cc
new file mode 100644 (file)
index 0000000..0eb7715
--- /dev/null
@@ -0,0 +1,320 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp-core/fs/TmpPath.cc
+ *
+*/
+
+#include <cstdlib>
+#include <cstring>
+#include <cerrno>
+
+#include <iostream>
+
+#include <zypp-core/base/ReferenceCounted.h>
+#include <zypp-core/base/NonCopyable.h>
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/fs/PathInfo.h>
+#include <zypp-core/fs/TmpPath.h>
+
+using std::endl;
+
+namespace zypp {
+  namespace filesystem {
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : TmpPath::Impl
+    /**
+     * Clean or delete a directory on destruction.
+     **/
+    class TmpPath::Impl : public base::ReferenceCounted, private base::NonCopyable
+    {
+      public:
+
+        enum Flags
+          {
+            NoOp         = 0,
+            Autodelete   = 1L << 0,
+            KeepTopdir   = 1L << 1,
+            //
+            CtorDefault  = Autodelete
+          };
+
+      public:
+
+        Impl( const Pathname & path_r, Flags flags_r = CtorDefault )
+        : _path( path_r ), _flags( flags_r )
+        {}
+
+        ~Impl()
+        {
+          if ( ! (_flags & Autodelete) || _path.empty() )
+            return;
+
+          PathInfo p( _path, PathInfo::LSTAT );
+          if ( ! p.isExist() )
+            return;
+
+          int res = 0;
+          if ( p.isDir() )
+            {
+              if ( _flags & KeepTopdir )
+                res = clean_dir( _path );
+              else
+                res = recursive_rmdir( _path );
+            }
+          else
+            res = unlink( _path );
+
+          if ( res )
+            INT << "TmpPath cleanup error (" << res << ") " << p << endl;
+          else
+            DBG << "TmpPath cleaned up " << p << endl;
+        }
+
+        const Pathname &
+        path() const
+        { return _path; }
+
+        bool autoCleanup() const
+        { return( _flags & Autodelete ); }
+
+        void autoCleanup( bool yesno_r )
+       { _flags = yesno_r ? CtorDefault : NoOp; }
+
+      private:
+        Pathname _path;
+        Flags    _flags;
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : TmpPath
+    //
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpPath::TmpPath
+    // METHOD TYPE : Constructor
+    //
+    TmpPath::TmpPath()
+    {}
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpPath::TmpPath
+    // METHOD TYPE : Constructor
+    //
+    TmpPath::TmpPath( const Pathname & tmpPath_r )
+    :_impl( tmpPath_r.empty() ? nullptr : new Impl( tmpPath_r ) )
+    {}
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpPath::~TmpPath
+    // METHOD TYPE : Destructor
+    //
+    TmpPath::~TmpPath()
+    {
+      // virtual not inlined dtor.
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    //      METHOD NAME : TmpPath::operator const void *
+    //      METHOD TYPE :
+    //
+    TmpPath::operator bool() const
+    {
+      return _impl.get();
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpPath::path
+    // METHOD TYPE : Pathname
+    //
+    Pathname
+    TmpPath::path() const
+    {
+      return _impl.get() ? _impl->path() : Pathname();
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpPath::defaultLocation
+    // METHOD TYPE : const Pathname &
+    //
+    const Pathname &
+    TmpPath::defaultLocation()
+    {
+      static Pathname p( getenv("ZYPPTMPDIR") ? getenv("ZYPPTMPDIR") : "/var/tmp" );
+      return p;
+    }
+
+    bool TmpPath::autoCleanup() const
+    { return _impl.get() ? _impl->autoCleanup() : false; }
+
+    void TmpPath::autoCleanup( bool yesno_r )
+    { if ( _impl.get() ) _impl->autoCleanup( yesno_r ); }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : TmpFile
+    //
+    ///////////////////////////////////////////////////////////////////
+
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpFile::TmpFile
+    // METHOD TYPE : Constructor
+    //
+    TmpFile::TmpFile( const Pathname & inParentDir_r,
+                      const std::string & prefix_r )
+    {
+      // parent dir must exist
+      if ( filesystem::assert_dir( inParentDir_r ) != 0 )
+      {
+        ERR << "Parent directory '" << inParentDir_r << "' can't be created." << endl;
+        return;
+      }
+
+      // create the temp file
+      Pathname tmpPath = (inParentDir_r + prefix_r).extend( "XXXXXX");
+      char * buf = ::strdup( tmpPath.asString().c_str() );
+      if ( ! buf )
+        {
+          ERR << "Out of memory" << endl;
+          return;
+        }
+
+      int tmpFd = ::mkostemp( buf, O_CLOEXEC );
+      if ( tmpFd != -1 )
+        {
+          // success; create _impl
+          ::close( tmpFd );
+          _impl = RW_pointer<Impl>( new Impl( buf ) );
+        }
+      else
+        ERR << "Cant create '" << buf << "' " << ::strerror( errno ) << endl;
+
+      ::free( buf );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpFile::makeSibling
+    // METHOD TYPE : TmpFile
+    //
+    TmpFile TmpFile::makeSibling( const Pathname & sibling_r )
+    {
+      TmpFile ret( sibling_r.dirname(), sibling_r.basename() );
+      // clone mode if sibling_r exists
+      PathInfo p( sibling_r );
+      if ( p.isFile() )
+      {
+        ::chmod( ret.path().c_str(), p.st_mode() );
+      }
+      return ret;
+    }
+
+    ManagedFile TmpFile::asManagedFile()
+    {
+      filesystem::TmpFile tmpFile;
+      ManagedFile mFile ( tmpFile.path(), filesystem::unlink );
+      tmpFile.autoCleanup(false); //cleaned up by ManagedFile
+      return mFile;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpFile::defaultPrefix
+    // METHOD TYPE : const std::string &
+    //
+    const std::string &
+    TmpFile::defaultPrefix()
+    {
+      static std::string p( "TmpFile." );
+      return p;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : TmpDir
+    //
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpDir::TmpDir
+    // METHOD TYPE : Constructor
+    //
+    TmpDir::TmpDir( const Pathname & inParentDir_r,
+                    const std::string & prefix_r )
+    {
+      // parent dir must exist
+      if ( filesystem::assert_dir( inParentDir_r ) != 0  )
+      {
+        ERR << "Parent directory '" << inParentDir_r << "' can't be created." << endl;
+        return;
+      }
+
+      // create the temp dir
+      Pathname tmpPath = (inParentDir_r + prefix_r).extend( "XXXXXX");
+      char * buf = ::strdup( tmpPath.asString().c_str() );
+      if ( ! buf )
+        {
+          ERR << "Out of memory" << endl;
+          return;
+        }
+
+      char * tmp = ::mkdtemp( buf );
+      if ( tmp )
+        // success; create _impl
+        _impl = RW_pointer<Impl>( new Impl( tmp ) );
+      else
+        ERR << "Cant create '" << tmpPath << "' " << ::strerror( errno ) << endl;
+
+      ::free( buf );
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpDir::makeSibling
+    // METHOD TYPE : TmpDir
+    //
+    TmpDir TmpDir::makeSibling( const Pathname & sibling_r )
+    {
+      TmpDir ret( sibling_r.dirname(), sibling_r.basename() );
+      // clone mode if sibling_r exists
+      PathInfo p( sibling_r );
+      if ( p.isDir() )
+      {
+        ::chmod( ret.path().c_str(), p.st_mode() );
+      }
+      return ret;
+    }
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // METHOD NAME : TmpDir::defaultPrefix
+    // METHOD TYPE : const std::string &
+    //
+    const std::string &
+    TmpDir::defaultPrefix()
+    {
+      static std::string p( "TmpDir." );
+      return p;
+    }
+
+  } // namespace filesystem
+} // namespace zypp
diff --git a/zypp-core/fs/TmpPath.h b/zypp-core/fs/TmpPath.h
new file mode 100644 (file)
index 0000000..3effb50
--- /dev/null
@@ -0,0 +1,212 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp-core/fs/TmpPath.h
+ *
+*/
+#ifndef ZYPP_CORE_FS_TMPPATH_H
+#define ZYPP_CORE_FS_TMPPATH_H
+
+#include <iosfwd>
+
+#include <zypp-core/Pathname.h>
+#include <zypp-core/base/PtrTypes.h>
+#include <zypp-core/ManagedFile.h>
+
+namespace zypp {
+  namespace filesystem {
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : TmpPath
+    /**
+     * @short Automaticaly deletes files or directories when no longer needed.
+     *
+     * TmpPath is constructed from a Pathname. Multiple TmpPath instances
+     * created by copy and assign, share the same reference counted internal
+     * repesentation.
+     *
+     * When the last reference drops any file or directory located at the path
+     * passed to the ctor is deleted (recursivly in case of directories). This
+     * behavior can be canged by calling \ref autoCleanup.
+     *
+     * Principally serves as base class, but standalone usable.
+     **/
+    class TmpPath
+    {
+      public:
+        /**
+         * Default Ctor. An empty Pathname.
+         **/
+        TmpPath();
+
+        /**
+         * Ctor. Takes a Pathname.
+         **/
+        explicit
+        TmpPath( const Pathname & tmpPath_r );
+
+        /**
+         * Dtor.
+         **/
+        virtual
+        ~TmpPath();
+
+        /**
+         * Test whether the Pathname is valid (i.e. not empty. NOT whether
+         * it really denotes an existing file or directory).
+         **/
+        explicit operator bool() const;
+
+        /**
+         * @return The Pathname.
+         **/
+        Pathname
+        path() const;
+
+        /**
+         * Type conversion to Pathname.
+         **/
+        operator Pathname() const
+        { return path(); }
+
+        /**
+        * Whether path is valid and deleted when the last reference drops.
+        */
+        bool autoCleanup() const;
+
+        /**
+        * Turn \ref autoCleanup on/off if path is valid.
+        */
+       void autoCleanup( bool yesno_r );
+
+      public:
+        /**
+         * @return The default directory where temporary
+         * files should be are created (/var/tmp).
+         **/
+        static const Pathname &
+        defaultLocation();
+
+      protected:
+        class Impl;
+        RW_pointer<Impl> _impl;
+
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    /**
+     * Stream output as pathname.
+     **/
+    inline std::ostream &
+    operator<<( std::ostream & str, const TmpPath & obj )
+    { return str << static_cast<Pathname>(obj); }
+
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : TmpFile
+    /**
+     * @short Provide a new empty temporary file and delete it when no
+     * longer needed.
+     *
+     * The temporary file is per default created in '/var/tmp' and named
+     * 'TmpFile.XXXXXX', with XXXXXX replaced by a string which makes the
+     * name unique. Different location and file prefix may be passed to
+     * the ctor. TmpFile is created with mode 0600.
+     *
+     * TmpFile provides the Pathname of the temporary file, or an empty
+     * path in case of any error.
+     **/
+    class TmpFile : public TmpPath
+    {
+      public:
+        /**
+         * Ctor. Takes a Pathname.
+         **/
+        explicit
+        TmpFile( const Pathname & inParentDir_r = defaultLocation(),
+                 const std::string & prefix_r = defaultPrefix() );
+
+        /** Provide a new empty temporary directory as sibling.
+         * \code
+         *   TmpFile s = makeSibling( "/var/lib/myfile" );
+         *   // returns: /var/lib/myfile.XXXXXX
+         * \endcode
+         * If \c sibling_r exists, sibling is created using the same mode.
+         */
+        static TmpFile makeSibling( const Pathname & sibling_r );
+
+        /**
+         * Create a temporary file and convert it to a automatically
+         * cleaned up ManagedFile
+         */
+        static ManagedFile asManagedFile ();
+
+      public:
+        /**
+         * @return The default prefix for temporary files (TmpFile.)
+         **/
+        static const std::string &
+        defaultPrefix();
+
+    };
+    ///////////////////////////////////////////////////////////////////
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : TmpDir
+    /**
+     * @short Provide a new empty temporary directory and recursively
+     * delete it when no longer needed.
+     *
+     * The temporary directory is per default created in '/var/tmp' and
+     * named 'TmpDir.XXXXXX', with XXXXXX replaced by a string which makes
+     * the  name unique. Different location and file prefix may be passed
+     * to the ctor. TmpDir is created with mode 0700.
+     *
+     * TmpDir provides the Pathname of the temporary directory , or an empty
+     * path in case of any error.
+     **/
+    class TmpDir : public TmpPath
+    {
+      public:
+        /**
+         * Ctor. Takes a Pathname.
+         **/
+        explicit
+        TmpDir( const Pathname & inParentDir_r = defaultLocation(),
+                const std::string & prefix_r = defaultPrefix() );
+
+        /** Provide a new empty temporary directory as sibling.
+         * \code
+         *   TmpDir s = makeSibling( "/var/lib/mydir" );
+         *   // returns: /var/lib/mydir.XXXXXX
+         * \endcode
+         * If \c sibling_r exists, sibling is created using the same mode.
+         */
+        static TmpDir makeSibling( const Pathname & sibling_r );
+
+      public:
+        /**
+         * @return The default prefix for temporary directories (TmpDir.)
+         **/
+        static const std::string &
+        defaultPrefix();
+    };
+    ///////////////////////////////////////////////////////////////////
+
+  } // namespace filesystem
+
+  /** Global access to the zypp.TMPDIR (created on demand, deleted when libzypp is unloaded) */
+  Pathname myTmpDir(); // implemented in ZYppImpl.cc
+
+} // namespace zypp
+
+#endif // ZYPP_CORE_FS_TMPPATH_H
similarity index 98%
rename from zypp/parser/xml/XmlEscape.cc
rename to zypp-core/parser/xml/XmlEscape.cc
index 06d3e4f..f3a0435 100644 (file)
@@ -11,7 +11,7 @@
 */
 
 #include <string>
-#include <zypp/parser/xml/XmlEscape.h>
+#include <zypp-core/parser/xml/XmlEscape.h>
 
 /*
 IoBind Library License:
diff --git a/zypp-core/parser/xml/XmlEscape.h b/zypp-core/parser/xml/XmlEscape.h
new file mode 100644 (file)
index 0000000..67ce821
--- /dev/null
@@ -0,0 +1,61 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file zypp/parser/xml/XmlEscape.h
+ *
+*/
+#ifndef ZYPP_PARSER_XML_XMLESCAPE_H
+#define ZYPP_PARSER_XML_XMLESCAPE_H
+
+#include <sstream>
+#include <string>
+#include <zypp-core/Globals.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{
+  ///////////////////////////////////////////////////////////////////
+  namespace xml
+  {
+    ///////////////////////////////////////////////////////////////////
+    namespace detail
+    {
+      struct EscapedString
+      {
+       EscapedString( const std::string & in_r ) : _in( in_r ) {}
+       std::ostream & dumpOn( std::ostream & str ) const;
+       std::string asString() const
+       { std::ostringstream str; dumpOn( str ); return str.str(); }
+       operator std::string() const
+       { return asString(); }
+      private:
+       const std::string & _in;
+      };
+
+      /** \relates EscapedString Stream output */
+      inline std::ostream & operator<<( std::ostream & str, const EscapedString & obj )
+      { return obj.dumpOn( str ); }
+
+    } // detail
+    ///////////////////////////////////////////////////////////////////
+
+    /** Escape xml special charaters (<tt>& -> &amp;</tt>; from IoBind library).
+     * The \ref detail::EscapedString can be dumped to an ostream and implicitly
+     * converts into a std::string.
+     */
+    inline detail::EscapedString escape( const std::string & in_r )
+    { return detail::EscapedString( in_r ); }
+
+    /** Unescape xml special charaters (<tt>&amp; -> &</tt>; from IoBind library) */
+    ZYPP_API std::string unescape( const std::string & in_r );
+
+  } // namespace xml
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_PARSER_XML_XMLESCAPE_H
diff --git a/zypp-core/proto/CMakeLists.txt b/zypp-core/proto/CMakeLists.txt
new file mode 100644 (file)
index 0000000..4616ff8
--- /dev/null
@@ -0,0 +1,6 @@
+SET( zypp_core_PROTOBUF_SOURCES
+)
+
+protobuf_generate_cpp(ZYPPCORE_PROTO_SRCS ZYPPCORE_PROTO_HDRS ${zypp_core_PROTOBUF_SOURCES})
+
+
similarity index 99%
rename from zypp/url/UrlBase.cc
rename to zypp-core/url/UrlBase.cc
index 4c00e80..29c9152 100644 (file)
@@ -9,11 +9,11 @@
 /**
  * \file zypp/url/UrlBase.cc
  */
-#include <zypp/url/UrlBase.h>
-#include <zypp/base/String.h>
-#include <zypp/base/Gettext.h>
-#include <zypp/base/Regex.h>
-#include <zypp/base/StringV.h>
+#include <zypp-core/url/UrlBase.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/Gettext.h>
+#include <zypp-core/base/Regex.h>
+#include <zypp-core/base/StringV.h>
 
 #include <stdexcept>
 #include <climits>
diff --git a/zypp-core/url/UrlBase.h b/zypp-core/url/UrlBase.h
new file mode 100644 (file)
index 0000000..e31ee19
--- /dev/null
@@ -0,0 +1,1103 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/**
+ * \file zypp/url/UrlBase.h
+ */
+#ifndef   ZYPP_URL_URLBASE_H
+#define   ZYPP_URL_URLBASE_H
+
+#include <zypp-core/url/UrlUtils.h>
+#include <zypp-core/base/PtrTypes.h>
+
+
+//////////////////////////////////////////////////////////////////////
+namespace zypp
+{ ////////////////////////////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////////////////////
+  namespace url
+  { //////////////////////////////////////////////////////////////////
+
+
+    // ---------------------------------------------------------------
+    /**
+     * Url::asString() view options.
+     *
+     * A instance of this class represents a bit-wise combination
+     * of view option constants.
+     *
+     * It provides ViewOption::operator+() and ViewOption::operator-()
+     * to modify a view option combination and a ViewOption::has()
+     * method, to check if a specified option is enabled or not.
+     */
+    struct ViewOption
+    {
+      /** @{ */
+      /**
+       * Option to include scheme name in the URL string.
+       *
+       * Disabling this option causes, that the URL string
+       * contains the path, query and fragment components
+       * only, for example just "/foo/bar.txt".
+       *
+       * This option is \b enabled by default.
+       */
+      static const ViewOption WITH_SCHEME;
+      /**
+       * Option to include username in the URL string.
+       *
+       * This option depends on a enabled WITH_SCHEME and
+       * WITH_HOST options and is \b enabled by default.
+       */
+      static const ViewOption WITH_USERNAME;
+      /**
+       * Option to include password in the URL string.
+       *
+       * This option depends on a enabled WITH_SCHEME,
+       * WITH_HOST and WITH_USERNAME options and is
+       * \b disabled by default, causing to hide the
+       * password in the URL authority.
+       */
+      static const ViewOption WITH_PASSWORD;
+      /**
+       * Option to include hostname in the URL string.
+       *
+       * This option depends on a enabled WITH_SCHEME
+       * option and is \b enabled by default.
+       */
+      static const ViewOption WITH_HOST;
+      /**
+       * Option to include port number in the URL string.
+       *
+       * This option depends on a enabled WITH_SCHEME and
+       * WITH_HOST options and is \b enabled by default.
+       */
+      static const ViewOption WITH_PORT;
+      /**
+       * Option to include path name in the URL string.
+       *
+       * This option is \b enabled by default.
+       */
+      static const ViewOption WITH_PATH_NAME;
+      /**
+       * Option to include path parameters in the URL string.
+       *
+       * This option depends on a enabled WITH_PATH_NAME
+       * option and is \b disabled by default, causing to
+       * hide the path parameters.
+       */
+      static const ViewOption WITH_PATH_PARAMS;
+      /**
+       * Option to include query string in the URL string.
+       *
+       * This option is \b enabled by default.
+       */
+      static const ViewOption WITH_QUERY_STR;
+      /**
+       * Option to include fragment string in the URL string.
+       *
+       * This option is \b enabled by default.
+       */
+      static const ViewOption WITH_FRAGMENT;
+      /** @} */
+
+      /** @{ */
+      /**
+       * Explicitely include the URL authority separator "//".
+       *
+       * It causes, that the URL string includes an empty URL
+       * authority, for example:
+       * "file:///foo.txt" instead of just "file:/foo.txt".
+       *
+       * This option depends on a enabled WITH_SCHEME view
+       * option and is enabled by default.
+       */
+      static const ViewOption EMPTY_AUTHORITY;
+      /**
+       * Explicitely include the "/" path character.
+       *
+       * It causes, that a "/" is added to the Url if the path
+       * name is empty, for example:
+       *
+       * "http://localhost/" instead of just "http://localhost".
+       *
+       * This option depends on a enabled WITH_PATH_NAME view
+       * option and is enabled by default.
+       */
+      static const ViewOption EMPTY_PATH_NAME;
+      /**
+       * Explicitely include the path parameters separator ";".
+       *
+       * It causes, that the URL allways contains the ";" path
+       * parameters separator.
+       *
+       * This option depends on a enabled EMPTY_PATH_NAME view
+       * option and is disabled by default.
+       */
+      static const ViewOption EMPTY_PATH_PARAMS;
+      /**
+       * Explicitely include the query string separator "?".
+       *
+       * It causes, that if the query string is requested using
+       * the WITH_QUERY_STR option, the URL allways contains the
+       * "?" query string separator, even if the query string is
+       * empty.
+       * This option depends on a enabled WITH_QUERY_STR view
+       * option and is disabled by default.
+       */
+      static const ViewOption EMPTY_QUERY_STR;
+      /**
+       * Explicitely include the fragment string separator "#".
+       *
+       * It causes, that if the fragment string is requested using
+       * the WITH_FRAGMENT option, the URL allways contains the "#"
+       * fragment string separator, even if the fragment string is
+       * empty. 
+       * This option depends on a enabled WITH_FRAGMENT view
+       * option and is disabled by default.
+       */
+      static const ViewOption EMPTY_FRAGMENT;
+      /** @} */
+
+      /** @{ */
+      /**
+       * Default combination of view options.
+       *
+       * By default, following view options are enabled:
+       *   WITH_SCHEME,    WITH_USERNAME,    WITH_HOST,
+       *   WITH_PORT,      WITH_PATH_NAME,   WITH_QUERY_STR,
+       *   WITH_FRAGMENT,  EMPTY_AUTHORITY,  EMPTY_PATH_NAME.
+       */
+      static const ViewOption DEFAULTS;
+      /** @} */
+
+
+      /**
+       * Create instance with default combination of view options.
+       */
+      ViewOption();
+
+
+      /**
+       * Adds \p l and \p r to a new option combination.
+       *
+       * @return The new option combination.
+       */
+      friend inline ViewOption
+      operator + (const ViewOption &l, const ViewOption &r)
+      {
+        return ViewOption(l.opt |  r.opt);
+      }
+
+      /**
+       * Substract \p r from \p l to a new option combination.
+       *
+       * @return The new option combination.
+       */
+      friend inline ViewOption
+      operator - (const ViewOption &l, const ViewOption &r)
+      {
+        return ViewOption(l.opt & ~r.opt);
+      }
+
+      /**
+       * Assign specified option combination \p o to the current object.
+       *
+       * \param o   The option or option combination to make a copy of.
+       * \return A reference to this option combination.
+       */
+      inline ViewOption &
+      operator = (const ViewOption &o)
+      {
+        opt = o.opt; return *this;
+      }
+
+      /**
+       * Check if specified option \p o is set in the current object.
+       * \param o    A view option constant.
+       * \return True, if specified option \p o is
+       *               set/enabled in the instance.
+       */
+      inline bool
+      has(const ViewOption &o) const
+      {
+        return o.opt & opt;
+      }
+
+      static const ViewOption hotfix1050625;
+    private:
+      ViewOption(int option);
+      int opt;
+    };
+
+
+    // ---------------------------------------------------------------
+    /**
+     * ViewOptions is just an alias for ViewOption.
+     */
+    typedef ViewOption                           ViewOptions;
+
+
+    // ---------------------------------------------------------------
+    /**
+     * Vector of URL scheme names.
+     */
+    typedef std::vector<std::string>             UrlSchemes;
+
+
+    // ---------------------------------------------------------------
+    /**
+     * Forward declaration of internal UrlBase data.
+     */
+    class UrlBaseData;
+
+
+    // ---------------------------------------------------------------
+    /**
+     * \brief Generic Url base class.
+     *
+     * The UrlBase class implements default behaviour for URL
+     * manipulations and a base for implementation of scheme-
+     * specialized URLs for the Url class.
+     *
+     */
+    class UrlBase
+    {
+    public:
+
+      virtual
+      ~UrlBase();
+
+      UrlBase();
+
+      /**
+       * Create a new Url object as copy of the given one.
+       * \param url The Url object to make a copy of.
+       */
+      UrlBase(const UrlBase &url);
+
+      /**
+       * \brief Construct new object and initializes it with
+       *        specified URL components.
+       *
+       * \param scheme    The scheme name.
+       * \param authority The encoded authority component data.
+       * \param pathdata  The encoded path component data.
+       * \param querystr  The encoded query string component.
+       * \param fragment  The encoded fragment string component.
+       * \throws UrlNotAllowedException if one of the components
+       *         is not allowed for the scheme.
+       * \throws UrlBadComponentException if one of the components
+       *         contains an invalid character.
+       */
+      UrlBase(const std::string &scheme,
+              const std::string &authority,
+              const std::string &pathdata,
+              const std::string &querystr,
+              const std::string &fragment);
+
+
+      // -----------------
+      /**
+       * \brief Clears all data in the object.
+       */
+      virtual void
+      clear();
+
+      /**
+       * Returns pointer to a copy of the current object.
+       *
+       * Should be reimplemented by all derived object using
+       * the copy constructor of the derived class, e.g.:
+       * \code
+       *   return new MyUrlDerivedFromUrlBase(*this);
+       * \endcode
+       *
+       * \return A pointer to a copy of the current object.
+       */
+      virtual UrlBase *
+      clone() const;
+
+      /**
+       * \brief Initializes current object with new URL components.
+       *
+       * \param scheme    The scheme name.
+       * \param authority The encoded authority component data.
+       * \param pathdata  The encoded path component data.
+       * \param querystr  The encoded query string component.
+       * \param fragment  The encoded fragment string component.
+       * \throws UrlNotAllowedException if one of the components
+       *         is not allowed in the scheme.
+       * \throws UrlBadComponentException if one of the components
+       *         contains an invalid character.
+       */
+      virtual void
+      init(const std::string &scheme,
+           const std::string &authority,
+           const std::string &pathdata,
+           const std::string &querystr,
+           const std::string &fragment);
+
+
+      // -----------------
+      /**
+       * \brief Returns scheme names known by this object.
+       *
+       * This method is used in the isValidScheme() method and
+       * is intended to be reimplemented by derived classes to
+       * return the scheme names it implements (is restricted
+       * or compatible to).
+       *
+       * For example, if your derived class implements special
+       * features of LDAP URLs, this method may return "ldap"
+       * and "ldaps" scheme names.
+       *
+       * The UrlBase class returns an empty vector, that signals
+       * that it is useable with all URLs.
+       *
+       * \return A vector with scheme names known by this object.
+       */
+      virtual UrlSchemes
+      getKnownSchemes() const;
+
+      /**
+       * \brief Returns if scheme name is known to this object.
+       * \return True, if scheme name is known to this object.
+       */
+      virtual bool
+      isKnownScheme(const std::string &scheme) const;
+
+
+      /**
+       * \brief Verifies specified scheme name.
+       *
+       * Verifies the generic syntax of the specified \p scheme name
+       * and if it is contained in the current object's list of known
+       * schemes (see getKnownSchemes()) if the list is not empty (as
+       * in the UrlBase class).
+       *
+       * \param  scheme The scheme name to verify.
+       * \return True, if generic scheme name syntax is valid and
+       *         the scheme name is known to the current object.
+       */
+      virtual bool
+      isValidScheme(const std::string &scheme) const;
+
+      /**
+       * \brief Verifies the Url.
+       *
+       * Verifies if the current object contains a non-empty scheme
+       * name. Additional semantical URL checks may be performed by
+       * derived UrlBase-objects.
+       *
+       * \return True, if the Url seems to be valid.
+       */
+      virtual bool
+      isValid() const;
+
+
+      // -----------------
+      /**
+       * Returns a default string representation of the Url object.
+       *
+       * By default, a password in the URL will be hidden.
+       *
+       * \return A default string representation of the Url object.
+       */
+      virtual std::string
+      asString() const;
+
+      /**
+       * Returns a string representation of the Url object.
+       *
+       * To include a password in the resulting Url string, use:
+       * \code
+       *    url.asString(url.getViewOptions() +
+       *                 url::ViewOptions::WITH_PASSWORD);
+       * \endcode
+       *
+       * \param opts  A combination of view options.
+       * \return A string representation of the Url object. 
+       */
+      virtual std::string
+      asString(const zypp::url::ViewOptions &opts) const;
+
+
+      // -----------------
+      /**
+       * Returns the scheme name of the URL.
+       * \return Scheme name of the current Url object.
+       */
+      virtual std::string
+      getScheme() const;
+
+
+      // -----------------
+      /**
+       * Returns the encoded authority component of the URL.
+       *
+       * The returned authority string does not contain the leading
+       * "//" separator characters, but just its "user:pass@host:port"
+       * content only.
+       *
+       * \return The encoded authority component string.
+       */
+      virtual std::string
+      getAuthority() const;
+
+      /**
+       * Returns the username from the URL authority.
+       * \param eflag Flag if the usename should be percent-decoded or not.
+       * \return The username sub-component from the URL authority.
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual std::string
+      getUsername(EEncoding eflag) const;
+
+      /**
+       * Returns the password from the URL authority.
+       * \param eflag Flag if the password should be percent-decoded or not.
+       * \return The password sub-component from the URL authority.
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual std::string
+      getPassword(EEncoding eflag) const;
+
+      /**
+       * Returns the hostname or IP from the URL authority.
+       *
+       * In case the Url contains an IPv6 number, it is be surrounded
+       * by "[" and "]" characters, for example "[::1]" for an IPv6
+       * localhost address.
+       *
+       * \param eflag Flag if the host should be percent-decoded or not.
+       * \return The host sub-component from the URL authority.
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual std::string
+      getHost(EEncoding eflag) const;
+
+      /**
+       * Returns the port number from the URL authority.
+       * \return The port sub-component from the URL authority.
+       */
+      virtual std::string
+      getPort() const;
+
+
+      // -----------------
+      /**
+       * Returns the encoded path component of the URL.
+       *
+       * The path data contains the path name, optionally
+       * followed by path parameters separated with a ";"
+       * character, for example "/foo/bar;version=1.1".
+       *
+       * \return The encoded path component of the URL.
+       */
+      virtual std::string
+      getPathData() const;
+
+      /**
+       * Returns the path name from the URL.
+       * \param eflag Flag if the path should be decoded or not.
+       * \return The path name sub-component without path parameters
+       *         from path data component of the URL.
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual std::string
+      getPathName(EEncoding eflag) const;
+
+      /**
+       * Returns the encoded path parameters from the URL.
+       * \return The encoded path parameters from the URL.
+       */
+      virtual std::string
+      getPathParams() const;
+
+      /**
+       * Returns a vector with encoded path parameter substrings.
+       *
+       * The default path parameter separator is the \c ',' character.
+       * A schema specific object may overide the default separators.
+       *
+       * For example, the path parameters string "foo=1,bar=2" is splited
+       * by default into a vector containing the substrings "foo=1" and
+       * "bar=2".
+       *
+       * \return The encoded path parameters vector.
+       */
+      virtual zypp::url::ParamVec
+      getPathParamsVec() const;
+
+      /**
+       * Returns a string map with path parameter keys and values.
+       *
+       * The default path parameter separator is the \c ',' character,
+       * the default key/value separator for the path parameters is
+       * the \c '=' character.
+       * A schema specific object may overide the default separators.
+       *
+       * For example, the path parameters string "foo=1,bar=2" is splited
+       * into a map containing "foo" = "1" and "bar" = "2" by default.
+       *
+       * \param eflag Flag if the path parameter keys and values should
+       *               be decoded or not.
+       * \return The path parameters key and values as a string map.
+       * \throws UrlNotSupportedException if parameter parsing
+       *         is not supported for a URL (scheme).
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual zypp::url::ParamMap
+      getPathParamsMap(EEncoding eflag) const;
+
+      /**
+       * Return the value for the specified path parameter.
+       *
+       * For example, if the path parameters string is "foo=1,bar=2"
+       * the method will return the substring "1" for the param key
+       * "foo" and "2" for the param key "bar".
+       *
+       * \param param The path parameter key.
+       * \param eflag Flag if the path parameter keys and values should
+       *              be decoded or not.
+       * \return The value for the path parameter key or empty string.
+       * \throws UrlNotSupportedException if parameter parsing
+       *         is not supported for a URL (scheme).
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual std::string
+      getPathParam(const std::string &param, EEncoding eflag) const;
+
+
+      // -----------------
+      /**
+       * Returns the encoded query string component of the URL.
+       *
+       * The query string is returned without first "?" (separator)
+       * character. Further "?" characters as in e.g. LDAP URLs
+       * remains in the returned string.
+       *
+       * \return The encoded query string component of the URL.
+       */
+      virtual std::string
+      getQueryString() const;
+
+      /** \overload Returns the safe query string (passwds stripped) unless WITH_PASSWORD is set. */
+      virtual std::string
+      getQueryString( const ViewOptions & viewopts_r ) const;
+
+      /**
+       * Returns a vector with query string parameter substrings.
+       *
+       * The default query string parameter separator is the \c '&'
+       * character.
+       * A schema specific object may overide the default separators.
+       *
+       * For example, the query string "foo=1&bar=2" is splited by
+       * default into a vector containing the substrings "foo=1" and
+       * "bar=2".
+       *
+       * \return The query string splited into a vector of substrings.
+       */
+      virtual zypp::url::ParamVec
+      getQueryStringVec() const;
+
+      /**
+       * Returns a string map with query parameter and their values.
+       *
+       * The default query string parameter separator is the \c ','
+       * character, the default key/value separator the \c '=' character.
+       * A schema specific object may overide the default separators.
+       *
+       * For example, the query string "foo=1&bar=2" is splited by
+       * default into a map containing "foo" = "1" and "bar" = "2".
+       *
+       * \param eflag Flag if the query string keys and values should
+       *               be decoded or not.
+       * \return The query string as a key/value string map.
+       * \throws UrlNotSupportedException if parameter parsing
+       *         is not supported for a URL (scheme).
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual zypp::url::ParamMap
+      getQueryStringMap(EEncoding eflag) const;
+
+      /**
+       * Return the value for the specified query parameter.
+       *
+       * For example, if the query string is "foo=1,bar=2" the method
+       * will return the substring "1" for the param key "foo" and
+       * "2" for the param key "bar".
+       *
+       * \param param The query parameter key.
+       * \param eflag Flag if the query parameter keys and values should
+       *              be decoded or not.
+       * \return The value for the query parameter key or empty string.
+       * \throws UrlNotSupportedException if parameter parsing
+       *         is not supported for a URL (scheme).
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual std::string
+      getQueryParam(const std::string &param, EEncoding eflag) const;
+
+
+      // -----------------
+      /**
+       * Returns the encoded fragment component of the URL.
+       * \param eflag Flag if the fragment should be percent-decoded or not.
+       * \return The encoded fragment component of the URL.
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual std::string
+      getFragment(EEncoding eflag) const;
+
+
+      // -----------------
+      /**
+       * \brief Set the scheme name in the URL.
+       * \param scheme The new scheme name.
+       * \throws UrlBadComponentException if the \p scheme
+       *         contains an invalid character or is empty.
+       */
+      virtual void
+      setScheme(const std::string &scheme);
+
+
+      // -----------------
+      /**
+       * \brief Set the authority component in the URL.
+       *
+       * The \p authority string shoud not contain any leading
+       * "//" separator characters (just "user:pass@host:port").
+       *
+       * \param authority The authority component string.
+       * \throws UrlNotAllowedException if the \p authority
+       *         has to be empty in for the current scheme.
+       * \throws UrlBadComponentException if the \p authority
+       *         contains an invalid character.
+       * \throws UrlParsingException if \p authority parsing fails.
+       */
+      virtual void
+      setAuthority(const std::string &authority);
+
+      /**
+       * \brief Set the username in the URL authority.
+       * \param user  The new username.
+       * \param eflag If the \p username is encoded or not.
+       * \throws UrlNotAllowedException if the \p user
+       *         has to be empty in for the current scheme.
+       * \throws UrlBadComponentException if the \p user
+       *         contains an invalid character.
+       */
+      virtual void
+      setUsername(const std::string &user,
+                  EEncoding         eflag);
+
+      /**
+       * \brief Set the password in the URL authority.
+       * \param pass  The new password.
+       * \param eflag If the \p password is encoded or not.
+       * \throws UrlNotAllowedException if the \p pass
+       *         has to be empty in for the current scheme.
+       * \throws UrlBadComponentException if the \p pass
+       *         contains an invalid character.
+       */
+      virtual void
+      setPassword(const std::string &pass,
+                  EEncoding         eflag);
+
+      /**
+       * \brief Set the hostname or IP in the URL authority.
+       *
+       * The \p host parameter may contain a hostname, an IPv4 address
+       * in dotted-decimal form or an IPv6 address literal encapsulated
+       * within square brackets (RFC3513, Sect. 2.2).
+       *
+       * A hostname may contain national alphanumeric UTF8 characters
+       * (letters other than ASCII a-zA-Z), that will be encoded.
+       * This function allows to specify both, a encoded or decoded
+       * hostname.
+       *
+       * Other IP literals in "[v ... ]" square bracket format are not
+       * supported by the implementation in UrlBase class.
+       *
+       * \param host The new hostname or IP address.
+       * \throws UrlNotAllowedException if the \p host
+       *         has to be empty in for the current scheme.
+       * \throws UrlBadComponentException if the \p host is invalid.
+       */
+      virtual void
+      setHost(const std::string &host);
+
+      /**
+       * \brief Set the port number in the URL authority.
+       * \param port The new port number.
+       * \throws UrlNotAllowedException if the \p port
+       *         has to be empty in for the current scheme.
+       * \throws UrlBadComponentException if the \p port is invalid.
+       */
+      virtual void
+      setPort(const std::string &port);
+
+
+      // -----------------
+      /**
+       * \brief Set the path data component in the URL.
+       *
+       * By default, the \p pathdata string may include path
+       * parameters separated by the ";" separator character.
+       *
+       * \param pathdata The encoded path data component string.
+       * \throws UrlBadComponentException if the \p pathdata
+       *         contains an invalid character.
+       */
+      virtual void
+      setPathData(const std::string &pathdata);
+
+      /**
+       * \brief Set the path name.
+       * \param path  The new path name.
+       * \param eflag If the \p path name is encoded or not.
+       * \throws UrlBadComponentException if the \p path name
+       *         contains an invalid character.
+       */
+      virtual void
+      setPathName(const std::string &path,
+                  EEncoding         eflag);
+
+      /**
+       * \brief Set the path parameters.
+       * \param params The new encoded path parameter string.
+       * \throws UrlBadComponentException if the path \p params
+       *         contains an invalid character.
+       */
+      virtual void
+      setPathParams(const std::string &params);
+
+      /**
+       * \brief Set the path parameters.
+       * \param pvec The vector with encoded path parameters.
+       * \throws UrlBadComponentException if the \p pvec
+       *         contains an invalid character.
+       */
+      virtual void
+      setPathParamsVec(const zypp::url::ParamVec &pvec);
+
+      /**
+       * \brief Set the path parameters.
+       * \param pmap The map with decoded path parameters.
+       * \throws UrlNotSupportedException if parameter parsing
+       *         is not supported for a URL (scheme).
+       */
+      virtual void
+      setPathParamsMap(const zypp::url::ParamMap &pmap);
+
+      /**
+       * \brief Set or add value for the specified path parameter.
+       * \param param The decoded path parameter name.
+       * \param value The decoded path parameter value.
+       * \throws UrlNotSupportedException if parameter parsing
+       *         is not supported for a URL (scheme).
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual void
+      setPathParam(const std::string &param, const std::string &value);
+
+
+      // -----------------
+      /**
+       * \brief Set the query string in the URL.
+       *
+       * The \p querystr string parameter is supposed
+       * to not to contain the "?" URL query separator
+       * character (use just a "foo=bar&x=22" instead
+       * of "?foo=bar&x=22").
+       *
+       * \param querystr The new encoded query string.
+       * \throws UrlBadComponentException if the \p querystr
+       *         contains an invalid character.
+       */
+      virtual void
+      setQueryString(const std::string &querystr);
+
+      /**
+       * \brief Set the query parameters.
+       * \param qvec The vector with encoded query parameters.
+       * \throws UrlBadComponentException if the \p qvec
+       *         contains an invalid character.
+       */
+      virtual void
+      setQueryStringVec(const zypp::url::ParamVec &qvec);
+
+      /**
+       * \brief Set the query parameters.
+       * \param qmap The map with decoded query parameters.
+       * \throws UrlNotSupportedException if parameter parsing
+       *         is not supported for a URL (scheme).
+       */
+      virtual void
+      setQueryStringMap(const zypp::url::ParamMap &qmap);
+
+      /**
+       * \brief Set or add value for the specified query parameter.
+       * \param param The decoded query parameter name.
+       * \param value The decoded query parameter value.
+       * \throws UrlNotSupportedException if parameter parsing
+       *         is not supported for a URL (scheme).
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual void
+      setQueryParam(const std::string &param, const std::string &value);
+
+      /**
+       * \brief remove the specified query parameter.
+       * \param param The decoded query parameter name.
+       * \throws UrlNotSupportedException if parameter parsing
+       *         is not supported for a URL (scheme).
+       * \throws UrlDecodingException if the decoded result string
+       *         would contain a '\\0' character.
+       */
+      virtual void
+      delQueryParam(const std::string &param);
+
+
+      // -----------------
+      /**
+       * \brief Set the fragment string in the URL.
+       * \param fragment The new fragment string.
+       * \param eflag If the \p fragment is encoded or not.
+       * \throws UrlBadComponentException if the \p querystr
+       *         contains an invalid character.
+       */
+      virtual void
+      setFragment(const std::string &fragment,
+                  EEncoding         eflag);
+
+
+      // -----------------
+      /**
+       * Configures behaviour of the instance.
+       *
+       * This method is called in UrlBase constructors before
+       * any URL components are applied.
+       * Derived classes may reimplement this method to change
+       * the behaviour of the object.
+       * Use the config() methods to query and change them.
+       *
+       * The UrlBase class uses following config variables:
+       *
+       * - Common path parameter separators:
+       *   - \a \c sep_pathparams   \c ";"
+       *     Separator used to split path parameters from path name.
+       *     Setting it to empty string disables splitting of path
+       *     name and path parameters. Set also rx_pathparams to an
+       *     empty string.
+       *   - \a \c psep_pathparam   \c ","
+       *     Separator between path parameters.
+       *   - \a \c vsep_pathparam   \c "="
+       *     Separator between key and value of a path parameter.
+       *   .
+       * .
+       *
+       * - Common query string separators:
+       *   - \a \c psep_querystr    \c "&"
+       *     Separator between query string parameters.
+       *   - \a \c vsep_querystr    \c "="
+       *     Separator between key and value of a query parameter.
+       *   .
+       * .
+       *
+       * - Characters in URL components, that are safe without
+       *   URL percent-encoding (see zypp::url::encode()).
+       *   - \a safe_username
+       *   - \a safe_password
+       *   - \a safe_hostname
+       *   - \a safe_pathname
+       *   - \a safe_pathparams
+       *   - \a safe_querystr
+       *   - \a safe_fragment
+       *   .
+       * .
+       *
+       * - Regular expressions used to verify encoded URL
+       *   components and their sub-components:
+       *   - \a rx_username
+       *   - \a rx_password
+       *   - \a rx_pathname
+       *   - \a rx_pathparams
+       *   - \a rx_querystr
+       *   - \a rx_fragment
+       *   .
+       * .
+       */
+      virtual void
+      configure();
+
+
+      /**
+       * Get the value of a UrlBase configuration variable.
+       *
+       * See configure() method for names an purpose of the
+       * configuration variables used in UrlBase class.
+       *
+       * \param opt The name of the configuration variable.
+       * \return The value of the specified variable
+       *         or empty string.
+       */
+      std::string
+      config(const std::string &opt) const;
+
+      /**
+       * Set the value of a UrlBase configuration variable.
+       *
+       * See configure() method for names an purpose of the
+       * configuration variables used in UrlBase class.
+       *
+       * \param opt The name of the configuration variable.
+       * \param val The new value for the configuration variable.
+       */
+      void
+      config(const std::string &opt, const std::string &val);
+
+
+      /**
+       * Return the view options of the current object.
+       *
+       * This method is used to query the view options
+       * used by the asString() method.
+       *
+       * \return The current view option combination.
+       */
+      ViewOptions
+      getViewOptions() const;
+
+      /**
+       * Change the view options of the current object.
+       *
+       * This method is used to change the view options
+       * used by the asString() method.
+       *
+       * \param vopts New view options combination.
+       */
+      void
+      setViewOptions(const ViewOptions &vopts);
+
+      std::string asString1050625() const;
+    protected:
+      /**
+       * Utility method to cleanup an encoded path name.
+       *
+       * By default, this method makes sure, that the first slash
+       * in the path is not encoded, and that the second slash
+       * before the first path segment, is encoded (to "%2F").
+       * It modifies the path in the url, for example:
+       *   "ftp://host//aaa//bbb" to "ftp://host/%2Faaa//bbb"
+       * or as encoded path only also "%2f/name" to "/%2fname".
+       *
+       * This operation is required to fulfill the path-absolute
+       * rule of RFC3986, if there is no authority. It avoids the
+       * missinterpretation of the path as an authority separator.
+       *
+       * It is not required if there is an authority ("//" behind
+       * the "scheme:"), that is in the path-abempty rule, but it
+       * is used e.g. in ftp url's defined by RFC1738.
+       * 
+       * We apply this operation in both cases (for all paths),
+       * but if \p authority is true, the encoding of the second
+       * slash depends on the schema configuration (for ftp only).
+       *
+       * \param path      The encoded path name to cleanup.
+       * \param authority Whether the url contains authority or not.
+       * \return A modified encoded path.
+       */
+      virtual std::string
+      cleanupPathName(const std::string &path, bool authority) const;
+
+      /**
+       * Utility method to cleanup an encoded path name.
+       *
+       * This variant of the method checks if the host component
+       * in the url is empty or not to differentiate if there is
+       * an authority.
+       *
+       * \param path      The encoded path name to cleanup.
+       * \return A modified encoded path.
+       */
+      virtual std::string
+      cleanupPathName(const std::string &path) const;
+
+      /**
+       * \brief Verifies specified host or IP.
+       *
+       * It verifies, if the specified \p host parameter contains
+       * a hostname, an IPv4 address in dotted-decimal form or an
+       * IPv6 address literal encapsulated within square brackets
+       * (RFC3513, Sect. 2.2).
+       *
+       * A hostname in the \p host parameter, may contain national
+       * alphanumeric UTF8 characters (letters other than ASCII
+       * a-zA-Z) and allows to specify both, a encoded or decoded
+       * hostname.
+       *
+       * This function does not perform any hostname lookups and
+       * supports only IPv6 addresses in "[ ... ]" notation. The
+       * "[v ... ]" square bracket format is not supported by
+       * this implementation.
+       *
+       * \param  host  The host name or IP to verify.
+       * \return True, if host seems to be valid.
+       */
+      virtual bool
+      isValidHost(const std::string &host) const;
+
+      /**
+       * \brief Verifies specified port number.
+       *
+       * \param  port  The port number to verify.
+       * \return True, if port number is valid.
+       */
+      virtual bool
+      isValidPort(const std::string &port) const;
+
+    private:
+      UrlBaseData *m_data;
+    };
+
+
+    // ---------------------------------------------------------------
+    /**
+     * \brief Copy-On-Write Url reference.
+     */
+    typedef RWCOW_pointer<UrlBase>          UrlRef;
+
+
+    //////////////////////////////////////////////////////////////////
+  } // namespace url
+  ////////////////////////////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////////////////////
+} // namespace zypp
+//////////////////////////////////////////////////////////////////////
+
+#endif /* ZYPP_URL_URLBASE_H */
+/*
+** vim: set ts=2 sts=2 sw=2 ai et:
+*/
diff --git a/zypp-core/url/UrlException.h b/zypp-core/url/UrlException.h
new file mode 100644 (file)
index 0000000..d9a0340
--- /dev/null
@@ -0,0 +1,150 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/**
+ * \file zypp/url/UrlException.h
+ */
+#ifndef   ZYPP_URL_URLEXCEPTION_H
+#define   ZYPP_URL_URLEXCEPTION_H
+
+#include <zypp-core/base/Exception.h>
+
+
+//////////////////////////////////////////////////////////////////////
+namespace zypp
+{ ////////////////////////////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////////////////////
+  namespace url
+  { //////////////////////////////////////////////////////////////////
+
+
+    // ---------------------------------------------------------------
+    /**
+     * Base class for all URL exceptions.
+     */
+    class UrlException: public zypp::Exception
+    {
+    public:
+      UrlException()
+        : zypp::Exception("Url exception")
+      {}
+
+      UrlException(const std::string &msg)
+        : zypp::Exception(msg)
+      {}
+
+      virtual ~UrlException() throw() {};
+    };
+
+    // ---------------------------------------------------------------
+    /**
+     * Thrown if the encoded string contains a NUL byte (%00).
+     */
+    class UrlDecodingException: public UrlException
+    {
+    public:
+      UrlDecodingException()
+        : UrlException("Url NUL decoding exception")
+      {}
+
+      UrlDecodingException(const std::string &msg)
+        : UrlException(msg)
+      {}
+
+      virtual ~UrlDecodingException() throw() {};
+    };
+
+    // ---------------------------------------------------------------
+    /**
+     * Thrown if the url or a component can't be parsed at all.
+     */
+    class UrlParsingException: public UrlException
+    {
+    public:
+      UrlParsingException()
+        : UrlException("Url parsing failure exception")
+      {}
+
+      UrlParsingException(const std::string &msg)
+        : UrlException(msg)
+      {}
+
+      virtual ~UrlParsingException() throw() {};
+    };
+
+    // ---------------------------------------------------------------
+    /**
+     * Thrown if a url component is invalid.
+     */
+    class UrlBadComponentException: public UrlException
+    {
+    public:
+      UrlBadComponentException()
+        : UrlException("Url bad component exception")
+      {}
+
+      UrlBadComponentException(const std::string &msg)
+        : UrlException(msg)
+      {}
+
+      virtual ~UrlBadComponentException() throw() {};
+    };
+
+
+    // ---------------------------------------------------------------
+    /**
+     * Thrown if scheme does not allow a component.
+     */
+    class UrlNotAllowedException: public UrlException
+    {
+    public:
+      UrlNotAllowedException()
+        : UrlException("Url not allowed component exception")
+      {}
+
+      UrlNotAllowedException(const std::string &msg)
+        : UrlException(msg)
+      {}
+
+      virtual ~UrlNotAllowedException() throw() {};
+    };
+
+
+    // ---------------------------------------------------------------
+    /**
+     * Thrown if a feature e.g. parsing of a component
+     * is not supported for the url/scheme.
+     */
+    class UrlNotSupportedException: public UrlException
+    {
+    public:
+      UrlNotSupportedException()
+        : UrlException("Url parsing unsupported exception")
+      {}
+
+      UrlNotSupportedException(const std::string &msg)
+        : UrlException(msg)
+      {}
+
+      virtual ~UrlNotSupportedException() throw() {};
+    };
+
+
+    //////////////////////////////////////////////////////////////////
+  } // namespace url
+  ////////////////////////////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////////////////////
+} // namespace zypp
+//////////////////////////////////////////////////////////////////////
+
+#endif /* ZYPP_URL_URLEXCEPTION_H */
+/*
+** vim: set ts=2 sts=2 sw=2 ai et:
+*/
similarity index 98%
rename from zypp/url/UrlUtils.cc
rename to zypp-core/url/UrlUtils.cc
index 714d3af..80cf434 100644 (file)
@@ -9,9 +9,9 @@
 /**
  * \file zypp/url/UrlUtils.cc
  */
-#include <zypp/base/Gettext.h>
-#include <zypp/base/String.h>
-#include <zypp/url/UrlUtils.h>
+#include <zypp-core/base/Gettext.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/url/UrlUtils.h>
 
 #include <stdlib.h>   // strtol
 #include <cctype>     // isxdigit
diff --git a/zypp-core/url/UrlUtils.h b/zypp-core/url/UrlUtils.h
new file mode 100644 (file)
index 0000000..94b97a2
--- /dev/null
@@ -0,0 +1,261 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/**
+ * \file zypp/url/UrlUtils.h
+ */
+#ifndef   ZYPP_URL_URLUTILS_H
+#define   ZYPP_URL_URLUTILS_H
+
+#include <zypp-core/url/UrlException.h>
+
+#include <string>
+#include <vector>
+#include <map>
+
+/** Characters that are safe for URL without percent-encoding. */
+#define URL_SAFE_CHARS ":/?#[]@!$&'(){}*+,;="
+
+//////////////////////////////////////////////////////////////////////
+namespace zypp
+{ ////////////////////////////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////////////////////
+  /** Url details namespace. */
+  namespace url
+  { //////////////////////////////////////////////////////////////////
+
+
+    // ---------------------------------------------------------------
+    /** A parameter vector container.
+     * A string vector containing splited PathParam- or Query-String.
+     * Each string in the vector is allways URL percent encoded and
+     * usually contains a "key=value" pair.
+     */
+    typedef std::vector < std::string >             ParamVec;
+
+
+    /** A parameter map container.
+     * A map containing key and value pairs parsed from a PathParam-
+     * or Query-String.
+     */
+    typedef std::map < std::string, std::string >   ParamMap;
+
+
+    /** Encoding flags.
+     */
+    typedef enum {
+        E_ENCODED, //!< Flag to request encoded string(s).
+        E_DECODED  //!< Flag to request decoded string(s).
+    } EEncoding;
+
+
+    // ---------------------------------------------------------------
+    /** Encodes a string using URL percent encoding.
+     *
+     * By default, all characters except of "a-zA-Z0-9_.-" will be encoded.
+     * Additional characters from the set ":/?#[]@!$&'()*+,;=", that are
+     * safe for a URL compoent without encoding, can be specified in the
+     * \p safe argument.
+     *
+     * If the \p eflag parameter is set to E_ENCODED, then already encoded
+     * substrings will be detected and not encoded a second time.
+     *
+     * The following function call will encode the "@" character as "%40",
+     * but skip encoding of the "%" character, because the \p eflag is set
+     * to E_ENCODED and "%ba" is detected as a valid encoded character.
+     * \code
+     *   zypp::url::encode("foo%bar@localhost", "", E_ENCODED);
+     * \endcode
+     * With \p eflag set to E_DECODED, the "%" character would be encoded
+     * as well. The complete encoded string would be "foo%25bar%40localhost".
+     *
+     * \param str      A string to encode (binary data).
+     * \param safe     Characters safe to skip in encoding,
+     *                 e.g. "/" for path names.
+     * \param eflag    If to detect and skip already encoded substrings.
+     * \return A percent encoded string.
+     */
+    std::string
+    encode(const std::string &str, const std::string &safe = "",
+                                   EEncoding         eflag = E_DECODED);
+
+
+    // ---------------------------------------------------------------
+    /** Decodes a URL percent encoded string.
+     * Replaces all occurences of \c "%<hex><hex>" in the \p str string
+     * with the character encoded using the two hexadecimal digits that
+     * follows the "%" character.
+     *
+     * For example, the encoded string "%40%3F%3D%26%25" will be decoded
+     * to "@?=&%".
+     *
+     * \param str      A string to decode.
+     * \param allowNUL A flag, if \c "%00" (encoded \c '\\0')
+     *                 is allowed or not.
+     * \return A decoded strig (may contain binary data).
+     * \throws UrlDecodingException if \p allowNUL is false and
+     *         a encoded NUL byte (\c "%00") was found in \p str.
+     */
+    std::string
+    decode(const std::string &str, bool allowNUL = false);
+
+
+    // ---------------------------------------------------------------
+    /** Encode one character.
+     *
+     * Encode the specified character \p c into its \c "%<hex><hex>"
+     * representation.
+     *
+     * \param c        A character to encode.
+     * \return A percent encoded representation of the character,
+     *         e.g. %20 for a ' ' (space).
+     */
+    std::string
+    encode_octet(const unsigned char c);
+
+
+    // ---------------------------------------------------------------
+    /** Decode one character.
+     *
+     * Decode the \p hex parameter pointing to (at least) two hexadecimal
+     * digits into its character value and return it.
+     *
+     * Example:
+     * \code
+     *   char *str = "%40";
+     *   char *pct = strchr(str, '%');
+     *   int   chr = pct ? decode_octet(pct+1) : -1;
+     *      // chr is set to the '@' ASCII character now.
+     * \endcode
+     *
+     * \param hex     Pointer to two hex characters representing
+     *                the character value in percent-encoded strings.
+     * \return The value (0-255) encoded in the \p hex characters or -1
+     *         if \p hex does not point to two hexadecimal characters.
+     */
+    int
+    decode_octet(const char *hex);
+
+
+    // ---------------------------------------------------------------
+    /** Split into a parameter vector.
+     *
+     * Splits a parameter string \p pstr into substrings using \p psep
+     * as separator and appends the resulting substrings to \p pvec.
+     *
+     * Usual parameter separators are \c '&' for Query- and \c ',' for
+     * PathParam-Strings.
+     *
+     * \param pvec    Reference to a result parameter vector.
+     * \param pstr    Reference to the PathParam- or Query-String to split.
+     * \param psep    Parameter separator character to split at.
+     * \throws UrlNotSupportedException if \p psep separator is empty.
+     */
+    void
+    split(ParamVec          &pvec,
+          const std::string &pstr,
+          const std::string &psep);
+
+
+    // ---------------------------------------------------------------
+    /** Split into a parameter map.
+     *
+     * Splits a parameter string \p pstr into substrings using \p psep as
+     * separator and then, each substring into key and value pair using
+     * \p vsep as separator between parameter key and value and adds them
+     * to the parameter map \p pmap.
+     *
+     * If a parameter substring doesn't contain any value separator \p vsep,
+     * the substring is used as a parameter key and value is set to an empty
+     * string.
+     *
+     * Usual parameter separators are \c '&' for Query- and \c ',' for
+     * PathParam-Strings. A usual parameter-value separator is \c '=' for
+     * both, Query- and PathParam-Strings.
+     *
+     * If the encoding flag \p eflag is set to \p E_DECODED, then the key
+     * and values are dedcoded before they are stored in the map.
+     *
+     * \param pmap    Reference to a result parameter map.
+     * \param pstr    Reference to the PathParam- or Query-String to split.
+     * \param psep    Separator character to split key-value pairs.
+     * \param vsep    Separator character to split key and value.
+     * \param eflag   Flag if the key and value strings should be URL percent
+     *                decoded before they're stored in the map.
+     * \throws UrlNotSupportedException if \p psep or \p vsep separator
+     *         is empty.
+     */
+    void
+    split(ParamMap          &pmap,
+          const std::string &pstr,
+          const std::string &psep,
+          const std::string &vsep,
+          EEncoding         eflag = E_ENCODED);
+
+
+    // ---------------------------------------------------------------
+    /** Join parameter vector to a string.
+     *
+     * Creates a string containing all substrings from the \p pvec separated
+     * by \p psep separator character. The substrings in \p pvec should be
+     * already URL percent encoded and should't contain \p psep characters.
+     *
+     * Usual parameter separators are \c '&' for Query- and \c ',' for
+     * PathParam-Strings.
+     *
+     * \param pvec    Reference to encoded parameter vector.
+     * \param psep    Parameter separator character to use.
+     * \return A parameter string.
+     */
+    std::string
+    join(const ParamVec     &pvec,
+         const std::string  &psep);
+
+
+    // ---------------------------------------------------------------
+    /** Join parameter map to a string.
+     *
+     * Creates a string containing all parameter key-value pairs from the
+     * parameter map \p pmap, that will be joined using the \p psep character
+     * and the parameter key is separated from the parameter value using the
+     * \p vsep character. Both, key and value will be automatically encoded.
+     *
+     * Usual parameter separators are \c '&' for Query- and \c ',' for
+     * PathParam-Strings. A usual parameter-value separator is \c '=' for
+     * both, Query- and PathParam-Strings.
+     *
+     * See encode() function from details about the \p safe characters.
+     *
+     * \param pmap    Reference to a parameter map.
+     * \param psep    Separator character to use between key-value pairs.
+     * \param vsep    Separator character to use between keys and values.
+     * \param safe    List of characters to accept without encoding.
+     * \return A URL percent-encoded parameter string.
+     * \throws UrlNotSupportedException if \p psep or \p vsep separator
+     *         is empty.
+     */
+    std::string
+    join(const ParamMap     &pmap,
+         const std::string  &psep,
+         const std::string  &vsep,
+         const std::string  &safe);
+
+
+    //////////////////////////////////////////////////////////////////
+  } // namespace url
+  ////////////////////////////////////////////////////////////////////
+
+  ////////////////////////////////////////////////////////////////////
+} // namespace zypp
+//////////////////////////////////////////////////////////////////////
+
+#endif /* ZYPP_URL_URLUTILS_H */
+/*
+** vim: set ts=2 sts=2 sw=2 ai et:
+*/
diff --git a/zypp-core/zyppng/base/AutoDisconnect b/zypp-core/zyppng/base/AutoDisconnect
new file mode 100644 (file)
index 0000000..3e47aa5
--- /dev/null
@@ -0,0 +1 @@
+#include "autodisconnect.h"
diff --git a/zypp-core/zyppng/base/EventLoop b/zypp-core/zyppng/base/EventLoop
new file mode 100644 (file)
index 0000000..4dd8ff3
--- /dev/null
@@ -0,0 +1 @@
+#include "eventloop.h"
similarity index 74%
rename from zypp/zyppng/base/abstracteventsource.cc
rename to zypp-core/zyppng/base/abstracteventsource.cc
index ac43ac3..b30b1e9 100644 (file)
@@ -3,11 +3,11 @@
 #include "eventdispatcher.h"
 #include "private/base_p.h"
 
-#include <zypp/base/Exception.h>
+#include <zypp-core/base/Exception.h>
 
 namespace zyppng {
 
-AbstractEventSourcePrivate::AbstractEventSourcePrivate()
+AbstractEventSourcePrivate::AbstractEventSourcePrivate( AbstractEventSource &p ) : BasePrivate( p )
 {
   auto ev = EventDispatcher::instance();
   if ( !ev )
@@ -15,8 +15,10 @@ AbstractEventSourcePrivate::AbstractEventSourcePrivate()
   _ev = ev;
 }
 
+ZYPP_IMPL_PRIVATE(AbstractEventSource)
+
 AbstractEventSource::AbstractEventSource()
-  : Base ( * new AbstractEventSourcePrivate )
+  : Base ( * new AbstractEventSourcePrivate( *this ) )
 { }
 
 AbstractEventSource::AbstractEventSource( AbstractEventSourcePrivate &dd )
@@ -29,7 +31,7 @@ AbstractEventSource::~AbstractEventSource()
   auto ev = d->_ev.lock();
   //if ev is null , eventloop is shutting down
   if ( ev )
-    ev->removeEventSource( this );
+    ev->removeEventSource( *this );
 }
 
 std::weak_ptr<EventDispatcher> AbstractEventSource::eventDispatcher() const
@@ -44,7 +46,7 @@ void AbstractEventSource::updateFdWatch(int fd, int mode)
   //if ev is null we are shutting down
   if ( !ev )
     return;
-  ev->updateEventSource( this, fd, mode );
+  ev->updateEventSource( *this, fd, mode );
 }
 
 void AbstractEventSource::removeFdWatch(int fd)
@@ -54,7 +56,7 @@ void AbstractEventSource::removeFdWatch(int fd)
   //if ev is null we are shutting down
   if ( !ev )
     return;
-  ev->removeEventSource( this, fd );
+  ev->removeEventSource( *this , fd );
 }
 
 }
similarity index 95%
rename from zypp/zyppng/base/abstracteventsource.h
rename to zypp-core/zyppng/base/abstracteventsource.h
index d3d539f..ea31b1d 100644 (file)
@@ -14,9 +14,9 @@
 #ifndef ZYPP_NG_BASE_ABSTRACTEVENTSOURCE_H_INCLUDED
 #define ZYPP_NG_BASE_ABSTRACTEVENTSOURCE_H_INCLUDED
 
-#include <zypp/zyppng/base/zyppglobal.h>
-#include <zypp/zyppng/base/Signals>
-#include <zypp/zyppng/base/Base>
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/Signals>
+#include <zypp-core/zyppng/base/Base>
 
 namespace zyppng {
 
diff --git a/zypp-core/zyppng/base/autodisconnect.h b/zypp-core/zyppng/base/autodisconnect.h
new file mode 100644 (file)
index 0000000..42ae2a5
--- /dev/null
@@ -0,0 +1,35 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+
+#include <zypp-core/zyppng/base/Signals>
+
+namespace zyppng
+{
+  /*!
+   * This can be used to scope a signal/slot connection.
+   * Basically just like \sa zypp::AutoDispose
+   */
+  struct AutoDisconnect
+  {
+    AutoDisconnect( connection &&conn ) : _conn ( std::move(conn) ) {}
+    AutoDisconnect( AutoDisconnect &&other ) : _conn ( std::move(other._conn) ) {}
+
+    AutoDisconnect( const AutoDisconnect &other ) = delete;
+    AutoDisconnect & operator=( const AutoDisconnect & ) = delete;
+
+    ~AutoDisconnect( ) { _conn.disconnect(); }
+    connection _conn;
+  };
+
+}
similarity index 80%
rename from zypp/zyppng/base/base.cc
rename to zypp-core/zyppng/base/base.cc
index 42c7702..e354957 100644 (file)
@@ -1,24 +1,28 @@
-#include <zypp/zyppng/base/private/base_p.h>
+#include <zypp-core/zyppng/base/private/base_p.h>
 
 namespace zyppng {
 
   BasePrivate::~BasePrivate()
   { }
 
-  Base::Base() : d_ptr( new BasePrivate )
-  {
-    d_ptr->z_ptr = this;
-  }
-
-  Base::~Base()
+  void BasePrivate::init()
   { }
 
+  ZYPP_IMPL_PRIVATE(Base)
+
   Base::Base ( BasePrivate &dd )
     : d_ptr ( &dd )
   {
     d_ptr->z_ptr = this;
+    d_ptr->init();
   }
 
+  Base::Base() : Base( *new BasePrivate(*this) )
+  { }
+
+  Base::~Base()
+  { }
+
   Base::WeakPtr Base::parent() const
   {
     return d_func()->parent;
@@ -64,4 +68,9 @@ namespace zyppng {
     return d_func()->children;
   }
 
+  std::thread::id Base::threadId() const
+  {
+    return d_func()->threadId;
+  }
+
 } // namespace zyppng
diff --git a/zypp-core/zyppng/base/base.h b/zypp-core/zyppng/base/base.h
new file mode 100644 (file)
index 0000000..75ba002
--- /dev/null
@@ -0,0 +1,196 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_BASE_BASE_H_INCLUDED
+#define ZYPP_NG_BASE_BASE_H_INCLUDED
+
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/signals.h>
+#include <memory>
+#include <unordered_set>
+#include <vector>
+#include <thread>
+
+namespace zyppng {
+
+  class Base;
+  class BasePrivate;
+
+  namespace internal {
+    template <typename Func>
+    struct MemberFunction;
+
+    template <typename BType, typename Ret, typename ...Args >
+    struct MemberFunction<Ret (BType::*)( Args... )> {
+      using ClassType = BType;
+    };
+
+    template <typename T>
+    inline constexpr bool is_base_receiver = std::is_base_of_v<Base, T> || std::is_base_of_v<BasePrivate, T>;
+
+  }
+
+  /*!
+   * The Base class is used as a common base class for objects that emit signals,
+   * it also supports a parent/child relationship where the parent object keeps
+   * a reference for all its children.
+   *
+   * Generally all objects that want to send or receive signals should derive from Base since it
+   * will help on enforcing a correct use of shared_ptr semantics. Generally with signal/slot emission
+   * its easy to run into the issue of a object being deleted while it emits a signal. Think about a Socket
+   * that emits a \a closed signal. It might be removed from the list of connections and the last reference of the
+   * object deleted before the signal returns.
+   * In order to prevent this from happening we established a rule of "Always own a reference to the object you use".
+   * The connection helpers \ref Base::connect and \ref Base::connectFunc help with enforcing this rule, even asserting
+   * when compiled without NDEBUG defined.
+   *
+   * \sa zypp/zyppng/base/signals.h
+   */
+  class LIBZYPP_NG_EXPORT Base : public sigc::trackable, public std::enable_shared_from_this<Base>
+  {
+    NON_COPYABLE(Base);
+    ZYPP_DECLARE_PRIVATE(Base)
+  public:
+
+    using Ptr = std::shared_ptr<Base>;
+    using WeakPtr = std::weak_ptr<Base>;
+
+    Base ();
+    virtual ~Base();
+
+    /*!
+     * Returns the parent object if there is one, otherwise
+     * returns a zero WeakPtr
+     */
+    WeakPtr parent() const;
+
+    /*!
+     * Adds a new object to the child list, the object
+     * will keep a reference for its entire lifetime or until the object is removed
+     */
+    void addChild ( Base::Ptr child );
+
+    /*!
+     * Removes a child object from the internal child list
+     */
+    void removeChild (Ptr child );
+
+    /*!
+     * Returns all child objects of this object
+     */
+    const std::unordered_set<Ptr> &children() const;
+
+    /*!
+     * Returns the thread ID this object was created in
+     */
+    std::thread::id threadId () const;
+
+    /*!
+     * Returns all children that can be casted to type T
+     */
+    template<typename T>
+    std::vector< std::weak_ptr<T> > findChildren () const {
+      std::vector< std::weak_ptr<T> > result;
+      for ( Ptr p : children() ) {
+        std::shared_ptr<T> casted = std::dynamic_pointer_cast<T>(p);
+        if ( casted )
+          result.push_back( std::weak_ptr<T>(casted) );
+      }
+      return result;
+    }
+
+    template<typename T>
+    inline std::shared_ptr<T> shared_this () const {
+      return std::static_pointer_cast<T>( shared_from_this() );
+    }
+
+    template<typename T>
+    inline std::shared_ptr<T> shared_this () {
+      return std::static_pointer_cast<T>( shared_from_this() );
+    }
+
+    template<typename T>
+    inline std::weak_ptr<T> weak_this () const {
+      return std::static_pointer_cast<T>( weak_from_this().lock() );
+    }
+
+    template<typename T>
+    inline std::weak_ptr<T> weak_this () {
+      return std::static_pointer_cast<T>( weak_from_this().lock() );
+    }
+
+    template<typename Obj, typename Functor >
+    static decltype (auto) make_base_slot( Obj *o, Functor &&f ) {
+      //static_assert ( !internal::is_base_receiver<Obj>, "Can not make a slot for a Object that does not derive from Base or BasePrivate.");
+      return internal::locking_fun( sigc::mem_fun( o, std::forward<Functor>(f) ), *o );
+    }
+
+    /*!
+     * Preferred way to connect a signal to a slow, this will automatically take care of tracking the target object in the connection
+     */
+    template< typename SenderFunc, typename ReceiverFunc >
+    static auto connect ( typename internal::MemberFunction<SenderFunc>::ClassType &s, SenderFunc &&sFun, typename internal::MemberFunction<ReceiverFunc>::ClassType &recv, ReceiverFunc &&rFunc ) {
+      return std::invoke( std::forward<SenderFunc>(sFun), &s ).connect( make_base_slot( &recv, std::forward<ReceiverFunc>(rFunc) ) );
+    }
+
+
+    /*!
+     * Convenience func that uses "this" as the sender object in the signal / slot connection, this allows syntax like:
+     * \code
+     * object.connect( &Obj::signal, *targetObj, &TargetObj::onSignal );
+     * \endcode
+     */
+    template< typename SenderFunc, typename ReceiverFunc >
+    auto connect ( SenderFunc &&sFun, typename internal::MemberFunction<ReceiverFunc>::ClassType &recv, ReceiverFunc &&rFunc ) {
+      return connect( static_cast<typename internal::MemberFunction<SenderFunc>::ClassType &>(*this), std::forward<SenderFunc>(sFun), recv, std::forward<ReceiverFunc>(rFunc) );
+    }
+
+    /*!
+     * This allows to connect a lambda to a signal in a \ref Base derived type. Make sure to track the objects used inside the slot for shared_ptr
+     * correctness ( always own a reference to the object you are calling )
+     */
+    template< typename SenderFunc, typename ReceiverFunc, typename ...Tracker >
+    static auto connectFunc ( typename internal::MemberFunction<SenderFunc>::ClassType &s, SenderFunc &&sFun, ReceiverFunc &&rFunc, const Tracker&...trackers ) {
+      return std::invoke( std::forward<SenderFunc>(sFun), &s ).connect( internal::locking_fun( std::forward<ReceiverFunc>(rFunc), trackers... ) );
+    }
+
+    template< typename SenderFunc, typename ReceiverFunc, typename ...Tracker  >
+    std::enable_if_t< std::is_member_function_pointer_v< SenderFunc >,  connection > connectFunc ( SenderFunc &&sFun, ReceiverFunc &&rFunc, const Tracker&...trackers  ) {
+      return connectFunc( static_cast<typename internal::MemberFunction<SenderFunc>::ClassType &>(*this), std::forward<SenderFunc>(sFun), std::forward<ReceiverFunc>(rFunc), trackers... );
+    }
+
+  protected:
+    Base ( BasePrivate &dd );
+    std::unique_ptr<BasePrivate> d_ptr;
+  };
+
+
+  template<typename Obj, typename Functor,
+    std::enable_if_t< std::is_base_of_v< Base, Obj> || std::is_base_of_v<BasePrivate, Obj>, bool> = true
+  >
+  inline decltype(auto) base_slot( Obj *o, Functor &&f )
+  {
+    return Base::make_base_slot(o, std::forward<Functor>(f) );
+  }
+
+  template<typename Obj, typename Functor,
+    std::enable_if_t< std::is_base_of_v< Base, Obj> || std::is_base_of_v<BasePrivate, Obj>, bool> = true
+    >
+  inline decltype(auto) base_slot( Obj &o, Functor &&f )
+  {
+    return Base::make_base_slot(&o, std::forward<Functor>(f) );
+  }
+
+} // namespace zyppng
+
+#endif // ZYPP_NG_CORE_BASE_H_INCLUDED
similarity index 59%
rename from zypp/zyppng/base/eventdispatcher.h
rename to zypp-core/zyppng/base/eventdispatcher.h
index 07a2b66..8782256 100644 (file)
 #ifndef ZYPP_BASE_EVENTDISPATCHER_DEFINED
 #define ZYPP_BASE_EVENTDISPATCHER_DEFINED
 
-#include <zypp/zyppng/base/zyppglobal.h>
-#include <zypp/zyppng/base/Signals>
-#include <zypp/zyppng/base/Base>
-#include <zypp/zyppng/base/AbstractEventSource>
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/Signals>
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/base/AbstractEventSource>
 #include <memory>
 #include <functional>
 
@@ -31,20 +31,12 @@ class EventDispatcher;
 class EventDispatcherPrivate;
 
 /*!
- * The EventDispatcher class implements the libzypp event loop.
+ * The EventDispatcher class implements the libzypp event loop native backend.
  *
- * A event loop is used to execute multiple tasks concurrently. This is not implemented using threads but usually by either
- * using Timers to poll a ressource or by reacting on events from a file descriptor or socket.
- * In a application like zypper where we heavily make use of I/O heavy tasks like downloading packages, rebuilding the repo metadata
- * or generating a checksum over a file the application needs to wait more for those tasks to finish than actually doing anything.
- * By using a event loop we can start one of those tasks and let the OS handle the execution and subscribe to certain events that can happen,
- * utilizing more of the CPU compared to starting all the tasks serially.
- *
- * Libzypp is using a thread local eventloop, means each thread needs to start its own loop. Only special case is when
+ * Libzypp is using a thread local dispatcher, means each thread has its own unique disptacher. Only special case is when
  * we need to work together with a already exisiting event loop, for example in a Qt application. The default implementation however
  * uses the glib eventloop, just like Qt and GTK, so integrating libzypp here is just a matter of passing the default main context
- * to the constructor of \a EventDispatcher.
- *
+ * to the constructor of \ref EventDispatcher.
  */
 class LIBZYPP_NG_EXPORT EventDispatcher : public Base
 {
@@ -58,24 +50,6 @@ public:
   using WeakPtr = std::shared_ptr<EventDispatcher>;
   using IdleFunction = std::function<bool ()>;
 
-  /*!
-   * Creates a new EventDispatcher, use this function to create a Dispatcher
-   * running on the default thread
-   *
-   * \note the glib implementation will use the g_default_context(), this means
-   * it will attach to any running main loop
-   */
-  static std::shared_ptr<EventDispatcher> createMain ( );
-
-  /*!
-   * Creates a new EventDispatcher, use this function to create a Dispatcher
-   * running on a threads aside the main thread
-   *
-   * \note the glib implementation will use the g_main_context_get_thread_default(), this means
-   * it will attach to any loop that was set as the default for the current thread, if there is no
-   * default context a new one will be created
-   */
-  static std::shared_ptr<EventDispatcher> createForThread ( );
 
   virtual ~EventDispatcher();
 
@@ -86,16 +60,6 @@ public:
   virtual bool run_once();
 
   /*!
-   * Start dispatching events, this function will block until \sa quit was called for the EventDispatcher instance
-   */
-  virtual void run ();
-
-  /*!
-   * Stop dispatching events and return from the main loop.
-   */
-  virtual void quit ();
-
-  /*!
    * \brief Convenience function to schedule a callback to be called later.
    * \param callback a std::function that is called after all other events have been processed
    */
@@ -113,6 +77,9 @@ public:
    *
    * In some cases it might be required to delay the cleanup of a ressource until the current
    * event loop iteration was finished, in case there are more pending events for the ressource.
+   *
+   * \note Normally this should be handled by using correct shared_ptr semantics, and always owning a reference
+   *       to a object were functions are called on. Only if that is not possible unrefLater should be used.
    */
   template< typename T >
   static void unrefLater ( T &&ptr ) {
@@ -122,6 +89,15 @@ public:
   }
 
   /*!
+   * Immediately clears the list of all shared_ptr's that were registered
+   * to be unreferenced later. Mainly used to be called when a event loop exits, otherwise we
+   * might have weird side effects when the main loop instance preserves pointers that should be cleared
+   * at that point already. Like child items still trying to access the parent object that was already cleaned
+   * up before the MainLoop instance.
+   */
+  void clearUnrefLaterList ();
+
+  /*!
    * Returns the number of the currently active timers
    */
   ulong runningTimers() const;
@@ -131,6 +107,42 @@ public:
    */
   static std::shared_ptr<EventDispatcher> instance();
 
+  /*!
+   * Registers the given event dispatcher as the default for the current thread. The reference count for the
+   * shared pointer will not be increased, so the application is responsible to keep it until the application exits.
+   * \note This must be called before the default dispatcher is registered, otherwise its ignored.
+   */
+  static void setThreadDispatcher ( const std::shared_ptr<EventDispatcher> &disp );
+
+  /**
+   * Returns the native dispatcher handle if the used implementation supports it
+   * \note the glib backend will return the used glib \a GMainContext
+   */
+  void *nativeDispatcherHandle () const;
+
+  /*!
+   * Waits until one of the requested events in \a events happens on the file descriptor.
+   * Use \ref AbstractEventSource::EventTypes to define for which events should be polled.
+   * Returns true on success, \a revents will contain the bitwise combination of \ref AbstractEventSource::EventTypes
+   * that triggered the wakeup.
+   */
+  static bool waitForFdEvent ( const int fd, int events, int &revents, int &timeout );
+
+  using WaitPidCallback = std::function<void(int, int)>;
+
+  /*!
+   * Tracks a child process until its execution did end.
+   * Callback is called when the child exits, the callback arguments are pid and status
+   */
+  void trackChildProcess ( int pid, std::function<void(int, int)> callback  );
+
+  /*!
+   * Removes a child process from the internal sources, the process will not be reaped
+   * anymore if it is still running!
+   * \returns true if the pid was removed
+   */
+  bool untrackChildProcess ( int pid );
+
 protected:
 
   /*!
@@ -155,7 +167,7 @@ protected:
    * \param fd The file descriptor that is added to the internal watchlist
    * \param mode The watch mode for the given file desriptor \sa zyppng::AbstractEventSource::EventTypes
    */
-  virtual void updateEventSource ( AbstractEventSource *notifier, int fd, int mode );
+  virtual void updateEventSource ( AbstractEventSource &notifier, int fd, int mode );
 
   /*!
    * Removes a file descriptor from the internal watchlist, if \a fd is set to -1 all file descriptors
@@ -163,17 +175,18 @@ protected:
    * \param notifier The \sa AbstractEventSource parent of the file descriptor
    * \param fd The file descriptor to be removed, set to -1 to remove all descriptors for a \sa AbstractEventSource
    */
-  virtual void removeEventSource   ( AbstractEventSource *notifier, int fd = -1 );
+  virtual void removeEventSource   ( AbstractEventSource &notifier, int fd = -1 );
 
   /*!
    * Adds a new Timer instance to the internal timer list
    */
-  virtual void registerTimer ( Timer *timer );
+  virtual void registerTimer ( Timer &timer );
 
   /*!
    * Removes a timer from the internal timer list, once a Timer is removed it does not fire anymore
    */
-  virtual void removeTimer ( Timer *timer );
+  virtual void removeTimer ( Timer &timer );
+
 };
 
 }
similarity index 62%
rename from zypp/zyppng/base/eventdispatcher_glib.cc
rename to zypp-core/zyppng/base/eventdispatcher_glib.cc
index cabff2d..cf2118c 100644 (file)
@@ -1,9 +1,11 @@
-#include "eventdispatcher.h"
 #include "timer.h"
 #include "private/eventdispatcher_glib_p.h"
+#include "private/threaddata_p.h"
+
+#include <zypp-core/base/Exception.h>
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/AutoDispose.h>
 
-#include <zypp/base/Exception.h>
-#include <zypp/base/Logger.h>
 namespace zyppng {
 
 static int inline readMask () {
@@ -18,16 +20,33 @@ static int inline excpMask () {
   return ( G_IO_PRI );
 }
 
-//returns the thread local dispatcher, we only support one EventDispatcher per thread
-static EventDispatcher **threadLocalDispatcher ( EventDispatcher * set = nullptr )
-{
-  static __thread EventDispatcher *threadDispatch = nullptr;
-  if ( set ) {
-    if ( threadDispatch )
-      ZYPP_THROW( zypp::Exception( "EventDispatcher can only be created once per thread" ) );
-    threadDispatch = set;
+static int inline evModeToMask ( int mode ) {
+  int cond = 0;
+  if ( mode & AbstractEventSource::Read ) {
+    cond = readMask() | G_IO_ERR;
+  }
+  if ( mode & AbstractEventSource::Write ) {
+    cond = cond | writeMask() | G_IO_ERR;
+  }
+  if ( mode & AbstractEventSource::Exception ) {
+    cond = cond | excpMask() | G_IO_ERR;
   }
-  return &threadDispatch;
+  return cond;
+}
+
+static int inline gioConditionToEventTypes ( const GIOCondition rEvents, const int requestedEvs ) {
+  int ev = 0;
+  if ( ( rEvents & requestedEvs ) != 0 ) {
+    if ( ( rEvents & readMask() ) && ( requestedEvs & readMask() ) )
+      ev = AbstractEventSource::Read;
+    if ( ( rEvents & writeMask() ) && ( requestedEvs & writeMask() ) )
+      ev = ev | AbstractEventSource::Write;
+    if ( ( rEvents & excpMask()) && ( requestedEvs & excpMask() ) )
+      ev = ev | AbstractEventSource::Exception;
+    if ( ( rEvents & G_IO_ERR) && ( requestedEvs & G_IO_ERR ) )
+      ev = ev | AbstractEventSource::Error;
+  }
+  return ev;
 }
 
 static GSourceFuncs abstractEventSourceFuncs = {
@@ -127,17 +146,11 @@ gboolean GAbstractEventSource::dispatch(GSource *source, GSourceFunc, gpointer)
       GIOCondition pendEvents = g_source_query_unix_fd( source, pollfd.tag );
 
       if ( (pendEvents & pollfd.reqEvents ) != 0 ) {
-        int ev = 0;
-        if ( ( pendEvents & readMask() ) && ( pollfd.reqEvents & readMask() ) )
-          ev = AbstractEventSource::Read;
-        if ( (pendEvents & writeMask() ) && ( pollfd.reqEvents & writeMask() ) )
-          ev = ev | AbstractEventSource::Write;
-        if ( (pendEvents & excpMask()) && ( pollfd.reqEvents & excpMask() ) )
-          ev = ev | AbstractEventSource::Exception;
-        if ( (pendEvents & G_IO_ERR) && ( pollfd.reqEvents & G_IO_ERR ) )
-          ev = ev | AbstractEventSource::Error;
-
-        src->eventSource->onFdReady( pollfd.pollfd, ev );
+        int ev = gioConditionToEventTypes( pendEvents, pollfd.reqEvents );
+        // we require all event objects to be used in shared_ptr form, by doing this we make sure that the object is not destroyed
+        // while we still use it. However this WILL throw in case of using the EventSource outside of shared_ptr bounds
+        auto eventSourceLocked = src->eventSource->shared_this<AbstractEventSource>();
+        eventSourceLocked->onFdReady( pollfd.pollfd, ev );
       }
     }
   }
@@ -192,7 +205,7 @@ gboolean GLibTimerSource::dispatch(GSource *src, GSourceFunc, gpointer)
     return true;
   //this will emit the expired signal and reset the timer
   //or stop it in case its a single shot timer
-  source->_t->expire();
+  source->_t->shared_this<Timer>()->expire();
   return true;
 }
 
@@ -221,11 +234,44 @@ static gboolean  eventLoopIdleFunc ( gpointer user_data )
       return G_SOURCE_CONTINUE;
     }
   }
+
+  g_source_unref ( dPtr->_idleSource );
+  dPtr->_idleSource = nullptr;
+
   return G_SOURCE_REMOVE;
 }
 
+GlibWaitPIDData::GlibWaitPIDData( GPid pid  )
+{
+  source = g_child_watch_source_new( pid );
+}
+
+GlibWaitPIDData::GlibWaitPIDData(GlibWaitPIDData &&other)
+  : tag( other.tag )
+  , source( other.source )
+  , callback( std::move( other.callback ) )
+{
+  other.source = nullptr;
+}
+
+GlibWaitPIDData::~GlibWaitPIDData()
+{
+  if ( source ) {
+    g_source_destroy( source );
+    g_source_unref( source );
+  }
+}
+
+GlibWaitPIDData &GlibWaitPIDData::operator=(GlibWaitPIDData &&other)
+{
+  tag = other.tag;
+  source = other.source;
+  callback = std::move( other.callback );
+  other.source = nullptr;
+  return *this;
+}
 
-EventDispatcherPrivate::EventDispatcherPrivate ( GMainContext *ctx )
+EventDispatcherPrivate::EventDispatcherPrivate (GMainContext *ctx , EventDispatcher &p) : BasePrivate(p)
 {
   _myThreadId = std::this_thread::get_id();
 
@@ -235,19 +281,10 @@ EventDispatcherPrivate::EventDispatcherPrivate ( GMainContext *ctx )
     _ctx = ctx;
     g_main_context_ref ( _ctx );
   } else {
-    _ctx = g_main_context_get_thread_default();
-    if ( !_ctx ) {
-      _ctx = g_main_context_new();
-    } else {
-      g_main_context_ref ( _ctx );
-    }
+    _ctx = g_main_context_new();
   }
-  g_main_context_push_thread_default( _ctx );
-
-  _loop = g_main_loop_new( _ctx, false );
-
-  _idleSource = g_idle_source_new ();
-  g_source_set_callback ( _idleSource, eventLoopIdleFunc, this, nullptr );
+  // Enable this again once we switch to a full async API that requires a eventloop before calling any zypp functions
+  // g_main_context_push_thread_default( _ctx );
 }
 
 EventDispatcherPrivate::~EventDispatcherPrivate()
@@ -260,28 +297,28 @@ EventDispatcherPrivate::~EventDispatcherPrivate()
   });
   _runningTimers.clear();
 
-  g_source_destroy( _idleSource );
-  g_source_unref ( _idleSource );
+  if ( _idleSource ) {
+    g_source_destroy( _idleSource );
+    g_source_unref ( _idleSource );
+  }
 
-  g_main_context_pop_thread_default( _ctx );
+  //g_main_context_pop_thread_default( _ctx );
   g_main_context_unref( _ctx );
-  g_main_loop_unref( _loop );
 }
 
 bool EventDispatcherPrivate::runIdleTasks()
 {
   //run all user defined idle functions
   //if they return true, they are executed again in the next idle run
-  decltype ( _idleFuncs ) rerunQueue;
-  while ( _idleFuncs.size() ) {
-    EventDispatcher::IdleFunction fun( std::move( _idleFuncs.front() ) );
-    _idleFuncs.pop();
+  decltype ( _idleFuncs ) runQueue;
+  runQueue.swap( _idleFuncs );
+
+  while ( runQueue.size() ) {
+    EventDispatcher::IdleFunction fun( std::move( runQueue.front() ) );
+    runQueue.pop();
     if ( fun() )
-      rerunQueue.push( std::move(fun) );
+      _idleFuncs.push( std::move(fun) );
   }
-  if ( !rerunQueue.empty() )
-    _idleFuncs.swap( rerunQueue );
-
 
   //keep this as the last thing to call after all user code was executed
   if ( _unrefLater.size() )
@@ -292,45 +329,64 @@ bool EventDispatcherPrivate::runIdleTasks()
 
 void EventDispatcherPrivate::enableIdleSource()
 {
-  if ( !_idleSource->context )
+  if ( !_idleSource ) {
+    _idleSource = g_idle_source_new ();
+    g_source_set_callback ( _idleSource, eventLoopIdleFunc, this, nullptr );
     g_source_attach ( _idleSource, _ctx );
+  }
 }
 
-
-EventDispatcher::EventDispatcher(void *ctx)
-  : Base ( * new EventDispatcherPrivate( reinterpret_cast<GMainContext*>(ctx) ) )
+std::shared_ptr<EventDispatcher> EventDispatcherPrivate::create()
 {
-  threadLocalDispatcher( this );
+  return std::shared_ptr<EventDispatcher>( new EventDispatcher() );
 }
 
-std::shared_ptr<EventDispatcher> EventDispatcher::createMain()
+void EventDispatcherPrivate::waitPidCallback( GPid pid, gint status, gpointer user_data )
 {
-  return std::shared_ptr<EventDispatcher>( new EventDispatcher(g_main_context_default()) );
+  EventDispatcherPrivate *that = reinterpret_cast<EventDispatcherPrivate *>( user_data );
+
+  try {
+    auto data = std::move( that->_waitPIDs.at(pid) );
+    that->_waitPIDs.erase( pid );
+
+    if ( data.callback )
+      data.callback( pid, status );
+
+    g_spawn_close_pid( pid );
+
+    // no need to take care of releasing the GSource, the event loop took care of that
+
+  }  catch ( const std::out_of_range &e ) {
+    return;
+  }
 }
 
-std::shared_ptr<EventDispatcher> EventDispatcher::createForThread()
+ZYPP_IMPL_PRIVATE(EventDispatcher)
+
+EventDispatcher::EventDispatcher(void *ctx)
+  : Base ( * new EventDispatcherPrivate( reinterpret_cast<GMainContext*>(ctx), *this ) )
 {
-  return std::shared_ptr<EventDispatcher>( new EventDispatcher() );
 }
 
 EventDispatcher::~EventDispatcher()
 {
-  *threadLocalDispatcher() = nullptr;
 }
 
-void EventDispatcher::updateEventSource( AbstractEventSource *notifier, int fd, int mode )
+void EventDispatcher::updateEventSource( AbstractEventSource &notifier, int fd, int mode )
 {
   Z_D();
-  if ( notifier->eventDispatcher().lock().get() != this )
+  if ( notifier.eventDispatcher().lock().get() != this )
     ZYPP_THROW( zypp::Exception("Invalid event dispatcher used to update event source") );
 
+  AbstractEventSource *notifyPtr = &notifier;
+
   GAbstractEventSource *evSrc = nullptr;
   auto &evSrcList = d->_eventSources;
-  auto itToEvSrc = std::find_if( evSrcList.begin(), evSrcList.end(), [ notifier ]( const auto elem ){ return elem->eventSource == notifier; } );
+  auto itToEvSrc = std::find_if( evSrcList.begin(), evSrcList.end(), [ notifyPtr ]( const auto elem ){ return elem->eventSource == notifyPtr; } );
   if ( itToEvSrc == evSrcList.end() ) {
 
     evSrc = GAbstractEventSource::create( d );
-    evSrc->eventSource = notifier;
+    evSrc->eventSource = notifyPtr;
     evSrcList.push_back( evSrc );
 
     g_source_attach( &evSrc->source, d->_ctx );
@@ -338,17 +394,7 @@ void EventDispatcher::updateEventSource( AbstractEventSource *notifier, int fd,
   } else
     evSrc = (*itToEvSrc);
 
-  int cond = 0;
-  if ( mode & AbstractEventSource::Read ) {
-    cond = readMask() | G_IO_ERR;
-  }
-  if ( mode & AbstractEventSource::Write ) {
-    cond = cond | writeMask() | G_IO_ERR;
-  }
-  if ( mode & AbstractEventSource::Exception ) {
-    cond = cond | excpMask() | G_IO_ERR;
-  }
-
+  int cond = evModeToMask( mode );
   auto it = std::find_if( evSrc->pollfds.begin(), evSrc->pollfds.end(), [fd]( const auto &currPollFd ) {
     return currPollFd.pollfd == fd;
   });
@@ -368,15 +414,17 @@ void EventDispatcher::updateEventSource( AbstractEventSource *notifier, int fd,
   }
 }
 
-void EventDispatcher::removeEventSource( AbstractEventSource *notifier, int fd )
+void EventDispatcher::removeEventSource( zyppng::AbstractEventSource &notifier, int fd )
 {
   Z_D();
 
-  if ( notifier->eventDispatcher().lock().get() != this )
+  AbstractEventSource *ptr = &notifier;
+
+  if ( notifier.eventDispatcher().lock().get() != this )
     ZYPP_THROW( zypp::Exception("Invalid event dispatcher used to remove event source") );
 
   auto &evList = d->_eventSources;
-  auto it = std::find_if( evList.begin(), evList.end(), [ notifier ]( const auto elem ){ return elem->eventSource == notifier; } );
+  auto it = std::find_if( evList.begin(), evList.end(), [ ptr ]( const auto elem ){ return elem->eventSource == ptr; } );
 
   if ( it == evList.end() )
     return;
@@ -405,27 +453,27 @@ void EventDispatcher::removeEventSource( AbstractEventSource *notifier, int fd )
   }
 }
 
-void EventDispatcher::registerTimer( Timer *timer )
+void EventDispatcher::registerTimer( Timer &timer )
 {
   Z_D();
   //make sure timer is not double registered
   for ( const GLibTimerSource *t : d->_runningTimers ) {
-    if ( t->_t == timer )
+    if ( t->_t == &timer )
       return;
   }
 
   GLibTimerSource *newSrc = GLibTimerSource::create();
-  newSrc->_t = timer;
+  newSrc->_t = &timer;
   d->_runningTimers.push_back( newSrc );
 
   g_source_attach( &newSrc->source, d->_ctx );
 }
 
-void EventDispatcher::removeTimer( Timer *timer )
+void EventDispatcher::removeTimer( Timer &timer )
 {
   Z_D();
-  auto it = std::find_if( d->_runningTimers.begin(), d->_runningTimers.end(), [ timer ]( const GLibTimerSource *src ){
-    return src->_t == timer;
+  auto it = std::find_if( d->_runningTimers.begin(), d->_runningTimers.end(), [ &timer ]( const GLibTimerSource *src ){
+    return src->_t == &timer;
   });
 
   if ( it != d->_runningTimers.end() ) {
@@ -435,19 +483,76 @@ void EventDispatcher::removeTimer( Timer *timer )
   }
 }
 
-bool EventDispatcher::run_once()
+void *EventDispatcher::nativeDispatcherHandle() const
 {
-  return g_main_context_iteration( d_func()->_ctx, false );
+  return d_func()->_ctx;
 }
 
-void EventDispatcher::run()
+bool EventDispatcher::waitForFdEvent( const int fd, int events , int &revents , int &timeout )
 {
-  g_main_loop_run( d_func()->_loop );
+  GPollFD pollFd;
+  pollFd.fd = fd;
+  pollFd.events = evModeToMask(events);
+
+  bool eventTriggered = false;
+  zypp::AutoDispose<GTimer *> timer( g_timer_new(), &g_timer_destroy );
+  while ( !eventTriggered ) {
+    g_timer_start( *timer );
+    const int res = g_poll( &pollFd, 1, timeout );
+    switch ( res ) {
+      case 0: //timeout
+        timeout = 0;
+        return false;
+      case -1: { // interrupt
+        // if timeout is -1 we wait until eternity
+        if ( timeout == -1 )
+          continue;
+
+        timeout -= g_timer_elapsed( *timer, NULL );
+        if ( timeout < 0 ) timeout = 0;
+        if ( timeout <= 0 )
+          return false;
+
+        if ( errno == EINTR )
+          continue;
+
+        break;
+      }
+      case 1:
+        eventTriggered = true;
+        break;
+    }
+  }
+
+  revents = gioConditionToEventTypes( (GIOCondition)pollFd.revents, evModeToMask(events) );
+  return true;
 }
 
-void EventDispatcher::quit()
+void EventDispatcher::trackChildProcess( int pid, std::function<void (int, int)> callback )
 {
-  g_main_loop_quit( d_func()->_loop );
+  Z_D();
+  GlibWaitPIDData data ( pid );
+  data.callback = std::move(callback);
+
+  g_source_set_callback ( data.source, (GSourceFunc) &EventDispatcherPrivate::waitPidCallback , d_ptr.get(), nullptr );
+  data.tag = g_source_attach ( data.source, d->_ctx );
+  d->_waitPIDs.insert( std::make_pair( pid, std::move(data) ) );
+}
+
+bool EventDispatcher::untrackChildProcess(int pid)
+{
+  Z_D();
+  try {
+    d->_waitPIDs.erase( pid );
+  }  catch ( const std::out_of_range &e ) {
+    return false;
+  }
+  return true;
+}
+
+bool EventDispatcher::run_once()
+{
+  return g_main_context_iteration( d_func()->_ctx, false );
 }
 
 void EventDispatcher::invokeOnIdleImpl(EventDispatcher::IdleFunction &&callback)
@@ -464,6 +569,11 @@ void EventDispatcher::unrefLaterImpl(std::shared_ptr<void> &&ptr )
   d->enableIdleSource();
 }
 
+void EventDispatcher::clearUnrefLaterList ()
+{
+  d_func()->_unrefLater.clear();
+}
+
 ulong EventDispatcher::runningTimers() const
 {
   return d_func()->_runningTimers.size();
@@ -471,10 +581,12 @@ ulong EventDispatcher::runningTimers() const
 
 std::shared_ptr<EventDispatcher> EventDispatcher::instance()
 {
-  auto ev = *threadLocalDispatcher();
-  if ( ev )
-    return ev->shared_this<EventDispatcher>();
-  return std::shared_ptr<EventDispatcher>();
+  return ThreadData::current().dispatcher();
+}
+
+void EventDispatcher::setThreadDispatcher(const std::shared_ptr<EventDispatcher> &disp)
+{
+  ThreadData::current().setDispatcher( disp );
 }
 
 }
diff --git a/zypp-core/zyppng/base/eventloop.h b/zypp-core/zyppng/base/eventloop.h
new file mode 100644 (file)
index 0000000..f836958
--- /dev/null
@@ -0,0 +1,73 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_BASE_EVENTLOOP_DEFINED
+#define ZYPP_BASE_EVENTLOOP_DEFINED
+
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/Signals>
+#include <zypp-core/zyppng/base/Base>
+
+// CONTINUE WITH THREAD DATA AND PUT THE DISPATCHER INSTANCE THERE!
+
+namespace zyppng {
+
+  class EventDispatcher;
+  class EventLoopPrivate;
+
+  /*!
+   * The EventDispatcher class implements the libzypp event loop.
+   *
+   * A event loop is used to execute multiple tasks concurrently. This is not implemented using threads but usually by either
+   * using Timers to poll a ressource or by reacting on events from a file descriptor or socket.
+   * In a application like zypper where we make use of I/O heavy tasks like downloading packages, rebuilding the repo metadata
+   * or generating a checksum over a file the application needs to wait more for those tasks to finish than actually doing anything.
+   * By using a event loop we can start one of those tasks and let the OS handle the execution and subscribe to certain events that can happen,
+   * utilizing more of the CPU compared to starting all the tasks serially.
+   *
+   */
+  class LIBZYPP_NG_EXPORT EventLoop : public Base
+  {
+    ZYPP_DECLARE_PRIVATE(EventLoop)
+
+  public:
+    using Ptr = std::shared_ptr<EventLoop>;
+    using WeakPtr = std::shared_ptr<EventLoop>;
+
+    static Ptr create ();
+    virtual ~EventLoop();
+
+    /*!
+     * Start dispatching events, this function will block until \sa quit was called for the EventLoop instance
+     */
+    void run ();
+
+    /*!
+     * Stop dispatching events and return control from the run function
+     */
+    void quit ();
+
+
+    /*!
+     * Returns the event dispatcher used by the MainLoop instance
+     */
+    std::shared_ptr<EventDispatcher> eventDispatcher () const;
+
+  private:
+    EventLoop();
+
+  };
+
+}
+
+#endif
diff --git a/zypp-core/zyppng/base/eventloop_glib.cc b/zypp-core/zyppng/base/eventloop_glib.cc
new file mode 100644 (file)
index 0000000..6f20dcd
--- /dev/null
@@ -0,0 +1,47 @@
+#include "private/eventloop_glib_p.h"
+#include <zypp-core/zyppng/base/EventDispatcher>
+
+namespace zyppng {
+
+  EventLoopPrivate::EventLoopPrivate( EventLoop &p ) : BasePrivate( p )
+  { }
+
+  ZYPP_IMPL_PRIVATE(EventLoop)
+
+  EventLoop::EventLoop()
+    : Base ( * new EventLoopPrivate(*this) )
+  {
+    Z_D();
+    d->_dispatcher = ThreadData::current().ensureDispatcher();
+    d->_loop = g_main_loop_new( reinterpret_cast<GMainContext*>(d->_dispatcher->nativeDispatcherHandle()), false );
+  }
+
+  EventLoop::~EventLoop()
+  {
+    g_main_loop_unref( d_func()->_loop );
+  }
+
+  EventLoop::Ptr EventLoop::create()
+  {
+    return Ptr( new EventLoop() );
+  }
+
+  void EventLoop::run()
+  {
+    Z_D();
+    g_main_context_push_thread_default( reinterpret_cast<GMainContext*>(d->_dispatcher->nativeDispatcherHandle()) );
+    g_main_loop_run( d->_loop );
+    d->_dispatcher->clearUnrefLaterList();
+    g_main_context_pop_thread_default( reinterpret_cast<GMainContext*>(d->_dispatcher->nativeDispatcherHandle()) );
+  }
+
+  void EventLoop::quit()
+  {
+    g_main_loop_quit( d_func()->_loop );
+  }
+
+  std::shared_ptr<EventDispatcher> EventLoop::eventDispatcher() const
+  {
+    return d_func()->_dispatcher;
+  }
+}
diff --git a/zypp-core/zyppng/base/linuxhelpers.cc b/zypp-core/zyppng/base/linuxhelpers.cc
new file mode 100644 (file)
index 0000000..ad5800a
--- /dev/null
@@ -0,0 +1,83 @@
+#include "private/linuxhelpers_p.h"
+
+#include <zypp-core/zyppng/io/SockAddr>
+#include <zypp-core/zyppng/base/Timer>
+
+#include <pthread.h>
+#include <csignal>
+#include <iostream>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+
+namespace zyppng {
+
+  bool blockSignalsForCurrentThread( const std::vector<int> &sigs )
+  {
+    sigset_t set;
+    ::sigemptyset(&set);
+    for ( const int sig : sigs )
+      ::sigaddset( &set, sig );
+
+    int res = ::pthread_sigmask(SIG_BLOCK, &set, NULL);
+    return ( res == 0 );
+  }
+
+  bool trySocketConnection( int &sockFD, const SockAddr &addr, uint64_t timeout )
+  {
+    int res = -1;
+    const auto opStarted = zyppng::Timer::now();
+    do {
+      res = zyppng::eintrSafeCall( ::connect, sockFD, addr.nativeSockAddr(), addr.size() );
+      if ( res < 0 && errno != ECONNREFUSED && errno != EADDRNOTAVAIL ) {
+        ERR << "Connection failed with error: " << errno << " " << zyppng::strerr_cxx( errno ) << std::endl;
+        ::close( sockFD );
+        sockFD = -1;
+        return false;
+      }
+    } while ( res == -1 && zyppng::Timer::elapsedSince( opStarted ) < timeout );
+    return ( res == 0 );
+  }
+
+  void renumberFd (int origfd, int newfd)
+  {
+    // It may happen that origfd is already the one we want
+    // (Although in our circumstances, that would mean somebody has closed
+    // our stdin or stdout... weird but has appened to Cray, #49797)
+    if (origfd != newfd)
+    {
+      dup2 (origfd, newfd);
+      ::close (origfd);
+    }
+  }
+
+  int bytesAvailableOnFD(int fd)
+  {
+    int value;
+    if ( ioctl( fd, FIONREAD, &value) >= 0 )
+      return value;
+
+    return 0;
+  }
+
+  std::optional<Pipe> Pipe::create( int flags )
+  {
+    int pipeFds[]={ -1, -1 };
+
+#ifdef HAVE_PIPE2
+    if ( ::pipe2( pipeFds, flags ) != 0 )
+      return {};
+#else
+    if ( ::pipe( pipeFds ) != 0 )
+      return {};
+    if ( flags != 0 ) {
+      ::fcntl( pipeFds[0], F_SETFD, flags );
+      ::fcntl( pipeFds[1], F_SETFD, flags );
+    }
+#endif
+    return Pipe {
+      .readFd  = zypp::AutoFD( pipeFds[0] ),
+      .writeFd = zypp::AutoFD( pipeFds[1] )
+    };
+  }
+}
@@ -15,7 +15,7 @@
 #define ZYPPNG_BASE_PRIVATE_ABSTRACTEVENTSOURCE_P_H_INCLUDED
 
 #include "base_p.h"
-#include <zypp/zyppng/base/eventdispatcher.h>
+#include <zypp-core/zyppng/base/eventdispatcher.h>
 
 namespace zyppng {
 
@@ -24,7 +24,7 @@ class AbstractEventSourcePrivate : public BasePrivate
   ZYPP_DECLARE_PUBLIC(AbstractEventSource)
 
 public:
-  AbstractEventSourcePrivate();
+  AbstractEventSourcePrivate( AbstractEventSource &p );
   std::weak_ptr<EventDispatcher> _ev;
 };
 
similarity index 57%
rename from zypp/zyppng/base/private/base_p.h
rename to zypp-core/zyppng/base/private/base_p.h
index f8c3c61..e39b3e5 100644 (file)
@@ -1,10 +1,11 @@
 #ifndef ZYPP_NG_BASE_PRIVATE_BASE_P_H_INCLUDED
 #define ZYPP_NG_BASE_PRIVATE_BASE_P_H_INCLUDED
 
-#include <zypp/zyppng/base/zyppglobal.h>
-#include <zypp/zyppng/base/base.h>
-#include <zypp/zyppng/base/signals.h>
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/base.h>
+#include <zypp-core/zyppng/base/signals.h>
 #include <unordered_set>
+#include <thread>
 
 namespace zyppng
 {
@@ -13,10 +14,15 @@ namespace zyppng
   {
     ZYPP_DECLARE_PUBLIC(Base)
   public:
+    BasePrivate ( Base &b ) : z_ptr(&b){}
     virtual ~BasePrivate();
+
+    virtual void init ();
+
     Base::WeakPtr parent;
     std::unordered_set< Base::Ptr > children;
     Base *z_ptr = nullptr;
+    std::thread::id threadId = std::this_thread::get_id();
   };
 
 }
@@ -2,7 +2,7 @@
 #define ZYPP_BASE_EVENTDISPATCHER_GLIB_P_DEFINED
 
 #include "base_p.h"
-#include <zypp/zyppng/base/eventdispatcher.h>
+#include <zypp-core/zyppng/base/eventdispatcher.h>
 #include <glib.h>
 #include <thread>
 #include <unordered_map>
@@ -26,8 +26,8 @@ struct GUnixPollFD
 struct GAbstractEventSource
 {
   GSource source;
-  AbstractEventSource *eventSource;
   EventDispatcherPrivate *_ev;
+  AbstractEventSource *eventSource;
   std::vector<GUnixPollFD> pollfds;
 
   static gboolean prepare(GSource *, gint *timeout);
@@ -57,18 +57,33 @@ struct GLibTimerSource
   static void destruct ( GLibTimerSource *src );
 };
 
+struct GlibWaitPIDData
+{
+  GlibWaitPIDData( GPid pid );
+  GlibWaitPIDData( GlibWaitPIDData &&other );
+  ~GlibWaitPIDData();
+
+  GlibWaitPIDData & operator= ( GlibWaitPIDData &&other );
+
+  guint tag = 0;
+  GSource *source = nullptr;
+  EventDispatcher::WaitPidCallback callback;
+};
+
 class EventDispatcherPrivate : public BasePrivate
 {
-public:
   ZYPP_DECLARE_PUBLIC(EventDispatcher)
-  EventDispatcherPrivate( GMainContext *ctx );
+public:
+  EventDispatcherPrivate( GMainContext *ctx, EventDispatcher &p );
   virtual ~EventDispatcherPrivate();
 
   bool runIdleTasks();
   void enableIdleSource ();
 
+  static std::shared_ptr<EventDispatcher> create ( );
+  static void waitPidCallback ( GPid pid, gint status, gpointer user_data );
+
   std::thread::id _myThreadId;
-  GMainLoop *_loop = nullptr;
   GMainContext *_ctx = nullptr;
 
   GSource *_idleSource  = nullptr;
@@ -77,6 +92,7 @@ public:
   std::vector<GAbstractEventSource *> _eventSources;
   std::vector< std::shared_ptr<void> > _unrefLater;
   std::queue< EventDispatcher::IdleFunction > _idleFuncs;
+  std::unordered_map<int, GlibWaitPIDData> _waitPIDs;
 };
 
 }
diff --git a/zypp-core/zyppng/base/private/eventloop_glib_p.h b/zypp-core/zyppng/base/private/eventloop_glib_p.h
new file mode 100644 (file)
index 0000000..39df198
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef ZYPP_BASE_EVENTLOOP_GLIB_P_DEFINED
+#define ZYPP_BASE_EVENTLOOP_GLIB_P_DEFINED
+
+#include "base_p.h"
+#include "threaddata_p.h"
+#include <zypp-core/zyppng/base/eventloop.h>
+#include <glib.h>
+
+namespace zyppng {
+
+  class EventLoopPrivate : public BasePrivate
+  {
+    ZYPP_DECLARE_PUBLIC(EventLoop)
+  public:
+    EventLoopPrivate ( EventLoop &p );
+
+    std::shared_ptr<EventDispatcher> _dispatcher;
+    GMainLoop *_loop = nullptr;
+
+  };
+
+}
+
+
+#endif
diff --git a/zypp-core/zyppng/base/private/linuxhelpers_p.h b/zypp-core/zyppng/base/private/linuxhelpers_p.h
new file mode 100644 (file)
index 0000000..030e6c6
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef ZYPP_BASE_LINUXHELPERS_P_H_DEFINED
+#define ZYPP_BASE_LINUXHELPERS_P_H_DEFINED
+
+#include <string>
+#include <optional>
+#include <zypp-core/zyppng/core/ByteArray>
+#include <zypp-core/AutoDispose.h>
+#include <errno.h>
+
+namespace zyppng {
+
+  class SockAddr;
+
+  inline std::string strerr_cxx ( const int err = -1 ) {
+    ByteArray strBuf( 1024, '\0' );
+    strerror_r( err == -1 ? errno : err , strBuf.data(), strBuf.size() );
+    return std::string( strBuf.data() );
+  }
+
+  template<typename Fun, typename... Args >
+  auto eintrSafeCall ( Fun &&function, Args&&... args ) {
+    int res;
+    do {
+      res = std::forward<Fun>(function)( std::forward<Args>(args)... );
+    } while ( res == -1 && errno == EINTR );
+    return res;
+  }
+
+  bool blockSignalsForCurrentThread ( const std::vector<int> &sigs );
+
+  bool trySocketConnection (int &sockFD, const SockAddr &addr, uint64_t timeout );
+
+  // origfd will be accessible as newfd and closed (unless they were equal)
+  void renumberFd (int origfd, int newfd);
+
+  /*!
+   * Tries to use the FIONREAD ioctl to detect how many bytes are available on a file descriptor,
+   * this can fail and return 0 so just use it as a indicator on how many bytes are pending
+   */
+  int bytesAvailableOnFD ( int fd );
+
+  /*!
+   * Small helper struct around creating a Unix pipe to ensure RAII with pipes
+   */
+  struct Pipe {
+    zypp::AutoFD readFd;
+    zypp::AutoFD writeFd;
+    static std::optional<Pipe> create ( int flags = 0 );
+
+    void unrefWrite( ) {
+      writeFd = -1;
+    }
+
+    void unrefRead( ) {
+      readFd = -1;
+    }
+  };
+}
+
+#endif // LINUXHELPERS_P_H
diff --git a/zypp-core/zyppng/base/private/threaddata_p.h b/zypp-core/zyppng/base/private/threaddata_p.h
new file mode 100644 (file)
index 0000000..98e7e2b
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef ZYPP_BASE_THREADDATA_P_DEFINED
+#define ZYPP_BASE_THREADDATA_P_DEFINED
+
+#include <memory>
+#include <thread>
+#include <string>
+
+namespace zyppng
+{
+  class EventDispatcher;
+
+  struct ThreadData
+  {
+    static ThreadData &current();
+
+    template<typename T>
+    void setName( T &&name ) {
+      _threadName = std::forward<T>( name );
+      syncNativeName();
+    }
+
+    const std::string &name() const;
+
+    std::shared_ptr<EventDispatcher> dispatcher()
+    { return _dispatcher.lock(); }
+    std::shared_ptr<EventDispatcher> ensureDispatcher();
+    void setDispatcher( const std::shared_ptr<EventDispatcher> &disp );
+
+
+  private:
+    void syncNativeName();
+    ThreadData();
+
+  private:
+    std::thread::id _threadId;
+    mutable std::string _threadName;   ///< lazy initialized to _threadId if unset
+    std::thread::native_handle_type _nativeHandle;
+    std::weak_ptr<EventDispatcher> _dispatcher;
+  };
+
+  ThreadData& threadData();
+}
+
+
+#endif
diff --git a/zypp-core/zyppng/base/signals.h b/zypp-core/zyppng/base/signals.h
new file mode 100644 (file)
index 0000000..7f3656d
--- /dev/null
@@ -0,0 +1,377 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_BASE_SIGNALS_H_INCLUDED
+#define ZYPP_NG_BASE_SIGNALS_H_INCLUDED
+
+#ifdef ENABLE_SYWU
+#include <sywu/signal.hpp>
+#else
+#include <sigc++/trackable.h>
+#include <sigc++/signal.h>
+#include <sigc++/connection.h>
+#include <sigc++/visit_each.h>
+#include <sigc++/adaptors/adaptors.h>
+#endif
+#include <memory>
+#include <utility>
+#include <cassert>
+#include <zypp-core/base/Exception.h>
+#include <zypp-core/base/LogControl.h>
+
+/*!
+ * \file signals.h
+ *
+ * This file implements the signal and slot concept in libzypp.
+ *
+ * Signals and slots are basically a implementation of the observer pattern which makes it possible
+ * for objects to work together without them having to know about each other by connecting the
+ * signals of one object to the slots of another. Whenever the object owning the signal
+ * emits said signal, all connected slots are executed. This is especially helpful in async environments
+ * where we need to react on specific events like timers or filedescriptor events that can
+ * happen at any time during execution.
+ *
+ * Using signals and slots in libzypp requires the developer to make sure
+ * that all objects that are used in the signal chain can not be deleted
+ * during emission, for example a Socket emitting the closed() signal might result in
+ * its deletion. This is usually made sure by taking a reference to the sender object
+ * via shared_ptr, e.g. the \ref EventLoop does this for all \ref AbstractEventSource 's that are
+ * registered to receive events using shared_from_this.
+ *
+ * To have signals in a Object its recommended to subclass the Type from \ref zyppng::Base
+ * and always have the objects in a \ref std::shared_ptr.
+ * \ref zyppng::Base provides the \ref zyppng::Base::connect and \ref zyppng::Base::connectFunc
+ * helpers to connect signals and slots. Connections made with those helpers will make sure the
+ * receiving objects are properly locked.
+ *
+ * The \ref zyppng::Base::connect helper function can be used to connect a signal that is hosted by a \ref zyppng::Base
+ * derived type to a slot hosted by a \ref zyppng::Base derived type. No special care needs to be taken to make sure
+ * the receiver object is locked since the function is handling all the details about that:
+ * \code
+ * class Receiver : public zyppng::Base
+ * {
+ * public:
+ *   static std::shared_ptr<Receiver> create();
+ *   void writeOnTimeout() {
+ *    std::cout << "Hello World" << std::endl;
+ *   }
+ * }
+ *
+ * auto evLoop   = zyppng::EventLoop::create();
+ * auto sender   = zyppng::Timer::create();
+ * auto receiver = Receiver::create();
+ *
+ * // invoking the static Base::connect() function will make sure receiver is locked, the sender will be locked by the
+ * // eventloop triggering the timeout
+ * sender->connect( *sender, &zyppng::Timer::sigExpired, *receiver, &Receiver::writeOnTimeout );
+ * sender->start(1000);
+ * evLoop->run();
+ * \endcode
+ *
+ * The \ref zyppng::Base::connect helper function can be used to connect a signal that is hosted by a \ref zyppng::Base
+ * derived type to a lambda type slot, commonly used when the developer wants to have the code that is invoked by the signal
+ * right where the slot is connected, to make the code easier to read or when the slot code is not reused anywhere else.
+ *
+ * In this example the receiver object uses a slot to invoke the actual function that handles the event. Since we only connect
+ * a lambda that invokes the writeOnTimeout function using a caputured \a this pointer we need to manually take care of locking the receiver object during the
+ * slot invocation by passing it as a extra argument after the lambda. While the code would compile without doing that we
+ * introduce a bug that is very hard to track down because the subsequent signal emitted from the receiver object causes it to be deleted,
+ * making the code fail afterwards.
+ * \code
+ * class Receiver : public zyppng::Base
+ * {
+ * public:
+ *   static std::shared_ptr<Receiver> create();
+ *
+ *   void connectToTimer ( std::shared_ptr<Timer> &p ) {
+ *     p->connectFunc( *sender, &zyppng::Timer::sigExpired, [ this ](){
+ *       onTimeout();
+ *     }, *this );
+ *   }
+ *
+ *   SignalProxy<void()> sigGotTimeout() {
+ *    return _sigGotTimeout;
+ *   }
+ *
+ * private:
+ *   void onTimeout() {
+ *    std::cout << "Hello World" << std::endl;
+ *    // emits a subsequent signal
+ *    _sigGotTimeout.emit();
+ *
+ *    // calls another function on this after emitting the signal
+ *    // in cases where our instance was not locked by the caller and
+ *    // a slot that received our signal released the last reference to us
+ *    // this will run into a segfault
+ *    this->doSomethingElse();
+ *   }
+ *   void doSomethingElse() {
+ *    std::cout << "Something else" << std::endl;
+ *   }
+ *   Signal<void()> _sigGotTimeout;
+ * }
+ *
+ * auto evLoop   = zyppng::EventLoop::create();
+ * auto sender   = zyppng::Timer::create();
+ * auto receiver = Receiver::create();
+ *
+ * // invoking the static Base::connect() function will make sure receiver is locked, the sender will be locked by the
+ * // eventloop triggering the timeout
+ * receiver->connectToTimer( sender );
+ *
+ * // release the receiver after the timeout was triggered
+ * receiver->connectFunc( *receiver, &Receiver::sigGotTimeout, [ &receiver ](){
+ *   // releasing the receiver Object once the timer was triggered once. If the object
+ *   // is not properly referenced during signal emission we will run into a SEGFAULT
+ *   receiver.reset();
+ * });
+ *
+ * sender->start( 1000 );
+ * evLoop->run();
+ * \endcode
+ */
+namespace zyppng {
+
+
+  /*!
+   * \class Signal
+   * Simple signal that can be invoked with the given arguments.
+   */
+  template <class R, class... T>
+  class Signal;
+
+  /*!
+   * \class MemSignal
+   * This is a special type of signal that takes a reference to the sender
+   * object during signal emission. This is only required in cases where
+   * sending a signal might delete the sender and no external object holds a reference to it.
+   */
+  template <class SignalHost, typename ReturnType, typename... Arguments>
+  class MemSignal;
+
+  class Base;
+  class BasePrivate;
+
+#ifdef ENABLE_SYWU
+  using connection = sywu::Connection;
+
+  template <class R, class... T>
+  using SignalProxyBase = sywu::SignalConceptImpl<R(T...)>;
+
+  template <class R, class... T>
+  class Signal<R(T...)> : public sywu::Signal<R(T...)>
+  { };
+
+  template <class SignalHost, typename ReturnType, typename... Arguments>
+  class MemSignal<SignalHost, ReturnType(Arguments...)> : public sywu::MemberSignal<SignalHost, ReturnType(Arguments...)>
+  { };
+
+#else
+  using connection = sigc::connection;
+  using trackable  = sigc::trackable;
+  using sigc::track_obj;
+
+  template <class R, class... T>
+  using SignalProxyBase = sigc::signal<R(T...)>;
+
+
+  template <class R, class... T>
+  class Signal<R(T...)> : public sigc::signal<R(T...)>
+  {
+  public:
+    ~Signal() {
+      assert(this->impl()->exec_count_ == 0);
+      if ( this->impl()->exec_count_ > 0 ) {
+        WAR << "Deleting Signal during emission, this is usually a BUG, Slots will be blocked to prevent SIGSEGV." << std::endl;
+#ifdef LIBZYPP_USE_SIGC_BLOCK_WORKAROUND
+        // older sigc versions will segfault if clear() is called in signal emission
+        // we use block instead in those cases which seems to have the same result
+        // since we do not use the slot instances explicitely that _should_ not have side effects
+        // https://bugzilla.gnome.org/show_bug.cgi?id=784550
+        this->block();
+        return;
+#endif
+      }
+
+      this->clear();
+    }
+  };
+
+  template <class SignalHost, typename ReturnType, typename... Arguments>
+  class MemSignal<SignalHost, ReturnType(Arguments...)> : public sigc::signal<ReturnType(Arguments...)>
+  {
+  public:
+    MemSignal ( SignalHost &host ) : _host(host) {}
+
+    ~MemSignal() {
+
+      assert(this->impl()->exec_count_ == 0);
+      if ( this->impl()->exec_count_ > 0 ) {
+        WAR << "Deleting MemSignal during emission, this is definitely a BUG, Slots will be blocked to prevent SIGSEGV." << std::endl;
+#ifdef LIBZYPP_USE_SIGC_BLOCK_WORKAROUND
+        // older sigc versions will segfault if clear() is called in signal emission
+        // we use block instead in those cases which seems to have the same result
+        // since we do not use the slot instances explicitely that _should_ not have side effects
+        // https://bugzilla.gnome.org/show_bug.cgi?id=784550
+        this->block();
+        return;
+#endif
+      }
+      this->clear();
+    }
+
+    template<typename... Args>
+    auto emit( Args&& ...arg ) const {
+      auto ref = _host.shared_from_this();
+      return sigc::signal<ReturnType(Arguments...)>::emit( std::forward<Args>(arg)...);
+    }
+
+    template<typename... Args>
+    auto operator()( Args&& ...arg ) const {
+      //auto ref = _host.shared_from_this();
+      return sigc::signal<ReturnType(Arguments...)>::operator()( std::forward<Args>(arg)...);
+    }
+
+  private:
+    SignalHost &_host;
+  };
+
+  namespace internal {
+
+    /*!
+     * Helper tool that always locks the public object in case a BasePrivate derived type
+     * is passed.
+     */
+    template <typename T>
+    inline auto lock_shared_makeLock ( const T& locker ) {
+      try {
+        if constexpr ( std::is_base_of_v<BasePrivate, T> ) {
+          return locker.z_func()->shared_from_this();
+        } else {
+          return locker.shared_from_this();
+        }
+      }  catch (  const std::bad_weak_ptr &e ) {
+        ZYPP_CAUGHT( e );
+        ZYPP_THROW( e );
+      }
+    }
+
+    /*!
+     * Adaptor that locks and tracks the given objects, this implements locking
+     * of the receiver object in a signal chain.
+     */
+    template <typename T_functor, typename ...Lockers>
+    struct lock_shared : public sigc::adapts<T_functor>
+    {
+      template <typename... Args>
+      decltype(auto) operator()( Args&&... args ) const {
+
+        try {
+          auto __attribute__ ((__unused__)) lck = std::apply( []( auto&... lockers ) {
+            return std::make_tuple( lock_shared_makeLock( lockers.invoke() )... );
+          }, _lcks );
+
+          // seems the overloaded function templates in sigc++2 force us to fully specify the overload
+          // we want to use. std::invoke() fails in that case.
+          //return std::invoke( this->functor_, std::forward<Args>(args)... );
+          if constexpr ( sizeof... (Args) == 0 ) {
+            return this->functor_();
+          } else {
+            return this->functor_.template operator()<decltype ( std::forward<Args>(args) )...> ( std::forward<Args>(args)... );
+          }
+        }  catch ( const std::bad_weak_ptr &e ) {
+          ZYPP_CAUGHT( e );
+          ERR << "Ignoring signal emit due to a bad_weak_ptr exception during object locking. Maybe the signal was sent to a object that is currently destructing?" << std::endl;
+#ifndef ZYPP_NDEBUG
+          assert( false );
+#endif
+          if constexpr ( !std::is_same_v<void, typename sigc::adapts<T_functor>::result_type> )
+            return typename sigc::adapts<T_functor>::result_type{};
+          else
+            return;
+        }
+      }
+
+      // Constructs a my_adaptor object that wraps the passed functor.
+      // Initializes adapts<T_functor>::functor_, which is invoked from operator()().
+      explicit lock_shared( const T_functor& functor, const Lockers&... lcks ) :
+        sigc::adapts<T_functor>(functor),
+        _lcks( lcks... )
+      {}
+
+      std::tuple<sigc::const_limit_reference<Lockers>...> _lcks;
+    };
+
+    template< typename Functor, typename ...Obj >
+    inline decltype(auto) locking_fun( const Functor &f, const Obj&... o )
+    {
+      return lock_shared<Functor, Obj...>( f, o...);
+    }
+
+  }
+#endif
+
+  template <class R, class... T>
+  class SignalProxy;
+
+  /**
+     * Hides the signals emit function from external code.
+     *
+     * \note based on Glibmms SignalProxy code
+     */
+  template <class R, class... T>
+  class SignalProxy<R(T...)>
+  {
+  public:
+    using SignalType = SignalProxyBase<R,T...>;
+
+    SignalProxy ( SignalType &sig ) : _sig ( sig ) {}
+
+    /**
+     * Forwards the arguments to the internal connect function of the signal type
+     */
+    template <typename... Args>
+    connection connect( Args&&... slot )
+    {
+      return _sig.connect( std::forward<Args>(slot)... );
+    }
+
+  private:
+    SignalType &_sig;
+  };
+
+}
+
+#ifndef ENABLE_SYWU
+//
+// Specialization of sigc::visitor for lock_shared.
+namespace sigc
+{
+  template <typename T_functor, typename ...Lockers>
+  struct visitor<zyppng::internal::lock_shared<T_functor, Lockers...> >
+  {
+    template <typename T_action>
+    static void do_visit_each(const T_action& action,
+      const zyppng::internal::lock_shared<T_functor, Lockers...>& target)
+    {
+      sigc::visit_each(action, target.functor_);
+      std::apply( [&]( auto&... a) {
+        ((void)sigc::visit_each(action, a),...);
+      }, target._lcks );
+
+    }
+  };
+} // end namespace sigc
+#endif
+
+#endif // ZYPP_NG_CORE_SIGNALS_H_INCLUDED
similarity index 71%
rename from zypp/zyppng/base/socketnotifier.cc
rename to zypp-core/zyppng/base/socketnotifier.cc
index 36d784d..641c80e 100644 (file)
@@ -8,7 +8,10 @@ class SocketNotifierPrivate : public AbstractEventSourcePrivate
   ZYPP_DECLARE_PUBLIC(SocketNotifier)
 public:
 
-  signal<void (const SocketNotifier &, int)> _activated;
+  SocketNotifierPrivate ( SocketNotifier &p ) :
+    AbstractEventSourcePrivate(p){}
+
+  Signal< void (const SocketNotifier &, int)> _activated;
 
   int _socket = -1;
   int _mode = SocketNotifier::Read;
@@ -16,19 +19,22 @@ public:
 
 };
 
-SocketNotifier::SocketNotifier (int socket, int evTypes , bool enable)
-  : AbstractEventSource ( * new SocketNotifierPrivate )
+
+ZYPP_IMPL_PRIVATE( SocketNotifier )
+
+SocketNotifier::SocketNotifier (int socket, int evTypes )
+  : AbstractEventSource ( * new SocketNotifierPrivate( *this ) )
 {
   Z_D();
   d->_socket = socket;
   d->_mode = evTypes;
-
-  setEnabled( enable );
 }
 
 SocketNotifier::Ptr SocketNotifier::create(int socket, int evTypes, bool enable )
 {
-  return std::shared_ptr<SocketNotifier>( new SocketNotifier( socket, evTypes, enable ) );
+  auto ptr = std::shared_ptr<SocketNotifier>( new SocketNotifier( socket, evTypes ) );
+  ptr->setEnabled( enable );
+  return ptr;
 }
 
 void SocketNotifier::setMode(int mode)
@@ -74,7 +80,7 @@ SignalProxy<void (const SocketNotifier &, int)> SocketNotifier::sigActivated()
 
 void SocketNotifier::onFdReady( int, int events )
 {
-  d_func()->_activated( *this, events );
+  d_func()->_activated.emit( *this, events );
 }
 
 void SocketNotifier::onSignal( int )
similarity index 91%
rename from zypp/zyppng/base/socketnotifier.h
rename to zypp-core/zyppng/base/socketnotifier.h
index 2ab702e..f98e312 100644 (file)
 *
 */
 
-#include <zypp/zyppng/base/zyppglobal.h>
-#include <zypp/zyppng/base/AbstractEventSource>
-#include <zypp/zyppng/base/Signals>
+#ifndef ZYPPNG_BASE_SOCKETNOTIFIER_H_DEFINED
+#define ZYPPNG_BASE_SOCKETNOTIFIER_H_DEFINED
+
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/AbstractEventSource>
+#include <zypp-core/zyppng/base/Signals>
 
 namespace zyppng {
 class SocketNotifierPrivate;
@@ -29,7 +32,7 @@ class SocketNotifierPrivate;
  *
  * \code
  * // Example code that uses a pipe() to communicate between a thread and the main loop
- * zyppng::EventDispatcher::Ptr loop = zyppng::EventDispatcher::createMain();
+ * zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create();
  *
  * int wakeupPipe[2] = { -1, -1 };
  * pipe2 ( wakeupPipe, O_NONBLOCK );
@@ -108,7 +111,7 @@ public:
   SignalProxy<void (const SocketNotifier &sock, int evTypes)> sigActivated();
 
 protected:
-  SocketNotifier( int socket, int evTypes, bool enable  );
+  SocketNotifier( int socket, int evTypes  );
 
   // AbstractEventSource interface
 public:
@@ -117,3 +120,5 @@ public:
 };
 
 }
+
+#endif
diff --git a/zypp-core/zyppng/base/statemachine.h b/zypp-core/zyppng/base/statemachine.h
new file mode 100644 (file)
index 0000000..2735db0
--- /dev/null
@@ -0,0 +1,597 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_BASE_STATEMACHINE_INCLUDED_H
+#define ZYPP_NG_BASE_STATEMACHINE_INCLUDED_H
+
+#include <zypp-core/zyppng/base/signals.h>
+#include <zypp-core/zyppng/base/Base>
+
+#include <variant>
+#include <tuple>
+#include <functional>
+#include <memory>
+#include <optional>
+
+namespace zyppng {
+
+  namespace detail {
+
+    template <typename T>
+    using EventSource = SignalProxy<void()> (T::*)();
+
+    /**
+     * \internal
+     * Internal helper type to wrap the user implemented state types.
+     * It's mostly used to have a container for the Transitions that belong to the State.
+     */
+    template < class State, class Transitions >
+    struct StateWithTransitions {
+      using StateType = State;
+      Transitions _transitions;
+
+      template< typename StateMachine >
+      StateWithTransitions ( StateMachine &sm ) : _ptr ( std::make_shared<State>( sm )) { }
+      StateWithTransitions ( std::shared_ptr<State> &&s ) : _ptr ( std::move(s) ) {}
+
+      // move construction is ok
+      StateWithTransitions ( StateWithTransitions &&other ) = default;
+      StateWithTransitions &operator= ( StateWithTransitions &&other ) = default;
+
+      // no copy construction
+      StateWithTransitions ( const StateWithTransitions &other ) = delete;
+      StateWithTransitions &operator= ( const StateWithTransitions &other ) = delete;
+
+      static constexpr auto stateId = State::stateId;
+      static constexpr bool isFinal = State::isFinal;
+
+      void enter( ) {
+        return _ptr->enter( );
+      }
+
+      void exit( ) {
+        return _ptr->exit( );
+      }
+
+      std::shared_ptr<State> wrappedState () {
+        return _ptr;
+      }
+
+      const std::shared_ptr<State> wrappedState () const {
+        return _ptr;
+      }
+
+    private:
+      // we need to use a std::shared_ptr here so we can correctly reference the object during signal emission
+      std::shared_ptr<State> _ptr;
+    };
+
+
+    /**
+     * this adds the type \a NewType to the collection if the condition is true
+     */
+    template < template<typename...> typename Templ , typename NewType, typename TupleType, bool condition >
+    struct add_type_to_collection;
+
+    template < template<typename...> typename Templ, typename NewType, typename ...Types >
+    struct add_type_to_collection< Templ, NewType, Templ<Types...>, true > {
+      using Type = Templ<Types..., NewType>;
+    };
+
+    template < template<typename...> typename Templ, typename NewType, typename ...Types >
+    struct add_type_to_collection< Templ, NewType, Templ<Types...>, false > {
+      using Type = Templ<Types...>;
+    };
+
+    /**
+     * Constexpr function that evaluates to true if a variant type \a Variant already contains the type \a Type.
+     * The \a Compare argument can be used to change how equality of a type is calculated
+     */
+    template < typename Variant, typename Type, template<typename, typename> typename Compare = std::is_same, size_t I = 0 >
+    constexpr bool VariantHasType () {
+      // cancel the evaluation if we entered the last type in the variant
+      if constexpr ( I >= std::variant_size_v<Variant> ) {
+        return false;
+      } else {
+        // if the current type in the variant is the same as the one we are looking for evaluate to true
+        if ( Compare< std::variant_alternative_t< I, Variant>, Type >::value )
+          return true;
+
+        // otherwise call the next iteration with I+1
+        return VariantHasType<Variant, Type, Compare, I+1>();
+      }
+    }
+
+    /**
+     * collect all transitions that have the same SourceState as the first type argument
+     */
+    template< class State, class TupleSoFar, class Head, class ...Transitions >
+    struct collect_transitions_helper {
+      using NewTuple = typename add_type_to_collection< std::tuple, Head, TupleSoFar, std::is_same_v< State, typename Head::SourceType> >::Type;
+      using Type = typename collect_transitions_helper<State, NewTuple, Transitions...>::Type;
+    };
+
+    template< class State, class TupleSoFar, class Head >
+    struct collect_transitions_helper<State, TupleSoFar, Head > {
+      using Type = typename add_type_to_collection< std::tuple, Head, TupleSoFar, std::is_same_v< State, typename Head::SourceType> >::Type;
+    };
+
+    template< class State, class ...Transitions >
+    struct collect_transitions{
+      using Type = typename collect_transitions_helper< State, std::tuple<>, Transitions... >::Type;
+    };
+
+    /**
+     * Iterates over the list of Transitions and collects them all in a std::variant<State1, State2, ...> type
+     */
+    template <typename VariantSoFar, typename Head, typename ...Transitions>
+    struct make_state_set_helper {
+      using WithSource = typename add_type_to_collection< std::variant, typename Head::SourceType, VariantSoFar, !VariantHasType<VariantSoFar, typename Head::SourceType>() >::Type;
+      using WithTarget = typename add_type_to_collection< std::variant, typename Head::TargetType, WithSource, !VariantHasType<WithSource, typename Head::TargetType>() >::Type;
+      using Type = typename make_state_set_helper<WithTarget, Transitions...>::Type;
+    };
+
+    template <typename VariantSoFar, typename Head>
+    struct make_state_set_helper< VariantSoFar, Head > {
+      using WithSource = typename add_type_to_collection< std::variant, typename Head::SourceType, VariantSoFar, !VariantHasType<VariantSoFar, typename Head::SourceType>() >::Type;
+      using Type = typename add_type_to_collection< std::variant, typename Head::TargetType, WithSource, !VariantHasType<WithSource, typename Head::TargetType>() >::Type;
+    };
+
+    template <typename Head, typename ...Transitions>
+    struct make_state_set {
+      using InitialVariant = std::variant<typename Head::SourceType>;
+      using VariantSoFar = typename add_type_to_collection< std::variant, typename Head::TargetType, InitialVariant , !VariantHasType<InitialVariant, typename Head::TargetType>() >::Type;
+      using Type = typename make_state_set_helper< VariantSoFar, Transitions...>::Type;
+    };
+
+
+    /**
+     * Evaluates to true if type \a A and type \a B wrap the same State type
+     */
+    template <typename A, typename B>
+    struct is_same_state : public std::is_same< typename A::StateType, typename B::StateType> {};
+
+
+    /**
+     * Turns a State type into its StateWithTransitions counterpart
+     */
+    template <typename State, typename ...Transitions>
+    struct make_statewithtransition {
+      using Type = StateWithTransitions<State, typename collect_transitions<State, Transitions...>::Type>;
+    };
+
+    /**
+     * Iterates over each State in the \a StateVariant argument, collects the corresponding
+     * Transitions and combines the results in a std::variant< StateWithTransitions<...>,... > type.
+     */
+    template <typename VariantSoFar, typename StateVariant, typename ...Transitions>
+    struct make_statewithtransition_set_helper;
+
+    template <typename VariantSoFar, typename HeadState, typename ...State, typename ...Transitions>
+    struct make_statewithtransition_set_helper< VariantSoFar, std::variant<HeadState, State...>, Transitions... > {
+      using FullStateType = typename make_statewithtransition<HeadState, Transitions...>::Type;
+      using NewVariant = typename add_type_to_collection< std::variant, FullStateType, VariantSoFar, !VariantHasType<VariantSoFar, FullStateType/*, is_same_state */>()>::Type;
+      using Type = typename make_statewithtransition_set_helper< NewVariant, std::variant<State...>, Transitions...>::Type;
+    };
+
+    template <typename VariantSoFar, typename HeadState, typename ...Transitions >
+    struct make_statewithtransition_set_helper< VariantSoFar, std::variant<HeadState>, Transitions... > {
+      using FullStateType = typename make_statewithtransition<HeadState, Transitions...>::Type;
+      using Type = typename add_type_to_collection< std::variant, FullStateType, VariantSoFar, !VariantHasType<VariantSoFar, FullStateType /*, is_same_state */>()>::Type;
+    };
+
+    template <typename NoState, typename StateVariant, typename ...Transitions>
+    struct make_statewithtransition_set;
+
+    template <typename NoState, typename HeadState, typename ...States, typename ...Transitions>
+    struct make_statewithtransition_set< NoState, std::variant<HeadState, States...>, Transitions...>{
+      using FirstState = typename make_statewithtransition< HeadState, Transitions...>::Type;
+      using Type = typename make_statewithtransition_set_helper< std::variant<NoState, FirstState>, std::variant<States...>, Transitions...>::Type;
+    };
+  }
+
+  constexpr bool DefaultStateCondition(true);
+  constexpr std::nullptr_t DefaultStateTransition(nullptr);
+
+  /*!
+   * Defines a transition between \a Source and \a Target states.
+   * The EventSource \a ev triggers the transition from Source to Target if the condition \a Cond
+   * evaluates to true. The operation \a Op is called between exiting the old and entering the new state.
+   * It can be used to transfer informations from the old into the new state.
+   *
+   * \tparam Source defines the type of the Source state
+   * \tparam ev takes a member function pointer returning the event trigger signal that is used to trigger the transition to \a Target
+   * \tparam Target defines the type of the Target state
+   * \tparam Cond Defines the transition condition, can be used if the same event could trigger different transitions
+   *         based on a condition, this can also be set to a simple boolean true or false
+   * \tparam Op defines the transition operation from Source to Target states,
+   *         this is either a function with the signature:   std::unique_ptr<Target> ( Statemachine &, Source & )
+   *         or it can be a member function pointer of Source with the signature:  std::unique_ptr<Target> ( Source::* ) ( )
+   *
+   * \note   While it would be possible to implement the statemachine to operate only on non pointer types for the states ,
+   *         I chose to use std::unique_ptr<State> instead to make the handling of States with signals less error prone. Because even move
+   *         assigning a signal that has connected lambda slots which have captured the this pointer will break the code. While it could
+   *         be worked around to connect and disconnect signals in the enter() and exit() functions not doing so would crash the code. Leaving that
+   *         note here in case we want to change that behaviour in the future.
+   */
+  template <
+    typename Source,
+    detail::EventSource<Source> ev ,
+    typename Target,
+    auto Cond = DefaultStateCondition,
+    auto Op   = DefaultStateTransition >
+  struct Transition {
+
+    using SourceType = Source;
+    using TargetType = Target;
+
+
+    template< typename Statemachine >
+    std::shared_ptr<Target> operator() ( Statemachine &sm, Source &oldState ) {
+      using OpType = std::decay_t<decltype ( Op )>;
+      // check if we have a member function pointer
+      if constexpr (  std::is_member_function_pointer_v<OpType> ) {
+        return std::invoke( Op, &oldState );
+      } else if constexpr ( std::is_null_pointer_v<OpType> ) {
+        return std::make_shared<Target>(sm);
+      } else {
+        return std::invoke( Op, sm, oldState );
+      }
+    }
+
+    bool checkCondition ( Source &currentState ) {
+      using CondType = std::decay_t<decltype ( Cond )>;
+      if constexpr ( std::is_same_v<bool, CondType> ) {
+        return Cond;
+      } else if constexpr ( std::is_member_function_pointer_v<CondType> ) {
+        return std::invoke( Cond, &currentState );
+      } else {
+        return std::invoke( Cond, currentState );
+      }
+    }
+
+    SignalProxy< void() > eventSource ( Source *st ) {
+      return std::invoke( ev, st );
+    }
+
+    auto eventAccessor () const {
+      return ev;
+    }
+
+  };
+
+  /*!
+   * \brief This defines the actual StateMachine.
+   * \tparam Derived is the Statemachine subclass type, this is used to pass a reference to the actual implementation into the State functions.
+   * \tparam StateId should be a enum with a ID for each state the SM can be in.
+   * \tparam Transitions variadic template argument taking a list of all \ref Transition types the statemachine should support.
+   *         The First Source State in the Transitions List is always the initial state.
+   *
+   * Implementation of a simple signal based statemachine, each state is a user defined state type that has to implement a specific API in order to be compatible.
+   * No inheritance is required to use the statemachine and everything will be resolved at compile time.
+   *
+   * This is how a basic statemachine implementation would look like
+   *
+   * \code
+   *
+   * // Each state should have a representation in the enum
+   * enum States {
+   *  StateA,
+   *  StateB,
+   *  ...
+   * }
+   *
+   * class MyStateMachine;
+   * class State;
+   * class StateB;
+   * class StateC;
+   * class StateD;
+   *
+   * // states are just simple types with a few required functions, there is a helper class
+   * // SimpleState<> to help with the implementation
+   * class StateA {
+   *
+   *  // the ID of the state
+   *  static constexpr auto stateId = States::StateA;
+   *
+   *  // is this a final state?
+   *  static constexpr bool isFinal = false;
+   *
+   *  // constructor taking the parent statemachine type
+   *  StateA ( MyStateMachine &parent ) {}
+   *
+   *  // function called when the state is first entered
+   *  void enter() {}
+   *
+   *  // function called when the state is exited
+   *  void exit () {}
+   *
+   *  // a state that is not final needs event sources
+   *  SignalProxy<void()> sigTransition ();
+   *
+   *  // a state might even define a transition function to the target states
+   *  std::unique_ptr<StateB> transitionToB ();
+   *
+   *  // also condition functions can be defined in a state:
+   *  bool transitionToStateBCondition() const;
+   * }
+   *
+   * // transition functions can also be defined as free functions or static member functions with the signature:
+   * std::unique_ptr<StateC> transitionStateBToStateC ( MyStateMachine &sm, StateB &oldState );
+   *
+   * // condition functions can also be defined as free functions or static member functions with the signature:
+   * bool transitionStateAToStateDCondition( State &currentState );
+   *
+   *
+   * // implementing the statemachine itself, using a template helper for better readability:
+   * template <typename T>
+   * using SmBase     = zyppng::Statemachine<T, States,
+   *                                         zyppng::Transition< StateA, &StateA::sigTransition, StateB, &StateA::transitionToStateBCondition, &StateA::transitionToB,
+   *                                         zyppng::Transition< StateB, &StateB::sigTransition, StateC, zyppng::DefaultStateCondition, &transitionStateBToStateC >,
+   *                                         zyppng::Transition< StateB, &StateB::sigTransition, StateD >>;
+   *
+   * // by using CRTP we can have a reference to the concrete Statemachine type in the States, allowing us to be much
+   * // more flexible with the implementation, since all states can now access API exported by the MyStateMachine type.
+   * // since the Statemachine uses signals, make sure to derive it also from the \ref zyppng::Base type.
+   * class MyStateMachine : public SmBase<MyStateMachine>, public Base { };
+   *
+   * \endcode
+   *
+   * In order to advance the statemachine, each state will have at least one signal ( event ) that tells the statemachine to transition to the next state, optionally
+   * a condition can be used to block the transition in certain cases. When transitioning from one state to the other a transition operation will be called that
+   * creates the instance of the target state and do other initializations or can move data from the old to the new state. The default version of the operation just
+   * returns a new instance of the target state.
+   * If a signal or event is used multiple times to trigger transitions, only the first transition whose condition evaluates to true will be triggered. All other transitions
+   * with the same trigger signal will not be even evaluated.
+   *
+   * After instantiating the statemachine will be in a internal intial state, in order to move to the first user defined state \ref Statemachine::start must be called.
+   */
+  template < typename Derived, typename StateId, typename ...Transitions >
+  class Statemachine {
+
+    struct _InitialState{};
+
+  public:
+
+    using AllStates = typename detail::make_state_set< Transitions... >::Type;
+    using StateSetHelper = typename detail::make_statewithtransition_set< _InitialState, AllStates, Transitions... >;
+    using FState = typename StateSetHelper::FirstState;
+    using StateSet = typename StateSetHelper::Type;
+
+    using StatemachineType = Statemachine< Derived, StateId, Transitions...>;
+
+    public:
+      Statemachine () { }
+      virtual ~Statemachine() {}
+
+      /*!
+       * Advances the state machine into the initial state.
+       */
+      void start () {
+        if ( _state.index() == 0 || _isInFinalState ) {
+          _previousState.reset();
+          _isInFinalState = false;
+          enterState( FState( static_cast<Derived &>(*this) ) );
+        }
+      }
+
+      template <typename Func>
+      auto visitState ( Func && f ) {
+        return std::visit( [ func = std::forward<Func>(f) ] ( auto &s ) {
+          using T = std::decay_t<decltype (s)>;
+          if constexpr ( std::is_same_v< T, _InitialState > ) {
+            throw std::exception();
+          } else {
+            auto lock = s.wrappedState();
+            return ( func( *lock ) );
+          }
+        }, _state );
+      }
+
+      /*!
+       * Returns the current stateId of the state the SM is currently in.
+       * If called before start() was called the std::optional will be empty
+       */
+      std::optional<StateId> currentState () const {
+        return std::visit( []( const auto &s ) -> std::optional<StateId> {
+          using T = std::decay_t<decltype (s)>;
+          if constexpr ( std::is_same_v< T, _InitialState > ) {
+            return {};
+          } else {
+            return T::stateId;
+          }
+        }, _state );
+      }
+
+      /*!
+       * Returns the ID of the previous state, or a invalid optional if there
+       * was no previous state.
+       */
+      std::optional<StateId> previousState () const {
+        return _previousState;
+      }
+
+      /*!
+       * Returns a reference to the current state object, will throw a exception
+       * if the passed state type does not match the current states type.
+       */
+      template<typename T>
+      std::shared_ptr<T> state () {
+        using WrappedEventType = typename detail::make_statewithtransition< std::decay_t<T>, Transitions...>::Type;
+        return std::get<WrappedEventType>( _state ).wrappedState();
+      }
+
+      /*!
+       * Returns a reference to the current state object, will throw a exception
+       * if the passed state type does not match the current states type.
+       */
+      template<typename T>
+      const std::shared_ptr<T> state () const {
+        using WrappedEventType = typename detail::make_statewithtransition< std::decay_t<T>, Transitions...>::Type;
+        return std::get<WrappedEventType>( _state ).wrappedState();
+      }
+
+      /*!
+       * Forces the statemachine to enter a specific state, a transition operation will not
+       * be executed, but the exit() function of the current state will be called.
+       */
+      template <typename NewState >
+      void forceState ( std::unique_ptr<NewState> &&nS ) {
+        using WrappedSType = typename detail::make_statewithtransition< std::decay_t<NewState>, Transitions...>::Type;
+        std::visit( [this, &nS]( auto &currState ) {
+          using T = std::decay_t<decltype (currState)>;
+          if constexpr ( std::is_same_v< T, WrappedSType > ) {
+            return;
+          } else if constexpr ( std::is_same_v< T, _InitialState > ) {
+            enterState ( WrappedSType( std::move(nS) ) );
+          } else {
+            enterState ( currState, WrappedSType( std::move(nS) ) );
+          }
+        }, _state );
+      }
+
+      /*!
+       * Emitted when the statemachine enters a type that has final set to true.
+       */
+      SignalProxy<void()> sigFinished () {
+        return _sigFinished;
+      }
+
+      /*!
+       * Emitted everytime the statemachine advanced to a new state, carrying the
+       * new state's ID.
+       * \note this signal is emitted before State::enter() is executed, the State object
+       *       however is already created and can be accessed via \ref Statemachine::state()
+       */
+      SignalProxy<void ( StateId )> sigStateChanged () {
+        return _sigStateChanged;
+      }
+
+    protected:
+
+      template <typename OldState, typename NewState>
+      void enterState ( OldState &os, NewState &&nS ) {
+        // disconnect all signals from the current state
+        clearConnections();
+        std::forward<OldState>(os).exit();
+        _previousState = OldState::stateId;
+        enterState( std::forward<NewState>(nS) );
+      }
+
+      template <typename NewState>
+      void enterState ( NewState &&nS ) {
+
+        if constexpr ( !NewState::isFinal ) {
+          connectAllTransitions<0>( nS, nS._transitions );
+        }
+
+        _state = std::forward<NewState>(nS);
+
+        // handle final state things
+        if constexpr ( NewState::isFinal ) {
+          _isInFinalState = true;
+        }
+
+        // let the outside world know whats going on
+        _sigStateChanged.emit( NewState::stateId  );
+
+        // call enter on the state as the last thing to do, it might emit a transition event right away
+        std::get< std::decay_t<NewState> >( _state ).enter();
+
+        if ( _isInFinalState )
+          _sigFinished.emit();
+      }
+
+      template <typename State, typename Transition>
+      auto makeEventCallback ( Transition &transition ) {
+        using WrappedEventType = typename detail::make_statewithtransition< typename Transition::TargetType, Transitions...>::Type;
+        return [ mytrans = &transition, this]() mutable {
+          auto stateLock = std::get< std::decay_t<State> >(_state).wrappedState();
+          if ( mytrans->checkCondition( *stateLock ) ) {
+            auto &st = std::get< std::decay_t<State> >(_state);
+            enterState( st , WrappedEventType( (*mytrans)( static_cast<Derived &>(*this), *stateLock ) ) );
+          }
+        };
+      }
+
+      template< std::size_t I = 0, typename State, typename ...StateTrans>
+      void connectAllTransitions( State &&nS, std::tuple<StateTrans...> &transitions ) {
+        if constexpr (I >= sizeof...(StateTrans)) {
+          return;
+        } else {
+          auto &transition = std::get<I>( transitions );
+          //_currentStateConnections.push_back( transition.eventSource ( std::forward<State>(nS).wrappedState().get() ).connect( makeEventCallback< std::decay_t<State> >(transition)) );
+          _currentStateConnections.push_back( std::forward<State>(nS).wrappedState()->Base::connectFunc( transition.eventAccessor(), makeEventCallback< std::decay_t<State> >(transition), *static_cast<Derived*>(this) ) );
+          connectAllTransitions<I+1>( std::forward<State>(nS), transitions );
+        }
+      }
+
+      void clearConnections () {
+        for ( auto &c : _currentStateConnections )
+          c.disconnect();
+        _currentStateConnections.clear();
+      }
+
+    private:
+      bool _isInFinalState = false;
+      Signal <void ( StateId )> _sigStateChanged;
+      Signal <void ()> _sigFinished;
+      StateSet _state = _InitialState();
+      std::optional<StateId> _previousState;
+      std::vector<sigc::connection> _currentStateConnections;
+  };
+
+  /*!
+   * Implements the most basic parts of a State,
+   * the functions enter() and exit() still need to be implemented in the base class
+   */
+  template < typename StatemachineType, bool isFin >
+  class BasicState : public Base {
+  public:
+
+    static constexpr bool isFinal = isFin;
+
+    BasicState( StatemachineType &sm ) : _sm( sm ){}
+    virtual ~BasicState() {}
+
+    BasicState( BasicState && ) = default;
+    BasicState &operator= ( BasicState && ) = default;
+
+    StatemachineType &stateMachine () {
+      return _sm;
+    }
+
+    const StatemachineType &stateMachine () const {
+      return _sm;
+    }
+
+  private:
+    StatemachineType &_sm;
+
+  };
+
+  /*!
+   * Helper type that also includes the State ID, in more complex state machines
+   * utilizing subclassing in their State objects,
+   * it might be desireable to have the State ID in the final class implementation
+   */
+  template < typename StatemachineType, auto sId, bool isFin >
+  class SimpleState : public BasicState<StatemachineType, isFin> {
+    public:
+      static constexpr auto stateId = sId;
+      using BasicState<StatemachineType, isFin>::BasicState;
+  };
+
+}
+
+#endif // ZYPP_NG_BASE_STATEMACHINE_INCLUDED_H
diff --git a/zypp-core/zyppng/base/threaddata.cc b/zypp-core/zyppng/base/threaddata.cc
new file mode 100644 (file)
index 0000000..226b8b6
--- /dev/null
@@ -0,0 +1,55 @@
+#include "private/threaddata_p.h"
+#include "private/eventdispatcher_glib_p.h"
+#include <zypp-core/base/Logger.h>
+#include <ostream> //for std::endl
+#include <sstream>
+#include <pthread.h>
+
+namespace zyppng
+{
+  ThreadData::ThreadData()
+  : _threadId( std::this_thread::get_id() ),
+    _nativeHandle( pthread_self() )
+  {
+  }
+
+  ThreadData &ThreadData::current()
+  {
+    static thread_local ThreadData data;
+    return data;
+  }
+
+  const std::string &ThreadData::name() const
+  {
+    if ( _threadName.empty() ) {
+      std::stringstream strStr;
+      strStr << _threadId;
+      _threadName = strStr.str();
+    }
+    return _threadName;
+  }
+
+  std::shared_ptr<EventDispatcher> ThreadData::ensureDispatcher()
+  {
+    auto sp = _dispatcher.lock();
+    if (!sp) {
+      _dispatcher = sp = EventDispatcherPrivate::create();
+    }
+    return sp;
+  }
+
+  void ThreadData::setDispatcher( const std::shared_ptr<EventDispatcher> &disp )
+  {
+    if ( _dispatcher.lock() ) {
+      WAR << "Dispatcher was already created for the current thread" << std::endl;
+      return;
+    }
+    _dispatcher = disp;
+  }
+
+  void ThreadData::syncNativeName()
+  {
+    // length is restricted to 16 characters, including the terminating null byte ('\0')
+    pthread_setname_np( _nativeHandle, name().substr(0,15).c_str() );
+  }
+}
similarity index 86%
rename from zypp/zyppng/base/timer.cc
rename to zypp-core/zyppng/base/timer.cc
index ec3ad23..f0a53e6 100644 (file)
@@ -4,8 +4,8 @@
 #include "eventdispatcher.h"
 
 #include <time.h>
-#include <zypp/base/Logger.h>
-#include <zypp/base/Exception.h>
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/base/Exception.h>
 #include <iostream>
 #include <glib.h>
 
@@ -18,7 +18,7 @@ class TimerPrivate : BasePrivate
 {
   ZYPP_DECLARE_PUBLIC(Timer)
 public:
-  TimerPrivate();
+  TimerPrivate( Timer &p );
   virtual ~TimerPrivate();
 
   uint64_t _beginMs = 0;
@@ -26,13 +26,15 @@ public:
   std::weak_ptr<EventDispatcher> _ev;
   bool _isRunning = false;
 
-  signal<void (Timer &t)> _expired;
+  Signal< void (Timer &t)> _expired;
 
   bool _singleShot = false;
 
 };
 
-TimerPrivate::TimerPrivate()
+ZYPP_IMPL_PRIVATE(Timer)
+
+TimerPrivate::TimerPrivate(Timer &p) : BasePrivate(p)
 {
   auto ev = EventDispatcher::instance();
   if ( !ev )
@@ -74,6 +76,12 @@ uint64_t Timer::now()
 #endif
 }
 
+uint64_t Timer::elapsedSince( const uint64_t start )
+{
+  uint64_t nowMs = now();
+  return ( nowMs - start );
+}
+
 uint64_t Timer::started() const
 {
   return d_func()->_beginMs;
@@ -97,8 +105,7 @@ uint64_t Timer::remaining() const
 uint64_t Timer::elapsed() const
 {
   Z_D();
-  uint64_t nowMs = now();
-  return ( nowMs - d->_beginMs );
+  return elapsedSince( d->_beginMs );
 }
 
 uint64_t Timer::expires() const
@@ -152,7 +159,7 @@ void Timer::start( uint64_t timeout )
     //if ev is null we are shutting down
     if ( !ev )
       return;
-    ev->registerTimer( this );
+    ev->registerTimer( *this );
 
     d->_isRunning = true;
   }
@@ -170,12 +177,12 @@ void Timer::stop()
 
   //event loop might be shutting down
   if ( ev )
-    ev->removeTimer( this );
+    ev->removeTimer( *this );
 
   d->_isRunning = false;
 }
 
-Timer::Timer() : Base ( *new TimerPrivate )
+Timer::Timer() : Base ( *new TimerPrivate( *this ) )
 { }
 
 }
similarity index 93%
rename from zypp/zyppng/base/timer.h
rename to zypp-core/zyppng/base/timer.h
index 53c110e..6bca512 100644 (file)
@@ -14,9 +14,9 @@
 #ifndef ZYPP_NG_BASE_TIMER_H_INCLUDED
 #define ZYPP_NG_BASE_TIMER_H_INCLUDED
 
-#include <zypp/zyppng/base/zyppglobal.h>
-#include <zypp/zyppng/base/Base>
-#include <zypp/zyppng/base/Signals>
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/base/Signals>
 #include <functional>
 
 namespace zyppng {
@@ -72,6 +72,11 @@ public:
   static uint64_t now ();
 
   /*!
+   * \return the time that has elapsed since the timepoint given in \a start
+   */
+  static uint64_t elapsedSince ( const uint64_t start );
+
+  /*!
    * \returns the monotonic system time when the timer started
    */
   uint64_t started  () const;
diff --git a/zypp-core/zyppng/base/zyppglobal.h b/zypp-core/zyppng/base/zyppglobal.h
new file mode 100644 (file)
index 0000000..78dd2f9
--- /dev/null
@@ -0,0 +1,107 @@
+#ifndef ZYPP_NG_BASE_ZYPPGLOBAL_H_INCLUDED
+#define ZYPP_NG_BASE_ZYPPGLOBAL_H_INCLUDED
+
+#include <zypp-core/base/Easy.h>
+
+#ifndef EXPORT_EXPERIMENTAL_API
+#define LIBZYPP_NG_EXPORT
+#define LIBZYPP_NG_NO_EXPORT
+#else
+#include <zypp-ng_export.h>
+#endif
+
+/*
+ * Convenience helpers to automatically generate boilerplate code
+ * for pimpl classes.
+ *
+ * Libzypp is using the PIMPL pattern to ensure binary compatiblity between
+ * different version releases. This keeps rebuilds of applications
+ * that link against libzypp to a minimum. A PIMPL class simply hides the
+ * data members and functions that are not part of the public API/ABI in a
+ * hidden private class, that is only accessible in the implementation files.
+ * This allows even bigger refactorings to happen behind the scenes.
+ *
+ * A simple example would be:
+ *
+ * \code
+ *
+ * // MyClass.h
+ *
+ * // forward declare the private class, always use the public classname
+ * // with a "Private" postfix:
+ * class MyClassPrivate;
+ *
+ * class MyClass
+ * {
+ * public:
+ *   // add all public API functions here
+ *   void doSomething();
+ *   int  getSomething() const;
+ * private:
+ *   // generate the forward declarations for the pimpl access functions
+ *   ZYPP_DECLARE_PRIVATE(MyClass)
+ *   // the only data member in the public class should be a pointer to the private type
+ *   // named d_ptr
+ *   std::unique_ptr<MyClassPrivate> d_ptr;
+ * };
+ *
+ * // MyClass.cc
+ *
+ * // in the implementation file we can now define the private class:
+ * class MyClassPrivate
+ * {
+ * public:
+ *   // add the data members and private functions here
+ *   int something = 0;
+ * };
+ *
+ * // in the constructor make sure that the private part of the class
+ * // is initialized too
+ * MyClass::MyClass() : d_ptr( new MyClassPrivate )
+ * {}
+ *
+ * int MyClass::getSomething() const
+ * {
+ *   // automatically generates a pointer named "d" to the
+ *   // pimpl object
+ *   Z_D();
+ *   return d->something;
+ * }
+ *
+ * void MyClass::doSomething()
+ * {
+ *   // its also possible to use the d_func() to access the pointer:
+ *   d_func()->something = 10;
+ * }
+ *
+ * \endcode
+ *
+ * \note those macros are inspired by the Qt framework
+ */
+
+template <typename T> inline T *zyppGetPtrHelper(T *ptr) { return ptr; }
+template <typename Ptr> inline auto zyppGetPtrHelper(const Ptr &ptr) -> decltype(ptr.operator->()) { return ptr.operator->(); }
+template <typename Ptr> inline auto zyppGetPtrHelper(Ptr &ptr) -> decltype(ptr.operator->()) { return ptr.operator->(); }
+
+#define ZYPP_DECLARE_PRIVATE(Class) \
+    Class##Private* d_func();\
+    const Class##Private* d_func() const; \
+    friend class Class##Private;
+
+#define ZYPP_IMPL_PRIVATE(Class) \
+    Class##Private* Class::d_func() \
+    { return static_cast<Class##Private *>(zyppGetPtrHelper(d_ptr)); } \
+    const Class##Private* Class::d_func() const \
+    { return static_cast<const Class##Private *>(zyppGetPtrHelper(d_ptr)); }
+
+#define ZYPP_DECLARE_PUBLIC(Class)            \
+    public:                                            \
+    inline Class* z_func() { return static_cast<Class *>(z_ptr); } \
+    inline const Class* z_func() const { return static_cast<const Class *>(z_ptr); } \
+    friend class Class; \
+    private:
+
+#define Z_D() auto const d = d_func()
+#define Z_Z() auto const z = z_func()
+
+#endif
diff --git a/zypp-core/zyppng/core/ByteArray b/zypp-core/zyppng/core/ByteArray
new file mode 100644 (file)
index 0000000..a3c9c82
--- /dev/null
@@ -0,0 +1 @@
+#include "bytearray.h"
diff --git a/zypp-core/zyppng/core/Env b/zypp-core/zyppng/core/Env
new file mode 100644 (file)
index 0000000..df8e361
--- /dev/null
@@ -0,0 +1 @@
+#include "env.h"
diff --git a/zypp-core/zyppng/core/String b/zypp-core/zyppng/core/String
new file mode 100644 (file)
index 0000000..eab76f2
--- /dev/null
@@ -0,0 +1 @@
+#include "string.h"
diff --git a/zypp-core/zyppng/core/bytearray.h b/zypp-core/zyppng/core/bytearray.h
new file mode 100644 (file)
index 0000000..ce90971
--- /dev/null
@@ -0,0 +1,25 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+
+#ifndef ZYPP_NG_CORE_BYTEARRAY_H_INCLUDED
+#define ZYPP_NG_CORE_BYTEARRAY_H_INCLUDED
+
+#include <zypp-core/ByteArray.h>
+
+namespace zyppng {
+  using ByteArray = zypp::ByteArray;
+  using UByteArray = zypp::UByteArray;
+}
+
+#endif
diff --git a/zypp-core/zyppng/core/env.h b/zypp-core/zyppng/core/env.h
new file mode 100644 (file)
index 0000000..0063999
--- /dev/null
@@ -0,0 +1,21 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#ifndef ZYPP_NG_CORE_ENV_H_INCLUDED
+#define ZYPP_NG_CORE_ENV_H_INCLUDED
+
+namespace zypp {
+  /// Namespace intended to collect all environment variables we use
+  namespace env {}
+}
+
+namespace zyppng {
+  namespace env = zypp::env;
+}
+
+#endif // ZYPP_NG_CORE_ENV_H_INCLUDED
similarity index 96%
rename from zypp/zyppng/core/idstring.h
rename to zypp-core/zyppng/core/idstring.h
index ad73a7f..c28398c 100644 (file)
@@ -9,7 +9,7 @@
 #ifndef ZYPP_NG_CORE_IDSTRING_H_INCLUDED
 #define ZYPP_NG_CORE_IDSTRING_H_INCLUDED
 
-#include <zypp/IdString.h>
+#include <zypp-core/IdString.h>
 
 namespace zyppng {
 
diff --git a/zypp-core/zyppng/core/string.h b/zypp-core/zyppng/core/string.h
new file mode 100644 (file)
index 0000000..a8f0e4d
--- /dev/null
@@ -0,0 +1,84 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#ifndef ZYPP_NG_CORE_STRING_H_INCLUDED
+#define ZYPP_NG_CORE_STRING_H_INCLUDED
+
+#include <zypp-core/base/String.h>
+#include <boost/utility/string_view.hpp>
+
+namespace zyppng {
+using namespace zypp::str;
+
+namespace str {
+
+  template< typename StrType, typename T = std::remove_reference_t<StrType> >
+  T trim( StrType&& s, const Trim trim_r )
+  {
+    T ret( std::forward<StrType>(s) );
+
+    if ( ret.empty() || trim_r == NO_TRIM )
+      return ret;
+
+    if ( trim_r & L_TRIM )
+    {
+      typename T::size_type p = ret.find_first_not_of( " \t\r\n" );
+      if ( p == T::npos )
+      {
+        ret.clear();
+        return ret;
+      }
+      ret.remove_prefix( p );
+    }
+
+    if ( trim_r & R_TRIM )
+    {
+      typename T::size_type p = ret.find_last_not_of( " \t\r\n" );
+      if ( p == T::npos )
+      {
+        ret.clear();
+        return ret;
+      }
+      ret.remove_suffix( ret.size() - ( p+1 ) );
+    }
+
+    return ret;
+  }
+
+  template<class TOutputIterator>
+  void split( const boost::string_view & line_r, TOutputIterator result_r, const boost::string_view & sepchars_r = " \t", const Trim trim_r = NO_TRIM )
+  {
+    //skip initial sepchars
+    std::string_view::size_type tokenEnd = 0, tokenBegin = line_r.find_first_not_of( sepchars_r );
+
+    //if we do not find a character that is not in sepchars there is nothing to split
+    if ( tokenBegin == std::string_view::npos )
+      return;
+
+    while ( ( tokenEnd = line_r.find_first_of( sepchars_r, tokenBegin ) ) != std::string_view::npos ) {
+      auto line = line_r.substr( tokenBegin, tokenEnd-tokenBegin );
+      *result_r = trim( line, trim_r );
+
+      //find start of next token
+      tokenBegin = line_r.find_first_not_of( sepchars_r, tokenEnd );
+      if( tokenBegin == std::string_view::npos )
+        break;
+    }
+
+    //insert the final element
+    if ( tokenBegin != std::string_view::npos && tokenBegin < line_r.size() )
+      *result_r = trim( line_r.substr( tokenBegin ), trim_r );
+  }
+}
+
+
+
+}
+
+
+#endif
similarity index 96%
rename from zypp/zyppng/core/url.h
rename to zypp-core/zyppng/core/url.h
index 8b3c621..6dee4ab 100644 (file)
@@ -9,7 +9,7 @@
 #ifndef ZYPP_NG_CORE_URL_H_INCLUDED
 #define ZYPP_NG_CORE_URL_H_INCLUDED
 
-#include <zypp/Url.h>
+#include <zypp-core/Url.h>
 
 namespace zyppng {
   using Url = zypp::Url;
diff --git a/zypp-core/zyppng/io/AsyncDataSource b/zypp-core/zyppng/io/AsyncDataSource
new file mode 100644 (file)
index 0000000..29a243e
--- /dev/null
@@ -0,0 +1 @@
+#include "asyncdatasource.h"
diff --git a/zypp-core/zyppng/io/IODevice b/zypp-core/zyppng/io/IODevice
new file mode 100644 (file)
index 0000000..94b8d47
--- /dev/null
@@ -0,0 +1 @@
+#include "iodevice.h"
diff --git a/zypp-core/zyppng/io/Process b/zypp-core/zyppng/io/Process
new file mode 100644 (file)
index 0000000..aaf2a9f
--- /dev/null
@@ -0,0 +1 @@
+#include "process.h"
diff --git a/zypp-core/zyppng/io/SockAddr b/zypp-core/zyppng/io/SockAddr
new file mode 100644 (file)
index 0000000..36c6706
--- /dev/null
@@ -0,0 +1 @@
+#include "sockaddr.h"
diff --git a/zypp-core/zyppng/io/Socket b/zypp-core/zyppng/io/Socket
new file mode 100644 (file)
index 0000000..88d614f
--- /dev/null
@@ -0,0 +1 @@
+#include "socket.h"
diff --git a/zypp-core/zyppng/io/abstractspawnengine.cc b/zypp-core/zyppng/io/abstractspawnengine.cc
new file mode 100644 (file)
index 0000000..eb4682c
--- /dev/null
@@ -0,0 +1,204 @@
+#include "private/abstractspawnengine_p.h"
+#include <zypp-core/base/LogControl.h>
+#include <zypp-core/base/Gettext.h>
+#include <zypp-core/base/String.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "private/forkspawnengine_p.h"
+
+namespace zyppng {
+
+
+#if ZYPP_HAS_GLIBSPAWNENGINE
+  namespace  {
+
+    enum class SpawnEngine {
+      GSPAWN,
+      PFORK
+    };
+
+    SpawnEngine initEngineFromEnv () {
+      const std::string fBackend ( zypp::str::asString( ::getenv("ZYPP_FORK_BACKEND") ) );
+      if ( fBackend.empty() || fBackend == "auto" || fBackend == "pfork" ) {
+        DBG << "Starting processes via posix fork" << std::endl;
+        return SpawnEngine::PFORK;
+      } else if ( fBackend == "gspawn" ) {
+        DBG << "Starting processes via glib spawn" << std::endl;
+        return SpawnEngine::GSPAWN;
+      }
+
+      DBG << "Falling back to starting process via posix fork" << std::endl;
+      return SpawnEngine::PFORK;
+    }
+
+    std::unique_ptr<zyppng::AbstractSpawnEngine> engineFromEnv () {
+      static const SpawnEngine eng = initEngineFromEnv();
+      switch ( eng ) {
+        case SpawnEngine::GSPAWN:
+          return std::make_unique<zyppng::GlibSpawnEngine>();
+        case SpawnEngine::PFORK:
+        default:
+          return std::make_unique<zyppng::ForkSpawnEngine>();
+      }
+    }
+  }
+#else
+
+  std::unique_ptr<zyppng::AbstractSpawnEngine> engineFromEnv () {
+    return std::make_unique<zyppng::ForkSpawnEngine>();
+  }
+
+#endif
+
+  AbstractSpawnEngine::AbstractSpawnEngine()
+  {
+  }
+
+  AbstractSpawnEngine::~AbstractSpawnEngine()
+  { }
+
+  std::unique_ptr<AbstractSpawnEngine> AbstractSpawnEngine::createDefaultEngine()
+  {
+    return engineFromEnv();
+  }
+
+  bool AbstractSpawnEngine::switchPgid() const
+  {
+    return _switchPgid;
+  }
+
+  void AbstractSpawnEngine::setSwitchPgid(bool switchPgid)
+  {
+    _switchPgid = switchPgid;
+  }
+
+  zypp::Pathname AbstractSpawnEngine::workingDirectory() const
+  {
+    return _workingDirectory;
+  }
+
+  void AbstractSpawnEngine::setWorkingDirectory(const zypp::Pathname &workingDirectory)
+  {
+    _workingDirectory = workingDirectory;
+  }
+
+  const std::vector<int> &AbstractSpawnEngine::fdsToMap() const
+  {
+    return _mapFds;
+  }
+
+  void AbstractSpawnEngine::addFd(int fd)
+  {
+    _mapFds.push_back( fd );
+  }
+
+  bool AbstractSpawnEngine::dieWithParent() const
+  {
+    return _dieWithParent;
+  }
+
+  void AbstractSpawnEngine::setDieWithParent( bool dieWithParent )
+  {
+    _dieWithParent = dieWithParent;
+  }
+
+  int AbstractSpawnEngine::exitStatus() const
+  {
+    return _exitStatus;
+  }
+
+  void AbstractSpawnEngine::setExitStatus(const int state)
+  {
+    _exitStatus = state;
+  }
+
+  const std::string &AbstractSpawnEngine::executedCommand() const
+  {
+    return _executedCommand;
+  }
+
+  const std::string &AbstractSpawnEngine::execError() const
+  {
+    return _execError;
+  }
+
+  void AbstractSpawnEngine::setExecError(const std::string &str)
+  {
+    _execError = str;
+  }
+
+  zypp::Pathname AbstractSpawnEngine::chroot() const
+  {
+    return _chroot;
+  }
+
+  void AbstractSpawnEngine::setChroot( const zypp::Pathname &chroot )
+  {
+    _chroot = chroot;
+  }
+
+  bool AbstractSpawnEngine::useDefaultLocale() const
+  {
+    return _useDefaultLocale;
+  }
+
+  void AbstractSpawnEngine::setUseDefaultLocale( bool defaultLocale )
+  {
+    _useDefaultLocale = defaultLocale;
+  }
+
+  AbstractSpawnEngine::Environment AbstractSpawnEngine::environment() const
+  {
+    return _environment;
+  }
+
+  void AbstractSpawnEngine::setEnvironment( const Environment &environment )
+  {
+    _environment = environment;
+  }
+
+  pid_t AbstractSpawnEngine::pid( )
+  {
+    return _pid;
+  }
+
+  int AbstractSpawnEngine::checkStatus( int status )
+  {
+    if (WIFEXITED (status))
+    {
+      status = WEXITSTATUS (status);
+      if(status)
+      {
+          DBG << "Pid " << _pid << " exited with status " << status << std::endl;
+          _execError = zypp::str::form( _("Command exited with status %d."), status );
+      }
+      else
+      {
+          // if 'launch' is logged, completion should be logged,
+          // even if successfull.
+          DBG << "Pid " << _pid << " successfully completed" << std::endl;
+          _execError.clear(); // empty if running or successfully completed
+      }
+    }
+    else if (WIFSIGNALED (status))
+    {
+      status = WTERMSIG (status);
+      WAR << "Pid " << _pid << " was killed by signal " << status
+              << " (" << strsignal(status);
+      if (WCOREDUMP (status))
+      {
+          WAR << ", core dumped";
+      }
+      WAR << ")" << std::endl;
+      _execError = zypp::str::form( _("Command was killed by signal %d (%s)."), status, strsignal(status) );
+      status+=128;
+    }
+    else {
+      ERR << "Pid " << _pid << " exited with unknown error" << std::endl;
+      _execError = _("Command exited with unknown error.");
+    }
+    return status;
+  }
+
+} // namespace zyppng
diff --git a/zypp-core/zyppng/io/asyncdatasource.cpp b/zypp-core/zyppng/io/asyncdatasource.cpp
new file mode 100644 (file)
index 0000000..a836c71
--- /dev/null
@@ -0,0 +1,270 @@
+#include "asyncdatasource.h"
+
+#include <zypp-core/base/IOTools.h>
+#include <zypp-core/zyppng/base/AutoDisconnect>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/io/private/iodevice_p.h>
+#include <zypp-core/zyppng/io/private/iobuffer_p.h>
+#include <zypp-core/zyppng/base/SocketNotifier>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+
+namespace zyppng {
+
+  class AsyncDataSourcePrivate : public IODevicePrivate {
+    ZYPP_DECLARE_PUBLIC(AsyncDataSource);
+  public:
+    AsyncDataSourcePrivate ( AsyncDataSource &pub ) : IODevicePrivate(pub) {}
+    SocketNotifier::Ptr _readNotifier;
+    SocketNotifier::Ptr _writeNotifier;
+    IOBuffer _writeBuffer;
+    int _readFd  = -1;
+    int _writeFd = -1;
+
+    void notifierActivated (const SocketNotifier &notify, int evTypes );
+    void readyRead  ( );
+    void readyWrite ( );
+
+    void closeWriteChannel ( AsyncDataSource::ChannelCloseReason reason );
+    void closeReadChannel  ( AsyncDataSource::ChannelCloseReason reason );
+
+    Signal<void( AsyncDataSource::ChannelCloseReason )> _sigWriteFdClosed;
+    Signal<void( AsyncDataSource::ChannelCloseReason )> _sigReadFdClosed;
+    Signal< void (std::size_t)> _sigBytesWritten;
+  };
+
+  void AsyncDataSourcePrivate::notifierActivated( const SocketNotifier &notify, int evTypes )
+  {
+    if ( _readNotifier.get() == &notify ) {
+      readyRead();
+    } else if ( _writeNotifier.get() == &notify ) {
+      if ( evTypes & SocketNotifier::Error ) {
+        DBG << "Closing due to error when polling" << std::endl;
+        closeWriteChannel(  AsyncDataSource::RemoteClose );
+        return;
+      }
+      readyWrite();
+    }
+  }
+
+  void AsyncDataSourcePrivate::readyRead()
+  {
+    auto bytesToRead = z_func()->rawBytesAvailable();
+    if ( bytesToRead == 0 ) {
+      // make sure to check if bytes are available even if the ioctl call returns something different
+      bytesToRead = 4096;
+    }
+
+    char *buf = _readBuf.reserve( bytesToRead );
+    const auto bytesRead = z_func()->readData( buf, bytesToRead );
+
+    if ( bytesRead < 0 ) {
+      _readBuf.chop( bytesToRead );
+      return;
+    }
+
+    if ( bytesToRead > (size_t)bytesRead )
+      _readBuf.chop( bytesToRead-bytesRead );
+
+    if ( bytesRead > 0 ) {
+      _readyRead.emit();
+      return;
+    }
+    //handle remote close
+    else if ( bytesRead == 0 && errno != EAGAIN && errno != EWOULDBLOCK  ) {
+      closeReadChannel(  AsyncDataSource::RemoteClose );
+    }
+
+    if ( errno == EAGAIN || errno == EWOULDBLOCK )
+      return;
+
+    //setError( Socket::InternalError, strerr_cxx() );
+    closeReadChannel(  AsyncDataSource::InternalError );
+  }
+
+  void AsyncDataSourcePrivate::readyWrite()
+  {
+    const auto nwrite = _writeBuffer.frontSize();
+    if ( !nwrite ) {
+      // disable Write notifications so we do not wake up without the need to
+      _writeNotifier->setEnabled( false );
+      return;
+    }
+
+    const auto nBuf = _writeBuffer.front();
+    const auto written = eintrSafeCall( ::write, _writeFd, nBuf, nwrite );
+    if ( written == -1 ) {
+      switch ( errno ) {
+        case EACCES:
+          closeWriteChannel( AsyncDataSource::AccessError );
+          return;
+        case EAGAIN:
+#if EAGAIN != EWOULDBLOCK
+        case EWOULDBLOCK:
+#endif
+          return;
+        case EPIPE:
+        case ECONNRESET:
+          closeWriteChannel(  AsyncDataSource::RemoteClose );
+          return;
+        default:
+          closeWriteChannel(  AsyncDataSource::InternalError );
+          return;
+      }
+      return;
+    }
+    _writeBuffer.discard( written );
+    _sigBytesWritten.emit( written );
+  }
+
+  void AsyncDataSourcePrivate::closeWriteChannel( AsyncDataSource::ChannelCloseReason reason )
+  {
+    bool sig = _writeFd >= 0;
+    _writeNotifier.reset();
+    _writeFd = -1;
+    _writeBuffer.clear();
+    _mode.unsetFlag( AsyncDataSource::WriteOnly );
+    if ( sig )
+      _sigWriteFdClosed.emit( reason );
+  }
+
+  void AsyncDataSourcePrivate::closeReadChannel( AsyncDataSource::ChannelCloseReason reason )
+  {
+    // we do not clear the read buffer so code has the opportunity to read whats left in there
+    bool sig = _readFd >= 0;
+    _readNotifier.reset();
+    _readFd = -1;
+    if ( sig )
+      _sigReadFdClosed.emit( reason );
+  }
+
+  ZYPP_IMPL_PRIVATE(AsyncDataSource)
+
+  AsyncDataSource::AsyncDataSource() : IODevice( *( new AsyncDataSourcePrivate(*this) ) )
+  { }
+
+  AsyncDataSource::Ptr AsyncDataSource::create()
+  {
+    return std::shared_ptr<AsyncDataSource>( new AsyncDataSource );
+  }
+
+  bool AsyncDataSource::open( int readFd, int writeFd )
+  {
+    Z_D();
+    close();
+    IODevice::OpenMode mode;
+    if ( readFd >= 0 ) {
+      mode |= IODevice::ReadOnly;
+      d->_readFd = readFd;
+      zypp::io::setFDBlocking( readFd, false );
+      d->_readNotifier = SocketNotifier::create( readFd, SocketNotifier::Read | AbstractEventSource::Error, true );
+      d->_readNotifier->connect( &SocketNotifier::sigActivated, *d, &AsyncDataSourcePrivate::notifierActivated );
+    }
+    if ( writeFd >= 0 ) {
+      mode |= IODevice::WriteOnly;
+      d->_writeFd = writeFd;
+      zypp::io::setFDBlocking( writeFd, false );
+      d->_writeNotifier = SocketNotifier::create( writeFd, SocketNotifier::Write | AbstractEventSource::Error, false );
+      d->_writeNotifier->connect( &SocketNotifier::sigActivated, *d, &AsyncDataSourcePrivate::notifierActivated );
+    }
+    return IODevice::open( mode );
+  }
+
+  off_t zyppng::AsyncDataSource::writeData( const char *data, off_t count )
+  {
+    Z_D();
+    if ( count > 0 ) {
+      // we always use the write buffer, to make sure the fd is actually writeable
+      d->_writeBuffer.append( data, count );
+      d->_writeNotifier->setEnabled( true );
+    }
+    return count;
+  }
+
+  off_t zyppng::AsyncDataSource::readData( char *buffer, off_t bufsize )
+  {
+    Z_D();
+    const auto read = eintrSafeCall( ::read, d->_readFd, buffer, bufsize );
+
+    // special case for remote close
+    if ( read == 0 ) {
+      d->closeReadChannel( RemoteClose );
+      return -1;
+    } else if ( read < 0 ) {
+      switch ( errno ) {
+#if EAGAIN != EWOULDBLOCK
+        case EWOULDBLOCK:
+#endif
+        case EAGAIN: {
+          return 0;
+        }
+        default: {
+          d->closeReadChannel( InternalError );
+          return -1;
+        }
+      }
+    }
+    return read;
+  }
+
+  size_t AsyncDataSource::rawBytesAvailable() const
+  {
+    if ( isOpen() && canRead() )
+      return zyppng::bytesAvailableOnFD( d_func()->_readFd );
+    return 0;
+  }
+
+  void zyppng::AsyncDataSource::close()
+  {
+    Z_D();
+    d->_readNotifier.reset();
+    d->_writeNotifier.reset();
+    d->_writeBuffer.clear();
+
+    if ( d->_readFd >= 0)
+      d->_sigReadFdClosed.emit( UserRequest );
+    if ( d->_writeFd >= 0 )
+      d->_sigWriteFdClosed.emit( UserRequest );
+
+    IODevice::close();
+  }
+
+  bool AsyncDataSource::waitForReadyRead(int timeout)
+  {
+    Z_D();
+    if ( !canRead() )
+      return false;
+
+    bool gotRR = false;
+    auto rrConn = AutoDisconnect( d->_readyRead.connect([&](){
+      gotRR = true;
+    }) );
+
+    // we can only wait if we are open for reading
+    while ( canRead() && !gotRR ) {
+      int rEvents = 0;
+      if ( EventDispatcher::waitForFdEvent( d->_readFd,  AbstractEventSource::Read | AbstractEventSource::Error , rEvents, timeout ) ) {
+        //simulate signal from read notifier
+        d->notifierActivated( *d->_readNotifier, rEvents );
+      } else {
+        //timeout
+        return false;
+      }
+    }
+    return gotRR;
+  }
+
+  SignalProxy<void (AsyncDataSource::ChannelCloseReason)> AsyncDataSource::sigWriteFdClosed()
+  {
+    return d_func()->_sigWriteFdClosed;
+  }
+
+  SignalProxy<void (AsyncDataSource::ChannelCloseReason)> AsyncDataSource::sigReadFdClosed()
+  {
+    return d_func()->_sigReadFdClosed;
+  }
+
+  SignalProxy<void (std::size_t)> AsyncDataSource::sigBytesWritten()
+  {
+    return d_func()->_sigBytesWritten;
+  }
+}
diff --git a/zypp-core/zyppng/io/asyncdatasource.h b/zypp-core/zyppng/io/asyncdatasource.h
new file mode 100644 (file)
index 0000000..0aa0fbf
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef ASYNCDATASOURCE_H
+#define ASYNCDATASOURCE_H
+
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/io/IODevice>
+
+namespace zyppng {
+
+  class AsyncDataSourcePrivate;
+
+  class AsyncDataSource : public IODevice
+  {
+    ZYPP_DECLARE_PRIVATE(AsyncDataSource);
+  public:
+
+    enum ChannelCloseReason {
+      RemoteClose,    // the other side of the fd was closed
+      AccessError,    // we got an EACCESS when polling the fd
+      InternalError,  // we got a unexpected errno when polling the fd
+      UserRequest     // channel were closed because close() was called
+    };
+
+    using Ptr     = std::shared_ptr<AsyncDataSource>;
+    using WeakPtr = std::weak_ptr<AsyncDataSource>;
+
+    static Ptr create ();
+    bool open ( int readFd = -1, int writeFd = -1 );
+    void close () override;
+
+    /*!
+     * Blocks the current event loop to wait until there are bytes available to read from the device
+     *
+     * \note do not use until there is a very good reason, like event processing should not continue until readyRead was sent
+     */
+    bool waitForReadyRead(int timeout);
+
+    /*!
+     * Signal is emitted always when the write channel is closed.
+     * All data that was not written yet will be discarded and canWrite() will return
+     * false.
+     */
+    SignalProxy<void( AsyncDataSource::ChannelCloseReason )> sigWriteFdClosed();
+
+    /*!
+     * Signal is emitted always when the write channel is closed, for example
+     * when the write side of a pipe is closed. All data still residing in the read buffer
+     * can still be read.
+     */
+    SignalProxy<void( AsyncDataSource::ChannelCloseReason )> sigReadFdClosed();
+
+    /*!
+     * Signal is emitted every time bytes have been written to the underlying fd.
+     * This can be used to track how much data was actually sent.
+     */
+    SignalProxy< void (std::size_t)> sigBytesWritten ();
+
+  protected:
+    AsyncDataSource (  );
+    off_t writeData(const char *data, off_t count) override;
+    off_t readData(char *buffer, off_t bufsize) override;
+    size_t rawBytesAvailable() const override;
+  };
+}
+
+
+#endif // ASYNCDATASOURCE_H
diff --git a/zypp-core/zyppng/io/forkspawnengine.cc b/zypp-core/zyppng/io/forkspawnengine.cc
new file mode 100644 (file)
index 0000000..d1f2e0f
--- /dev/null
@@ -0,0 +1,511 @@
+#include "private/forkspawnengine_p.h"
+
+#include <sstream>
+#include <zypp/base/LogControl.h>
+#include <zypp/base/Gettext.h>
+#include <zypp/base/IOTools.h>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <zypp-core/base/CleanerThread_p.h>
+
+#include <cstdint>
+#include <iostream>
+#include <signal.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <pty.h> // openpty
+#include <stdlib.h> // setenv
+#include <sys/prctl.h> // prctl(), PR_SET_PDEATHSIG
+
+zyppng::AbstractDirectSpawnEngine::~AbstractDirectSpawnEngine()
+{
+  if ( AbstractDirectSpawnEngine::isRunning() ) {
+    // we got destructed while the external process is still alive
+    // make sure the zombie is cleaned up once it exits
+    zypp::CleanerThread::watchPID( _pid );
+  }
+}
+
+bool zyppng::AbstractDirectSpawnEngine::isRunning( bool wait )
+{
+  if ( _pid < 0 ) return false;
+
+  int status = 0;
+  int p = zyppng::eintrSafeCall( ::waitpid, _pid, &status, wait ? 0 : WNOHANG );
+  switch ( p )
+    {
+    case -1:
+      ERR << "waitpid( " << _pid << ") returned error '" << strerror(errno) << "'" << std::endl;
+      return false;
+      break;
+    case 0:
+      return true; // still running
+      break;
+    }
+
+  // Here: completed...
+  _exitStatus = checkStatus( status );
+  _pid = -1;
+  return false;
+}
+
+void zyppng::AbstractDirectSpawnEngine::mapExtraFds ( int controlFd )
+{
+  // we might have gotten other FDs to reuse, lets map them to STDERR_FILENO++
+  // BUT we need to make sure the fds are not already in the range we need to map them to
+  // so we first go over a list and collect those that are safe or move those that are not
+  int lastFdToKeep = STDERR_FILENO + _mapFds.size();
+  int nextBackupFd = lastFdToKeep + 1; //this we will use to count the fds upwards
+  std::vector<int> safeFds;
+  for ( auto fd : _mapFds ) {
+    // if the fds are bigger than the last one we will map to its safe
+    if ( fd > lastFdToKeep ) {
+      safeFds.push_back( fd );
+    } else {
+      // we need to map the fd after the set of those we want to keep, but also make sure
+      // that we do not close one of those we have already moved or might move
+      while (true) {
+
+        int backupTo = nextBackupFd;
+        nextBackupFd++;
+        const bool isSafe1 = std::find( _mapFds.begin(), _mapFds.end(), backupTo ) == _mapFds.end();
+        const bool isSafe2 = std::find( safeFds.begin(), safeFds.end(), backupTo ) == safeFds.end();
+        if ( isSafe1 && isSafe2 && ( controlFd == -1 || backupTo != controlFd) ) {
+          dup2( fd, backupTo );
+          safeFds.push_back( backupTo );
+          break;
+        }
+      }
+    }
+  }
+
+  // now we have a list of safe fds we need to map to the fd we want them to end up
+  int nextFd = STDERR_FILENO;
+  for ( auto fd : safeFds ) {
+    nextFd++;
+    dup2( fd, nextFd );
+  }
+
+  // close all filedescriptors above the last we want to keep
+  for ( int i = ::getdtablesize() - 1; i > lastFdToKeep; --i ) {
+    // controlFD has O_CLOEXEC set so it will be cleaned up :)
+    if ( controlFd != -1 && controlFd == i )
+      continue;
+    ::close( i );
+  }
+}
+
+bool zyppng::ForkSpawnEngine::start( const char * const *argv, int stdin_fd, int stdout_fd, int stderr_fd )
+{
+  _pid = -1;
+  _exitStatus = 0;
+  _execError.clear();
+  _executedCommand.clear();
+  _args.clear();
+
+  const char * chdirTo = nullptr;
+
+  if ( !argv || !argv[0] ) {
+    _execError = _("Invalid spawn arguments given.");
+    _exitStatus = 128;
+    return false;
+  }
+
+  if ( !_chroot.empty() )
+  {
+    const auto chroot = _chroot.c_str();
+    if ( chroot[0] == '\0' )
+    {
+      _chroot = zypp::Pathname();      // ignore empty _chroot
+    }
+    else if ( chroot[0] == '/' && chroot[1] == '\0' )
+    {
+      // If _chroot is '/' do not chroot, but chdir to '/'
+      // unless arglist defines another dir.
+      chdirTo = "/";
+      _chroot = zypp::Pathname();
+    }
+  }
+
+  if ( !_workingDirectory.empty() )
+    chdirTo = _workingDirectory.c_str();
+
+  // do not remove the single quotes around every argument, copy&paste of
+  // command to shell will not work otherwise!
+  {
+    _args.clear();
+    std::stringstream cmdstr;
+    for (int i = 0; argv[i]; i++) {
+      if ( i != 0 ) cmdstr << ' ';
+      cmdstr << '\'';
+      cmdstr << argv[i];
+      cmdstr << '\'';
+      _args.push_back( argv[i] );
+    }
+    _executedCommand = cmdstr.str();
+  }
+  DBG << "Executing" << ( _useDefaultLocale?"[C] ":" ") << _executedCommand << std::endl;
+
+  // we use a control pipe to figure out if the exec actually worked,
+  // this is the approach:
+  // - create a pipe before forking
+  // - block on the read end of the pipe in the parent process
+  // - in the child process we write a error tag + errno into the pipe if we encounter any error and exit
+  // - If child setup works out, the pipe is auto closed by exec() and the parent process knows from just receiving EOF
+  //   that starting the child was successful, otherwise the blocking read in the parent will return with actual data read from the fd
+  //   which will contain the error description
+
+  enum class ChildErrType : int8_t {
+    NO_ERR,
+    CHROOT_FAILED,
+    CHDIR_FAILED,
+    EXEC_FAILED
+  };
+
+  struct ChildErr {
+    int childErrno = 0;
+    ChildErrType type = ChildErrType::NO_ERR;
+  };
+
+  auto controlPipe = Pipe::create( O_CLOEXEC );
+  if ( !controlPipe ) {
+    _execError = _("Unable to create control pipe.");
+    _exitStatus = 128;
+    return false;
+  }
+
+  pid_t ppid_before_fork = ::getpid();
+
+  // Create module process
+  if ( ( _pid = fork() ) == 0 )
+  {
+
+    // child process
+    controlPipe->unrefRead();
+
+    const auto &writeErrAndExit = [&]( int errCode, ChildErrType type ){
+      ChildErr buf {
+        errno,
+        type
+      };
+
+      zypp::io::writeAll( controlPipe->writeFd, &buf, sizeof(ChildErr) );
+      _exit ( errCode );
+    };
+
+    //////////////////////////////////////////////////////////////////////
+    // Don't write to the logfile after fork!
+    //////////////////////////////////////////////////////////////////////
+    if ( _use_pty )
+    {
+        setsid();
+        dup2 ( stdout_fd, 1);    // set new stdout
+        dup2 ( stdin_fd , 0);    // set new stdin
+
+        // We currently have no controlling terminal (due to setsid).
+        // The first open call will also set the new ctty (due to historical
+        // unix guru knowledge ;-) )
+
+        char name[512];
+        ttyname_r( stdout_fd , name, sizeof(name) );
+        ::close(open(name, O_RDONLY));
+    }
+    else
+    {
+        if ( _switchPgid )
+          setpgid( 0, 0);
+        if ( stdin_fd != -1 )
+          dup2 ( stdin_fd, 0); // set new stdin
+        if ( stdout_fd != -1 )
+          dup2 ( stdout_fd, 1); // set new stdout
+    }
+
+    // Handle stderr
+    if ( stderr_fd != -1 )
+      dup2 ( stderr_fd, 2); // set new stderr
+
+    for ( Environment::const_iterator it = _environment.begin(); it != _environment.end(); ++it ) {
+      setenv( it->first.c_str(), it->second.c_str(), 1 );
+    }
+
+    if( _useDefaultLocale )
+      setenv("LC_ALL","C",1);
+
+    if( !_chroot.empty() )
+    {
+        if( ::chroot(_chroot.c_str()) == -1)
+        {
+            _execError = zypp::str::form( _("Can't chroot to '%s' (%s)."), _chroot.c_str(), strerror(errno) );
+            std::cerr << _execError << std::endl; // After fork log on stderr too
+            writeErrAndExit( 128, ChildErrType::CHROOT_FAILED ); // No sense in returning! I am forked away!!
+        }
+        if ( ! chdirTo )
+          chdirTo = "/";
+    }
+
+    if ( chdirTo && chdir( chdirTo ) == -1 )
+    {
+      _execError = _chroot.empty() ? zypp::str::form( _("Can't chdir to '%s' (%s)."), chdirTo, strerror(errno) )
+                                   : zypp::str::form( _("Can't chdir to '%s' inside chroot '%s' (%s)."), chdirTo, _chroot.c_str(), strerror(errno) );
+
+      std::cerr << _execError << std::endl;// After fork log on stderr too
+      writeErrAndExit( 128, ChildErrType::CHDIR_FAILED ); // No sense in returning! I am forked away!!
+    }
+
+    // map the extra fds the user might have set
+    mapExtraFds( controlPipe->writeFd );
+
+    if ( _dieWithParent ) {
+      // process dies with us
+      int r = prctl(PR_SET_PDEATHSIG, SIGTERM);
+      if (r == -1) {
+        //ignore if it did not work, worst case the process lives on after the parent dies
+        std::cerr << "Failed to set PR_SET_PDEATHSIG" << std::endl;// After fork log on stderr too
+      }
+
+      // test in case the original parent exited just
+      // before the prctl() call
+      pid_t ppidNow = getppid();
+      if (ppidNow != ppid_before_fork) {
+        // no sense to write to control pipe, parent is gone
+        std::cerr << "PPID changed from "<<ppid_before_fork<<" to "<< ppidNow << std::endl;// After fork log on stderr too
+        _exit(128);
+      }
+    }
+
+    execvp( argv[0], const_cast<char *const *>( argv ) );
+    // don't want to get here
+    _execError = zypp::str::form( _("Can't exec '%s' (%s)."), _args[0].c_str(), strerror(errno) );
+    std::cerr << _execError << std::endl;// After fork log on stderr too
+    writeErrAndExit( 129, ChildErrType::EXEC_FAILED ); // No sense in returning! I am forked away!!
+    //////////////////////////////////////////////////////////////////////
+  }
+  else if ( _pid == -1 )        // Fork failed, close everything.
+  {
+    _execError = zypp::str::form( _("Can't fork (%s)."), strerror(errno) );
+    _exitStatus = 127;
+    ERR << _execError << std::endl;
+    return false;
+  }
+  else {
+
+    // parent process, fork worked lets wait for the exec to happen
+    controlPipe->unrefWrite();
+
+    ChildErr buf;
+    const auto res = zypp::io::readAll( controlPipe->readFd, &buf, sizeof(ChildErr) );
+    if ( res == zypp::io::ReadAllResult::Eof ) {
+      // success!!!!
+      DBG << "pid " << _pid << " launched" << std::endl;
+      return true;
+    } else if ( res == zypp::io::ReadAllResult::Ok ) {
+      switch( buf.type ) {
+        case ChildErrType::CHDIR_FAILED:
+          _execError = zypp::str::form( _("Can't exec '%s', chdir failed (%s)."), _args[0].c_str(), strerror(buf.childErrno) );
+          break;
+        case ChildErrType::CHROOT_FAILED:
+          _execError = zypp::str::form( _("Can't exec '%s', chroot failed (%s)."), _args[0].c_str(), strerror(buf.childErrno) );
+          break;
+        case ChildErrType::EXEC_FAILED:
+          _execError = zypp::str::form( _("Can't exec '%s', exec failed (%s)."), _args[0].c_str(), strerror(buf.childErrno) );
+          break;
+        // all other cases need to be some sort of error, because we only get data if the exec fails
+        default:
+          _execError = zypp::str::form( _("Can't exec '%s', unexpected error."), _args[0].c_str() );
+          break;
+      }
+
+      // reap child and collect exit code
+      isRunning( true );
+      return false;
+    } else {
+      //reading from the fd failed, this should actually never happen
+      ERR << "Reading from the control pipe failed. " << errno << ". This is not supposed to happen ever." << std::endl;
+      return isRunning();
+    }
+  }
+  return true;
+}
+
+bool zyppng::ForkSpawnEngine::usePty() const
+{
+  return _use_pty;
+}
+
+void zyppng::ForkSpawnEngine::setUsePty( const bool set )
+{
+  _use_pty = set;
+}
+
+
+#if ZYPP_HAS_GLIBSPAWNENGINE
+
+struct GLibForkData {
+  zyppng::GlibSpawnEngine *that = nullptr;
+  pid_t pidParent = -1;
+};
+
+bool zyppng::GlibSpawnEngine::start( const char * const *argv, int stdin_fd, int stdout_fd, int stderr_fd )
+{
+  _pid = -1;
+  _exitStatus = 0;
+  _execError.clear();
+  _executedCommand.clear();
+  _args.clear();
+
+  if ( !argv || !argv[0] ) {
+    _execError = _("Invalid spawn arguments given.");
+    _exitStatus = 128;
+    return false;
+  }
+
+  const char * chdirTo = nullptr;
+
+  if ( !_chroot.empty() ) {
+    const auto chroot = _chroot.c_str();
+    if ( chroot[0] == '\0' )
+    {
+      _chroot = zypp::Pathname();      // ignore empty _chroot
+    }
+    else if ( chroot[0] == '/' && chroot[1] == '\0' )
+    {
+      // If _chroot is '/' do not chroot, but chdir to '/'
+      // unless arglist defines another dir.
+      chdirTo = "/";
+      _chroot = zypp::Pathname();
+    }
+  }
+
+  if ( !_workingDirectory.empty() )
+    chdirTo = _workingDirectory.c_str();
+
+  // do not remove the single quotes around every argument, copy&paste of
+  // command to shell will not work otherwise!
+  {
+    _args.clear();
+    std::stringstream cmdstr;
+    for (int i = 0; argv[i]; i++) {
+      if ( i != 0 ) cmdstr << ' ';
+      cmdstr << '\'';
+      cmdstr << argv[i];
+      cmdstr << '\'';
+      _args.push_back( argv[i] );
+    }
+    _executedCommand = cmdstr.str();
+  }
+  DBG << "Executing" << ( _useDefaultLocale?"[C] ":" ") << _executedCommand << std::endl;
+
+  // build the env var ptrs
+  std::vector<std::string> envStrs;
+  std::vector<gchar *> envPtrs;
+
+  for ( char **envPtr = environ; *envPtr != nullptr; envPtr++ )
+    envPtrs.push_back( *envPtr );
+
+  envStrs.reserve( _environment.size() );
+  envPtrs.reserve( envPtrs.size() + _environment.size() + ( _useDefaultLocale ? 2 : 1 ) );
+  for ( const auto &env : _environment ) {
+    envStrs.push_back( env.first + "=" + env.second );
+    envPtrs.push_back( envStrs.back().data() );
+  }
+  if ( _useDefaultLocale ) {
+    envStrs.push_back( "LC_ALL=C" );
+    envPtrs.push_back( envStrs.back().data() );
+  }
+  envPtrs.push_back( nullptr );
+
+  GLibForkData data;
+  data.that = this;
+  data.pidParent = ::getpid();
+
+  bool needCallback = !_chroot.empty() || _dieWithParent || _switchPgid || _mapFds.size();
+
+  auto spawnFlags = GSpawnFlags( G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH_FROM_ENVP );
+  if ( _mapFds.size() )
+    spawnFlags = GSpawnFlags( spawnFlags | G_SPAWN_LEAVE_DESCRIPTORS_OPEN );
+
+  GPid childPid = -1;
+  g_autoptr(GError) error = NULL;
+  g_spawn_async_with_fds(
+        chdirTo,
+        (gchar **)argv,
+        envPtrs.data(),
+        spawnFlags,
+        needCallback ? &GlibSpawnEngine::glibSpawnCallback : nullptr,
+        needCallback ? &data : nullptr,
+        &childPid,
+        stdin_fd,  //in
+        stdout_fd,  //out
+        stderr_fd,  //err
+        &error
+  );
+
+  if ( !error ) {
+    _pid = childPid;
+  } else {
+    _execError = zypp::str::form( _("Can't fork (%s)."), strerror(errno) );
+    _exitStatus = 127;
+    ERR << _execError << std::endl;
+    return false;
+  }
+  return true;
+}
+
+void zyppng::GlibSpawnEngine::glibSpawnCallback(void *data)
+{
+  GLibForkData *d = reinterpret_cast<GLibForkData *>(data);
+
+  bool doChroot = !d->that->_chroot.empty();
+
+  std::string execError;
+
+  if ( d->that->_switchPgid )
+    setpgid( 0, 0);
+
+  if ( doChroot ) {
+    if ( ::chroot( d->that->_chroot.c_str() ) == -1 ) {
+      execError = zypp::str::form( "Can't chroot to '%s' (%s).", d->that->_chroot.c_str(), strerror(errno) );
+      std::cerr << execError << std::endl;// After fork log on stderr too
+      _exit (128); // No sense in returning! I am forked away!!
+    }
+
+    std::string chdir; //if we are in chroot we need to chdir again
+    if ( d->that->_workingDirectory.empty() ) {
+      chdir = "/";
+    } else {
+      chdir = d->that->_workingDirectory.asString();
+    }
+
+    if ( !chdir.empty() && ::chdir( chdir.data() ) == -1 )
+    {
+      execError = doChroot ? zypp::str::form( "Can't chdir to '%s' inside chroot '%s' (%s).", chdir.data(), d->that->_chroot.c_str(), strerror(errno) )
+                           : zypp::str::form( "Can't chdir to '%s' (%s).", chdir.data(), strerror(errno) );
+      std::cerr << execError << std::endl; // After fork log on stderr too
+      _exit (128);                          // No sense in returning! I am forked away!!
+    }
+
+  }
+
+  if ( d->that->_dieWithParent ) {
+    // process dies with us
+    int r = prctl(PR_SET_PDEATHSIG, SIGTERM);
+    if (r == -1) {
+      //ignore if it did not work, worst case the process lives on after the parent dies
+      std::cerr << "Failed to set PR_SET_PDEATHSIG" << std::endl;// After fork log on stderr too
+    }
+
+    // test in case the original parent exited just
+    // before the prctl() call
+    pid_t ppidNow = getppid();
+    if (ppidNow != d->pidParent ) {
+      std::cerr << "PPID changed from "<<d->pidParent<<" to "<< ppidNow << std::endl;// After fork log on stderr too
+      _exit(128);
+    }
+  }
+
+  // map the extra fds the user might have set
+  d->that->mapExtraFds();
+}
+#endif
diff --git a/zypp-core/zyppng/io/iobuffer.cc b/zypp-core/zyppng/io/iobuffer.cc
new file mode 100644 (file)
index 0000000..5e03bb9
--- /dev/null
@@ -0,0 +1,214 @@
+#include "private/iobuffer_p.h"
+#include <cstring>
+
+namespace zyppng {
+
+  enum {
+    DefChunkSize = 4096
+  };
+
+  IOBuffer::IOBuffer(unsigned chunkSize) : _defaultChunkSize ( chunkSize == 0 ? DefChunkSize : chunkSize )
+  { }
+
+  char *IOBuffer::reserve( size_t bytes )
+  {
+    // do we need a new chunk?
+    if ( _chunks.size() ) {
+      auto &back = _chunks.back();
+      if ( back.available() >= bytes ) {
+        char * ptr = back._buffer.data() + back.tail;
+        back.tail += bytes;
+        return ptr;
+      }
+    }
+
+    // not enough space ready allocate a new one
+    _chunks.push_back( Chunk{} );
+    auto &back = _chunks.back();
+    back._buffer.insert( back._buffer.end(), std::max<size_t>( _defaultChunkSize, bytes ), '\0' );
+    back.tail += bytes;
+    return back.data();
+  }
+
+  char *IOBuffer::front()
+  {
+    if ( frontSize() == 0 )
+      return nullptr;
+
+    return _chunks.front().data();
+  }
+
+  size_t IOBuffer::frontSize() const
+  {
+    if ( _chunks.empty() )
+      return 0;
+    return _chunks.front().len();
+  }
+
+  void IOBuffer::clear()
+  {
+    _chunks.clear();
+  }
+
+  size_t IOBuffer::discard( size_t bytes )
+  {
+    const size_t bytesToDiscard = std::min(bytes, size());
+    if ( bytesToDiscard == size() ) {
+      clear();
+      return bytesToDiscard;
+    }
+
+    size_t discardedSoFar = 0;
+
+    // since the chunks might not be used completely we need to iterate over them
+    // counting how much used bytes we actually discard until we hit the requested amount
+    while ( discardedSoFar < bytesToDiscard ) {
+      auto &chunk = _chunks.front();
+      const auto bytesInChunk = chunk.len();
+
+      if ( discardedSoFar + bytesInChunk > bytesToDiscard ) {
+        chunk.head += ( bytesToDiscard - discardedSoFar );
+        discardedSoFar = bytesToDiscard;
+      } else {
+        _chunks.erase( _chunks.begin() );
+        discardedSoFar += bytesInChunk;
+      }
+    }
+
+
+    return bytesToDiscard;
+  }
+
+  /*!
+   * Removes bytes from the end of the buffer
+   */
+  void IOBuffer::chop( size_t bytes )
+  {
+    if ( bytes == 0 )
+      return;
+
+    bytes = std::min( bytes, size() );
+    if ( bytes == size() ) {
+      clear();
+      return;
+    }
+
+    size_t choppedSoFar = 0;
+    while ( choppedSoFar < bytes && _chunks.size() ) {
+      auto bytesStillToChop =  bytes - choppedSoFar;
+      auto &chunk = _chunks.back();
+
+      if ( chunk.len() > bytesStillToChop ) {
+        chunk.tail -= bytesStillToChop;
+        break;
+      } else {
+        choppedSoFar += chunk.len();
+        _chunks.pop_back();
+      }
+    }
+  }
+
+  void IOBuffer::append(const char *data, size_t count)
+  {
+    char *buf = reserve( count );
+    if ( count == 1 )
+      *buf = *data;
+    else {
+      ::memcpy( buf, data, count );
+    }
+  }
+
+  void IOBuffer::append(const ByteArray &data)
+  {
+    append( data.data(), data.size() );
+  }
+
+  size_t IOBuffer::read( char *buffer, size_t max )
+  {
+    const size_t bytesToRead = std::min( size(), max );
+    size_t readSoFar = 0;
+
+    while ( readSoFar < bytesToRead && _chunks.size() ) {
+
+      auto &chunk = _chunks.front();
+      const auto toRead   = std::min<size_t>( bytesToRead - readSoFar, chunk.len() );
+      ::memcpy( buffer+readSoFar, chunk.data(), toRead );
+      readSoFar += toRead;
+
+      // if we consumed all data in the chunk discard it
+      chunk.head += toRead;
+      if( chunk.head >= chunk.tail )
+        _chunks.erase( _chunks.begin() );
+    }
+
+    return readSoFar;
+  }
+
+  size_t IOBuffer::size() const
+  {
+    size_t s = 0;
+    for ( const auto &c : _chunks )
+      s+= c.len();
+    return s;
+  }
+
+  std::vector<IOBuffer::Chunk>::size_type IOBuffer::chunks() const
+  {
+    return _chunks.size();
+  }
+
+  int64_t IOBuffer::indexOf( const char c, size_t maxCount, size_t pos ) const
+  {
+    if ( maxCount == 0 )
+      return -1;
+
+    maxCount = std::min<size_t>( maxCount, size() );
+
+    size_t  scannedSoFar  = 0;
+    for ( const auto &chunk : _chunks ) {
+
+      //as long as pos is still after the current chunk just increase the count
+      if ( scannedSoFar+chunk.len() - 1 < pos ) {
+        scannedSoFar += chunk.len();
+        continue;
+      }
+
+      const char * const chunkBegin = chunk.data();
+      const char *s = chunkBegin;
+
+      size_t lengthToScan = std::min<size_t>( chunk.len() , maxCount - scannedSoFar );
+      if ( pos > 0  && scannedSoFar < pos ) {
+        const auto adjust = (pos-scannedSoFar);
+        s += adjust;
+        lengthToScan -= adjust;
+      }
+
+      const char *ptr = reinterpret_cast<const char*>(::memchr( s, c, lengthToScan ));
+      if ( ptr ) {
+        return ( ( ptr - chunkBegin ) + scannedSoFar );
+      }
+
+      scannedSoFar += chunk.len();
+      if ( scannedSoFar >= maxCount )
+        break;
+    }
+    return -1;
+  }
+
+  ByteArray IOBuffer::readLine(const size_t max)
+  {
+    const auto idx = indexOf( '\n', max == 0 ? size() : max );
+    if ( idx == -1 )
+      return {};
+
+    zyppng::ByteArray b( idx+1, '\0' );
+    read( b.data(), idx+1 );
+    return b;
+  }
+
+  bool IOBuffer::canReadLine() const
+  {
+    return indexOf('\n') >= 0;
+  }
+
+}
diff --git a/zypp-core/zyppng/io/iodevice.cc b/zypp-core/zyppng/io/iodevice.cc
new file mode 100644 (file)
index 0000000..1cbeba5
--- /dev/null
@@ -0,0 +1,125 @@
+#include "private/iodevice_p.h"
+
+namespace zyppng {
+
+  IODevicePrivate::IODevicePrivate(IODevice &p) : BasePrivate(p)
+  { }
+
+  ZYPP_IMPL_PRIVATE(IODevice)
+
+  IODevice::IODevice() : Base( *( new IODevicePrivate(*this)) )
+  { }
+
+  IODevice::IODevice(IODevicePrivate &d) : Base(d)
+  { }
+
+  bool IODevice::open( const OpenMode mode )
+  {
+    Z_D();
+
+    d->_readBuf.clear();
+    d->_mode = mode;
+
+    return true;
+  }
+
+  void IODevice::close()
+  {
+    d_func()->_mode = IODevice::Closed;
+    d_func()->_readBuf.clear();
+  }
+
+  bool IODevice::canRead() const
+  {
+    return ( d_func()->_mode & IODevice::ReadOnly );
+  }
+
+  bool IODevice::canWrite() const
+  {
+    return ( d_func()->_mode & IODevice::WriteOnly );
+  }
+
+  bool IODevice::isOpen() const
+  {
+    return d_func()->_mode != IODevice::Closed;
+  }
+
+  bool IODevice::canReadLine() const
+  {
+    Z_D();
+    if ( !canRead() )
+      return false;
+
+    return d->_readBuf.canReadLine();
+  }
+
+  size_t IODevice::bytesAvailable() const
+  {
+    Z_D();
+    if ( !canRead() )
+      return 0;
+
+    return d->_readBuf.size() + rawBytesAvailable();
+  }
+
+  ByteArray IODevice::readAll()
+  {
+    return read( bytesAvailable() );
+  }
+
+  ByteArray IODevice::read( size_t maxSize )
+  {
+    if ( !canRead() || maxSize == 0 )
+      return {};
+
+    ByteArray res( maxSize, '\0' );
+    const auto r = read( res.data(), maxSize );
+    res.resize( r );
+    return res;
+  }
+
+  size_t IODevice::read( char *buf, size_t maxSize )
+  {
+    Z_D();
+    if ( !canRead() )
+      return 0;
+
+    size_t readSoFar = d->_readBuf.read( buf, maxSize );
+
+    // try to read more from the device
+    if ( readSoFar < maxSize ) {
+      size_t readFromDev = readData( buf+readSoFar, maxSize - readSoFar );
+      if ( readFromDev > 0 )
+        return readSoFar + readFromDev;
+    }
+    return readSoFar;
+  }
+
+  ByteArray IODevice::readLine(const size_t maxSize)
+  {
+    if ( !canRead() )
+      return {};
+
+    return d_func()->_readBuf.readLine( maxSize );
+  }
+
+  off_t zyppng::IODevice::write(const zyppng::ByteArray &data)
+  {
+    if ( !canWrite() )
+      return 0;
+    return write( data.data(), data.size() );
+  }
+
+  off_t IODevice::write(const char *data, size_t len)
+  {
+    if ( !canWrite() )
+      return 0;
+    return writeData( data, len );
+  }
+
+  SignalProxy<void ()> IODevice::sigReadyRead()
+  {
+    return d_func()->_readyRead;
+  }
+}
+
diff --git a/zypp-core/zyppng/io/iodevice.h b/zypp-core/zyppng/io/iodevice.h
new file mode 100644 (file)
index 0000000..d4bcc0d
--- /dev/null
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+
+#ifndef ZYPPNG_IO_IODEVICE_DEFINED
+#define ZYPPNG_IO_IODEVICE_DEFINED
+
+#include <zypp-core/base/Flags.h>
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/base/Signals>
+#include <zypp-core/zyppng/core/ByteArray>
+
+namespace zyppng {
+
+  class IODevicePrivate;
+  class IODevice : public Base
+  {
+    ZYPP_DECLARE_PRIVATE(IODevice);
+  public:
+
+    enum OpenModeFlag {
+      Closed = 0x0,
+      ReadOnly = 0x1,
+      WriteOnly = 0x2,
+      ReadWrite = ReadOnly | WriteOnly
+    };
+    ZYPP_DECLARE_FLAGS( OpenMode, OpenModeFlag );
+
+    using Ptr = std::shared_ptr<IODevice>;
+    using WeakPtr = std::weak_ptr<IODevice>;
+
+    IODevice();
+
+    virtual bool open ( const OpenMode mode );
+    virtual void close ();
+
+
+    bool canRead () const;
+    bool canWrite () const;
+    bool isOpen () const;
+    bool canReadLine () const;
+
+    ByteArray readAll ();
+    ByteArray read ( size_t maxSize );
+    size_t read ( char *buf, size_t maxSize );
+    virtual ByteArray readLine ( const size_t maxSize = 0 );
+    virtual size_t bytesAvailable () const;
+
+    off_t write ( const ByteArray &data );
+    off_t write ( const char *data, size_t len );
+
+    /*!
+     * Signal is emitted when there is data available to read
+     */
+    SignalProxy<void ()> sigReadyRead ();
+
+  protected:
+    IODevice( IODevicePrivate &d );
+    virtual size_t rawBytesAvailable () const = 0;
+    virtual off_t writeData ( const char *data, off_t count ) = 0;
+    virtual off_t readData  ( char *buffer, off_t bufsize ) = 0;
+  };
+  ZYPP_DECLARE_OPERATORS_FOR_FLAGS( IODevice::OpenMode );
+
+}
+
+#endif
diff --git a/zypp-core/zyppng/io/private/abstractspawnengine_p.h b/zypp-core/zyppng/io/private/abstractspawnengine_p.h
new file mode 100644 (file)
index 0000000..4628747
--- /dev/null
@@ -0,0 +1,104 @@
+#ifndef ZYPPNG_IO_PRIVATE_ABSTRACTPROCESSBACKEND_H
+#define ZYPPNG_IO_PRIVATE_ABSTRACTPROCESSBACKEND_H
+
+#include <string>
+#include <vector>
+#include <map>
+#include <memory>
+
+#include <zypp/Pathname.h>
+
+namespace zyppng {
+
+  /*!
+   * This implements the basic skeleton of ExternalProgram and Process.
+   * Taking care of forking the process and setting up stdout and stderr so both
+   * implementations can use the same code
+   * 
+   */
+  class AbstractSpawnEngine
+  {
+  public:
+
+    /**
+     * For passing additional environment variables to set
+     */
+    using Environment = std::map<std::string,std::string>;
+
+    AbstractSpawnEngine();
+    virtual ~AbstractSpawnEngine();
+
+    static std::unique_ptr<zyppng::AbstractSpawnEngine> createDefaultEngine ();
+
+    int exitStatus () const;
+    void setExitStatus ( const int state );
+
+    const std::string &executedCommand () const;
+    const std::string &execError() const;
+    void setExecError ( const std::string & str );
+
+    zypp::Pathname chroot() const;
+    void setChroot( const zypp::Pathname &chroot );
+
+    bool useDefaultLocale() const;
+    void setUseDefaultLocale( bool defaultLocale );
+
+    Environment environment() const;
+    void setEnvironment( const Environment &environment );
+
+    /**
+     * @returns the pid of the forked process, without checking if the process is
+     *          still running.  
+     */
+    pid_t pid   ( );
+
+    /** 
+     * Kickstart the process, if this returns true it is guaranteed that exec() was successful 
+     */
+    virtual bool start ( const char *const *argv, int stdin_fd, int stdout_fd, int stderr_fd )  = 0;
+
+    virtual bool isRunning ( bool wait = false ) = 0;
+
+    bool dieWithParent() const;
+    void setDieWithParent( bool dieWithParent );
+
+    bool switchPgid() const;
+    void setSwitchPgid(bool switchPgid);
+
+    zypp::Pathname workingDirectory() const;
+    void setWorkingDirectory(const zypp::Pathname &workingDirectory);
+
+    const std::vector<int> &fdsToMap () const;
+    void addFd ( int fd );
+
+    int checkStatus(int status);
+
+  protected:
+    bool _useDefaultLocale = false;
+    /** Should the process die with the parent process */
+    bool _dieWithParent = false;
+
+    bool _switchPgid = false;
+
+    pid_t _pid = -1;
+    int _exitStatus = 0;
+    /** Remember execution errors like failed fork/exec. */
+    std::string _execError;
+    /** Store the command we're executing. */
+    std::string _executedCommand;
+    /** The arguments we want to pass to the program. */
+    std::vector<std::string> _args;
+    /** Environment variables to set in the new process. */
+    Environment _environment;
+    /** Path to chroot into */
+    zypp::Pathname _chroot;
+    /** Working directory */
+    zypp::Pathname _workingDirectory;
+    /** Additional file descriptors we want to map to the new process */
+    std::vector<int> _mapFds;
+
+  };
+
+} // namespace zyppng
+
+#endif // ZYPPNG_IO_PRIVATE_ABSTRACTPROCESSBACKEND_H
diff --git a/zypp-core/zyppng/io/private/forkspawnengine_p.h b/zypp-core/zyppng/io/private/forkspawnengine_p.h
new file mode 100644 (file)
index 0000000..b704883
--- /dev/null
@@ -0,0 +1,63 @@
+#ifndef ZYPPNG_IO_PRIVATE_FORKSPAWNENGINE_H
+#define ZYPPNG_IO_PRIVATE_FORKSPAWNENGINE_H
+
+#include "abstractspawnengine_p.h"
+#include <glib.h>
+
+namespace zyppng {
+
+  class AbstractDirectSpawnEngine : public AbstractSpawnEngine
+  {
+  public:
+    ~AbstractDirectSpawnEngine();
+    virtual bool isRunning ( bool wait = false ) override;
+
+  protected:
+    void mapExtraFds( int controlFd = -1 );
+  };
+
+  /*!
+    \internal
+    Process forking engine thats using the traditional fork() approach
+   */
+  class ForkSpawnEngine : public AbstractDirectSpawnEngine
+  {
+  public:
+    bool start( const char *const *argv, int stdin_fd, int stdout_fd, int stderr_fd  ) override;
+    bool usePty () const;
+    void setUsePty ( const bool set = true );
+
+  private:
+    /**
+     * Set to true, if a pair of ttys is used for communication
+     * instead of a pair of pipes.
+     */
+    bool _use_pty = false;
+  };
+
+#if GLIB_CHECK_VERSION( 2, 58, 0)
+
+#define ZYPP_HAS_GLIBSPAWNENGINE 1
+
+  /*!
+    \internal
+    Process forking engine thats using g_spawn from glib which can in most cases optimize
+    using posix_spawn.
+   */
+  class GlibSpawnEngine : public AbstractDirectSpawnEngine
+  {
+  public:
+    bool start( const char *const *argv, int stdin_fd, int stdout_fd, int stderr_fd  ) override;
+
+  private:
+    static void glibSpawnCallback ( void *data );
+  };
+
+#else
+  #define ZYPP_HAS_GLIBSPAWNENGINE 0
+#endif
+
+}
+
+
+#endif //
diff --git a/zypp-core/zyppng/io/private/iobuffer_p.h b/zypp-core/zyppng/io/private/iobuffer_p.h
new file mode 100644 (file)
index 0000000..0226cdc
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef ZYPPNG_IO_IOBUFFER_P_H
+#define ZYPPNG_IO_IOBUFFER_P_H
+
+#include <zypp-core/zyppng/core/ByteArray>
+#include <vector>
+#include <cstdint>
+
+namespace zyppng {
+
+  class IOBuffer {
+
+    struct Chunk {
+      ByteArray _buffer;
+
+      unsigned head = 0;
+      unsigned tail = 0;
+
+      char * data () {
+        return _buffer.data() + head;
+      }
+
+      const char * data () const {
+        return _buffer.data() + head;
+      }
+
+      unsigned available() const {
+        return _buffer.size() - tail;
+      }
+      unsigned len () const {
+        return tail - head;
+      }
+    };
+
+  public:
+    IOBuffer( unsigned chunkSize = 0);
+
+    char *reserve( size_t bytes );
+    char *front ();
+    size_t frontSize () const;
+    void clear     ( );
+    size_t discard ( size_t bytes );
+    void chop ( size_t bytes );
+    void append ( const char *data, size_t count );
+    void append ( const ByteArray &data );
+    size_t read ( char *buffer, size_t max );
+    size_t size ( ) const;
+    std::vector<Chunk>::size_type chunks ()  const;
+    inline int64_t indexOf ( const char c ) const { return indexOf( c, size() ); }
+    int64_t indexOf ( const char c, size_t maxCount, size_t pos = 0 ) const;
+    ByteArray readLine ( const size_t max = 0 );
+    bool canReadLine () const;
+
+  private:
+    unsigned _defaultChunkSize;
+    std::vector<Chunk> _chunks;
+  };
+
+}
+
+#endif
diff --git a/zypp-core/zyppng/io/private/iodevice_p.h b/zypp-core/zyppng/io/private/iodevice_p.h
new file mode 100644 (file)
index 0000000..bbd9ba1
--- /dev/null
@@ -0,0 +1,36 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+
+#ifndef ZYPPNG_IO_IODEVICE_P_DEFINED
+#define ZYPPNG_IO_IODEVICE_P_DEFINED
+
+#include <zypp-core/zyppng/io/iodevice.h>
+#include <zypp-core/zyppng/base/private/base_p.h>
+#include "iobuffer_p.h"
+
+
+namespace zyppng {
+
+  class IODevicePrivate : public BasePrivate {
+  public:
+    IODevicePrivate ( IODevice &p );
+    IOBuffer _readBuf;
+    IODevice::OpenMode _mode = IODevice::Closed;
+    Signal< void()> _readyRead;
+  };
+
+}
+
+
+#endif
diff --git a/zypp-core/zyppng/io/private/sockaddr_p.h b/zypp-core/zyppng/io/private/sockaddr_p.h
new file mode 100644 (file)
index 0000000..d7a17c5
--- /dev/null
@@ -0,0 +1,19 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPPNG_IO_SOCKADDR_P_H
+#define ZYPPNG_IO_SOCKADDR_P_H
+
+#include <zypp-core/zyppng/io/sockaddr.h>
+
+#endif // ZYPPNG_IO_SOCKADDR_P_H
diff --git a/zypp-core/zyppng/io/private/socket_p.h b/zypp-core/zyppng/io/private/socket_p.h
new file mode 100644 (file)
index 0000000..c99148e
--- /dev/null
@@ -0,0 +1,120 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+
+#ifndef ZYPPNG_IO_SOCKET_P_DEFINED
+#define ZYPPNG_IO_SOCKET_P_DEFINED
+
+#include <zypp-core/zyppng/io/socket.h>
+#include <zypp-core/zyppng/io/private/iobuffer_p.h>
+#include <zypp-core/zyppng/base/socketnotifier.h>
+#include <zypp-core/zyppng/base/Timer>
+#include "iodevice_p.h"
+
+#include <variant>
+
+namespace zyppng {
+
+  class SocketPrivate : public IODevicePrivate
+  {
+    ZYPP_DECLARE_PUBLIC(Socket);
+  public:
+
+    SocketPrivate( int domain, int type, int protocol, Socket &p ) : IODevicePrivate(p),
+      _domain(domain),
+      _type( type ),
+      _protocol( protocol )
+    { }
+
+    bool initSocket () ;
+    void setError ( Socket::SocketError error, std::string &&err );
+    bool handleConnectError ( int error );
+
+    bool transition ( Socket::SocketState newState );
+    Socket::SocketState state () const;
+
+    bool connectToHost ();
+    void onSocketActivated ( int ev );
+    void onSocketActivatedSlot ( const SocketNotifier &, int ev ) {
+      return onSocketActivated(ev);
+    }
+    int  rawBytesAvailable () const;
+    bool readRawBytesToBuffer ();
+    bool writePendingData ();
+
+    int _domain;
+    int _type;
+    int _protocol;
+    std::shared_ptr<SockAddr> _targetAddr;
+
+    int _socket = -1;
+    bool _borrowedSocket = false;
+
+    //error handling
+    Socket::SocketError _error = Socket::NoError;
+    std::string _errorDesc;
+
+    //signals
+    Signal< void(Socket::SocketError)> _sigError;
+    Signal< void (std::size_t)> _sigBytesWritten;
+    Signal< void()> _incomingConnection;
+    Signal< void()> _connected;
+    Signal< void()> _disconnected;
+
+
+    struct InitialState {
+      static constexpr Socket::SocketState type() { return Socket::InitialState; }
+    };
+
+    struct ConnectingState : public sigc::trackable {
+      NON_COPYABLE(ConnectingState);
+      ConnectingState() = default;
+
+      static constexpr Socket::SocketState type() { return Socket::ConnectingState; }
+
+      SocketNotifier::Ptr _connectNotifier;
+      Timer::Ptr _connectTimeout;
+    };
+
+    struct ConnectedState : public sigc::trackable {
+      NON_COPYABLE(ConnectedState);
+      ConnectedState() = default;
+      static constexpr Socket::SocketState type() { return Socket::ConnectedState; }
+      SocketNotifier::Ptr _socketNotifier;
+      IOBuffer _writeBuffer;
+    };
+
+    struct ListeningState : public sigc::trackable {
+      NON_COPYABLE(ListeningState);
+      ListeningState() = default;
+      static constexpr Socket::SocketState type() { return Socket::ListeningState; }
+      SocketNotifier::Ptr _socketNotifier;
+    };
+
+    struct ClosingState {
+      static constexpr Socket::SocketState type() { return Socket::ClosingState; }
+      ClosingState( IOBuffer &&writeBuffer );
+
+      SocketNotifier::Ptr _socketNotifier;
+      IOBuffer _writeBuffer;
+    };
+
+    struct ClosedState {
+      static constexpr Socket::SocketState type() { return Socket::ClosedState; }
+    };
+    std::variant< InitialState, ConnectingState, ConnectedState, ListeningState, ClosingState, ClosedState > _state = InitialState();
+  };
+
+}
+
+#endif
diff --git a/zypp-core/zyppng/io/process.cpp b/zypp-core/zyppng/io/process.cpp
new file mode 100644 (file)
index 0000000..4ef4294
--- /dev/null
@@ -0,0 +1,275 @@
+#include "process.h"
+#include <zypp-core/zyppng/base/private/base_p.h>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/io/private/abstractspawnengine_p.h>
+#include <zypp-core/zyppng/io/AsyncDataSource>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <fcntl.h>
+
+namespace zyppng {
+
+  /*!
+   * @todo We will receive a started signal here before exec was called, so sigStarted actually just
+   *       signals that the fork has worked out but NOT that the app actually started
+   */
+
+  class ProcessPrivate : public BasePrivate
+  {
+  public:
+    ProcessPrivate( Process &p ) : BasePrivate(p)
+    { }
+
+    std::unique_ptr<AbstractSpawnEngine> _spawnEngine = AbstractSpawnEngine::createDefaultEngine();
+    AsyncDataSource::Ptr _stdinDevice;
+    AsyncDataSource::Ptr _stdoutDevice;
+    AsyncDataSource::Ptr _stderrDevice;
+    zypp::AutoFD _stdinFd  = -1;
+    zypp::AutoFD _stderrFd = -1;
+    zypp::AutoFD _stdoutFd = -1;
+    pid_t _pid = -1;
+    Signal<void ()> _sigStarted;
+    Signal<void ( int )> _sigFinished;
+    Signal<void ()> _sigFailedToStart;
+
+  };
+
+  ZYPP_IMPL_PRIVATE(Process)
+
+  Process::Process() : Base( *( new ProcessPrivate(*this) ) )
+  {
+
+  }
+
+  Process::Ptr Process::create()
+  {
+    return std::shared_ptr<Process>( new Process() );
+  }
+
+  Process::~Process()
+  {
+    Z_D();
+    if ( d->_pid >= 0 ) {
+      EventDispatcher::instance()->untrackChildProcess( d->_pid );
+      DBG << "Process destroyed while still running removing from EventLoop." << std::endl;
+    }
+  }
+
+  bool Process::start(const char * const *argv )
+  {
+    Z_D();
+
+    if ( !EventDispatcher::instance() ) {
+      ERR << "A valid EventDispatcher needs to be registered before starting a Process" << std::endl;
+      return false;
+    }
+
+    // clean up the previous run
+    d->_stdinDevice.reset();
+    d->_stdoutDevice.reset();
+    d->_stderrDevice.reset();
+    d->_stdinFd  = -1;
+    d->_stderrFd = -1;
+    d->_stdoutFd = -1;
+
+    // create the pipes we need
+    auto stdinPipe = Pipe::create( );
+    if ( !stdinPipe ) {
+      d->_sigFailedToStart.emit();
+      return false;
+    }
+
+    auto stdoutPipe = Pipe::create( );
+    if ( !stdoutPipe ) {
+      d->_sigFailedToStart.emit();
+      return false;
+    }
+
+    auto stderrPipe = Pipe::create( );
+    if ( !stderrPipe ) {
+      d->_sigFailedToStart.emit();
+      return false;
+    }
+
+    if ( d->_spawnEngine->start( argv, stdinPipe->readFd, stdoutPipe->writeFd, stderrPipe->writeFd ) ) {
+
+      // if we reach this point the engine guarantees that exec() was successful
+      d->_pid = d->_spawnEngine->pid( );
+
+      // register to the eventloop right away
+      EventDispatcher::instance()->trackChildProcess( d->_pid, [this]( int, int status ){
+        Z_D();
+        d->_spawnEngine->setExitStatus( d->_spawnEngine->checkStatus( status ) );
+        d->_pid = -1;
+        d->_sigFinished.emit( d->_spawnEngine->exitStatus() );
+      });
+
+      // make sure the fds we need are kept open
+      d->_stdinFd  = std::move( stdinPipe->writeFd );
+      d->_stdoutFd = std::move( stdoutPipe->readFd );
+      d->_stderrFd = std::move( stderrPipe->readFd );
+
+      d->_stdinDevice = AsyncDataSource::create();
+      d->_stdinDevice->open( -1, d->_stdinFd );
+
+      d->_stdoutDevice = AsyncDataSource::create();
+      d->_stdoutDevice->open( d->_stdoutFd );
+
+      d->_stderrDevice = AsyncDataSource::create();
+      d->_stderrDevice->open( d->_stderrFd );
+
+      d->_sigStarted.emit();
+      return true;
+    }
+    d->_sigFailedToStart.emit();
+    return false;
+  }
+
+  void Process::stop( int signal )
+  {
+    Z_D();
+    if ( isRunning() ) {
+      ::kill( d->_spawnEngine->pid(), signal );
+    }
+  }
+
+  bool Process::isRunning()
+  {
+    return ( d_func()->_pid > -1 );
+  }
+
+  const std::string &Process::executedCommand() const
+  {
+    return d_func()->_spawnEngine->executedCommand();
+  }
+
+  const std::string &Process::execError() const
+  {
+    return d_func()->_spawnEngine->execError();
+  }
+
+  zypp::filesystem::Pathname Process::chroot() const
+  {
+    return d_func()->_spawnEngine->chroot();
+  }
+
+  void Process::setChroot( const zypp::filesystem::Pathname &chroot )
+  {
+    return d_func()->_spawnEngine->setChroot( chroot );
+  }
+
+  bool Process::useDefaultLocale() const
+  {
+    return d_func()->_spawnEngine->useDefaultLocale();
+  }
+
+  void Process::setUseDefaultLocale( bool defaultLocale )
+  {
+    return d_func()->_spawnEngine->setUseDefaultLocale( defaultLocale );
+  }
+
+  Process::Environment Process::environment() const
+  {
+    return d_func()->_spawnEngine->environment();
+  }
+
+  void Process::setEnvironment( const Process::Environment &env )
+  {
+    return d_func()->_spawnEngine->setEnvironment( env );
+  }
+
+  pid_t Process::pid()
+  {
+    return d_func()->_pid;
+  }
+
+  int Process::exitStatus() const
+  {
+    return d_func()->_spawnEngine->exitStatus();
+  }
+
+  bool Process::dieWithParent() const
+  {
+    return d_func()->_spawnEngine->dieWithParent();
+  }
+
+  void Process::setDieWithParent( bool enabled )
+  {
+    return d_func()->_spawnEngine->setDieWithParent( enabled );
+  }
+
+  bool Process::switchPgid() const
+  {
+    return d_func()->_spawnEngine->switchPgid();
+  }
+
+  void Process::setSwitchPgid(bool enabled)
+  {
+    return d_func()->_spawnEngine->setSwitchPgid( enabled );
+  }
+
+  zypp::filesystem::Pathname Process::workingDirectory() const
+  {
+    return d_func()->_spawnEngine->workingDirectory();
+  }
+
+  void Process::setWorkingDirectory(const zypp::filesystem::Pathname &wd)
+  {
+    return d_func()->_spawnEngine->setWorkingDirectory( wd );
+  }
+
+  const std::vector<int> &Process::fdsToMap() const
+  {
+    return d_func()->_spawnEngine->fdsToMap();
+  }
+
+  void Process::addFd(int fd)
+  {
+    return d_func()->_spawnEngine->addFd( fd );
+  }
+
+  std::shared_ptr<IODevice> Process::stdinDevice()
+  {
+    return d_func()->_stdinDevice;
+  }
+
+  std::shared_ptr<IODevice> Process::stdoutDevice()
+  {
+    return d_func()->_stdoutDevice;
+  }
+
+  std::shared_ptr<IODevice> Process::stderrDevice()
+  {
+    return d_func()->_stderrDevice;
+  }
+
+  int Process::stdinFd()
+  {
+    return d_func()->_stdinFd;
+  }
+
+  int Process::stdoutFd()
+  {
+    return d_func()->_stdoutFd;
+  }
+
+  int Process::stderrFd()
+  {
+    return d_func()->_stderrFd;
+  }
+
+  SignalProxy<void ()> Process::sigStarted()
+  {
+    return d_func()->_sigStarted;
+  }
+
+  SignalProxy<void ()> Process::sigFailedToStart()
+  {
+    return d_func()->_sigFailedToStart;
+  }
+
+  SignalProxy<void (int)> Process::sigFinished()
+  {
+    return d_func()->_sigFinished;
+  }
+
+}
diff --git a/zypp-core/zyppng/io/process.h b/zypp-core/zyppng/io/process.h
new file mode 100644 (file)
index 0000000..f860c91
--- /dev/null
@@ -0,0 +1,92 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+
+#ifndef ZYPPNG_IO_PROCESS_H_DEFINED
+#define ZYPPNG_IO_PROCESS_H_DEFINED
+
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/base/Signals>
+#include <memory>
+#include <map>
+#include <signal.h>
+
+namespace zyppng {
+
+  class ProcessPrivate;
+  class IODevice;
+
+  class Process : public Base
+  {
+    ZYPP_DECLARE_PRIVATE(Process);
+  public:
+    /**
+     * For passing additional environment variables to set
+     */
+    using Environment = std::map<std::string,std::string>;
+
+    using Ptr = std::shared_ptr<Process>;
+    using WeakPtr = std::weak_ptr<Process>;
+
+    static Ptr create ();
+    ~Process();
+
+    bool start (const char *const *argv);
+    void stop  ( int signal = SIGTERM );
+    bool isRunning ();
+
+    const std::string &executedCommand () const;
+    const std::string &execError() const;
+
+    zypp::Pathname chroot() const;
+    void setChroot( const zypp::Pathname &chroot );
+
+    bool useDefaultLocale() const;
+    void setUseDefaultLocale( bool defaultLocale );
+
+    Environment environment() const;
+    void setEnvironment( const Environment &environment );
+
+    pid_t pid   ();
+    int exitStatus () const;
+
+    bool dieWithParent() const;
+    void setDieWithParent(bool enabled );
+
+    bool switchPgid() const;
+    void setSwitchPgid(bool enabled);
+
+    zypp::Pathname workingDirectory() const;
+    void setWorkingDirectory(const zypp::Pathname &workingDirectory);
+
+    const std::vector<int> &fdsToMap () const;
+    void addFd ( int fd );
+
+    std::shared_ptr<IODevice> stdinDevice ();
+    std::shared_ptr<IODevice> stdoutDevice ();
+    std::shared_ptr<IODevice> stderrDevice ();
+
+    int stdinFd ();
+    int stdoutFd ();
+    int stderrFd ();
+
+    SignalProxy<void ()> sigStarted  ();
+    SignalProxy<void ()> sigFailedToStart  ();
+    SignalProxy<void ( int )> sigFinished ();
+
+  protected:
+    Process();
+  };
+}
+
+#endif // ZYPPNG_IO_PROCESS_H_DEFINED
diff --git a/zypp-core/zyppng/io/sockaddr.cpp b/zypp-core/zyppng/io/sockaddr.cpp
new file mode 100644 (file)
index 0000000..fcd4e36
--- /dev/null
@@ -0,0 +1,32 @@
+#include "sockaddr.h"
+#include <sys/un.h>
+
+namespace zyppng {
+
+  UnixSockAddr::UnixSockAddr(const std::string &path , bool abstract ) : _data( std::make_shared<struct sockaddr_un>() )
+  {
+    memset( _data.get(), 0, size() );
+
+    _data->sun_family = AF_UNIX;
+    if ( path.size() ) {
+      const auto align = abstract ? 1 : 0;
+      path.copy( _data->sun_path + align, sizeof( _data->sun_path ) - align - 1 );
+    }
+  }
+
+  sockaddr *UnixSockAddr::nativeSockAddr() const
+  {
+    return reinterpret_cast<sockaddr *>(_data.get());
+  }
+
+  std::size_t UnixSockAddr::size() const
+  {
+    return sizeof(struct sockaddr_un);
+  }
+
+  bool UnixSockAddr::isAbstract() const
+  {
+    return _data->sun_path[0];
+  }
+
+}
diff --git a/zypp-core/zyppng/io/sockaddr.h b/zypp-core/zyppng/io/sockaddr.h
new file mode 100644 (file)
index 0000000..eb94fb0
--- /dev/null
@@ -0,0 +1,54 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPPNG_IO_SOCKADDR_H_DEFINED
+#define ZYPPNG_IO_SOCKADDR_H_DEFINED
+
+#include <cstddef>
+#include <sys/socket.h>
+#include <memory>
+#include <string>
+
+struct sockaddr_un;
+
+namespace zyppng {
+
+  class SockAddr {
+  public:
+    virtual ~SockAddr(){};
+    virtual struct ::sockaddr* nativeSockAddr () const = 0;
+    virtual std::size_t size () const = 0;
+  protected:
+
+  };
+
+  class UnixSockAddr : public SockAddr
+  {
+  public:
+
+    using Ptr = std::shared_ptr<UnixSockAddr>;
+
+    UnixSockAddr( const std::string &path, bool abstract );
+
+    // SockAddr interface
+    sockaddr *nativeSockAddr() const override;
+    std::size_t size() const override;
+
+    bool isAbstract () const;
+
+  private:
+    std::shared_ptr<struct sockaddr_un> _data;
+  };
+}
+
+#endif // SOCKADDR_H
diff --git a/zypp-core/zyppng/io/socket.cc b/zypp-core/zyppng/io/socket.cc
new file mode 100644 (file)
index 0000000..6edc821
--- /dev/null
@@ -0,0 +1,859 @@
+#include "private/socket_p.h"
+#include <errno.h>
+#include <string.h>
+#include <zypp-core/base/Logger.h>
+#include <zypp-core/AutoDispose.h>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <sys/ioctl.h> //For FIONREAD
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <fcntl.h>
+
+#include <iostream>
+
+namespace zyppng {
+
+  SocketPrivate::ClosingState::ClosingState(IOBuffer &&writeBuffer)
+    : _writeBuffer( std::move(writeBuffer) )
+  { }
+
+  bool SocketPrivate::initSocket()
+  {
+    if ( _socket >= 0 )
+      return true;
+
+    // Since Linux 2.6.27 we can pass additional flags with the type argument to avoid fcntl
+    // if creating sockets fails we might need to change that
+    _socket = ::socket( _domain, _type | SOCK_NONBLOCK | SOCK_CLOEXEC, _protocol );
+    if ( _socket >= 0 )
+      return true;
+
+    switch ( errno ) {
+      case EACCES:
+        setError( Socket::InsufficientPermissions, strerr_cxx() );
+        break;
+      case EINVAL:
+        setError( Socket::InvalidSocketOptions, strerr_cxx() );
+        break;
+      case EMFILE:
+      case ENFILE:
+      case ENOBUFS:
+      case ENOMEM:
+        setError( Socket::InsufficientRessources, strerr_cxx() );
+        break;
+      case EAFNOSUPPORT:
+      case EPROTONOSUPPORT:
+        setError ( Socket::UnsupportedSocketOptions, strerr_cxx() );
+        break;
+      default:
+        setError( Socket::UnknownSocketError, strerr_cxx() );
+        break;
+    }
+
+    return false;
+  }
+
+  void SocketPrivate::setError(Socket::SocketError error , std::string &&err )
+  {
+    if ( _error == error )
+      return;
+    _error = error;
+    _errorDesc = std::move(err);
+    _sigError.emit( error );
+  }
+
+  bool SocketPrivate::transition( Socket::SocketState newState )
+  {
+    const auto oldState = state();
+
+    if ( oldState == newState )
+      return true;
+
+    switch ( newState ) {
+      case Socket::InitialState:
+        setError( Socket::InternalError, "Invalid state transition" );
+        return false;
+      case Socket::ConnectingState:
+        if ( oldState != Socket::InitialState && oldState != Socket::ClosedState ) {
+          setError( Socket::InternalError, "Invalid state transition" );
+          return false;
+        }
+        _state.emplace<SocketPrivate::ConnectingState>( );
+        return connectToHost();
+        break;
+      case Socket::ConnectedState: {
+        if ( oldState != Socket::InitialState && oldState != Socket::ConnectingState ) {
+          setError( Socket::InternalError, "Invalid state transition" );
+          return false;
+        }
+        auto &s = _state.emplace<SocketPrivate::ConnectedState>();
+        s._socketNotifier = SocketNotifier::create( _socket, SocketNotifier::Read | SocketNotifier::Error, true );
+        s._socketNotifier->connect( &SocketNotifier::sigActivated, *this, &SocketPrivate::onSocketActivatedSlot );
+
+        z_func()->IODevice::open( IODevice::ReadOnly | IODevice::WriteOnly );
+
+        _connected.emit();
+        break;
+      }
+      case Socket::ListeningState: {
+        if ( state() != Socket::InitialState ) {
+          setError( Socket::InternalError, "Invalid state transition" );
+          return false;
+        }
+        auto &s = _state.emplace<SocketPrivate::ListeningState>();
+        s._socketNotifier = SocketNotifier::create( _socket, SocketNotifier::Read, true );
+        s._socketNotifier->connect( &SocketNotifier::sigActivated, *this, &SocketPrivate::onSocketActivatedSlot );
+        break;
+      }
+      case Socket::ClosingState: {
+        if ( state() != Socket::ConnectedState ) {
+          setError( Socket::InternalError, "Invalid state transition" );
+          return false;
+        }
+
+        auto wbOld =  std::move( std::get<ConnectedState>(_state)._writeBuffer );
+        auto &s = _state.emplace<SocketPrivate::ClosingState>(  std::move( wbOld ) );
+        s._socketNotifier = SocketNotifier::create( _socket, SocketNotifier::Write, true );
+        s._socketNotifier->connect( &SocketNotifier::sigActivated, *this, &SocketPrivate::onSocketActivatedSlot );
+        break;
+      }
+      case Socket::ClosedState: {
+        _state.emplace<SocketPrivate::ClosedState>();
+        if ( _socket >= 0 && !_borrowedSocket )
+          ::close( _socket );
+        _socket = -1;
+        _targetAddr.reset();
+        _disconnected.emit();
+        z_func()->IODevice::close();
+        break;
+      }
+    }
+    return true;
+  }
+
+  bool SocketPrivate::connectToHost()
+  {
+    auto &state = std::get<ConnectingState>( _state );
+
+    const int res = eintrSafeCall( ::connect, _socket, _targetAddr->nativeSockAddr(), _targetAddr->size() );
+
+    auto doDelayedConnect = [ this, &state ](){
+      if ( !state._connectNotifier ) {
+        state._connectNotifier = SocketNotifier::create( _socket, SocketNotifier::Write, true );
+        state._connectNotifier->connect( &SocketNotifier::sigActivated, *this, &SocketPrivate::onSocketActivatedSlot );
+      }
+
+      if ( !state._connectTimeout ) {
+        state._connectTimeout = Timer::create();
+        state._connectTimeout->connectFunc( &Timer::sigExpired, [this, &state ]( const auto &) {
+          setError( Socket::ConnectionTimeout, "The connection timed out." );
+          state._connectNotifier.reset();
+          state._connectTimeout.reset();
+        }, *z_func());
+      }
+      state._connectTimeout->setSingleShot( true );
+      state._connectTimeout->start( 30000 );
+      setError( Socket::ConnectionDelayed, "" );
+      return false;
+    };
+
+    if ( res < 0 ) {
+      switch ( errno ) {
+        case EAGAIN: {
+          if ( _targetAddr->nativeSockAddr()->sa_family == AF_UNIX ) {
+            // the Servers backlog is full , we need to wait
+            return doDelayedConnect();
+          } else {
+            setError( Socket::FailedSocketOperation, strerr_cxx() );
+            z_func()->close();
+            return false;
+          }
+          break;
+        }
+        case EINPROGRESS:
+          return doDelayedConnect();
+          break;
+
+        default:
+          if ( handleConnectError( errno ) == false ) {
+            z_func()->close();
+            return false;
+          }
+      }
+    }
+
+    // connected yay
+    if ( !transition( Socket::ConnectedState ) ) {
+      z_func()->close();
+      return false;
+    }
+    return true;
+  }
+
+  int zyppng::SocketPrivate::rawBytesAvailable() const
+  {
+    if ( state() != Socket::ConnectedState )
+      return 0;
+
+    return zyppng::bytesAvailableOnFD( _socket );
+  }
+
+  bool SocketPrivate::readRawBytesToBuffer()
+  {
+    auto bytesToRead = rawBytesAvailable();
+    if ( bytesToRead == 0 ) {
+      // make sure to check if bytes are available even if the ioctl call returns something different
+      bytesToRead = 4096;
+    }
+
+    char *buf = _readBuf.reserve( bytesToRead );
+    const auto bytesRead = z_func()->readData( buf, bytesToRead );
+
+    if ( bytesRead < 0 ) {
+      _readBuf.chop( bytesToRead );
+      return false;
+    }
+
+    if ( bytesToRead > bytesRead )
+      _readBuf.chop( bytesToRead-bytesRead );
+
+    if ( bytesRead > 0 ) {
+      _readyRead.emit();
+      return true;
+    }
+    //handle remote close
+    else if ( bytesRead == 0 && errno != EAGAIN && errno != EWOULDBLOCK  ) {
+      setError( Socket::ConnectionClosedByRemote, "The remote host closed the connection" );
+      return false;
+    }
+
+    if ( errno == EAGAIN || errno == EWOULDBLOCK )
+      return true;
+
+    setError( Socket::InternalError, strerr_cxx() );
+    return false;
+  }
+
+  bool SocketPrivate::writePendingData()
+  {
+    return std::visit( [this]( auto &s ){
+      using T = std::decay_t<decltype (s)>;
+      if constexpr ( std::is_same_v<T, ConnectedState> || std::is_same_v<T, ClosingState> ) {
+        const auto nwrite = s._writeBuffer.frontSize();
+        if ( !nwrite ) {
+          // disable Write notifications so we do not wake up without the need to
+          s._socketNotifier->setMode( SocketNotifier::Read | SocketNotifier::Error );
+          return true;
+        }
+
+        const auto nBuf = s._writeBuffer.front();
+        const auto written = eintrSafeCall( ::send, _socket, nBuf, nwrite, MSG_NOSIGNAL );
+        if ( written == -1 ) {
+          switch ( errno ) {
+            case EACCES:
+              setError( Socket::InsufficientPermissions, strerr_cxx() );
+              return false;
+            case EAGAIN:
+#if EAGAIN != EWOULDBLOCK
+            case EWOULDBLOCK:
+#endif
+              return true;
+            case EPIPE:
+            case ECONNRESET:
+              setError( Socket::ConnectionClosedByRemote, strerr_cxx() );
+              return false;
+            default:
+              setError( Socket::InternalError, strerr_cxx() );
+              return false;
+          }
+          return false;
+        }
+        s._writeBuffer.discard( written );
+        _sigBytesWritten.emit( written );
+      }
+      return true;
+    }, _state );
+  }
+
+  /*!
+   * Maps \a error into a \ref Socket::SocketError and sets it accordingly in
+   * the socket. Returns false if the error is fatal and connection needs to stop.
+   */
+  bool zyppng::SocketPrivate::handleConnectError( int error )
+  {
+    switch ( error ) {
+      case EACCES:
+      case EPERM:
+        setError( Socket::InsufficientPermissions, strerr_cxx() );
+        return false;
+      case EADDRINUSE:
+        setError( Socket::AddressInUse, strerr_cxx() );
+        return false;
+      case EADDRNOTAVAIL:
+        setError( Socket::AddressNotAvailable, strerr_cxx() );
+        return false;
+      case EAFNOSUPPORT:
+        setError( Socket::AddressIssue, strerr_cxx() );
+        return false;
+      case ETIMEDOUT:
+        setError( Socket::ConnectionTimeout, strerr_cxx() );
+        return false;
+      case EALREADY:
+        setError( Socket::ConnectionDelayed, "" );
+        return false;
+      case ECONNREFUSED:
+        setError( Socket::ConnectionRefused, strerr_cxx() );
+        return false;
+      case EBADF:
+      case EFAULT:
+      case ENOTSOCK:
+        setError( Socket::InternalError, strerr_cxx() ); // this can only happen if we screw up
+        return false;
+      case ENETUNREACH:
+        setError( Socket::NetworkUnreachable, strerr_cxx() );
+        return false;
+      case EPROTOTYPE:
+        setError ( Socket::InvalidSocketOptions, strerr_cxx() );
+        return false;
+      case EISCONN:
+        break;
+    }
+    return true;
+  }
+
+
+  void SocketPrivate::onSocketActivated( int ev )
+  {
+    std::visit( [ this, &ev ] ( const auto &currState ) {
+      using T = std::decay_t<decltype(currState)>;
+      if constexpr ( std::is_same<ConnectingState, T>() ) {
+        if ( (ev & SocketNotifier::Write) == SocketNotifier::Write ) {
+          if ( this->_targetAddr->nativeSockAddr()->sa_family == AF_UNIX ) {
+            // for AF_UNIX sockets we just call connect again
+            this->connectToHost();
+            return;
+          } else {
+
+            // for others we check with getsockopt as mentioned in connect(2) if the conn was successful
+            int err = 0;
+            socklen_t errSize = sizeof ( err );
+            ::getsockopt( _socket, SOL_SOCKET, SO_ERROR, &err, &errSize );
+
+            if ( err == 0 || err == EISCONN ) {
+              transition( Socket::ConnectedState );
+            } else {
+              if ( err == EINPROGRESS || err == EAGAIN || err == EALREADY )
+                return;
+              handleConnectError( err );
+              z_func()->abort();
+            }
+          }
+        }
+
+      } else if constexpr ( std::is_same<ConnectedState, T>() ) {
+        if ( (ev & SocketNotifier::Write) == SocketNotifier::Write ) {
+          if ( !writePendingData() ) {
+            z_func()->abort();
+            return;
+          }
+        }
+        if ( (ev & SocketNotifier::Read) == SocketNotifier::Read ) {
+          if ( !readRawBytesToBuffer() ) {
+            z_func()->abort();
+            return;
+          }
+        }
+        if ( (ev & SocketNotifier::Error) == SocketNotifier::Error ) {
+          return;
+        }
+
+      } else if constexpr ( std::is_same<ClosingState, T>() ) {
+
+        if ( (ev & SocketNotifier::Write) == SocketNotifier::Write ) {
+          if ( !writePendingData() ) {
+            z_func()->abort();
+            return;
+
+          }
+
+          if ( currState._writeBuffer.size() == 0 ) {
+            transition( Socket::ClosedState );
+          }
+        }
+
+      } else if constexpr ( std::is_same<ListeningState, T>() ) {
+
+        //signal that we have pending connections
+        _incomingConnection.emit();
+
+      } else {
+        DBG << "Unexpected state on socket activation" << std::endl;
+      }
+    },_state);
+  }
+
+  Socket::SocketState SocketPrivate::state() const
+  {
+    return std::visit([]( const auto &s ) constexpr { return s.type(); }, _state );
+  }
+
+  ZYPP_IMPL_PRIVATE(Socket)
+
+  Socket::Socket( int domain, int type, int protocol )
+    : IODevice( *( new SocketPrivate( domain, type, protocol, *this )))
+  { }
+
+  size_t Socket::rawBytesAvailable() const
+  {
+    return d_func()->rawBytesAvailable();
+  }
+
+  Socket::~Socket()
+  {
+    this->abort();
+  }
+
+  Socket::Ptr Socket::create( int domain, int type, int protocol )
+  {
+    return Ptr( new Socket( domain, type, protocol ) );
+  }
+
+  bool Socket::bind( std::shared_ptr<SockAddr> addr )
+  {
+    Z_D();
+    if ( !addr || !d->initSocket() )
+      return false;
+
+    int res = ::bind( d->_socket, addr->nativeSockAddr(), addr->size() );
+    if ( res >= 0) return true;
+
+    switch ( errno ) {
+      case EACCES:
+        d->setError( Socket::InsufficientPermissions, strerr_cxx() );
+        break;
+      case EADDRINUSE:
+        d->setError( Socket::AddressInUse, strerr_cxx() );
+        break;
+      case EBADF:
+      case ENOTSOCK:
+      case EFAULT:
+        d->setError( Socket::InternalError, strerr_cxx() ); // this can only happen if we screw up
+        break;
+      case EINVAL:
+        d->setError( Socket::SocketAlreadyBound, strerr_cxx() );
+        break;
+      case EADDRNOTAVAIL:
+        d->setError( Socket::AddressNotAvailable, strerr_cxx() );
+        break;
+      case ELOOP:
+      case ENAMETOOLONG:
+      case ENOENT:
+      case ENOTDIR:
+      case EROFS:
+        d->setError( Socket::AddressIssue, strerr_cxx() );
+        break;
+      case ENOMEM:
+        d->setError( Socket::InsufficientRessources, strerr_cxx() );
+        break;
+      default:
+        d->setError( Socket::UnknownSocketError, strerr_cxx() );
+        break;
+    }
+
+    abort();
+    return false;
+  }
+
+  bool Socket::listen(int backlog)
+  {
+    Z_D();
+    if ( !d->initSocket() )
+      return false;
+
+    int res = ::listen( d->_socket, backlog );
+    if ( res >= 0 ) {
+      d->transition( Socket::ListeningState );
+      return true;
+    }
+
+    switch ( errno ) {
+
+      case EADDRINUSE:
+        d->setError( Socket::AddressInUse, strerr_cxx() );
+        break;
+      case EBADF:
+      case ENOTSOCK:
+        d->setError( Socket::InternalError, strerr_cxx() ); // this can only happen if we screw up
+        break;
+      case EOPNOTSUPP:
+        d->setError( Socket::OperationNotSupported, strerr_cxx() );
+        break;
+
+    }
+    return false;
+  }
+
+  Socket::Ptr Socket::accept()
+  {
+    Z_D();
+    if ( d->_socket == -1 )
+      return nullptr;
+
+    //accept new pending connections
+    const auto res = eintrSafeCall( ::accept4, d->_socket, (struct sockaddr*)nullptr, (socklen_t *)nullptr, SOCK_CLOEXEC );
+    if ( res < 0 ) {
+      switch ( errno ) {
+#if EAGAIN != EWOULDBLOCK
+        case EWOULDBLOCK:
+#endif
+        case EAGAIN:
+        case ECONNABORTED:
+          return nullptr;
+          break;
+        default:
+          d->setError( Socket::InternalError, strerr_cxx() );
+          return nullptr;
+      }
+    }
+
+    return Socket::fromSocket( res, Socket::ConnectedState );
+  }
+
+  Socket::Ptr Socket::fromSocket( int fd, Socket::SocketState state )
+  {
+
+    int domain;
+    socklen_t optlen = sizeof(domain);
+    int res = getsockopt( fd, SOL_SOCKET, SO_DOMAIN, &domain, &optlen );
+    if ( res < 0 ) {
+      DBG << "Error querying socket domain: " << strerr_cxx() << std::endl;
+      ::close(fd);
+      return nullptr;
+    }
+
+    int protocol;
+    optlen = sizeof(domain);
+    res = getsockopt( fd, SOL_SOCKET, SO_PROTOCOL, &protocol, &optlen );
+    if ( res < 0 ) {
+      DBG << "Error querying socket protocol: " << strerr_cxx() << std::endl;
+      ::close(fd);
+      return nullptr;
+    }
+
+    int type;
+    optlen = sizeof(domain);
+    res = getsockopt( fd, SOL_SOCKET, SO_TYPE, &type, &optlen );
+    if ( res < 0 ) {
+      DBG << "Error querying socket type: " << strerr_cxx() << std::endl;
+      ::close(fd);
+      return nullptr;
+    }
+
+    // from here on the Socket instance owns the fd, no need to manually close it
+    // in case of error
+    auto sptr = Socket::create( domain, type, protocol );
+    sptr->d_func()->_socket = fd;
+
+    // make sure the socket is non blocking
+    if ( !sptr->setBlocking( false ) ) {
+      DBG << "Failed to unblock socket." << std::endl;
+      return nullptr;
+    }
+
+    if( sptr->d_func()->transition( state ) )
+      return sptr;
+
+    return nullptr;
+  }
+
+  bool Socket::setBlocking( const bool set )
+  {
+    Z_D();
+
+    if ( !d->initSocket() )
+      return false;
+
+    const int oldFlags = fcntl( d->_socket, F_GETFL, 0 );
+    if (oldFlags == -1) return false;
+
+    const int flags = set ? ( oldFlags & ~(O_NONBLOCK) ) : ( oldFlags | O_NONBLOCK );
+
+    // no need to do a syscall if we do not change anything
+    if ( flags == oldFlags )
+      return true;
+
+    if ( fcntl( d->_socket, F_SETFL, flags ) != 0) {
+      return false;
+    }
+    return true;
+  }
+
+  bool Socket::connect( std::shared_ptr<SockAddr> addr )
+  {
+    Z_D();
+
+    if ( !addr || ( d->state() != Socket::InitialState &&  d->state() != Socket::ClosedState ) )
+      return false;
+
+    if ( !d->initSocket() )
+      return false;
+
+    d->_targetAddr = addr;
+    if ( !d->transition( Socket::ConnectingState ) ) {
+      abort();
+      return false;
+    }
+
+    return d->state() == Socket::ConnectedState;
+  }
+
+  int Socket::nativeSocket() const
+  {
+    Z_D();
+    return d->_socket;
+  }
+
+  int Socket::releaseSocket()
+  {
+    Z_D();
+    auto sock = d->_socket;
+    d->_socket = -1;
+    d->transition( Socket::ClosedState );
+    return sock;
+  }
+
+  Socket::SocketError Socket::lastError() const
+  {
+    Z_D();
+    return d->_error;
+  }
+
+  void Socket::abort()
+  {
+    Z_D();
+    d->transition( ClosedState );
+  }
+
+  void Socket::close()
+  {
+    disconnect();
+  }
+
+  void Socket::disconnect()
+  {
+    Z_D();
+    std::visit([&d]( const auto &s ){
+      using Type = std::decay_t<decltype (s)>;
+      if constexpr ( std::is_same_v<Type, SocketPrivate::ConnectedState > ) {
+        // we still have pending data, we need to wait for it to be written
+        if ( s._writeBuffer.size() ) {
+          d->transition( Socket::ClosingState );
+          return;
+        }
+      }
+      d->transition( Socket::ClosedState );
+    }, d->_state );
+
+  }
+
+  off_t Socket::writeData( const char *data, off_t count )
+  {
+    Z_D();
+    if ( d->state() != SocketState::ConnectedState )
+      return 0;
+
+    auto &s = std::get<SocketPrivate::ConnectedState>( d->_state );
+
+    // if the write buffer has already data we need to append to it to keep the correct order
+    if ( s._writeBuffer.size() ) {
+      s._writeBuffer.append( data, count );
+      //lets try to write some of it
+      d->writePendingData();
+      return count;
+    }
+
+    auto written = eintrSafeCall( ::send, d->_socket, data, count, MSG_NOSIGNAL );
+    if ( written == -1  ) {
+      switch ( errno ) {
+#if EAGAIN != EWOULDBLOCK
+        case EWOULDBLOCK:
+#endif
+        case EAGAIN: {
+          written = 0;
+          break;
+        }
+        case EPIPE:
+        case ECONNRESET: {
+          d->setError( Socket::ConnectionClosedByRemote, strerr_cxx( errno ) );
+          return -1;
+        }
+        default: {
+          d->setError( Socket::UnknownSocketError, strerr_cxx( errno ) );
+          return -1;
+        }
+      }
+    }
+
+    if ( written >= 0 ) {
+      if ( written < count ) {
+        // append the rest of the data to the buffer, so we can return always the full count
+        s._writeBuffer.append( data + written, count - written );
+        s._socketNotifier->setMode( SocketNotifier::Read | SocketNotifier::Write | SocketNotifier::Error );
+      }
+      if ( written > 0 )
+        d->_sigBytesWritten.emit( written );
+    }
+    return count;
+  }
+
+  bool Socket::waitForConnected( int timeout )
+  {
+    Z_D();
+    if ( d->state() == Socket::ConnectedState )
+      return true;
+    // we can only wait if we are in connecting state
+    while ( d->state() == Socket::ConnectingState ) {
+      int rEvents = 0;
+      if ( EventDispatcher::waitForFdEvent( d->_socket, AbstractEventSource::Write, rEvents, timeout ) ) {
+        d->onSocketActivated( rEvents );
+      } else {
+        // timeout
+        return false;
+      }
+    }
+    return d->state() == Socket::ConnectedState;
+  }
+
+  bool Socket::waitForAllBytesWritten( int timeout )
+  {
+    Z_D();
+
+    bool canContinue = true;
+    bool bufferEmpty = false;
+
+    while ( canContinue && !bufferEmpty ) {
+
+      if ( d->state() != Socket::ConnectedState &&  d->state() != Socket::ClosingState)
+        return false;
+
+      std::visit([&]( const auto &s ){
+        using T = std::decay_t<decltype (s)>;
+        if constexpr ( std::is_same_v<T, SocketPrivate::ConnectedState> || std::is_same_v<T, SocketPrivate::ClosingState> ) {
+          if ( s._writeBuffer.size() > 0 ) {
+            int rEvents = 0;
+            canContinue = EventDispatcher::waitForFdEvent( d->_socket, AbstractEventSource::Write | AbstractEventSource::Read, rEvents, timeout );
+            if ( canContinue ) {
+              //this will trigger the bytesWritten signal, we check there if the buffer is empty
+              d->onSocketActivated( rEvents );
+            }
+          }
+          if ( s._writeBuffer.size() == 0 ){
+            canContinue = false;
+            bufferEmpty = true;
+          }
+        }
+      }, d->_state );
+    }
+    return bufferEmpty;
+  }
+
+  bool Socket::waitForReadyRead(int timeout)
+  {
+    Z_D();
+    if ( d->state() != Socket::ConnectedState )
+      return false;
+
+    // we can only wait if we are in connected state
+    while ( d->state() == Socket::ConnectedState && bytesAvailable() <= 0 ) {
+      int rEvents = 0;
+      if ( EventDispatcher::waitForFdEvent( d->_socket,  AbstractEventSource::Read | AbstractEventSource::Error , rEvents, timeout ) ) {
+        d->onSocketActivated( rEvents );
+      } else {
+        //timeout
+        return false;
+      }
+    }
+    return bytesAvailable() > 0;
+  }
+
+  off_t Socket::readData( char *buffer, off_t bufsize )
+  {
+
+    Z_D();
+    if ( d->state() != SocketState::ConnectedState )
+      return -1;
+
+    const auto read = eintrSafeCall( ::read, d->_socket, buffer, bufsize );
+
+    // special case for remote close
+    if ( read == 0 ) {
+      d->setError( ConnectionClosedByRemote, "The remote host closed the connection" );
+      abort();
+      return -1;
+    } else if ( read < 0 ) {
+      switch ( errno ) {
+#if EAGAIN != EWOULDBLOCK
+        case EWOULDBLOCK:
+#endif
+        case EAGAIN: {
+          return 0;
+        }
+        default: {
+          d->setError( UnknownSocketError, strerr_cxx( errno ) );
+          abort();
+          return -1;
+        }
+      }
+    }
+    return read;
+  }
+
+  size_t Socket::bytesAvailable() const
+  {;
+    return IODevice::bytesAvailable();
+  }
+
+  size_t Socket::bytesPending() const
+  {
+    Z_D();
+    return std::visit([&]( const auto &s ) -> size_t {
+      using T = std::decay_t<decltype (s)>;
+      if constexpr ( std::is_same_v<T, SocketPrivate::ConnectedState> || std::is_same_v<T, SocketPrivate::ClosingState> ) {
+        return s._writeBuffer.size();
+      }
+      return 0;
+    }, d->_state );
+  }
+
+  Socket::SocketState Socket::state() const
+  {
+    return d_func()->state();
+  }
+
+  SignalProxy<void ()> Socket::sigIncomingConnection()
+  {
+    return d_func()->_incomingConnection;
+  }
+
+  SignalProxy<void ()> Socket::sigConnected()
+  {
+    return d_func()->_connected;
+  }
+
+  SignalProxy<void ()> Socket::sigDisconnected()
+  {
+    return d_func()->_disconnected;
+  }
+
+  SignalProxy<void (Socket::SocketError)> Socket::sigError()
+  {
+    return d_func()->_sigError;
+  }
+
+  SignalProxy<void (std::size_t)> Socket::sigBytesWritten()
+  {
+    return d_func()->_sigBytesWritten;
+  }
+
+}
diff --git a/zypp-core/zyppng/io/socket.h b/zypp-core/zyppng/io/socket.h
new file mode 100644 (file)
index 0000000..d2417fe
--- /dev/null
@@ -0,0 +1,240 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+
+#ifndef ZYPPNG_IO_SOCKET_DEFINED
+#define ZYPPNG_IO_SOCKET_DEFINED
+
+#include <zypp-core/zyppng/io/IODevice>
+#include <zypp-core/zyppng/io/SockAddr>
+#include <zypp-core/zyppng/base/Signals>
+
+namespace zyppng {
+
+  class SocketPrivate;
+
+  /*!
+   * Combines Sockets with the zypp event loop. Generally every socket type that is supported
+   * by the socket(2) API should work, however currently only Unix Domain sockets are tested.
+   *
+   * The useage pattern of this class is similar to the socket(2) API, on the server endpoint
+   * one listening socket is created and bound to a adress to accept incoming connections.
+   * For every appected connections a connected socket instance is returned which can be used for communication with the peer.
+   *
+   */
+  class Socket : public IODevice
+  {
+    ZYPP_DECLARE_PRIVATE(Socket);
+  public:
+
+    enum SocketError {
+      NoError,
+      UnknownSocketError,
+      InsufficientPermissions,
+      InvalidSocketOptions,
+      InsufficientRessources,
+      UnsupportedSocketOptions,
+      FailedSocketOperation,
+      SocketAlreadyBound,
+      SocketNotListening,
+      AddressInUse,
+      AddressNotAvailable,
+      AddressIssue,
+      OperationNotSupported,
+      ConnectionTimeout,
+      ConnectionDelayed,
+      ConnectionRefused,
+      ConnectionClosedByRemote,
+      NetworkUnreachable,
+      InternalError
+    };
+
+    enum SocketState {
+      InitialState,
+      ConnectingState,
+      ConnectedState,
+      ListeningState,
+      ClosingState,
+      ClosedState
+    };
+
+    using Ptr = std::shared_ptr<Socket>;
+
+    /*!
+     * Creates a new socket with the given \a doman , \a type and \a protocol.
+     * See socket(2) for available arguments.
+     *
+     * \note currently only AF_UNIX, SOCK_STREAM sockets are tested
+     */
+    static Ptr create ( int domain, int type, int protocol );
+    virtual ~Socket();
+
+    /*!
+     * Closed the socket and disconnects from the peer.
+     * The \a disconnected signal will be emitted.
+     * This is similar to calling \ref disconnect.
+     */
+    void close() override;
+
+    /*!
+     * Returns the current number of bytes that can be read from the socket.
+     */
+    size_t bytesAvailable() const override;
+
+    /*!
+     * Returns the current number of bytes that are not yet written to the socket.
+     */
+    size_t bytesPending() const;
+
+    /*!
+     * Returns the current state the socket is in,
+     * check \ref SocketState for possible values.
+     */
+    SocketState state () const;
+
+    /*!
+     * Bind the socket to a local address, this is usually required to listen for incoming connections.
+     */
+    bool bind ( std::shared_ptr<SockAddr> addr );
+
+    /*!
+     * Puts the socket in listen mode, the state is set accordingly.
+     */
+    bool listen ( int backlog = 50 );
+
+    /*!
+     * Accepts a pending incoming connection and returns it as a
+     * intialized connected socket.
+     * Returns nullptr if there is no pending connection.
+     */
+    Ptr accept ();
+
+    /*!
+     * This will set the socket into blocking mode. Can be used if there is no
+     * EventLoop running. (Make sure a EventDispatcher instance exists for the thread)
+     */
+    bool setBlocking ( const bool set = true );
+
+
+    /*!
+     * Starts to disconnect from the host, wait for the actual
+     * \ref sigDisconnected signal to arrive before destroying the socket
+     * otherwise the connection is forcefully aborted
+     */
+    void disconnect ();
+
+    /*!
+     * Forcefully aborts the connection, no matter if there is still data to be written
+     * in the write buffer
+     */
+    void abort ();
+
+    /*!
+     * Starts the connection process to the given adress in \a addr.
+     * Returns true on success, if false is returned the current state should be
+     * checked if the connection was simply delayed. In that case the state is \ref ConnectingState
+     * and error is set to \ref ConnectionDelayed and the socket still tries to connect.
+     */
+    bool connect ( std::shared_ptr<SockAddr> addr );
+
+    /*!
+     * Blocks the current event loop to wait for the connected event on the socket.
+     * \note do not use until there is no other way
+     */
+    bool waitForConnected ( int timeout = -1 );
+
+    /*!
+     * Blocks the current event loop to wait until all bytes from the buffer have been written
+     * to the device.
+     *
+     * \note do not use until there is no other way
+     */
+    bool waitForAllBytesWritten ( int timeout = -1 );
+
+    /*!
+     * Blocks the current event loop to wait until there are bytes available to read from the device
+     *
+     * \note do not use until there is no other way
+     */
+    bool waitForReadyRead ( int timeout = -1 );
+
+    /*!
+     * Returns the native socket handle.
+     */
+    int nativeSocket () const;
+
+    /*!
+     * This will release the current socket and instantly transition into
+     * ClosedState. All unwritten data in the buffers will be discarded,
+     * so consider to use \ref waitForAllBytesWritten before you call this function.
+     *
+     * \returns the socket or -1 if there was no socket connected
+     */
+    int releaseSocket ();
+
+    /*!
+     * Return the last error that was encountered by the socket.
+     */
+    SocketError lastError () const;
+
+    /*!
+     * Signals when there are new incoming connection pending.
+     * \note Make sure to accept all connection otherwise the event loop keeps triggering that signal
+     */
+    SignalProxy<void ()> sigIncomingConnection ();
+
+    /*!
+     * Signal is emitted as soon as the socket enters the connected state. It is not possible to
+     * read and write data.
+     */
+    SignalProxy<void ()> sigConnected ();
+
+    /*!
+     * Signal is emitted always when the socket was closed. In the signal handler it is still possible
+     * to read all pending data in the read buffer, which will be discarded right after emitting the signal.
+     * \note when the socket should be deleted in a slot connected to this signal make sure
+     *       to delay the delete using the EventDispatcher.
+     */
+    SignalProxy<void ()> sigDisconnected ();
+
+    /*!
+     * Signal is emitted every time bytes have been written to the underlying socket.
+     * This can be used to track how much data was actually sent.
+     */
+    SignalProxy<void ( std::size_t )> sigBytesWritten ();
+
+    /*!
+     * Signal is emitted whenever a error happend in the socket. Make sure to check
+     * the actual error code to determine if the error is fatal.
+     */
+    SignalProxy<void (Socket::SocketError)> sigError ();
+
+
+    /*!
+     * Makes a socket instance out of a existing socket file descriptor,
+     * the instance takes ownership of the fd
+     */
+    static Ptr fromSocket ( int fd, SocketState state );
+
+  protected:
+    Socket ( int domain, int type, int protocol );
+
+
+    // IODevice interface
+  protected:
+    size_t rawBytesAvailable() const override;
+    off_t writeData(const char *data, off_t count) override;
+    off_t readData(char *buffer, off_t bufsize) override;
+  };
+}
+#endif
diff --git a/zypp-core/zyppng/rpc/rpc.cc b/zypp-core/zyppng/rpc/rpc.cc
new file mode 100644 (file)
index 0000000..180fe42
--- /dev/null
@@ -0,0 +1,10 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include "rpc.h"
diff --git a/zypp-core/zyppng/rpc/rpc.h b/zypp-core/zyppng/rpc/rpc.h
new file mode 100644 (file)
index 0000000..6e5e4ce
--- /dev/null
@@ -0,0 +1,21 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#ifndef ZYPP_NG_RPC_RPC_H_INCLUDED
+#define ZYPP_NG_RPC_RPC_H_INCLUDED
+
+#include <zypp-proto/envelope.pb.h>
+
+namespace zyppng::rpc {
+  /*!
+     Type used as header before each zypp::proto::Envelope
+   */
+  using HeaderSizeType = uint32_t;
+}
+
+#endif
diff --git a/zypp-core/zyppng/rpc/zerocopystreams.cc b/zypp-core/zyppng/rpc/zerocopystreams.cc
new file mode 100644 (file)
index 0000000..e54d480
--- /dev/null
@@ -0,0 +1,276 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* Some versions of protobuf lite do not export the simple zero copy streams,
+* so for those we copied them from upstream.
+*/
+
+#include "zerocopystreams.h"
+
+#ifdef PROTOBUFLITE_HAS_NO_ZEROCOPYSTREAM
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <iostream>
+#include <algorithm>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/logging.h>
+#include <google/protobuf/stubs/stl_util.h>
+
+namespace zyppng {
+
+namespace {
+
+// EINTR sucks.
+int close_no_eintr(int fd) {
+  int result;
+  do {
+    result = close(fd);
+  } while (result < 0 && errno == EINTR);
+  return result;
+}
+
+}  // namespace
+
+
+// ===================================================================
+
+FileInputStream::FileInputStream(int file_descriptor, int block_size)
+  : copying_input_(file_descriptor),
+    impl_(&copying_input_, block_size) {
+}
+
+bool FileInputStream::Close() {
+  return copying_input_.Close();
+}
+
+bool FileInputStream::Next(const void** data, int* size) {
+  return impl_.Next(data, size);
+}
+
+void FileInputStream::BackUp(int count) {
+  impl_.BackUp(count);
+}
+
+bool FileInputStream::Skip(int count) {
+  return impl_.Skip(count);
+}
+
+google::protobuf::int64 FileInputStream::ByteCount() const {
+  return impl_.ByteCount();
+}
+
+FileInputStream::CopyingFileInputStream::CopyingFileInputStream(
+    int file_descriptor)
+  : file_(file_descriptor),
+    close_on_delete_(false),
+    is_closed_(false),
+    errno_(0),
+    previous_seek_failed_(false) {
+}
+
+FileInputStream::CopyingFileInputStream::~CopyingFileInputStream() {
+  if (close_on_delete_) {
+    if (!Close()) {
+      GOOGLE_LOG(ERROR) << "close() failed: " << strerror(errno_);
+    }
+  }
+}
+
+bool FileInputStream::CopyingFileInputStream::Close() {
+  GOOGLE_CHECK(!is_closed_);
+
+  is_closed_ = true;
+  if (close_no_eintr(file_) != 0) {
+    // The docs on close() do not specify whether a file descriptor is still
+    // open after close() fails with EIO.  However, the glibc source code
+    // seems to indicate that it is not.
+    errno_ = errno;
+    return false;
+  }
+
+  return true;
+}
+
+int FileInputStream::CopyingFileInputStream::Read(void* buffer, int size) {
+  GOOGLE_CHECK(!is_closed_);
+
+  int result;
+  do {
+    result = read(file_, buffer, size);
+  } while (result < 0 && errno == EINTR);
+
+  if (result < 0) {
+    // Read error (not EOF).
+    errno_ = errno;
+  }
+
+  return result;
+}
+
+int FileInputStream::CopyingFileInputStream::Skip(int count) {
+  GOOGLE_CHECK(!is_closed_);
+
+  if (!previous_seek_failed_ &&
+      lseek(file_, count, SEEK_CUR) != (off_t)-1) {
+    // Seek succeeded.
+    return count;
+  } else {
+    // Failed to seek.
+
+    // Note to self:  Don't seek again.  This file descriptor doesn't
+    // support it.
+    previous_seek_failed_ = true;
+
+    // Use the default implementation.
+    return google::protobuf::io::CopyingInputStream::Skip(count);
+  }
+}
+
+// ===================================================================
+
+FileOutputStream::FileOutputStream(int file_descriptor, int block_size)
+  : copying_output_(file_descriptor),
+    impl_(&copying_output_, block_size) {
+}
+
+FileOutputStream::~FileOutputStream() {
+  impl_.Flush();
+}
+
+bool FileOutputStream::Close() {
+  bool flush_succeeded = impl_.Flush();
+  return copying_output_.Close() && flush_succeeded;
+}
+
+bool FileOutputStream::Flush() {
+  return impl_.Flush();
+}
+
+bool FileOutputStream::Next(void** data, int* size) {
+  return impl_.Next(data, size);
+}
+
+void FileOutputStream::BackUp(int count) {
+  impl_.BackUp(count);
+}
+
+google::protobuf::int64 FileOutputStream::ByteCount() const {
+  return impl_.ByteCount();
+}
+
+FileOutputStream::CopyingFileOutputStream::CopyingFileOutputStream(
+    int file_descriptor)
+  : file_(file_descriptor),
+    close_on_delete_(false),
+    is_closed_(false),
+    errno_(0) {
+}
+
+FileOutputStream::CopyingFileOutputStream::~CopyingFileOutputStream() {
+  if (close_on_delete_) {
+    if (!Close()) {
+      GOOGLE_LOG(ERROR) << "close() failed: " << strerror(errno_);
+    }
+  }
+}
+
+bool FileOutputStream::CopyingFileOutputStream::Close() {
+  GOOGLE_CHECK(!is_closed_);
+
+  is_closed_ = true;
+  if (close_no_eintr(file_) != 0) {
+    // The docs on close() do not specify whether a file descriptor is still
+    // open after close() fails with EIO.  However, the glibc source code
+    // seems to indicate that it is not.
+    errno_ = errno;
+    return false;
+  }
+
+  return true;
+}
+
+bool FileOutputStream::CopyingFileOutputStream::Write(
+    const void* buffer, int size) {
+  GOOGLE_CHECK(!is_closed_);
+  int total_written = 0;
+
+  const google::protobuf::uint8* buffer_base = reinterpret_cast<const google::protobuf::uint8*>(buffer);
+
+  while (total_written < size) {
+    int bytes;
+    do {
+      bytes = write(file_, buffer_base + total_written, size - total_written);
+    } while (bytes < 0 && errno == EINTR);
+
+    if (bytes <= 0) {
+      // Write error.
+
+      // FIXME(kenton):  According to the man page, if write() returns zero,
+      //   there was no error; write() simply did not write anything.  It's
+      //   unclear under what circumstances this might happen, but presumably
+      //   errno won't be set in this case.  I am confused as to how such an
+      //   event should be handled.  For now I'm treating it as an error, since
+      //   retrying seems like it could lead to an infinite loop.  I suspect
+      //   this never actually happens anyway.
+
+      if (bytes < 0) {
+        errno_ = errno;
+      }
+      return false;
+    }
+    total_written += bytes;
+  }
+
+  return true;
+}
+
+// ===================================================================
+
+} // namespace
+
+#endif
diff --git a/zypp-core/zyppng/rpc/zerocopystreams.h b/zypp-core/zyppng/rpc/zerocopystreams.h
new file mode 100644 (file)
index 0000000..ee46f15
--- /dev/null
@@ -0,0 +1,238 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+* Some versions of protobuf lite do not export the simple zero copy streams,
+* so for those we copied them from upstream.
+*/
+#ifndef ZYPP_NG_RPC_ZEROCOPYSTREAMS_H_INCLUDED
+#define ZYPP_NG_RPC_ZEROCOPYSTREAMS_H_INCLUDED
+
+#ifndef PROTOBUFLITE_HAS_NO_ZEROCOPYSTREAM
+
+// just use the one we get from libprotobuf
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+
+// pull them into our namespace
+namespace zyppng {
+    using FileInputStream  = google::protobuf::io::FileInputStream;
+    using FileOutputStream = google::protobuf::io::FileOutputStream;
+}
+
+#else
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+//
+// This file contains common implementations of the interfaces defined in
+// zero_copy_stream.h which are only included in the full (non-lite)
+// protobuf library.  These implementations include Unix file descriptors
+// and C++ iostreams.  See also:  zero_copy_stream_impl_lite.h
+
+#include <string>
+#include <iosfwd>
+#include <google/protobuf/io/zero_copy_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
+#include <google/protobuf/stubs/common.h>
+
+// pull into zyppng namespace, even though protobuf-lite does not export the symbols of those
+// classes the headers still define them. So make sure we do not clash.
+namespace zyppng {
+
+// A ZeroCopyInputStream which reads from a file descriptor.
+//
+// FileInputStream is preferred over using an ifstream with IstreamInputStream.
+// The latter will introduce an extra layer of buffering, harming performance.
+// Also, it's conceivable that FileInputStream could someday be enhanced
+// to use zero-copy file descriptors on OSs which support them.
+class FileInputStream : public google::protobuf::io::ZeroCopyInputStream {
+ public:
+  // Creates a stream that reads from the given Unix file descriptor.
+  // If a block_size is given, it specifies the number of bytes that
+  // should be read and returned with each call to Next().  Otherwise,
+  // a reasonable default is used.
+  explicit FileInputStream(int file_descriptor, int block_size = -1);
+
+  // Flushes any buffers and closes the underlying file.  Returns false if
+  // an error occurs during the process; use GetErrno() to examine the error.
+  // Even if an error occurs, the file descriptor is closed when this returns.
+  bool Close();
+
+  // By default, the file descriptor is not closed when the stream is
+  // destroyed.  Call SetCloseOnDelete(true) to change that.  WARNING:
+  // This leaves no way for the caller to detect if close() fails.  If
+  // detecting close() errors is important to you, you should arrange
+  // to close the descriptor yourself.
+  void SetCloseOnDelete(bool value) { copying_input_.SetCloseOnDelete(value); }
+
+  // If an I/O error has occurred on this file descriptor, this is the
+  // errno from that error.  Otherwise, this is zero.  Once an error
+  // occurs, the stream is broken and all subsequent operations will
+  // fail.
+  int GetErrno() { return copying_input_.GetErrno(); }
+
+  // implements ZeroCopyInputStream ----------------------------------
+  bool Next(const void** data, int* size);
+  void BackUp(int count);
+  bool Skip(int count);
+  google::protobuf::int64 ByteCount() const;
+
+ private:
+  class CopyingFileInputStream : public google::protobuf::io::CopyingInputStream {
+   public:
+    CopyingFileInputStream(int file_descriptor);
+    ~CopyingFileInputStream();
+
+    bool Close();
+    void SetCloseOnDelete(bool value) { close_on_delete_ = value; }
+    int GetErrno() { return errno_; }
+
+    // implements CopyingInputStream ---------------------------------
+    int Read(void* buffer, int size);
+    int Skip(int count);
+
+   private:
+    // The file descriptor.
+    const int file_;
+    bool close_on_delete_;
+    bool is_closed_;
+
+    // The errno of the I/O error, if one has occurred.  Otherwise, zero.
+    int errno_;
+
+    // Did we try to seek once and fail?  If so, we assume this file descriptor
+    // doesn't support seeking and won't try again.
+    bool previous_seek_failed_;
+
+    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileInputStream);
+  };
+
+  CopyingFileInputStream copying_input_;
+  google::protobuf::io::CopyingInputStreamAdaptor impl_;
+
+  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileInputStream);
+};
+
+// ===================================================================
+
+// A ZeroCopyOutputStream which writes to a file descriptor.
+//
+// FileOutputStream is preferred over using an ofstream with
+// OstreamOutputStream.  The latter will introduce an extra layer of buffering,
+// harming performance.  Also, it's conceivable that FileOutputStream could
+// someday be enhanced to use zero-copy file descriptors on OSs which
+// support them.
+class FileOutputStream : public google::protobuf::io::ZeroCopyOutputStream {
+ public:
+  // Creates a stream that writes to the given Unix file descriptor.
+  // If a block_size is given, it specifies the size of the buffers
+  // that should be returned by Next().  Otherwise, a reasonable default
+  // is used.
+  explicit FileOutputStream(int file_descriptor, int block_size = -1);
+  ~FileOutputStream();
+
+  // Flushes any buffers and closes the underlying file.  Returns false if
+  // an error occurs during the process; use GetErrno() to examine the error.
+  // Even if an error occurs, the file descriptor is closed when this returns.
+  bool Close();
+
+  // Flushes FileOutputStream's buffers but does not close the
+  // underlying file. No special measures are taken to ensure that
+  // underlying operating system file object is synchronized to disk.
+  bool Flush();
+
+  // By default, the file descriptor is not closed when the stream is
+  // destroyed.  Call SetCloseOnDelete(true) to change that.  WARNING:
+  // This leaves no way for the caller to detect if close() fails.  If
+  // detecting close() errors is important to you, you should arrange
+  // to close the descriptor yourself.
+  void SetCloseOnDelete(bool value) { copying_output_.SetCloseOnDelete(value); }
+
+  // If an I/O error has occurred on this file descriptor, this is the
+  // errno from that error.  Otherwise, this is zero.  Once an error
+  // occurs, the stream is broken and all subsequent operations will
+  // fail.
+  int GetErrno() { return copying_output_.GetErrno(); }
+
+  // implements ZeroCopyOutputStream ---------------------------------
+  bool Next(void** data, int* size);
+  void BackUp(int count);
+  google::protobuf::int64 ByteCount() const;
+
+ private:
+  class CopyingFileOutputStream : public google::protobuf::io::CopyingOutputStream {
+   public:
+    CopyingFileOutputStream(int file_descriptor);
+    ~CopyingFileOutputStream();
+
+    bool Close();
+    void SetCloseOnDelete(bool value) { close_on_delete_ = value; }
+    int GetErrno() { return errno_; }
+
+    // implements CopyingOutputStream --------------------------------
+    bool Write(const void* buffer, int size);
+
+   private:
+    // The file descriptor.
+    const int file_;
+    bool close_on_delete_;
+    bool is_closed_;
+
+    // The errno of the I/O error, if one has occurred.  Otherwise, zero.
+    int errno_;
+
+    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileOutputStream);
+  };
+
+  CopyingFileOutputStream copying_output_;
+  google::protobuf::io::CopyingOutputStreamAdaptor impl_;
+
+  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileOutputStream);
+};
+
+}  // namespace
+
+#endif
+
+
+
+#endif
diff --git a/zypp-core/zyppng/thread/AsyncQueue b/zypp-core/zyppng/thread/AsyncQueue
new file mode 100644 (file)
index 0000000..e948e2c
--- /dev/null
@@ -0,0 +1 @@
+#include "asyncqueue.h"
diff --git a/zypp-core/zyppng/thread/Wakeup b/zypp-core/zyppng/thread/Wakeup
new file mode 100644 (file)
index 0000000..6650b49
--- /dev/null
@@ -0,0 +1 @@
+#include "wakeup.h"
diff --git a/zypp-core/zyppng/thread/asyncqueue.cc b/zypp-core/zyppng/thread/asyncqueue.cc
new file mode 100644 (file)
index 0000000..8ce0d0c
--- /dev/null
@@ -0,0 +1,110 @@
+#include "private/asyncqueue_p.h"
+#include <glib-unix.h>
+#include <ostream>
+
+#include <zypp-core/base/Logger.h>
+
+namespace zyppng {
+
+  AsyncQueueBase::~AsyncQueueBase()
+  { }
+
+  void AsyncQueueBase::addWatch(AsyncQueueWatch &watch)
+  {
+    std::lock_guard lock(_watchLock);
+    _watches.insert( &watch );
+  }
+
+  void AsyncQueueBase::removeWatch(AsyncQueueWatch &watch)
+  {
+    std::lock_guard lock(_watchLock);
+    _watches.erase( &watch );
+  }
+
+  void AsyncQueueBase::notifyWatches()
+  {
+    std::lock_guard lock(_watchLock);
+    std::for_each( _watches.begin(), _watches.end(), []( AsyncQueueWatch *w ){
+      w->postNotifyEvent();
+    });
+  }
+
+  AsyncQueueWatchPrivate::AsyncQueueWatchPrivate(std::shared_ptr<AsyncQueueBase> &&q  , AsyncQueueWatch &p) : AbstractEventSourcePrivate(p)
+    , _queue( std::move(q) )
+  {
+        GError *error = NULL;
+
+        if (!g_unix_open_pipe (fds, FD_CLOEXEC, &error))
+          ERR << "Creating pipes for AsyncQueueWatch: " << error->message << std::endl;
+
+        if (!g_unix_set_fd_nonblocking (fds[0], TRUE, &error) ||
+             !g_unix_set_fd_nonblocking (fds[1], TRUE, &error))
+          ERR << "Set pipes non-blocking for AsyncQueueWatch: "<< error->message << std::endl;
+  }
+
+  AsyncQueueWatchPrivate::~AsyncQueueWatchPrivate()
+  {
+    close (fds[0]);
+    close (fds[1]);
+  }
+
+  ZYPP_IMPL_PRIVATE(AsyncQueueWatch)
+
+  AsyncQueueWatch::AsyncQueueWatch(std::shared_ptr<zyppng::AsyncQueueBase> &&queue )
+    : AsyncQueueWatch( *( new AsyncQueueWatchPrivate( std::move(queue), *this ) ) )
+  {  }
+
+  AsyncQueueWatch::AsyncQueueWatch(AsyncQueueWatchPrivate &dd)
+    : AbstractEventSource( dd )
+  { }
+
+  std::shared_ptr<AsyncQueueWatch> AsyncQueueWatch::create( std::shared_ptr<AsyncQueueBase> queue )
+  {
+    std::shared_ptr<AsyncQueueWatch> ptr ( new AsyncQueueWatch( std::move(queue) ) );
+    auto d = ptr->d_func();
+    ptr->updateFdWatch( d->fds[0], AbstractEventSource::Read );
+    d->_queue->addWatch( *ptr );
+    return ptr;
+  }
+
+  AsyncQueueWatch::~AsyncQueueWatch()
+  {
+    // sync point, since the queue locks all its watches before changing or notifying them
+    // we should never run into a bad situation where the AsyncQueueWatch is deleted while notified from a different thread.
+    // In case watches are notified this will block and the other way round
+    d_func()->_queue->removeWatch( *this );
+  }
+
+  void AsyncQueueWatch::postNotifyEvent()
+  {
+    Z_D();
+    int res = -1;
+    guint8 one = 1;
+
+    do
+      res = write (d->fds[1], &one, sizeof one);
+    while (G_UNLIKELY (res == -1 && errno == EINTR));
+  }
+
+  SignalProxy<void ()> AsyncQueueWatch::sigMessageAvailable()
+  {
+    return d_func()->_sigMessageAvailable;
+  }
+
+  void AsyncQueueWatch::onFdReady( int , int )
+  {
+    Z_D();
+    char buffer[16];
+
+    /* read until it is empty */
+    while (read (d->fds[0], buffer, sizeof buffer) == sizeof buffer);
+    d->_sigMessageAvailable.emit();
+  }
+
+  void AsyncQueueWatch::onSignal(int)
+  {
+  }
+
+
+}
+
diff --git a/zypp-core/zyppng/thread/asyncqueue.h b/zypp-core/zyppng/thread/asyncqueue.h
new file mode 100644 (file)
index 0000000..10ca864
--- /dev/null
@@ -0,0 +1,171 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#ifndef ZYPP_NG_THREAD_ASYNCQUEUE_H_INCLUDED
+#define ZYPP_NG_THREAD_ASYNCQUEUE_H_INCLUDED
+
+#include <zypp-core/zyppng/base/AbstractEventSource>
+
+#include <queue>
+#include <set>
+#include <mutex>
+#include <memory>
+#include <optional>
+#include <condition_variable>
+
+namespace zyppng {
+
+  class AsyncQueueWatch;
+
+  class AsyncQueueBase {
+    public:
+      virtual ~AsyncQueueBase();
+
+      void addWatch ( AsyncQueueWatch &watch );
+      void removeWatch (  AsyncQueueWatch &watch );
+      void notifyWatches ( );
+
+    private:
+      std::set<AsyncQueueWatch *> _watches;
+      std::recursive_mutex _watchLock;
+  };
+
+  /*!
+   * AsyncQueue provides a thread safe way to send messages between threads.
+   * Using this class makes only sense for multithreaded applications.
+   */
+  template< class Message >
+  class AsyncQueue : public AsyncQueueBase {
+
+  public:
+
+    using Ptr = std::shared_ptr<AsyncQueue>;
+
+    static Ptr create () {
+      return Ptr( new AsyncQueue() );
+    }
+
+    AsyncQueue(const AsyncQueue&) = delete;
+    AsyncQueue& operator=(const AsyncQueue&) = delete;
+
+    /*!
+     * Pushes a new message into the queue, make sure to manually
+     * acqiure the lock before calling this function and \ref notify after
+     * unlocking it again. This function should be used when multiple messages should be pushed
+     * into the queue before notifying the threads.
+     * \sa push
+     */
+    template< typename T = Message >
+    void pushUnlocked ( T &&value ) {
+      _messages.push( std::forward<T>(value) );
+    }
+
+    /*!
+     * Pushes a new message into the queue and notify all waiting
+     * threads that there is new data available.
+     */
+    template< typename T = Message >
+    void push ( T &&value ) {
+      {
+        std::lock_guard lk( _mut );
+        pushUnlocked( std::forward<T>(value) );
+      }
+      notify();
+    }
+
+    /*!
+     * Pops the first message from the queue, blocking until there is data available.
+     */
+    Message pop () {
+      std::unique_lock<std::mutex> lk( _mut );
+      _cv.wait( lk, [this](){ return _messages.size() > 0; } );
+      Message msg = std::move( _messages.front() );
+      _messages.pop();
+      return msg;
+    }
+
+    /*!
+     * Tries to pop the first element from the queue, if no data is available returns a empty
+     * \ref std::optional instead of blocking.
+     */
+    std::optional<Message> tryPop () {
+      std::lock_guard lk( _mut );
+      return tryPopUnlocked();
+    }
+
+    /*!
+     * Same as \ref tryPop but does not lock the mutex, make sure to acquire the lock before
+     * calling this function.
+     */
+    std::optional<Message> tryPopUnlocked () {
+      if ( _messages.size() ) {
+        Message msg = std::move( _messages.front() );
+        _messages.pop();
+        return msg;
+      }
+      return {};
+    }
+
+    /*!
+     * Locks the internal mutex, use \ref std::lock_guard instead of manually
+     * calling lock and unlock.
+     */
+    void lock   () {
+      _mut.lock();
+    }
+
+    /*!
+     * Unlocks the internal mutex, use \ref std::lock_guard instead of manually
+     * calling lock and unlock.
+     */
+    void unlock () {
+      _mut.unlock();
+    }
+
+    /*!
+     * Notifies all waiting threads and registered \ref AsyncQueueWatch instances that
+     * new data is available.
+     */
+    void notify () {
+      _cv.notify_all();
+      notifyWatches();
+    }
+
+  private:
+    AsyncQueue() = default;
+    std::queue<Message> _messages;
+    std::mutex _mut;
+    std::condition_variable _cv;
+  };
+
+  class AsyncQueueWatchPrivate;
+  class LIBZYPP_NG_EXPORT AsyncQueueWatch : public AbstractEventSource
+  {
+    ZYPP_DECLARE_PRIVATE(AsyncQueueWatch)
+  public:
+
+    static std::shared_ptr<AsyncQueueWatch> create ( std::shared_ptr<AsyncQueueBase> queue );
+    virtual ~AsyncQueueWatch();
+
+    void postNotifyEvent ();
+
+    SignalProxy<void()> sigMessageAvailable();
+
+    // AbstractEventSource interface
+    void onFdReady(int fd, int events) override;
+    void onSignal(int signal) override;
+
+  protected:
+    AsyncQueueWatch( std::shared_ptr<AsyncQueueBase> &&queue );
+    AsyncQueueWatch( AsyncQueueWatchPrivate &dd );
+  };
+
+}
+
+
+#endif
diff --git a/zypp-core/zyppng/thread/private/asyncqueue_p.h b/zypp-core/zyppng/thread/private/asyncqueue_p.h
new file mode 100644 (file)
index 0000000..2ccbeb3
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef ZYPP_NG_THREAD_PRIVATE_ASYNCQUEUE_P_H
+#define ZYPP_NG_THREAD_PRIVATE_ASYNCQUEUE_P_H
+
+#include <zypp-core/zyppng/base/private/abstracteventsource_p.h>
+#include <zypp-core/zyppng/thread/asyncqueue.h>
+#include <zypp-core/zyppng/base/Signals>
+
+#include <glib.h>
+
+namespace zyppng {
+
+  class AsyncQueueWatchPrivate : public AbstractEventSourcePrivate
+  {
+    ZYPP_DECLARE_PUBLIC(AsyncQueueWatch)
+    public:
+      AsyncQueueWatchPrivate( std::shared_ptr<AsyncQueueBase> &&q, AsyncQueueWatch &p );
+      virtual ~AsyncQueueWatchPrivate();
+
+      std::shared_ptr<AsyncQueueBase> _queue;
+      gint fds[2] = { -1, -1 };
+      Signal< void()> _sigMessageAvailable;
+  };
+
+}
+
+#endif // ZYPP_NG_THREAD_PRIVATE_ASYNCQUEUE_P_H
diff --git a/zypp-core/zyppng/thread/wakeup.cpp b/zypp-core/zyppng/thread/wakeup.cpp
new file mode 100644 (file)
index 0000000..a7a19a5
--- /dev/null
@@ -0,0 +1,43 @@
+#include "wakeup.h"
+
+#include <zypp-core/zyppng/base/SocketNotifier>
+
+#include <unistd.h>
+#include <fcntl.h>
+
+namespace zyppng {
+
+  Wakeup::Wakeup()
+  {
+    ::pipe ( _wakeupPipe );
+    ::fcntl( _wakeupPipe[0], F_SETFL, O_NONBLOCK );
+  }
+
+  Wakeup::~Wakeup()
+  {
+    ::close (_wakeupPipe[0]);
+    ::close (_wakeupPipe[1]);
+  }
+
+  void Wakeup::notify()
+  {
+    write( _wakeupPipe[1], "\n", 1);
+  }
+
+  void Wakeup::ack()
+  {
+    char dummy;
+    while ( ::read( _wakeupPipe[0], &dummy, 1 ) > 0 ) { continue; }
+  }
+
+  int Wakeup::pollfd() const
+  {
+    return _wakeupPipe[0];
+  }
+
+  std::shared_ptr<SocketNotifier> Wakeup::makeNotifier( const bool enabled ) const
+  {
+    return SocketNotifier::create( _wakeupPipe[0], zyppng::SocketNotifier::Read, enabled );
+  }
+
+}
diff --git a/zypp-core/zyppng/thread/wakeup.h b/zypp-core/zyppng/thread/wakeup.h
new file mode 100644 (file)
index 0000000..1ec180e
--- /dev/null
@@ -0,0 +1,58 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#ifndef ZYPP_NG_THREAD_WAKEUP_H_INCLUDED
+#define ZYPP_NG_THREAD_WAKEUP_H_INCLUDED
+
+#include <memory>
+
+namespace zyppng {
+
+  class SocketNotifier;
+
+  /*!
+ * Simple helper class that can be used to notify a thread to wake up.
+ * This is guaranteed to use signal safe means to wake up the thread.
+ */
+  class Wakeup
+  {
+  public:
+    Wakeup();
+    ~Wakeup();
+
+    /*!
+     * Post a notification to the thread.
+     */
+    void notify();
+
+    /*!
+     * Called from the thread to acknowledge and clear the wakeup signal
+     * \note If this is not called the EventLoop in the thread will constantly wake up
+     */
+    void ack();
+
+    /*!
+     * Returns the internal FD to be used in the thread to poll for notifications
+     */
+    int pollfd() const;
+
+    /*!
+     * Convenience function to create a \ref zyppng::SocketNotifier that is listening for incoming
+     * notifications.
+     */
+    std::shared_ptr<SocketNotifier> makeNotifier( const bool enabled = true ) const;
+
+  private:
+    int _wakeupPipe[2] = { -1, -1 };
+  };
+
+}
+
+
+
+#endif // ZYPP_NG_THREAD_WAKEUP_H_INCLUDED
diff --git a/zypp-proto/CMakeLists.txt b/zypp-proto/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3eb68fb
--- /dev/null
@@ -0,0 +1,22 @@
+SET( zypp_core_PROTOBUF_SOURCES
+    core/envelope.proto
+)
+
+SET( zypp_media_PROTOBUF_SOURCES
+  media/transfersettings.proto
+  media/download.proto
+  media/messages.proto
+  media/networkrequesterror.proto
+)
+
+SET( zypp_target_PROTOBUF_SOURCES
+    target/commit.proto
+)
+
+protobuf_generate_cpp( ZYPPCORE_PROTO_SRCS ZYPPCORE_PROTO_HDRS ${zypp_core_PROTOBUF_SOURCES} )
+protobuf_generate_cpp( ZYPPMEDIA_PROTO_SRCS ZYPPMEDIA_PROTO_HDRS ${zypp_media_PROTOBUF_SOURCES} )
+protobuf_generate_cpp( ZYPPTARGET_PROTO_SRCS ZYPPTARGET_PROTO_HDRS ${zypp_target_PROTOBUF_SOURCES} )
+
+
+ADD_LIBRARY( zypp-protobuf STATIC ${ZYPPCORE_PROTO_SRCS} ${ZYPPCORE_PROTO_HDRS} ${ZYPPMEDIA_PROTO_SRCS} ${ZYPPMEDIA_PROTO_HDRS} ${ZYPPTARGET_PROTO_HDRS} ${ZYPPTARGET_PROTO_SRCS} )
+
diff --git a/zypp-proto/core/envelope.proto b/zypp-proto/core/envelope.proto
new file mode 100644 (file)
index 0000000..01899e2
--- /dev/null
@@ -0,0 +1,10 @@
+syntax = "proto3";
+option optimize_for = LITE_RUNTIME;
+
+package zypp.proto;
+
+// all messages will be enclosed in this type
+message Envelope {
+  string messageTypeName = 1;
+  bytes  value = 2;
+}
diff --git a/zypp-proto/media/download.proto b/zypp-proto/media/download.proto
new file mode 100644 (file)
index 0000000..7b1405b
--- /dev/null
@@ -0,0 +1,27 @@
+syntax = "proto3";
+option optimize_for = LITE_RUNTIME;
+
+import "transfersettings.proto";
+
+package zypp.proto;
+
+message Checksum {
+  string type = 1;
+  bytes  sum  = 2;
+}
+
+/*!
+ * Specifies a file that needs to be downloaded
+ */
+message DownloadSpec {
+    string url = 1;
+    TransferSettings settings = 2;
+    string delta = 3;
+    uint64 expectedFileSize = 4;
+    string targetPath = 5;
+    bool   checkExistanceOnly = 6; //< this will NOT download the file but only query the server if its existant
+    bool   metalink_enabled = 7;   //< should the download try to use metalinks
+    uint32   headerSize = 8;         //< Optional file header size for things like zchunk
+    Checksum headerChecksum = 9;     //< Optional file header checksum
+    uint32 preferred_chunk_size = 10;
+}
diff --git a/zypp-proto/media/messages.proto b/zypp-proto/media/messages.proto
new file mode 100644 (file)
index 0000000..03cc7e4
--- /dev/null
@@ -0,0 +1,100 @@
+syntax = "proto3";
+option optimize_for = LITE_RUNTIME;
+
+import "transfersettings.proto";
+import "download.proto";
+import "networkrequesterror.proto";
+
+package zypp.proto;
+
+// the download is silently enqueued and prefetched
+// will return a Status object to the sender
+message Request {
+    uint32 requestId = 1;
+    DownloadSpec spec = 2;
+    bool   prioritize = 3;         //< this is usually set when a download is required right away, it will be enqueued with highest prio
+    bool   streamProgress = 4;     //< immediately start to stream download updates
+}
+
+// the downloads are silently enqueued and prefetched
+// will return a Status object to the sender
+message Prefetch {
+    uint32 requestId = 1;
+    repeated Request requests = 2;
+}
+
+// Will reprioritize a download that is not yet started
+message Prioritize {
+    uint32 requestId = 1;
+}
+
+// Download has been started in the server, updates are streamed if streamProgress was
+// set to true in the initial request or if SubscribeProgress was issued for this request
+message DownloadStart {
+    uint32 requestId = 1;
+    string url = 2;
+}
+
+// constant updates about the state of the download
+// if total is NOT set, its a "Alive" update only
+message DownloadProgress {
+    uint32 requestId = 1;
+    string url = 2;
+    uint64 total = 3;
+    uint64 now = 4;
+}
+
+// last message sent about a tracked download
+message DownloadFin {
+    uint32 requestId = 1;
+    NetworkRequestError error = 2;
+    int64 last_auth_timestamp = 3; //< this field is only set if a timestamp from CredentialManager was used
+}
+
+// will start streaming updates about download download progress
+// usually only download start and finished messages are sent
+message SubscribeProgress {
+  uint32 requestId  = 1;
+  bool   prioritize = 2; //< setting this flag will also prioritize the download
+}
+
+// will stop streaming updates about download download progress
+// usually only download start and finished messages are sent
+message UnSubscribeProgress {
+  uint32 requestId = 1;
+}
+
+// this message can only be sent when a download is tracked
+// otherwise its silenty ignored without even a return code
+// the expected answer message for this is a DownloadFin with
+// its status code set to cancelled ( if it was not finished before )
+message CancelDownload {
+    uint32 requestId = 1;
+}
+
+// message sent to server to indicate that new auth data was stored
+// in the credential manager, this will restart all requests currently
+// sitting in AuthFailed status
+message NewAuthDataAvailable {
+  uint32 requestId = 1;
+  TransferSettings settings = 2;
+}
+
+// generic status object, showing if a request that has no explicit return message
+// was successful or not. However it can also be returned in place of any other response message
+// which usually means there is a error we can not recover from.
+message Status {
+    enum Code {
+      Ok = 0;
+      InvalidMessage = 1; //< The message could not be parsed from the stream, this will close the stream
+      UnknownRequest = 2; //< The Payload in the request was valid but unknown
+      MalformedRequest = 3; //< The payload type in the request was known, but it was not possible to deserialize it
+      UnknownId = 4; //< The request ID was not found
+    }
+    uint32 requestId = 1;
+    Code   code   = 2;
+    string reason = 3; //< if rejected is false, this will contain the reason why
+}
+
+
+
diff --git a/zypp-proto/media/networkrequesterror.proto b/zypp-proto/media/networkrequesterror.proto
new file mode 100644 (file)
index 0000000..0f12c50
--- /dev/null
@@ -0,0 +1,14 @@
+syntax = "proto3";
+option optimize_for = LITE_RUNTIME;
+
+package zypp.proto;
+
+message NetworkRequestError {
+  /**
+    * This will always correspond to the enum value specified in NetworkRequestError::Type
+    */
+  int32  error = 1;
+  string errorDesc = 2;
+  string nativeError = 3;
+  map<string, string> extra_info = 4;
+}
diff --git a/zypp-proto/media/transfersettings.proto b/zypp-proto/media/transfersettings.proto
new file mode 100644 (file)
index 0000000..7d266d9
--- /dev/null
@@ -0,0 +1,35 @@
+syntax = "proto3";
+option optimize_for = LITE_RUNTIME;
+
+package zypp.proto;
+
+message TransferSettings {
+    repeated string header = 1;
+    string useragent = 2;
+    string username = 3;
+    string password = 4;
+    bool useproxy = 5;
+    string proxy = 6;
+    string proxy_username = 7;
+    string proxy_password = 8;
+    string authtype = 9;
+    int64 timeout = 10;
+    int64 connect_timeout = 11;
+    string url = 12;
+    string targetdir = 13;
+
+
+    int64 maxConcurrentConnections = 14;
+    int64 minDownloadSpeed = 15;
+    int64 maxDownloadSpeed = 16;
+    int64 maxSilentTries = 17;
+
+    bool verify_host = 18;
+    bool verify_peer = 19;
+    string ca_path = 20;
+    string client_cert_path = 21;
+    string client_key_path = 22;
+
+    // workarounds
+    bool head_requests_allowed = 23;
+}
diff --git a/zypp-proto/target/commit.proto b/zypp-proto/target/commit.proto
new file mode 100644 (file)
index 0000000..ceea34c
--- /dev/null
@@ -0,0 +1,107 @@
+syntax = "proto3";
+option optimize_for = LITE_RUNTIME;
+
+package zypp.proto.target;
+
+// Commit Setup information
+message InstallStep {
+  string pathname = 1;
+  bool   multiversion = 2;
+}
+
+message RemoveStep {
+  string name = 1;
+  string version = 2;
+  string release = 3;
+  string arch    = 4;
+}
+
+message TransactionStep {
+  uint32 stepId = 1;
+  oneof stepdata {
+    InstallStep install = 2;
+    RemoveStep  remove = 3;
+  }
+}
+
+message Commit {
+  uint32 flags = 1;
+  string arch = 2;
+  string root = 3;
+  string dbPath = 4;
+  bool   ignoreArch = 5;
+  repeated TransactionStep steps = 6;
+}
+
+// message written to zypper when the transaction has failed
+message TransactionProblemDesc {
+  string message = 1;
+}
+message TransactionError {
+  repeated TransactionProblemDesc problems = 1;
+}
+
+// message written to the rpm log including the level
+message RpmLog {
+  uint32 level = 1;
+  string line = 2;
+}
+
+// Per package information which directly correspond to a TransactionStep !!!!
+message PackageBegin {
+  uint32 stepId = 1;
+}
+
+message PackageFinished {
+  uint32 stepId = 1;
+}
+
+message PackageError {
+  uint32 stepId = 1;
+}
+
+message PackageProgress {
+  uint32 stepId = 1;
+  uint32 amount = 2;
+}
+
+// Progress for cleaning up old versions of packages
+// which have NO corresponding TransactionStep
+message CleanupBegin {
+  string nvra = 1;
+}
+
+message CleanupFinished {
+  string nvra = 1;
+}
+
+message CleanupProgress {
+  string nvra = 1;
+  uint32 amount = 2;
+}
+
+// per script info, for each of those the stepId can be -1 or point
+// to a valid step in the transaction set.
+message ScriptBegin {
+  uint32 stepId = 1;
+  string scriptType = 2;
+  string scriptPackage = 3;
+}
+
+message ScriptFinished {
+  uint32 stepId = 1;
+}
+
+message ScriptError {
+  uint32 stepId = 1;
+  bool   fatal = 2;
+}
+
+// Generic Transactionstep report, we use it for preparing and verifying progress
+message TransBegin {
+  string name = 1;
+}
+message TransFinished {}
+message TransProgress {
+  uint32 amount = 1;
+}
index 1e540ea..a9d2f43 100644 (file)
@@ -12,8 +12,6 @@
 #ifndef ZYPP_APICONFIG_H
 #define ZYPP_APICONFIG_H
 
-#include "zypp/base/Easy.h"    // some macros used almost everywhere
-
 #define LIBZYPP_VERSION_STRING "@VERSION@"
 #define LIBZYPP_VERSION_MAJOR  @LIBZYPP_MAJOR@
 #define LIBZYPP_VERSION_MINOR  @LIBZYPP_MINOR@
 #define LIBZYPP_SOVERSION      @LIBZYPP_SO_FIRST@
 #define LIBZYPP_VERSION        @LIBZYPP_NUMVERSION@
 
-/**
- * Legacy code we still support.
- *
- * Deprecated items we can't drop immediately because YAST/PK still
- * refer to them or they break binary compatibility, should be
- * enclosed in `#if LEGACY(#)` where # is either a minor number(<=99),
- * a soversion [<=9999] or numversion [<=999999].
- *
- */
-#define LEGACY(CL) ( CL < 100 && LIBZYPP_VERSION_MAJOR <= CL ) || ( CL < 10000 && LIBZYPP_SOVERSION <= CL ) || LIBZYPP_VERSION <= CL
-
-/**
- * Generic helper definitions for shared library support.
- *
- * \see e.g. http://gcc.gnu.org/wiki/Visibility
- * \code
- *   extern "C" ZYPP_API void function(int a);
- *   class ZYPP_API SomeClass
- *   {
- *      int c;
- *      ZYPP_LOCAL void privateMethod();  // Only for use within this DSO
- *   public:
- *      Person(int _c) : c(_c) { }
- *      static void foo(int a);
- *   };
- * \endcode
-};*/
-#if __GNUC__ >= 4
-  #define ZYPP_DECL_EXPORT __attribute__ ((visibility ("default")))
-  #define ZYPP_DECL_IMPORT __attribute__ ((visibility ("default")))
-  #define ZYPP_DECL_HIDDEN __attribute__ ((visibility ("hidden")))
-#else
-  #define ZYPP_DECL_EXPORT
-  #define ZYPP_DECL_IMPORT
-  #define ZYPP_DECL_HIDDEN
-#endif
-
-#ifdef ZYPP_DLL        //defined if zypp is compiled as DLL
-  #define ZYPP_API     ZYPP_DECL_EXPORT
-  #define ZYPP_LOCAL   ZYPP_DECL_HIDDEN
-#else
-  #define ZYPP_API      ZYPP_DECL_IMPORT
-  #define ZYPP_LOCAL
-#endif
-
-/**
- * The ZYPP_DEPRECATED macro can be used to trigger compile-time warnings
- * with gcc >= 3.2 when deprecated functions are used.
- *
- * For non-inline functions, the macro is used at the very end of the
- * function declaration, right before the semicolon, unless it's pure
- * virtual:
- *
- * int deprecatedFunc() const ZYPP_DEPRECATED;
- * virtual int deprecatedPureVirtualFunc() const ZYPP_DEPRECATED = 0;
- *
- * Functions which are implemented inline are handled differently:
- * the ZYPP_DEPRECATED macro is used at the front, right before the
- * return type, but after "static" or "virtual":
- *
- * ZYPP_DEPRECATED void deprecatedFuncA() { .. }
- * virtual ZYPP_DEPRECATED int deprecatedFuncB() { .. }
- * static  ZYPP_DEPRECATED bool deprecatedFuncC() { .. }
- *
- * You can also mark whole structs or classes as deprecated, by inserting
- * the ZYPP_DEPRECATED macro after the struct/class keyword, but before
- * the name of the struct/class:
- *
- * class ZYPP_DEPRECATED DeprecatedClass { };
- * struct ZYPP_DEPRECATED DeprecatedStruct { };
- *
- * However, deprecating a struct/class doesn't create a warning for gcc
- * versions <= 3.3 (haven't tried 3.4 yet).  If you want to deprecate a class,
- * also deprecate all member functions as well (which will cause warnings).
- *
- */
-#if __GNUC__ - 0 > 3 || (__GNUC__ - 0 == 3 && __GNUC_MINOR__ - 0 >= 2)
-  #ifndef ZYPP_DEPRECATED
-  #define ZYPP_DEPRECATED __attribute__ ((deprecated))
-  #endif
-#else
-  #ifndef ZYPP_DEPRECATED
-  #define ZYPP_DEPRECATED
-  #endif
-#endif
+#include <zypp/Globals.h>
 
 #endif //ZYPP_APICONFIG_H
index bccf2fa..df53541 100644 (file)
@@ -1,316 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/AutoDispose.h
- *
-*/
-#ifndef ZYPP_AUTODISPOSE_H
-#define ZYPP_AUTODISPOSE_H
-
-#include <iosfwd>
-#include <boost/call_traits.hpp>
-
-#include <zypp/base/NonCopyable.h>
-#include <zypp/base/PtrTypes.h>
-#include <zypp/base/Function.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  ///////////////////////////////////////////////////////////////////
-  //
-  //   CLASS NAME : AutoDispose<Tp>
-  //
-  /** Reference counted access to a \c Tp object calling a custom
-   *  \c Dispose function when the last AutoDispose handle to it is
-   *  destroyed or reset.
-   *
-   * \note As with pointers, constness of an \c AutoDispose object does
-   * \b not apply to the stored \c Tp object. If the stored \c Tp object
-   * should be immutable, you should use <tt>AutoDispose\<const Tp\></tt>.
-   *
-   * Pass a filename to the application and provide the appropriate
-   * code to be executed when the file is no longer needed:
-   * \code
-   * struct FileCache
-   * {
-   *   Pathname getFile();
-   *   void     releaseFile( const Pathname & );
-   * };
-   *
-   * static FileCache cache;
-   *
-   * void unlink( const Pathname & file_r );
-   *
-   * AutoDispose<const Pathname> provideFile( ... )
-   * {
-   *   if ( file_is_in_cache )
-   *     {
-   *       // will call 'cache.releaseFile( file )'
-   *       return AutoDispose<const Pathname>( cache.getFile(),
-   *                                           bind( &FileCache::releaseFile, ref(cache), _1 ) );
-   *     }
-   *   else if ( file_is_temporary )
-   *     {
-   *       // will call 'unlink( file )'
-   *       return AutoDispose<const Pathname>( file, unlink );
-   *     }
-   *   else if ( file_is_permanent )
-   *     {
-   *       // will do nothing.
-   *       return AutoDispose<const Pathname>( file );
-   *     }
-   *   else
-   *     {
-   *       // will do nothing.
-   *       return AutoDispose<const Pathname>();
-   *     }
-   * }
-   * \endcode
-   *
-   * Exception safe handling of temporary files:
-   * \code
-   * void provideFileAt( const Pathname & destination )
-   * {
-   *   AutoDispose<const Pathname> guard( destination, unlink );
-   *
-   *   // Any exception here will lead to 'unlink( destination )'
-   *   // ...
-   *
-   *   // On success: reset the dispose function to NOOP.
-   *   guard.resetDispose();
-   * }
-   * \endcode
-  */
-  template<class Tp>
-    class AutoDispose
-    {
-    public:
-      typedef typename boost::call_traits<Tp>::param_type       param_type;
-      typedef typename boost::call_traits<Tp>::reference        reference;
-      typedef typename boost::call_traits<Tp>::const_reference  const_reference;
-      typedef Tp                                                value_type;
-      typedef typename boost::call_traits<Tp>::value_type       result_type;
-
-    public:
-      /** Dispose function signatue. */
-      typedef function<void ( param_type )> Dispose;
-
-    public:
-      /** Default Ctor using default constructed value and no dispose function. */
-      AutoDispose()
-      : _pimpl( new Impl( value_type() ) )
-      {}
-
-      /** Ctor taking dispose function and using default constructed value. */
-      explicit AutoDispose( const Dispose & dispose_r )
-      : _pimpl( new Impl( value_type(), dispose_r ) )
-      {}
-
-      /** Ctor taking value and no dispose function. */
-      explicit AutoDispose( param_type value_r )
-      : _pimpl( new Impl( value_r ) )
-      {}
-
-      /** Ctor taking value and dispose function. */
-      AutoDispose( param_type value_r, const Dispose & dispose_r )
-      : _pimpl( new Impl( value_r, dispose_r ) )
-      {}
-
-    public:
-
-      /** Provide implicit conversion to \c Tp\&. */
-      operator reference() const
-      { return _pimpl->_value; }
-
-      /** Reference to the \c Tp object. */
-      reference value() const
-      { return _pimpl->_value; }
-
-      /** Reference to the \c Tp object. */
-      reference operator*() const
-      { return _pimpl->_value; }
-
-      /** Pointer to the \c Tp object (asserted to be <tt>!= NULL</tt>). */
-      value_type * operator->() const
-      { return & _pimpl->_value; }
-
-      /** Reset to default Ctor values. */
-      void reset()
-      { AutoDispose().swap( *this ); }
-
-      /** Exchange the contents of two AutoDispose objects. */
-      void swap( AutoDispose & rhs )
-      { _pimpl.swap( rhs._pimpl ); }
-
-    public:
-      /** Return the current dispose function. */
-      const Dispose & getDispose() const
-      { return _pimpl->_dispose; }
-
-      /** Set a new dispose function. */
-      void setDispose( const Dispose & dispose_r )
-      { _pimpl->_dispose = dispose_r; }
-
-      /** Set no dispose function. */
-      void resetDispose()
-      { setDispose( Dispose() ); }
-
-      /** Exchange the dispose function. */
-      void swapDispose( Dispose & dispose_r )
-      { _pimpl->_dispose.swap( dispose_r ); }
-
-    private:
-      struct Impl : private base::NonCopyable
-      {
-        Impl( param_type value_r )
-        : _value( value_r )
-        {}
-        Impl( param_type value_r, const Dispose & dispose_r )
-        : _value( value_r )
-        , _dispose( dispose_r )
-        {}
-        ~Impl()
-        {
-          if ( _dispose )
-            try { _dispose( _value ); } catch(...) {}
-        }
-        value_type _value;
-        Dispose    _dispose;
-      };
-
-      shared_ptr<Impl> _pimpl;
-    };
-
-    template<>
-    class AutoDispose<void>
-    {
-    public:
-      /** Dispose function signatue. */
-      typedef function<void ()> Dispose;
-
-    public:
-      /** Default Ctor using default constructed value and no dispose function. */
-      AutoDispose()
-        : _pimpl( new Impl() )
-      {}
-
-      /** Ctor taking dispose function and using default constructed value. */
-      explicit AutoDispose( const Dispose & dispose_r )
-        : _pimpl( new Impl( dispose_r ) )
-      {}
-
-    public:
-
-      /** Reset to default Ctor values. */
-      void reset()
-      { AutoDispose().swap( *this ); }
-
-      /** Exchange the contents of two AutoDispose objects. */
-      void swap( AutoDispose & rhs )
-      { _pimpl.swap( rhs._pimpl ); }
-
-    public:
-      /** Return the current dispose function. */
-      const Dispose & getDispose() const
-      { return _pimpl->_dispose; }
-
-      /** Set a new dispose function. */
-      void setDispose( const Dispose & dispose_r )
-      { _pimpl->_dispose = dispose_r; }
-
-      /** Set no dispose function. */
-      void resetDispose()
-      { setDispose( Dispose() ); }
-
-      /** Exchange the dispose function. */
-      void swapDispose( Dispose & dispose_r )
-      { _pimpl->_dispose.swap( dispose_r ); }
-
-    private:
-      struct Impl : private base::NonCopyable
-      {
-        Impl( )
-        {}
-
-        Impl( const Dispose & dispose_r )
-          : _dispose( dispose_r )
-        {}
-
-        ~Impl()
-        {
-          if ( _dispose )
-            try { _dispose(); } catch(...) {}
-        }
-        Dispose    _dispose;
-      };
-      shared_ptr<Impl> _pimpl;
-    };
-
-  /*!
-   * Simple way to run a function at scope exit:
-   * \code
-   * bool wasBlocking = unblockFile( fd, true );
-   * OnScopeExit cleanup( [wasBlocking, fd](){
-   *  if ( wasBlocking ) unblockFile( fd, false );
-   * });
-   * \endcode
-   */
-  using OnScopeExit = AutoDispose<void>;
-
-  ///////////////////////////////////////////////////////////////////
-
-  /** \relates AutoDispose Stream output of the \c Tp object. */
-  template<class Tp>
-    inline std::ostream & operator<<( std::ostream & str, const AutoDispose<Tp> & obj )
-    { return str << obj.value(); }
-
-
-  ///////////////////////////////////////////////////////////////////
-  /// \class AutoFD
-  /// \brief \ref AutoDispose\<int>  calling \c ::close
-  /// \ingroup g_RAII
-  ///////////////////////////////////////////////////////////////////
-  struct AutoFD : public AutoDispose<int>
-  {
-    AutoFD( int fd_r = -1 ) : AutoDispose<int>( fd_r, [] ( int fd_r ) { if ( fd_r != -1 ) ::close( fd_r ); } ) {}
-  };
-
-  ///////////////////////////////////////////////////////////////////
-  /// \class AutoFILE
-  /// \brief \ref AutoDispose\<FILE*> calling \c ::fclose
-  /// \see \ref AutoDispose
-  /// \ingroup g_RAII
-  ///////////////////////////////////////////////////////////////////
-  struct AutoFILE : public AutoDispose<FILE*>
-  {
-    AutoFILE( FILE* file_r = nullptr ) : AutoDispose<FILE*>( file_r, [] ( FILE* file_r ) { if ( file_r ) ::fclose( file_r ); } ) {}
-  };
-
-  ///////////////////////////////////////////////////////////////////
-  /// \class AutoFREE<Tp>
-  /// \brief \ref AutoDispose\<Tp*> calling \c ::free
-  /// \ingroup g_RAII
-  ///////////////////////////////////////////////////////////////////
-  template <typename Tp>
-  struct AutoFREE : public AutoDispose<Tp*>
-  {
-    AutoFREE( Tp* ptr_r = nullptr ) : AutoDispose<Tp*>( ptr_r, [] ( Tp* ptr_r ) { if ( ptr_r ) ::free( ptr_r ); } ) {}
-    AutoFREE( void* ptr_r ) : AutoFREE( static_cast<Tp*>(ptr_r) ) {}
-  };
-
-  template <>
-  struct AutoFREE<void> : public AutoDispose<void*>
-  {
-    AutoFREE( void* ptr_r = nullptr ) : AutoDispose<void*>( ptr_r, [] ( void* ptr_r ) { if ( ptr_r ) ::free( ptr_r ); } ) {}
-  };
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_AUTODISPOSE_H
+#include <zypp-core/AutoDispose.h>
diff --git a/zypp/ByteArray.h b/zypp/ByteArray.h
new file mode 100644 (file)
index 0000000..017126a
--- /dev/null
@@ -0,0 +1 @@
+#include <zypp-core/ByteArray.h>
index 87c1ac8..20e2e49 100644 (file)
@@ -1,166 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/ByteCount.h
- *
-*/
-#ifndef ZYPP_BYTECOUNT_H
-#define ZYPP_BYTECOUNT_H
-
-#include <iosfwd>
-
-#include <zypp/base/Unit.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  ///////////////////////////////////////////////////////////////////
-  //
-  //   CLASS NAME : ByteCount
-  //
-  /** Store and operate with byte count.
-   *
-  */
-  class ByteCount
-  {
-    friend std::ostream & operator<<( std::ostream & str, const ByteCount & obj );
-
-  public:
-
-    typedef base::Unit      Unit;
-    typedef Unit::ValueType SizeType;
-
-    /** \name Byte unit constants. */
-    //@{
-    /** 1 Byte */
-    static const Unit B;
-
-    /** 1024 Byte */
-    static const Unit K;
-    static const Unit KiB;
-    /** 1024^2 Byte */
-    static const Unit M;
-    static const Unit MiB;
-    /** 1024^3 Byte */
-    static const Unit G;
-    static const Unit GiB;
-    /** 1024^4 Byte */
-    static const Unit T;
-    static const Unit TiB;
-
-    /** 1000 Byte */
-    static const Unit kB;
-    /** 1000^2 Byte */
-    static const Unit MB;
-    /** 1000^3 Byte */
-    static const Unit GB;
-    /** 1000^4 Byte */
-    static const Unit TB;
-    //@}
-
-  public:
-
-    /** Default ctor */
-    ByteCount()
-    : _count( 0 )
-    {}
-    /** Ctor taking 1 Unit. */
-    ByteCount( const Unit & unit_r )
-    : _count( unit_r.factor() )
-    {}
-    /** Ctor taking a count and optinal Unit. */
-    ByteCount( const SizeType count_r, const Unit & unit_r = B )
-    : _count( count_r * unit_r.factor() )
-    {}
-
- public:
-
-    /** Conversion to SizeType. */
-    operator SizeType() const
-    { return _count; }
-
-    /** \name Arithmetic operations.
-     * \c + \c - \c * \c / are provided via conversion to SizeType.
-    */
-    //@{
-    ByteCount & operator+=( const SizeType rhs ) { _count += rhs; return *this; }
-    ByteCount & operator-=( const SizeType rhs ) { _count -= rhs; return *this; }
-    ByteCount & operator*=( const SizeType rhs ) { _count *= rhs; return *this; }
-    ByteCount & operator/=( const SizeType rhs ) { _count /= rhs; return *this; }
-
-    ByteCount & operator++(/*prefix*/) { _count += 1; return *this; }
-    ByteCount & operator--(/*prefix*/) { _count -= 1; return *this; }
-
-    ByteCount operator++(int/*postfix*/) { return _count++; }
-    ByteCount operator--(int/*postfix*/) { return _count--; }
-    //@}
-
-    /** Adjust count to multiple of \a blocksize_r (default 1K).
-     * Zero blocksize_r is treated as 1B.
-    */
-    ByteCount & fillBlock( ByteCount blocksize_r = K );
-
-    /** Return count adjusted to multiple of \a blocksize_r (default 1K). */
-    ByteCount fullBlocks( ByteCount blocksize_r = K ) const
-    { return ByteCount(*this).fillBlock( blocksize_r ); }
-
-    /** Return number of blocks of size \a blocksize_r (default 1K). */
-    SizeType blocks( ByteCount blocksize_r = K ) const
-    { return fullBlocks( blocksize_r ) / blocksize_r; }
-
-  public:
-
-    /** Return the best Unit (B,K,M,G,T) for count. */
-    const Unit & bestUnit() const;
-
-    /** Return the best Unit (B,kB,MB,GB,TB) for count. */
-    const Unit & bestUnit1000() const;
-
-    /** \name Conversion to string.
-     * \li \a field_width_r Width for the number part (incl. precision)
-     * \li \a unit_width_r With for the unit symbol (without symbol if zero)
-     * \li \a prec_r Precision to use.
-     * \see zypp::base::Unit
-    */
-    //@{
-    /** Auto selected Unit and precision. */
-    std::string asString( unsigned field_width_r = 0,
-                          unsigned unit_width_r  = 1 ) const
-    { return asString( bestUnit(), field_width_r, unit_width_r ); }
-    /** Auto selected Unit. */
-    std::string asString( unsigned field_width_r,
-                          unsigned unit_width_r,
-                          unsigned prec_r ) const
-    { return asString( bestUnit(), field_width_r, unit_width_r, prec_r ); }
-    /** Auto selected precision. */
-    std::string asString( const Unit & unit_r,
-                          unsigned field_width_r = 0,
-                          unsigned unit_width_r  = 1 ) const
-    { return asString( unit_r, field_width_r, unit_width_r, unit_r.prec() ); }
-    /** Nothing auto selected. */
-    std::string asString( const Unit & unit_r,
-                          unsigned field_width_r,
-                          unsigned unit_width_r,
-                          unsigned prec_r ) const
-    { return unit_r.form( _count, field_width_r, unit_width_r, prec_r ); }
-    //@}
-
-  private:
-    SizeType _count;
-  };
-  ///////////////////////////////////////////////////////////////////
-
-  /** \relates ByteCount Stream output */
-  inline std::ostream & operator<<( std::ostream & str, const ByteCount & obj )
-  { return str << obj.asString(); }
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BYTECOUNT_H
+#include <zypp-core/ByteCount.h>
index db52f89..1e841bf 100644 (file)
@@ -1,10 +1,16 @@
 # Collect all files that may contain translatable texts
 FILE( GLOB_RECURSE POT_FILE_DEPENDS RELATIVE ${LIBZYPP_SOURCE_DIR} "*.h" "*.cc" )
-SET( POT_FILE_DEPENDS ${POT_FILE_DEPENDS} PARENT_SCOPE )
+SET( POT_FILE_DEPENDS_ZYPP ${POT_FILE_DEPENDS} PARENT_SCOPE )
 
 
-ADD_DEFINITIONS(-DLOCALEDIR="${CMAKE_INSTALL_PREFIX}/share/locale" -DTEXTDOMAIN="zypp" -DZYPP_DLL )
-INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} )
+ADD_DEFINITIONS( -DZYPP_DLL )
+INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/sywu/include )
+INCLUDE_DIRECTORIES( ${LIBZYPP_SOURCE_DIR} ${LIBZYPP_BINARY_DIR} ${LIBZYPP_SOURCE_DIR}/libs/zypp-core SYSTEM )
+
+message(${LIBZYPP_SOURCE_DIR}/zypp-core)
+
+# add_definitions( -DENABLE_SYWU )
+# add_subdirectory(sywu)
 
 IF (ENABLE_ZCHUNK_COMPRESSION)
   INCLUDE_DIRECTORIES( ${ZCHUNK_INCLUDEDIR} )
@@ -13,20 +19,17 @@ ENDIF(ENABLE_ZCHUNK_COMPRESSION)
 
 SET( zypp_SRCS
   Application.cc
-  ByteCount.cc
   Capabilities.cc
   Capability.cc
   CapMatch.cc
   Changelog.cc
   CheckSum.cc
   CpeId.cc
-  Date.cc
   Dep.cc
   Digest.cc
   DiskUsageCounter.cc
   DownloadMode.cc
   Edition.cc
-  ExternalProgram.cc
   PluginFrame.cc
   PluginFrameException.cc
   PluginScript.cc
@@ -48,7 +51,6 @@ SET( zypp_SRCS
   Package.cc
   Patch.cc
   PathInfo.cc
-  Pathname.cc
   Pattern.cc
   PoolItem.cc
   PoolItemBest.cc
@@ -82,7 +84,6 @@ SET( zypp_SRCS
   SysContent.cc
   Target.cc
   TmpPath.cc
-  Url.cc
   VendorAttr.cc
   VendorSupportOptions.cc
   ZYpp.cc
@@ -102,10 +103,8 @@ SET( zypp_HEADERS
   ${CMAKE_CURRENT_BINARY_DIR}/APIConfig.h
   Application.h
   Arch.h
-  AutoDispose.h
   Bit.h
   Bitmap.h
-  ByteCount.h
   Callback.h
   Capabilities.h
   Capability.h
@@ -115,13 +114,11 @@ SET( zypp_HEADERS
   ContentType.h
   CountryCode.h
   CpeId.h
-  Date.h
   Dep.h
   Digest.h
   DiskUsageCounter.h
   DownloadMode.h
   Edition.h
-  ExternalProgram.h
   PluginFrame.h
   PluginFrameException.h
   PluginScript.h
@@ -152,7 +149,6 @@ SET( zypp_HEADERS
   PackageKeyword.h
   Patch.h
   PathInfo.h
-  Pathname.h
   Pattern.h
   PoolItem.h
   PoolItemBest.h
@@ -193,8 +189,6 @@ SET( zypp_HEADERS
   SysContent.h
   Target.h
   TmpPath.h
-  TriBool.h
-  Url.h
   UserData.h
   VendorAttr.h
   VendorSupportOptions.h
@@ -211,31 +205,17 @@ INSTALL(  FILES ${zypp_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp" )
 
 SET( zypp_base_SRCS
   base/Backtrace.cc
-  base/CleanerThread.cc
   base/DrunkenBishop.cc
   base/SerialNumber.cc
   base/Random.cc
   base/Measure.cc
-  base/Gettext.cc
   base/GzStream.cc
-  base/IOStream.cc
-  base/IOTools.cc
   base/InputStream.cc
-  base/ReferenceCounted.cc
   base/SetRelationMixin.cc
-  base/String.cc
-  base/StringV.cc
   base/StrMatcher.h
   base/StrMatcher.cc
-  base/Regex.cc
-  base/Unit.cc
-  base/ExternalDataSource.cc
-  base/Exception.cc
   base/UserRequestException.cc
   base/Sysconfig.cc
-  base/ProfilingFormater.cc
-  base/LogControl.cc
-  base/Xml.cc
 )
 
 SET( zypp_base_HEADERS
@@ -243,9 +223,7 @@ SET( zypp_base_HEADERS
   base/Collector.h
   base/DrunkenBishop.h
   base/SerialNumber.h
-  base/Easy.h
   base/Env.h
-  base/Errno.h
   base/fXstream.h
   base/Random.h
   base/Algorithm.h
@@ -253,47 +231,25 @@ SET( zypp_base_HEADERS
   base/Debug.h
   base/DefaultIntegral.h
   base/DtorReset.h
-  base/Exception.h
   base/UserRequestException.h
-  base/EnumClass.h
-  base/ExternalDataSource.h
-  base/Flags.h
-  base/Function.h
   base/Functional.h
-  base/Gettext.h
   base/GzStream.h
-  base/Hash.h
-  base/IOStream.h
-  base/IOTools.h
   base/InputStream.h
-  base/Iterable.h
-  base/Iterator.h
   base/Json.h
   base/LocaleGuard.h
-  base/LogControl.h
-  base/LogTools.h
-  base/Logger.h
   base/Measure.h
   base/NamedValue.h
-  base/NonCopyable.h
-  base/ProfilingFormater.h
   base/ProvideNumericId.h
-  base/PtrTypes.h
   base/ReferenceCounted.h
   base/SetRelationMixin.h
   base/SetTracker.h
   base/Signal.h
   base/SimpleStreambuf.h
-  base/String.h
-  base/StringV.h
   base/StrMatcher.h
-  base/Regex.h
   base/Sysconfig.h
   base/TypeTraits.h
-  base/Unit.h
   base/ValueTransform.h
   base/WatchFile.h
-  base/Xml.h
 )
 
 IF (ENABLE_ZCHUNK_COMPRESSION)
@@ -316,8 +272,8 @@ INSTALL(  FILES
 SET( zypp_media_SRCS
   media/CurlHelper.cc
   media/MediaException.cc
-  media/MediaAccess.cc
   media/MediaHandler.cc
+  media/MediaHandlerFactory.cc
   media/Mount.cc
   media/MediaNFS.cc
   media/MediaCD.cc
@@ -325,6 +281,7 @@ SET( zypp_media_SRCS
   media/MediaDISK.cc
   media/MediaCIFS.cc
   media/ProxyInfo.cc
+  media/MediaNetworkCommonHandler.h
   media/MediaCurl.cc
   media/MediaMultiCurl.cc
   media/MediaISO.cc
@@ -344,7 +301,6 @@ SET( zypp_media_SRCS
 )
 
 SET( zypp_media_HEADERS
-  media/MediaAccess.h
   media/MediaCD.h
   media/MediaCIFS.h
   media/MediaCurl.h
@@ -353,6 +309,7 @@ SET( zypp_media_HEADERS
   media/MediaDISK.h
   media/MediaException.h
   media/MediaHandler.h
+  media/MediaHandlerFactory.h
   media/MediaISO.h
   media/MediaPlugin.h
   media/MediaManager.h
@@ -448,7 +405,6 @@ SET( zypp_parser_xml_SRCS
   parser/xml/ParseDefConsume.cc
   parser/xml/ParseDefException.cc
   parser/xml/Reader.cc
-  parser/xml/XmlEscape.cc
   parser/xml/XmlString.cc
   parser/xml/libxmlfwd.cc
 )
@@ -461,7 +417,6 @@ SET( zypp_parser_xml_HEADERS
   parser/xml/ParseDefException.h
   parser/xml/ParseDefTraits.h
   parser/xml/Reader.h
-  parser/xml/XmlEscape.h
   parser/xml/XmlString.h
   parser/xml/libxmlfwd.h
 )
@@ -699,17 +654,6 @@ INSTALL(  FILES
   DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/ui
 )
 
-SET( zypp_url_SRCS
-  url/UrlUtils.cc
-  url/UrlBase.cc
-)
-
-SET( zypp_url_HEADERS
-  url/UrlBase.h
-  url/UrlException.h
-  url/UrlUtils.h
-)
-
 INSTALL(  FILES
   ${zypp_url_HEADERS}
   DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/url
@@ -790,6 +734,7 @@ SET( zypp_repo_susetags_HEADERS
   repo/susetags/Downloader.h
 )
 
+
 ####################################################################
 
 SET( zypp_misc_HEADERS
@@ -814,6 +759,77 @@ INSTALL( FILES
 
 ####################################################################
 
+
+SET ( zypp_core_compat_HEADERS
+  ByteCount.h
+  Url.h
+  Globals.h
+  ExternalProgram.h
+  Date.h
+  AutoDispose.h
+  TriBool.h
+  Pathname.h
+  ByteArray.h
+)
+
+INSTALL( FILES
+  ${zypp_core_compat_HEADERS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/zypp
+)
+
+SET ( zypp_core_base_compat_HEADERS
+  base/Xml.h
+  base/Function.h
+  base/Flags.h
+  base/StringV.h
+  base/Iterator.h
+  base/NonCopyable.h
+  base/Exception.h
+  base/Unit.h
+  base/String.h
+  base/Regex.h
+  base/IOTools.h
+  base/IOStream.h
+  base/Gettext.h
+  base/EnumClass.h
+  base/Logger.h
+  base/Easy.h
+  base/ProfilingFormater.h
+  base/ExternalDataSource.h
+  base/LogTools.h
+  base/LogControl.h
+  base/Hash.h
+  base/PtrTypes.h
+  base/Errno.h
+  base/Iterable.h
+)
+
+INSTALL( FILES
+  ${zypp_core_base_compat_HEADERS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/base
+)
+
+
+SET ( zypp_core_url_compat_HEADERS
+  url/UrlException.h
+  url/UrlUtils.h
+  url/UrlBase.h
+)
+
+INSTALL( FILES
+  ${zypp_core_url_compat_HEADERS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/url
+)
+
+SET ( zypp_core_parser_compat_HEADERS
+  parser/xml/XmlEscape.h
+)
+
+INSTALL( FILES
+  ${zypp_core_parser_compat_HEADERS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/parser/xml
+)
+
 add_subdirectory( zyppng )
 
 SET( zypp_lib_SRCS
@@ -842,7 +858,6 @@ ${zypp_sat_SRCS}
 ${zypp_sat_detail_SRCS}
 ${zypp_EARLY_SRCS}
 ${zypp_base_SRCS}
-${zyppng_SRCS}
 )
 
 SET( zypp_lib_HEADERS
@@ -869,7 +884,10 @@ ${zypp_target_modalias_HEADERS}
 ${zypp_target_HEADERS}
 ${zypp_pool_HEADERS}
 ${zypp_misc_HEADERS}
-${zyppng_HEADERS}
+${zypp_core_compat_HEADERS}
+${zypp_core_base_compat_HEADERS}
+${zypp_core_url_compat_HEADERS}
+${zypp_core_parser_compat_HEADERS}
 )
 
 #
@@ -911,14 +929,23 @@ SET_LOGGROUP( "libsolv" ${zypp_sat_SRCS} )
 #SET_LOGGROUP( "group" ${zypp_pool_SRCS} )
 
 ADD_LIBRARY( zypp-objlib OBJECT ${zypp_lib_SRCS} ${zypp_lib_HEADERS} )
+#we include generated headers, so we need to wait for zypp-protobuf to be ready
+add_dependencies( zypp-objlib zypp-protobuf )
 
 macro( ADDZYPPLIB LIBNAME )
   message( "ADDING lib ${LIBNAME} to project" )
-  ADD_LIBRARY(${LIBNAME} SHARED $<TARGET_OBJECTS:zypp-objlib> )
+  ADD_LIBRARY( ${LIBNAME} SHARED $<TARGET_OBJECTS:zypp-objlib> $<TARGET_OBJECTS:zyppng-objlib> )
   SET_TARGET_PROPERTIES( ${LIBNAME} PROPERTIES VERSION "${LIBZYPP_VERSION_INFO}" )
   SET_TARGET_PROPERTIES( ${LIBNAME} PROPERTIES SOVERSION "${LIBZYPP_SOVERSION_INFO}" )
   # System libraries
   SET(UTIL_LIBRARY util)
+
+  # CAUTION, link those 2 libs always first and always in that order,
+  # otherwise you get symbol lookup errors when linking against libzypp
+  TARGET_LINK_LIBRARIES(${LIBNAME} zypp-core )
+  TARGET_LINK_LIBRARIES(${LIBNAME} zypp-protobuf )
+
+
   TARGET_LINK_LIBRARIES(${LIBNAME} ${UTIL_LIBRARY} )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${RPM_LIBRARY} )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${GETTEXT_LIBRARIES} )
@@ -926,14 +953,11 @@ macro( ADDZYPPLIB LIBNAME )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${LIBXML2_LIBRARIES} )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${ZLIB_LIBRARY} )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${LibSolv_LIBRARIES} )
-  TARGET_LINK_LIBRARIES(${LIBNAME} ${OPENSSL_LIBRARIES} )
-  TARGET_LINK_LIBRARIES(${LIBNAME} ${CRYPTO_LIBRARIES} )
   TARGET_LINK_LIBRARIES(${LIBNAME} ${SIGNALS_LIBRARY})
   TARGET_LINK_LIBRARIES(${LIBNAME} ${Boost_THREAD_LIBRARY})
   TARGET_LINK_LIBRARIES(${LIBNAME} ${GPGME_PTHREAD_LIBRARIES})
-  target_link_libraries(${LIBNAME} ${SIGCPP_LIBRARIES})
-  target_link_libraries(${LIBNAME} ${LIBGLIB_LIBRARIES})
   target_link_libraries(${LIBNAME} ${YAML_CPP_LIBRARIES})
+  target_link_libraries(${LIBNAME} ${PROTOBUF_LITE_LIBRARIES})
 
   IF (ENABLE_ZSTD_COMPRESSION)
     TARGET_LINK_LIBRARIES(${LIBNAME} ${ZSTD_LIBRARY})
index 494c86d..97b0507 100644 (file)
@@ -9,208 +9,3 @@
 /** \file      zypp/CheckSum.cc
  *
 */
-#include <iostream>
-#include <sstream>
-
-#include <zypp/base/Logger.h>
-#include <zypp/base/Gettext.h>
-#include <zypp/base/String.h>
-
-#include <zypp/CheckSum.h>
-#include <zypp/Digest.h>
-
-using std::endl;
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  const std::string & CheckSum::md5Type()
-  { return Digest::md5(); }
-
-  const std::string & CheckSum::shaType()
-  { static std::string _type( "sha" ); return _type; }
-
-  const std::string & CheckSum::sha1Type()
-  { return Digest::sha1(); }
-
-  const std::string & CheckSum::sha224Type()
-  { return Digest::sha224(); }
-
-  const std::string & CheckSum::sha256Type()
-  { return Digest::sha256(); }
-
-  const std::string & CheckSum::sha384Type()
-  { return Digest::sha384(); }
-
-  const std::string & CheckSum::sha512Type()
-  { return Digest::sha512(); }
-
-  CheckSum::CheckSum( const std::string & type, const std::string & checksum )
-  : _type( str::toLower( type ) )
-  , _checksum( checksum )
-  {
-    switch ( checksum.size() )
-    {
-      case 128:
-        if ( _type == sha512Type() )
-          return;
-        if ( _type.empty() || _type == shaType() )
-        {
-          _type = sha512Type();
-          return;
-        }
-        // else: dubious
-        break;
-
-      case 96:
-        if ( _type == sha384Type() )
-          return;
-        if ( _type.empty() || _type == shaType() )
-        {
-          _type = sha384Type();
-          return;
-        }
-        // else: dubious
-        break;
-
-      case 64:
-        if ( _type == sha256Type() )
-          return;
-        if ( _type.empty() || _type == shaType() )
-        {
-          _type = sha256Type();
-          return;
-        }
-        // else: dubious
-        break;
-
-      case 56:
-        if ( _type == sha224Type() )
-          return;
-        if ( _type.empty() || _type == shaType() )
-        {
-          _type = sha224Type();
-          return;
-        }
-        // else: dubious
-        break;
-
-      case 40:
-        if ( _type == sha1Type() )
-          return;
-        if ( _type.empty() || _type == shaType() )
-        {
-          _type = sha1Type();
-          return;
-        }
-        // else: dubious
-        break;
-
-      case 32:
-        if (  _type == md5Type() )
-          return;
-        if ( _type.empty() )
-        {
-          _type = md5Type();
-          return;
-        }
-        // else: dubious
-        break;
-
-      case 0:
-        return; // empty checksum is ok
-        break;
-
-      default:
-        if ( _type.empty() )
-        {
-          WAR << "Can't determine type of " << checksum.size() << " byte checksum '" << _checksum << "'" << endl;
-          return;
-        }
-        // else: dubious
-        break;
-    }
-
-    // dubious: Throw on malformed known types, otherwise log a warning.
-    std::string msg = str::form ( _("Dubious type '%s' for %u byte checksum '%s'"),
-                                  _type.c_str(), checksum.size(), _checksum.c_str() );
-    if (    _type == md5Type()
-         || _type == shaType()
-         || _type == sha1Type()
-         || _type == sha224Type()
-         || _type == sha256Type()
-         || _type == sha384Type()
-         || _type == sha512Type() )
-    {
-      ZYPP_THROW( CheckSumException( msg ) );
-    }
-    else
-    {
-      WAR << msg << endl;
-    }
-  }
-
-  CheckSum::CheckSum( const std::string & type_r, std::istream & input_r )
-  {
-    if ( input_r.good() && ! type_r.empty() )
-      {
-        _type = str::toLower( type_r );
-        _checksum = Digest::digest( _type, input_r );
-        if ( ! input_r.eof() || _checksum.empty() )
-          {
-            _type = _checksum = std::string();
-          }
-      }
-  }
-
-  std::string CheckSum::type() const
-  { return _type; }
-
-  std::string CheckSum::checksum() const
-  { return _checksum; }
-
-  bool CheckSum::empty() const
-  { return (checksum().empty() || type().empty()); }
-
-  std::string CheckSum::asString() const
-  {
-    std::ostringstream str;
-    str << *this;
-    return str.str();
-  }
-
-  std::ostream & operator<<( std::ostream & str, const CheckSum & obj )
-  {
-    if ( obj.checksum().empty() )
-      {
-        return str << std::string("NoCheckSum");
-      }
-
-    return str << ( obj.type().empty() ? std::string("UNKNOWN") : obj.type() ) << '-' << obj.checksum();
-  }
-
-  std::ostream & dumpAsXmlOn( std::ostream & str, const CheckSum & obj )
-  {
-    const std::string & type( obj.type() );
-    const std::string & checksum( obj.checksum() );
-    str << "<checksum";
-    if ( ! type.empty() ) str << " type=\"" << type << "\"";
-    if ( checksum.empty() )
-      str << "/>";
-    else
-      str << ">" << checksum << "</checksum>";
-    return str;
-  }
-
-   /** \relates CheckSum */
-  bool operator==( const CheckSum & lhs, const CheckSum & rhs )
-  { return lhs.checksum() == rhs.checksum() && lhs.type() == rhs.type(); }
-
-  /** \relates CheckSum */
-  bool operator!=( const CheckSum & lhs, const CheckSum & rhs )
-  { return ! ( lhs == rhs ); }
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
index f52fdbe..d431c59 100644 (file)
 #ifndef ZYPP_CHECKSUM_H
 #define ZYPP_CHECKSUM_H
 
-#include <iosfwd>
-#include <string>
-#include <sstream>
+#include <zypp-core/CheckSum.h>
 
-#include <zypp/base/Exception.h>
-#include <zypp/Pathname.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  struct CheckSumException : public Exception
-  {
-    CheckSumException( const std::string & msg )
-      : Exception( msg )
-    {}
-  };
-
-  class CheckSum
-  {
-  public:
-    /** Default Ctor: empty checksum. */
-    CheckSum()
-    {}
-    /**
-     * Creates a checksum for algorithm \param type.
-     * \throws CheckSumException if the checksum is invalid and can't be constructed
-     */
-    CheckSum( const std::string & type, const std::string & checksum );
-    /**
-     * Creates a checksum auto probing the algorithm type.
-     * \throws CheckSumException if the checksum is invalid and can't be constructed
-     */
-    CheckSum( const std::string & checksum )
-      : CheckSum( std::string(), checksum )
-    {}
-
-    /**
-     * Reads the content of \param input_r and computes the checksum.
-     */
-    CheckSum( const std::string & type, std::istream & input_r );
-
-    /** Ctor from temporary istream */
-    CheckSum( const std::string & type, std::istream && input_r )
-      : CheckSum( type, input_r )
-    {}
-
-  public:
-    static const std::string & md5Type();
-    static const std::string & shaType();
-    static const std::string & sha1Type();
-    static const std::string & sha224Type();
-    static const std::string & sha256Type();
-    static const std::string & sha384Type();
-    static const std::string & sha512Type();
-
-    /** \name Creates a checksum for algorithm \param type. */
-    //@{
-    static CheckSum md5( const std::string & checksum )                { return  CheckSum( md5Type(), checksum); }
-    static CheckSum sha( const std::string & checksum )                { return  CheckSum( shaType(), checksum); }
-    static CheckSum sha1( const std::string & checksum )       { return  CheckSum( sha1Type(), checksum); }
-    static CheckSum sha224( const std::string & checksum )     { return  CheckSum( sha224Type(), checksum); }
-    static CheckSum sha256( const std::string & checksum )     { return  CheckSum( sha256Type(), checksum); }
-    static CheckSum sha384( const std::string & checksum )     { return  CheckSum( sha384Type(), checksum); }
-    static CheckSum sha512( const std::string & checksum )     { return  CheckSum( sha512Type(), checksum); }
-    //@}
-
-    /** \name Reads the content of \param input_r and computes the checksum. */
-    //@{
-    static CheckSum md5( std::istream & input_r )              { return  CheckSum( md5Type(), input_r ); }
-    static CheckSum sha( std::istream & input_r )              { return  CheckSum( sha1Type(), input_r ); }
-    static CheckSum sha1( std::istream & input_r )             { return  CheckSum( sha1Type(), input_r ); }
-    static CheckSum sha224( std::istream & input_r )           { return  CheckSum( sha224Type(), input_r ); }
-    static CheckSum sha256( std::istream & input_r )           { return  CheckSum( sha256Type(), input_r ); }
-    static CheckSum sha384( std::istream & input_r )           { return  CheckSum( sha384Type(), input_r ); }
-    static CheckSum sha512( std::istream & input_r )           { return  CheckSum( sha512Type(), input_r ); }
-
-    static CheckSum md5( std::istream && input_r )             { return  CheckSum( md5Type(), input_r ); }
-    static CheckSum sha( std::istream && input_r )             { return  CheckSum( sha1Type(), input_r ); }
-    static CheckSum sha1( std::istream && input_r )            { return  CheckSum( sha1Type(), input_r ); }
-    static CheckSum sha224( std::istream && input_r )          { return  CheckSum( sha224Type(), input_r ); }
-    static CheckSum sha256( std::istream && input_r )          { return  CheckSum( sha256Type(), input_r ); }
-    static CheckSum sha384( std::istream && input_r )          { return  CheckSum( sha384Type(), input_r ); }
-    static CheckSum sha512( std::istream && input_r )          { return  CheckSum( sha512Type(), input_r ); }
-    //@}
-
-    /** \name Reads the content of \param input_r and computes the checksum. */
-    //@{
-    static CheckSum md5FromString( const std::string & input_r )       { return md5( std::stringstream( input_r ) ); }
-    static CheckSum shaFromString( const std::string & input_r )       { return sha( std::stringstream( input_r ) ); }
-    static CheckSum sha1FromString( const std::string & input_r )      { return sha1( std::stringstream( input_r ) ); }
-    static CheckSum sha224FromString( const std::string & input_r )    { return sha224( std::stringstream( input_r ) ); }
-    static CheckSum sha256FromString( const std::string & input_r )    { return sha256( std::stringstream( input_r ) ); }
-    static CheckSum sha384FromString( const std::string & input_r )    { return sha384( std::stringstream( input_r ) ); }
-    static CheckSum sha512FromString( const std::string & input_r )    { return sha512( std::stringstream( input_r ) ); }
-    //@}
-
-  public:
-    std::string type() const;
-    std::string checksum() const;
-    bool empty() const;
-
-  public:
-    std::string asString() const;
-
-  private:
-    std::string _type;
-    std::string _checksum;
-  };
-
-  /** \relates CheckSum Stream output. */
-  std::ostream & operator<<( std::ostream & str, const CheckSum & obj );
-
-  /** \relates CheckSum XML output. */
-  std::ostream & dumpAsXmlOn( std::ostream & str, const CheckSum & obj );
-
-  /** \relates CheckSum */
-  bool operator==( const CheckSum & lhs, const CheckSum & rhs );
-
-  /** \relates CheckSum */
-  bool operator!=( const CheckSum & lhs, const CheckSum & rhs );
-
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
 #endif // ZYPP_CHECKSUM_H
index 09c2f57..717e196 100644 (file)
@@ -1,271 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/Date.h
- *
-*/
-#ifndef ZYPP_DATE_H
-#define ZYPP_DATE_H
-
-#include <ctime>
-#include <iosfwd>
-#include <string>
-
-#include <zypp/base/Exception.h>
-#include <zypp/base/EnumClass.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  ///////////////////////////////////////////////////////////////////
-  //
-  //   CLASS NAME : Date
-  //
-  /** Store and operate on date (time_t).
-  */
-  class Date
-  {
-    friend std::ostream & operator<<( std::ostream & str, const Date & obj );
-
-  public:
-
-    typedef time_t ValueType;
-    typedef time_t Duration;
-
-    static const ValueType second      = 1;
-    static const ValueType minute      = 60;
-    static const ValueType hour                = 3600;
-    static const ValueType day         = 86400;
-    static const ValueType month28     = 2419200;
-    static const ValueType month29     = 2505600;
-    static const ValueType month30     = 2592000;
-    static const ValueType month31     = 2678400;
-    static const ValueType month       = month30;
-    static const ValueType year365     = 31536000;
-    static const ValueType year366     = 31622400;
-    static const ValueType year                = year365;
-
-    enum TimeBase { TB_LOCALTIME, TB_UTC };
-
-    /** Default ctor: 0 */
-    Date()
-    : _date( 0 )
-    {}
-    /** Ctor taking time_t value. */
-    Date( ValueType date_r )
-    : _date( date_r )
-    {}
-    /** Ctor taking time_t value as string. */
-    explicit Date( const std::string & seconds_r );
-
-    /**
-     * Ctor from a \a date_str (in localtime) formatted using \a format.
-     *
-     * \throws DateFormatException in case \a date_str cannot be
-     *         parsed according to \a format.
-     */
-    Date( const std::string & date_str, const std::string & format );
-    /** \overload with explicitly given \ref TimeBase. */
-    Date( const std::string & date_str, const std::string & format, TimeBase base_r );
-
-    /** Return the current time. */
-    static Date now()
-    { return ::time( 0 ); }
-
-  public:
-    /** Conversion to time_t. */
-    operator ValueType() const
-    { return _date; }
-
-    /** \name Arithmetic operations. */
-    //@{
-    Date operator+( const time_t rhs ) const { return _date + rhs; }
-    Date operator-( const time_t rhs ) const { return _date - rhs; }
-    Date operator*( const time_t rhs ) const { return _date * rhs; }
-    Date operator/( const time_t rhs ) const { return _date / rhs; }
-
-    Date & operator+=( const time_t rhs ) { _date += rhs; return *this; }
-    Date & operator-=( const time_t rhs ) { _date -= rhs; return *this; }
-    Date & operator*=( const time_t rhs ) { _date *= rhs; return *this; }
-    Date & operator/=( const time_t rhs ) { _date /= rhs; return *this; }
-
-    Date & operator++(/*prefix*/) { _date += 1; return *this; }
-    Date & operator--(/*prefix*/) { _date -= 1; return *this; }
-
-    Date operator++(int/*postfix*/) { return _date++; }
-    Date operator--(int/*postfix*/) { return _date--; }
-    //@}
-
-  public:
-    /** Return string representation according to format as localtime.
-     * \see 'man strftime' (which is used internaly) for valid
-     * conversion specifiers in format.
-     *
-     * \return An empty string on illegal format, "0" if date is unspecified.
-     **/
-    std::string form( const std::string & format_r ) const
-    { return form( format_r, TB_LOCALTIME ); }
-    /** \overload with explicitly given \ref TimeBase. */
-    std::string form( const std::string & format_r, TimeBase base_r ) const;
-
-    /** Default string representation of Date.
-     * The preferred date and time representation for the current locale.
-     **/
-    std::string asString() const
-    { return form( "%c" ); }
-
-    /** Convert to string representation of calendar time in
-     *  numeric form (like "1029255142").
-     **/
-    std::string asSeconds() const
-    { return form( "%s" ); }
-
-  public:
-    /** \name Printing in various predefined formats */
-    //@{
-    /** Date formats for printing (use like 'enum class \ref DateFormat') */
-    struct EDateFormatDef { enum Enum {
-      none,    ///< ""
-      calendar,        ///< 2014-02-07
-      month,   ///< 2014-02
-      year,    ///< 2014
-      week,    ///< 2014-W06
-      weekday, ///< 2014-W06-5 (1 is Monday)
-      ordinal, ///< 2014-038
-    };};
-    typedef base::EnumClass<EDateFormatDef> DateFormat;        ///< 'enum class DateFormat'
-
-    /** Time formats for printing (use like 'enum class \ref TimeFormat') */
-    struct ETimeFormatDef { enum Enum {
-      none,    ///< ""
-      seconds, ///< 07:06:41
-      minutes, ///< 07:06
-      hours,   ///< 07
-    };};
-    typedef base::EnumClass<ETimeFormatDef> TimeFormat;        ///< 'enum class TimeFormat'
-
-    /** Timezone indicator for printing (use like 'enum class \ref TimeZoneFormat') */
-    struct ETimeZoneFormatDef { enum Enum {
-      none,    ///< ""
-      name,    ///< UTC, CET, ...
-      offset,  ///< +00[:00]
-    };};
-    typedef base::EnumClass<ETimeZoneFormatDef> TimeZoneFormat;        ///< 'enum class TimeZoneFormat'
-
-    /** Default format is <tt>'2014-02-07 07:06:41 CET'</tt>
-     * The default is \ref DateFormat::calendar, \ref TimeFormat::seconds, \ref TimeZoneFormat::name and
-     * \ref TB_LOCALTIME. For other formats you don't have to repeat all the defaults, just pass the
-     * values where you differ.
-     */
-    std::string print( DateFormat dateFormat_r = DateFormat::calendar, TimeFormat timeFormat_r = TimeFormat::seconds, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const;
-    /** \overload */
-    std::string print( TimeFormat timeFormat_r, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const
-    { return print( DateFormat::calendar, timeFormat_r, timeZoneFormat_r, base_r ); }
-    /** \overload */
-    std::string print( DateFormat dateFormat_r, TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const
-    { return print( dateFormat_r, TimeFormat::seconds, timeZoneFormat_r, base_r ); }
-    /** \overload */
-    std::string print( DateFormat dateFormat_r, TimeFormat timeFormat_r, TimeBase base_r ) const
-    { return print( dateFormat_r, timeFormat_r, TimeZoneFormat::name, base_r ); }
-    /** \overload */
-    std::string print( TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const
-    { return print( DateFormat::calendar, TimeFormat::seconds, timeZoneFormat_r, base_r ); }
-    /** \overload */
-    std::string print( TimeFormat timeFormat_r, TimeBase base_r ) const
-    { return print( DateFormat::calendar, timeFormat_r, TimeZoneFormat::name, base_r ); }
-    /** \overload */
-    std::string print( DateFormat dateFormat_r, TimeBase base_r ) const
-    { return print( dateFormat_r, TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
-    /** \overload */
-    std::string print( TimeBase base_r ) const
-    { return print( DateFormat::calendar, TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
-
-    /** Convenience for printing the date only [<tt>'2014-02-07'</tt>]
-     * The default is \ref DateFormat::calendar and \ref TB_LOCALTIME
-     */
-    std::string printDate( DateFormat dateFormat_r = DateFormat::calendar, TimeBase base_r = TB_LOCALTIME ) const
-    { return print( dateFormat_r, TimeFormat::none, TimeZoneFormat::none, base_r ); }
-    /** \overload */
-    std::string printDate( TimeBase base_r ) const
-    { return printDate( DateFormat::calendar, base_r ); }
-
-    /** Convenience for printing the time only [<tt>'07:06:41 CET'</tt>]
-     * The default is \ref DateFormat::calendar and \ref TB_LOCALTIME
-     */
-    std::string printTime( TimeFormat timeFormat_r = TimeFormat::seconds, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const
-    { return print( DateFormat::none, timeFormat_r, timeZoneFormat_r, base_r ); }
-    /** \overload */
-    std::string printTime( TimeZoneFormat timeZoneFormat_r , TimeBase base_r = TB_LOCALTIME ) const
-    { return printTime( TimeFormat::seconds, timeZoneFormat_r, base_r ); }
-    /** \overload */
-    std::string printTime( TimeFormat timeFormat_r , TimeBase base_r ) const
-    { return printTime( timeFormat_r, TimeZoneFormat::name, base_r ); }
-    /** \overload */
-    std::string printTime( TimeBase base_r ) const
-    { return printTime( TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
-
-    /** Default ISO 8601 format is <tt>'2014-02-07T07:06:41+01'</tt>
-     * \note As timezone names are not used in ISO, \ref TimeZoneFormat::name is the same as
-     * \ref TimeZoneFormat::offset when printing in \ref TB_LOCALTIME. When printing \ref TB_UTC
-     * it uses a \c 'Z' to indicate UTC (Zulu time) rather than printing \c '+00'.
-     */
-    std::string printISO( DateFormat dateFormat_r = DateFormat::calendar, TimeFormat timeFormat_r = TimeFormat::seconds, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const;
-    /** \overload */
-    std::string printISO( TimeFormat timeFormat_r, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const
-    { return printISO( DateFormat::calendar, timeFormat_r, timeZoneFormat_r, base_r ); }
-    /** \overload */
-    std::string printISO( DateFormat dateFormat_r, TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const
-    { return printISO( dateFormat_r, TimeFormat::seconds, timeZoneFormat_r, base_r ); }
-    /** \overload */
-    std::string printISO( DateFormat dateFormat_r, TimeFormat timeFormat_r, TimeBase base_r ) const
-    { return printISO( dateFormat_r, timeFormat_r, TimeZoneFormat::name, base_r ); }
-    /** \overload */
-    std::string printISO( TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const
-    { return printISO( DateFormat::calendar, TimeFormat::seconds, timeZoneFormat_r, base_r ); }
-    /** \overload */
-    std::string printISO( TimeFormat timeFormat_r, TimeBase base_r ) const
-    { return printISO( DateFormat::calendar, timeFormat_r, TimeZoneFormat::name, base_r ); }
-    /** \overload */
-    std::string printISO( DateFormat dateFormat_r, TimeBase base_r ) const
-    { return printISO( dateFormat_r, TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
-    /** \overload */
-    std::string printISO( TimeBase base_r ) const
-    { return printISO( DateFormat::calendar, TimeFormat::seconds, TimeZoneFormat::name, base_r ); }
-    //@}
-
- private:
-    /** Calendar time.
-     * The number of seconds elapsed since 00:00:00 on January 1, 1970,
-     * Coordinated Universal Time (UTC).
-     **/
-    ValueType _date;
-  };
-  ///////////////////////////////////////////////////////////////////
-
-  /** \relates Date Stream output */
-  inline std::ostream & operator<<( std::ostream & str, const Date & obj )
-  { return str << obj.asString(); }
-
-  /** \relates Date XML output.
-   * Print \c time_t and \c text attribute. Allow alternate node name [date].
-   */
-  std::ostream & dumpAsXmlOn( std::ostream & str, const Date & obj, const std::string & name_r = "date" );
-
-  ///////////////////////////////////////////////////////////////////
-  class DateFormatException : public Exception
-  {
-  public:
-    DateFormatException( const std::string & msg ) : Exception( msg )
-    {}
-  };
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_DATE_H
+#include <zypp-core/Date.h>
index 159e54e..fba43f0 100644 (file)
  *
 */
 
-#include <cstdio> // snprintf
-#include <openssl/evp.h>
-#include <openssl/conf.h>
-#include <openssl/engine.h>
-#include <string>
-#include <string.h>
 
 #include <iostream>
 #include <sstream>
@@ -42,253 +36,10 @@ namespace zypp {
     bool DigestReport::askUserToAcceptWrongDigest( const Pathname &file, const std::string &requested, const std::string &found )
     { return false; }
 
-
-    const std::string & Digest::md5()
-    { static std::string _type( "md5" ); return _type; }
-
-    const std::string & Digest::sha1()
-    { static std::string _type( "sha1" ); return _type; }
-
-    const std::string & Digest::sha224()
-    { static std::string _type( "sha224" ); return _type; }
-
-    const std::string & Digest::sha256()
-    { static std::string _type( "sha256" ); return _type; }
-
-    const std::string & Digest::sha384()
-    { static std::string _type( "sha384" ); return _type; }
-
-    const std::string & Digest::sha512()
-    { static std::string _type( "sha512" ); return _type; }
-
-    // private data
-    class Digest::P
-    {
-      P(const P& p);
-      const P& operator=(const P& p);
-
-      public:
-        typedef zypp::shared_ptr<EVP_MD_CTX> EvpDataPtr;
-        P();
-        ~P();
-
-        EvpDataPtr mdctx;
-
-        const EVP_MD *md;
-        unsigned char md_value[EVP_MAX_MD_SIZE];
-        unsigned md_len;
-
-        bool finalized : 1;
-        static bool openssl_digests_added;
-
-        std::string name;
-
-        inline bool maybeInit();
-        inline void cleanup();
-    };
-
-
-
-    bool Digest::P::openssl_digests_added = false;
-
-    Digest::P::P() :
-      md(NULL),
-      finalized(false)
-    {
-    }
-
-    Digest::P::~P()
-    {
-      cleanup();
-    }
-
-    bool Digest::P::maybeInit()
-    {
-      if(!openssl_digests_added)
-      {
-        OPENSSL_config(NULL);
-        ENGINE_load_builtin_engines();
-        ENGINE_register_all_complete();
-        OpenSSL_add_all_digests();
-        openssl_digests_added = true;
-      }
-
-      if(!mdctx)
-      {
-        md = EVP_get_digestbyname(name.c_str());
-        if(!md)
-          return false;
-
-#if OPENSSL_VERSION_NUMBER < 0x10100000L
-        EvpDataPtr tmp_mdctx(EVP_MD_CTX_create(), EVP_MD_CTX_destroy);
-#else
-        EvpDataPtr tmp_mdctx(EVP_MD_CTX_new(), EVP_MD_CTX_free);
-#endif
-        if (!tmp_mdctx)
-          return false;
-
-        if (!EVP_DigestInit_ex(tmp_mdctx.get(), md, NULL)) {
-          return false;
-        }
-
-        md_len = 0;
-        ::memset(md_value, 0, sizeof(md_value));
-
-        mdctx.swap(tmp_mdctx);
-      }
-      return true;
-    }
-
-    void Digest::P::cleanup()
-    {
-      mdctx.reset();
-      finalized = false;
-    }
-
-    Digest::Digest() : _dp(new P())
-    {
-    }
-
-    Digest::~Digest()
-    {
-      delete _dp;
-    }
-
-    bool Digest::create(const std::string& name)
-    {
-      if(name.empty()) return false;
-
-      if(_dp->mdctx)
-       _dp->cleanup();
-
-      _dp->name = name;
-
-      return _dp->maybeInit();
-    }
-
-    const std::string& Digest::name()
-    {
-      return _dp->name;
-    }
-
-    bool Digest::reset()
-    {
-      if (!_dp->mdctx)
-        return false;
-      if(!_dp->finalized)
-      {
-        (void)EVP_DigestFinal_ex(_dp->mdctx.get(), _dp->md_value, &_dp->md_len);
-        _dp->finalized = true;
-      }
-      if(!EVP_DigestInit_ex(_dp->mdctx.get(), _dp->md, NULL))
-        return false;
-      _dp->finalized = false;
-      return true;
-    }
-
-    std::string Digest::digest()
-    {
-      return digestVectorToString( digestVector() );
-    }
-
-    std::string Digest::digestVectorToString(const std::vector<unsigned char> &vec)
-    {
-      if ( vec.empty() )
-        return std::string();
-
-      std::vector<char> resData ( vec.size()*2 + 1, '\0' );
-      char *mdtxt = &resData[0];
-      for(unsigned i = 0; i < vec.size(); ++i)
-      {
-        ::snprintf( mdtxt+(i*2), 3, "%02hhx", vec[i]);
-      }
-      return std::string( resData.data() );
-    }
-
-    std::vector<unsigned char> Digest::digestVector()
-    {
-      std::vector<unsigned char> r;
-      if(!_dp->maybeInit())
-        return r;
-
-      if(!_dp->finalized)
-      {
-        if(!EVP_DigestFinal_ex(_dp->mdctx.get(), _dp->md_value, &_dp->md_len))
-            return r;
-        _dp->finalized = true;
-      }
-      r.reserve(_dp->md_len);
-      for(unsigned i = 0; i < _dp->md_len; ++i)
-       r.push_back(_dp->md_value[i]);
-      return r;
-    }
-
-    bool Digest::update(const char* bytes, size_t len)
-    {
-      if(!bytes)
-      {
-       return false;
-      }
-
-      if(!_dp->maybeInit())
-       return false;
-
-      if(_dp->finalized)
-      {
-       _dp->cleanup();
-       if(!_dp->maybeInit())
-           return false;
-
-      }
-      if(!EVP_DigestUpdate(_dp->mdctx.get(), reinterpret_cast<const unsigned char*>(bytes), len))
-       return false;
-
-      return true;
-    }
-
-    bool Digest::update(std::istream &is, size_t bufsize)
-    {
-      if( !is )
-        return false;
-
-      char buf[bufsize];
-
-      while(is.good())
-      {
-        size_t readed;
-        is.read(buf, bufsize);
-        readed = is.gcount();
-        if(readed && !update(buf, readed))
-          return false;
-      }
-
-      return true;
-    }
-
-    std::string Digest::digest(const std::string& name, std::istream& is, size_t bufsize)
-    {
-      if(name.empty() || !is)
-       return std::string();
-
-      Digest digest;
-      if(!digest.create(name))
-        return std::string();
-
-      if ( !digest.update( is, bufsize ))
-        return std::string();
-
-      return digest.digest();
-    }
-
-    std::string Digest::digest( const std::string & name, const std::string & input, size_t bufsize )
-    {
-      std::istringstream is( input );
-      return digest( name, is, bufsize );
-    }
-
 #ifdef DIGEST_TESTSUITE
     int main(int argc, char *argv[])
     {
+      using namespace std;
       bool openssl = false;
       unsigned argpos = 1;
 
index 540b6b6..60d0628 100644 (file)
 #ifndef ZYPP_MEDIA_DIGEST_H
 #define ZYPP_MEDIA_DIGEST_H
 
-#include <string>
-#include <iosfwd>
-#include <vector>
+#include <zypp-core/Digest.h>
 
 #include <zypp/Callback.h>
 #include <zypp/Pathname.h>
 
 namespace zypp {
 
-
   struct DigestReport : public callback::ReportBase
   {
     virtual bool askUserToAcceptNoDigest( const zypp::Pathname &file );
@@ -32,127 +29,5 @@ namespace zypp {
     virtual bool askUserToAcceptWrongDigest( const Pathname &file, const std::string &requested, const std::string &found );
   };
 
-
-
-    /** \brief Compute Message Digests (MD5, SHA1 etc)
-     *
-     * The computation works by initializing the algorithm using create(). This
-     * will construct an internal state. successive calls to update() deliver the
-     * data for which the digest is to be computed. After all data has been
-     * deliverd, a call to digest() finalizes the computation and returns the
-     * result
-     * */
-    class Digest
-    {
-      private:
-       class P;
-       P* _dp;
-
-       // disabled
-       Digest(const Digest& d);
-       // disabled
-       const Digest& operator=(const Digest& d);
-
-      public:
-       /** \name Well known digest algorithm names. */
-       //@{
-       /** md5 */
-       static const std::string & md5();
-       /** sha1 */
-       static const std::string & sha1();
-       /** sha224 */
-       static const std::string & sha224();
-       /** sha256 */
-       static const std::string & sha256();
-       /** sha384 */
-       static const std::string & sha384();
-       /** sha512 */
-       static const std::string & sha512();
-       //@}
-
-      public:
-       Digest();
-       ~Digest();
-
-       /** \brief initialize creation of a new message digest
-        *
-        * Since openssl is used as backend you may use anything that openssl
-        * supports (see man 1 dgst). Common examples are md5 or sha1. sha1
-        * should be preferred when creating digests to verify the authenticity
-        * of something.
-        *
-        * successive calls to this funcion will destroy the internal state and
-        * reinit from scratch
-        *
-        * @param name name of the message digest algorithm.
-        * @return whether an error occured
-        * */
-       bool create(const std::string& name);
-
-       /** \brief get the name of the current digest algorithm */
-       const std::string& name();
-
-       /** \brief feed data into digest computation algorithm
-        * @param bytes
-        * @param len
-        * @return whether an error occured
-        * */
-       bool update(const char* bytes, size_t len);
-
-        /** \brief feed data into digest computation algorithm
-        * @param is
-        * @param bufsize
-        * @return whether an error occured
-        * */
-        bool update(std::istream& is, size_t bufsize = 4096);
-
-       /** \brief get hex string representation of the digest
-        *
-        * this function will finalize the digest computation. calls to update
-        * after this function will start from scratch
-        *
-        * @return hex string representation of the digest
-        * */
-       std::string digest();
-
-        /** \brief get hex string representation of the digest vector given as parameter
-        *
-        * @return hex string representation of the digest
-        * */
-        static std::string digestVectorToString ( const std::vector<unsigned char> &vec );
-
-       /** \brief get vector of unsigned char representation of the digest
-        *
-        * this function will finalize the digest computation. calls to update
-        * after this function will start from scratch
-        *
-        * @return vector representation of the digest
-        * */
-       std::vector<unsigned char> digestVector();
-
-       /** \brief reset internal digest state
-        *
-        * this function is equivalent to calling create() with an unchanged name,
-        * but it may be implemented in a more efficient way.
-        */
-       bool reset();
-
-       /** \brief compute digest of a stream. convenience function
-        *
-        * calls create, update and digest in one function. The data for the
-        * computation is read from the stream
-        *
-        * @param name name of the digest algorithm, \see create
-        * @param is an input stream to get the data from
-        * @param bufsize size of the buffer used for update(). Be careful, this is on the stack.
-        * @return the digest or empty on error
-        * */
-       static std::string digest(const std::string& name, std::istream& is, size_t bufsize = 4096);
-
-       /** \overload Reading input data from \c string. */
-       static std::string digest( const std::string & name, const std::string & input, size_t bufsize = 4096 );
-    };
-
 } // namespace zypp
-
 #endif
index 5f46aa4..806a71a 100644 (file)
@@ -1,328 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/ExternalProgram.h
-*/
-
-
-#ifndef ZYPP_EXTERNALPROGRAM_H
-#define ZYPP_EXTERNALPROGRAM_H
-
-#include <unistd.h>
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include <zypp/APIConfig.h>
-#include <zypp/base/ExternalDataSource.h>
-#include <zypp/Pathname.h>
-
-namespace zypp {
-
-    /**
-     * @short Execute a program and give access to its io
-     * An object of this class encapsulates the execution of
-     * an external program. It starts the program using fork
-     * and some exec.. call, gives you access to the program's
-     * stdio and closes the program after use.
-     *
-     * \code
-     *
-     * const char* argv[] =
-     * {
-     *     "/usr/bin/foo,
-     *     "--option1",
-     *     "--option2",
-     *     NULL
-     * };
-     *
-     * ExternalProgram prog( argv,
-     *                        ExternalProgram::Discard_Stderr,
-     *                        false, -1, true);
-     * string line;
-     * for(line = prog.receiveLine();
-     *     ! line.empty();
-     *     line = prog.receiveLine() )
-     * {
-     *     stream << line;
-     * }
-     * prog.close();
-     *
-     * \endcode
-     */
-    class ExternalProgram : public zypp::externalprogram::ExternalDataSource
-    {
-
-    public:
-
-      typedef std::vector<std::string> Arguments;
-
-      /**
-       * Define symbols for different policies on the handling
-       * of stderr
-       */
-      enum Stderr_Disposition {
-       Normal_Stderr,
-       Discard_Stderr,
-       Stderr_To_Stdout,
-       Stderr_To_FileDesc
-      };
-
-
-      /**
-       * For passing additional environment variables to set
-       */
-      typedef std::map<std::string,std::string> Environment;
-
-      /**
-       * Start the external program by using the shell <tt>/bin/sh<tt>
-       * with the option <tt>-c</tt>. You can use io direction symbols < and >.
-       * @param commandline a shell commandline that is appended to
-       * <tt>/bin/sh -c</tt>.
-       * @param default_locale whether to set LC_ALL=C before starting
-       * @param root directory to chroot into; or just 'cd' if '/'l;  nothing if empty
-       */
-      ExternalProgram (std::string commandline,
-                    Stderr_Disposition stderr_disp = Normal_Stderr,
-                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
-                    const Pathname& root = "");
-
-      /**
-       * Start an external program by giving the arguments as an arry of char *pointers.
-       * If environment is provided, varaiables will be added to the childs environment,
-       * overwriting existing ones.
-       *
-       * Initial args starting with \c # are discarded but some are treated specially:
-       *       #/[path] - chdir to /[path] before executing
-       *
-       * Stdin redirection: If the \b 1st argument starts with a \b '<', the remaining
-       * part is treated as file opened for reading on standard input (or \c /dev/null
-       * if empty).
-       * \code
-       *   // cat file /tmp/x
-       *   const char* argv[] = { "</tmp/x", "cat", NULL };
-       *   ExternalProgram prog( argv );
-       * \endcode
-       *
-       * Stdout redirection: If the \b 1st argument starts with a \b '>', the remaining
-       * part is treated as file opened for writing on standard output (or \c /dev/null
-       * if empty).
-       */
-
-      ExternalProgram();
-
-      ExternalProgram (const Arguments &argv,
-                    Stderr_Disposition stderr_disp = Normal_Stderr,
-                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
-                    const Pathname& root = "");
-
-      ExternalProgram (const Arguments &argv, const Environment & environment,
-                    Stderr_Disposition stderr_disp = Normal_Stderr,
-                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
-                    const Pathname& root = "");
-
-      ExternalProgram (const char *const *argv,
-                    Stderr_Disposition stderr_disp = Normal_Stderr,
-                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
-                    const Pathname& root = "");
-
-      ExternalProgram (const char *const *argv, const Environment & environment,
-                    Stderr_Disposition stderr_disp = Normal_Stderr,
-                    bool use_pty = false, int stderr_fd = -1, bool default_locale = false,
-                    const Pathname& root = "");
-
-      ExternalProgram (const char *binpath, const char *const *argv_1,
-                    bool use_pty = false);
-
-
-      ExternalProgram (const char *binpath, const char *const *argv_1, const Environment & environment,
-                    bool use_pty = false);
-
-
-      ~ExternalProgram();
-
-      /** Wait for the progamm to complete. */
-      int close();
-
-      /**
-       * Kill the program
-       */
-      bool kill();
-
-      /**
-       * Send a signal to the program
-       */
-      bool kill( int sig );
-
-      /**
-       * Return whether program is running
-       */
-      bool running();
-
-      /**
-       * return pid
-       * */
-      pid_t getpid() { return pid; }
-
-      /** The command we're executing. */
-      const std::string & command() const
-      { return _command; }
-
-      /** Some detail telling why the execution failed, if it failed.
-       * Empty if the command is still running or successfully completed.
-       *
-       * \li <tt>Can't open pty (%s).</tt>
-       * \li <tt>Can't open pipe (%s).</tt>
-       * \li <tt>Can't fork (%s).</tt>
-       * \li <tt>Command exited with status %d.</tt>
-       * \li <tt>Command was killed by signal %d (%s).</tt>
-      */
-      const std::string & execError() const
-      { return _execError; }
-
-      /**
-       * origfd will be accessible as newfd and closed (unless they were equal)
-       */
-      static void renumber_fd (int origfd, int newfd);
-
-    public:
-
-      /**
-       * Redirect all command output to an \c ostream.
-       * Returns when the command has completed.
-       * \code
-       *   std::ostringstream s;
-       *   ExternalProgram("pwd") >> s;
-       *   SEC << s.str() << endl;
-       * \endcode
-       * \code
-       *   std::ostringstream s;
-       *   ExternalProgram prog("ls -l wrzl");
-       *   prog >> s;
-       *   if ( prog.close() == 0 )
-       *     MIL << s.str() << endl;
-       *   else
-       *     ERR << prog.execError() << endl;
-       * \endcode
-       */
-      std::ostream & operator>>( std::ostream & out_r );
-
-    protected:
-      int checkStatus( int );
-
-    private:
-
-      /**
-       * Set to true, if a pair of ttys is used for communication
-       * instead of a pair of pipes.
-       */
-      bool use_pty;
-
-      pid_t pid;
-      int _exitStatus;
-      /** Store the command we're executing. */
-      std::string _command;
-      /** Remember execution errors like failed fork/exec. */
-      std::string _execError;
-
-    protected:
-
-      void start_program (const char *const *argv, const Environment & environment,
-                       Stderr_Disposition stderr_disp = Normal_Stderr,
-                       int stderr_fd = -1, bool default_locale = false,
-                       const char* root = NULL, bool switch_pgid = false, bool die_with_parent = false );
-
-    };
-
-
-  namespace externalprogram
-  {
-    /** Helper providing pipe FDs for \ref ExternalProgramWithStderr.
-     * Moved to a basse class because the pipe needs to be initialized
-     * before the \ref ExternalProgram base class is initialized.
-     * \see \ref ExternalProgramWithStderr
-     */
-    struct EarlyPipe
-    {
-      enum { R=0, W=1 };
-      EarlyPipe();
-      ~EarlyPipe();
-      void closeW()            { if ( _fds[W] != -1 ) { ::close( _fds[W] ); _fds[W] = -1; } }
-      FILE * fStdErr()         { return _stderr; }
-      protected:
-       FILE * _stderr;
-       int _fds[2];
-    };
-  } // namespace externalprogram
-
-  /** ExternalProgram extended to offer reading programs stderr.
-   * \see \ref ExternalProgram
-   */
-  class ExternalProgramWithStderr : private externalprogram::EarlyPipe, public ExternalProgram
-  {
-    public:
-      ExternalProgramWithStderr( const Arguments & argv_r, bool defaultLocale_r = false, const Pathname & root_r = "" )
-      : ExternalProgram( argv_r, Stderr_To_FileDesc, /*use_pty*/false, _fds[W], defaultLocale_r, root_r )
-      { _initStdErr(); }
-      /** \overlocad Convenience taking just the \a root_r. */
-      ExternalProgramWithStderr( const Arguments & argv_r, const Pathname & root_r )
-      : ExternalProgramWithStderr( argv_r, false, root_r )
-      {}
-
-      ExternalProgramWithStderr( const Arguments & argv_r, const Environment & environment_r, bool defaultLocale_r = false, const Pathname & root_r = "" )
-      : ExternalProgram( argv_r, environment_r, Stderr_To_FileDesc, /*use_pty*/false, _fds[W], defaultLocale_r, root_r )
-      { _initStdErr(); }
-      /** \overlocad Convenience taking just the \a root_r.  */
-      ExternalProgramWithStderr( const Arguments & argv_r, const Environment & environment_r, const Pathname & root_r )
-      : ExternalProgramWithStderr( argv_r, environment_r, false, root_r )
-      {}
-  public:
-      /** Return \c FILE* to read programms stderr (O_NONBLOCK set). */
-      using externalprogram::EarlyPipe::fStdErr;
-
-      /** Read data up to \c delim_r from stderr (nonblocking).
-       * \note If \c delim_r is '\0', we read as much data as possible.
-       * \return \c false if data are not yet available (\c retval_r remains untouched then).
-       */
-      bool stderrGetUpTo( std::string & retval_r, const char delim_r, bool returnDelim_r = false );
-
-      /** Read next complete line from stderr (nonblocking).
-       * \return \c false if data are not yet available (\c retval_r remains untouched then).
-       */
-      bool stderrGetline( std::string & retval_r, bool returnDelim_r = false  )
-      { return stderrGetUpTo( retval_r, '\n', returnDelim_r ); }
-
-    private:
-      /** Close write end of the pipe (childs end). */
-      void _initStdErr()
-      { closeW(); }
-
-    private:
-      std::string _buffer;
-  };
-
-  /** ExternalProgram extended to change the progress group ID after forking.
-   * \see \ref ExternalProgram
-   */
-  class ZYPP_LOCAL ExternalProgramWithSeperatePgid : public ExternalProgram
-  {
-    public:
-      ExternalProgramWithSeperatePgid (const char *const *argv,
-                   Stderr_Disposition stderr_disp = Normal_Stderr,
-                   int stderr_fd = -1, bool default_locale = false,
-                   const Pathname& root = "") : ExternalProgram()
-      {
-        start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), true );
-      }
-
-  };
-
-} // namespace zypp
-
-#endif // ZYPP_EXTERNALPROGRAM_H
+#include <zypp-core/ExternalProgram.h>
index b28ba23..451e8db 100644 (file)
@@ -20,6 +20,7 @@
 #include <zypp/base/PtrTypes.h>
 #include <zypp/base/DefaultIntegral.h>
 #include <zypp/base/String.h>
+#include <zypp/media/MediaException.h>
 #include <zypp/Fetcher.h>
 #include <zypp/ZYppFactory.h>
 #include <zypp/CheckSum.h>
@@ -28,7 +29,7 @@
 #include <zypp/parser/susetags/RepoIndex.h>
 
 #undef ZYPP_BASE_LOGGER_LOGGROUP
-#define ZYPP_BASE_LOGGER_LOGGROUP "zypp:fetcher"
+#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::fetcher"
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
@@ -67,7 +68,7 @@ namespace zypp
       if ( lhs->location.medianr() == rhs->location.medianr() )
         return lhs->location.filename() < rhs->location.filename();
       //else
-        return lhs->location.medianr() < rhs->location.medianr();
+      return lhs->location.medianr() < rhs->location.medianr();
     }
   };
 
@@ -90,9 +91,8 @@ namespace zypp
     ZYPP_DECLARE_FLAGS(Flags, Flag);
 
 
-    FetcherJob( const OnMediaLocation &loc, const Pathname dfile = Pathname())
+    FetcherJob( const OnMediaLocation &loc )
       : location(loc)
-      , deltafile(dfile)
       , flags(None)
     {
       //MIL << location << endl;
@@ -104,7 +104,6 @@ namespace zypp
     }
 
     OnMediaLocation location;
-    Pathname deltafile;
     //CompositeFileChecker checkers;
     std::list<FileChecker> checkers;
     Flags flags;
@@ -141,9 +140,12 @@ namespace zypp
     void enqueueDigestedDir( const OnMediaLocation &resource, bool recursive, const FileChecker &checker = FileChecker() );
 
     void enqueue( const OnMediaLocation &resource, const FileChecker &checker = FileChecker()  );
-    void enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker = FileChecker(), const Pathname &deltafile = Pathname() );
+    void enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker = FileChecker() );
     void addCachePath( const Pathname &cache_dir );
     void reset();
+    void setMediaSetAccess ( MediaSetAccess &media );
+    void start( const Pathname &dest_dir,
+                const ProgressData::ReceiverFnc &progress );
     void start( const Pathname &dest_dir,
                 MediaSetAccess &media,
                 const ProgressData::ReceiverFnc & progress_receiver );
@@ -227,14 +229,19 @@ namespace zypp
     // cache of dir contents
     std::map<std::string, filesystem::DirContent> _dircontent;
 
+    MediaSetAccess * _mediaSetAccess = nullptr;
+
     Fetcher::Options _options;
   };
   ///////////////////////////////////////////////////////////////////
 
-  void Fetcher::Impl::enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker, const Pathname &deltafile )
+  void Fetcher::Impl::enqueueDigested( const OnMediaLocation &resource, const FileChecker & )
   {
+    if ( _mediaSetAccess )
+      _mediaSetAccess->precacheFiles( {resource} );
+
     FetcherJob_Ptr job;
-    job.reset(new FetcherJob(resource, deltafile));
+    job.reset(new FetcherJob(resource));
     job->flags |= FetcherJob:: AlwaysVerifyChecksum;
     _resources.push_back(job);
   }
@@ -284,6 +291,9 @@ namespace zypp
 
   void Fetcher::Impl::enqueue( const OnMediaLocation &resource, const FileChecker &checker )
   {
+    if ( _mediaSetAccess )
+      _mediaSetAccess->precacheFiles( {resource} );
+
     FetcherJob_Ptr job;
     job.reset(new FetcherJob(resource));
     if ( checker )
@@ -306,6 +316,11 @@ namespace zypp
     _dircontent.clear();
   }
 
+  void Fetcher::Impl::setMediaSetAccess( MediaSetAccess &media )
+  {
+    _mediaSetAccess = &media;
+  }
+
   void Fetcher::Impl::addCachePath( const Pathname &cache_dir )
   {
     PathInfo info(cache_dir);
@@ -516,7 +531,7 @@ namespace zypp
       if ( tmpFile.empty() )
       {
        MIL << "Not found in cache, retrieving..." << endl;
-       tmpFile = media_r.provideFile( resource, resource.optional() ? MediaSetAccess::PROVIDE_NON_INTERACTIVE : MediaSetAccess::PROVIDE_DEFAULT, jobp_r->deltafile );
+       tmpFile = media_r.provideFile( resource, resource.optional() ? MediaSetAccess::PROVIDE_NON_INTERACTIVE : MediaSetAccess::PROVIDE_DEFAULT );
        releaseFileGuard.reset( new MediaSetAccess::ReleaseFileGuard( media_r, resource ) ); // release it when we leave the block
       }
 
@@ -711,12 +726,22 @@ namespace zypp
       MIL << "done reading indexes" << endl;
   }
 
+  void Fetcher::Impl::start( const Pathname &dest_dir,
+                             const ProgressData::ReceiverFnc & progress )
+  {
+    if ( !_mediaSetAccess )
+      ZYPP_THROW( zypp::Exception("Called Fetcher::start without setting MediaSetAccess before.") );
+    start( dest_dir, *_mediaSetAccess, progress );
+  }
+
   // start processing all fetcher jobs.
   // it processes any user pointed index first
   void Fetcher::Impl::start( const Pathname &dest_dir,
                              MediaSetAccess &media,
                              const ProgressData::ReceiverFnc & progress_receiver )
   {
+    _mediaSetAccess = nullptr; //reset the internally stored MediaSetAccess
+
     ProgressData progress(_resources.size());
     progress.sendTo(progress_receiver);
 
@@ -830,7 +855,12 @@ namespace zypp
 
   void Fetcher::enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker, const Pathname &deltafile )
   {
-    _pimpl->enqueueDigested(resource, checker, deltafile);
+    enqueueDigested( OnMediaLocation(resource).setDeltafile(deltafile), checker );
+  }
+
+  void Fetcher::enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker )
+  {
+    _pimpl->enqueueDigested( resource, checker );
   }
 
   void Fetcher::enqueueDir( const OnMediaLocation &resource,
@@ -859,6 +889,7 @@ namespace zypp
     _pimpl->enqueue(resource, checker);
   }
 
+
   void Fetcher::addCachePath( const Pathname &cache_dir )
   {
     _pimpl->addCachePath(cache_dir);
@@ -869,6 +900,16 @@ namespace zypp
     _pimpl->reset();
   }
 
+  void Fetcher::setMediaSetAccess( MediaSetAccess &media )
+  {
+    _pimpl->setMediaSetAccess( media );
+  }
+
+  void Fetcher::start(const zypp::filesystem::Pathname &dest_dir, const ProgressData::ReceiverFnc &progress)
+  {
+    _pimpl->start( dest_dir, progress );
+  }
+
   void Fetcher::start( const Pathname &dest_dir,
                        MediaSetAccess &media,
                        const ProgressData::ReceiverFnc & progress_receiver )
index 62aff9a..b9fce4e 100644 (file)
@@ -197,15 +197,17 @@ namespace zypp
     * the user could be asked twice.
     *
     * \todo FIXME implement checker == operator to avoid this.
-    *
-    * the optional deltafile argument describes a file that can
-    * be used for delta download algorithms. Usable files are
-    * uncompressed files or files compressed with gzip --rsyncable.
-    * Other files like rpms do not work, as the compression
-    * breaks the delta algorithm.
     */
-    void enqueueDigested( const OnMediaLocation &resource,
-                          const FileChecker &checker = FileChecker(), const Pathname &deltafile = Pathname());
+     void enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker = FileChecker() );
+
+
+    /**
+      * \deprecated
+      * the deltafile argument is part of OnMediaLocation now, please use \ref enqueueDigested without the
+      * deltafile argument
+      */
+    ZYPP_DEPRECATED void enqueueDigested( const OnMediaLocation &resource,
+                          const FileChecker &checker, const Pathname &deltafile );
 
 
     /**
@@ -308,6 +310,25 @@ namespace zypp
     void reset();
 
     /**
+     * Sets the media set access that will be used to precache and
+     * to download the files when \ref start is called. Calling \ref start
+     * will reset the media access.
+     */
+    void setMediaSetAccess ( MediaSetAccess &media );
+
+    /**
+    * start the transfer to a destination directory
+    * \a dest_dir
+    * The media has to be provides with \ref setMediaSetAccess before
+    * calling this version of start.
+    * The file tree will be replicated inside this
+    * directory
+    *
+    */
+    void start( const Pathname &dest_dir,
+      const ProgressData::ReceiverFnc & progress = ProgressData::ReceiverFnc() );
+
+    /**
     * start the transfer to a destination directory
     * \a dest_dir
     * You have to provde a media set access
diff --git a/zypp/Globals.h b/zypp/Globals.h
new file mode 100644 (file)
index 0000000..58d7385
--- /dev/null
@@ -0,0 +1 @@
+#include <zypp-core/Globals.h>
index b53b03c..272e514 100644 (file)
@@ -115,6 +115,10 @@ namespace zypp
     std::list<std::string> readSignaturesFprs( const Pathname & signature_r )
     { return readSignaturesFprsOptVerify( signature_r ); }
 
+    /** Return all fingerprints found in \a signature_r. */
+    std::list<std::string> readSignaturesFprs( const ByteArray & signature_r )
+    { return readSignaturesFprsOptVerify( signature_r ); }
+
     /** Tries to verify the \a file_r using \a signature_r. */
     bool verifySignaturesFprs( const Pathname & file_r, const Pathname & signature_r )
     {
@@ -123,6 +127,9 @@ namespace zypp
       return verify;
     }
 
+    template< typename Callback >
+    bool importKey(GpgmeDataPtr &data, Callback &&calcDataSize );
+
     gpgme_ctx_t _ctx { nullptr };
     bool _volatile { false };  ///< readKeyFromFile workaround bsc#1140670
 
@@ -133,6 +140,8 @@ namespace zypp
      * whether all signatures are good.
      */
     std::list<std::string> readSignaturesFprsOptVerify( const Pathname & signature_r, const Pathname & file_r = "/dev/null", bool * verify_r = nullptr );
+    std::list<std::string> readSignaturesFprsOptVerify( const ByteArray& keyData_r, const Pathname & file_r = "/dev/null", bool * verify_r = nullptr );
+    std::list<std::string> readSignaturesFprsOptVerify( GpgmeDataPtr &sigData, const Pathname & file_r = "/dev/null", bool * verify_r = nullptr );
   };
 
 std::list<std::string> KeyManagerCtx::Impl::readSignaturesFprsOptVerify( const Pathname & signature_r, const Pathname & file_r, bool * verify_r )
@@ -141,29 +150,53 @@ std::list<std::string> KeyManagerCtx::Impl::readSignaturesFprsOptVerify( const P
   if ( verify_r )
     *verify_r = false;
 
-
   if (!PathInfo( signature_r ).isExist())
     return std::list<std::string>();
 
-  FILEPtr dataFile(fopen(file_r.c_str(), "rb"), fclose);
-  if (!dataFile)
+  FILEPtr sigFile(fopen(signature_r.c_str(), "rb"), fclose);
+  if (!sigFile) {
+    ERR << "Unable to open signature file '" << signature_r << "'" <<endl;
     return std::list<std::string>();
+  }
 
-  GpgmeDataPtr fileData(nullptr, gpgme_data_release);
-  GpgmeErr err = gpgme_data_new_from_stream (&fileData.get(), dataFile.get());
+  GpgmeDataPtr sigData(nullptr, gpgme_data_release);
+  GpgmeErr err = gpgme_data_new_from_stream (&sigData.get(), sigFile.get());
   if (err) {
     ERR << err << endl;
     return std::list<std::string>();
   }
 
-  FILEPtr sigFile(fopen(signature_r.c_str(), "rb"), fclose);
-  if (!sigFile) {
-    ERR << "Unable to open signature file '" << signature_r << "'" <<endl;
+  return readSignaturesFprsOptVerify( sigData, file_r, verify_r );
+}
+
+std::list<std::string> KeyManagerCtx::Impl::readSignaturesFprsOptVerify( const ByteArray &keyData_r, const filesystem::Pathname &file_r, bool *verify_r )
+{
+  //lets be pessimistic
+  if ( verify_r )
+    *verify_r = false;
+
+  GpgmeDataPtr sigData(nullptr, gpgme_data_release);
+  GpgmeErr err = gpgme_data_new_from_mem(&sigData.get(), keyData_r.data(), keyData_r.size(), 1 );
+  if (err) {
+    ERR << err << endl;
     return std::list<std::string>();
   }
 
-  GpgmeDataPtr sigData(nullptr, gpgme_data_release);
-  err = gpgme_data_new_from_stream (&sigData.get(), sigFile.get());
+  return readSignaturesFprsOptVerify( sigData, file_r, verify_r );
+}
+
+std::list<std::string> KeyManagerCtx::Impl::readSignaturesFprsOptVerify(GpgmeDataPtr &sigData, const filesystem::Pathname &file_r, bool *verify_r)
+{
+  //lets be pessimistic
+  if ( verify_r )
+    *verify_r = false;
+
+  FILEPtr dataFile(fopen(file_r.c_str(), "rb"), fclose);
+  if (!dataFile)
+    return std::list<std::string>();
+
+  GpgmeDataPtr fileData(nullptr, gpgme_data_release);
+  GpgmeErr err = gpgme_data_new_from_stream (&fileData.get(), dataFile.get());
   if (err) {
     ERR << err << endl;
     return std::list<std::string>();
@@ -194,7 +227,7 @@ std::list<std::string> KeyManagerCtx::Impl::readSignaturesFprsOptVerify( const P
       // [https://github.com/gpg/gpgme/commit/478d1650bbef84958ccce439fac982ef57b16cd0]
       std::string id( sig->fpr );
       if ( id.size() > 16 )
-       id = id.substr( id.size()-16 );
+        id = id.substr( id.size()-16 );
 
       DBG << "Found signature with ID: " << id  << " in " << file_r << std::endl;
       signatures.push_back( std::move(id) );
@@ -209,13 +242,13 @@ std::list<std::string> KeyManagerCtx::Impl::readSignaturesFprsOptVerify( const P
       // We will however keep the behaviour of failing if we find a bad signatures even if others are good.
       if ( status != GPG_ERR_KEY_EXPIRED && status != GPG_ERR_NO_PUBKEY )
       {
-       WAR << "Failed signature check: " << file_r << " " << GpgmeErr(sig->status) << endl;
-       if ( !foundBadSignature )
-         foundBadSignature = true;
+        WAR << "Failed signature check: " << file_r << " " << GpgmeErr(sig->status) << endl;
+        if ( !foundBadSignature )
+          foundBadSignature = true;
       }
       else
       {
-       WAR << "Legacy: Ignore expired or unknown key: " << file_r << " " << GpgmeErr(sig->status) << endl;
+        WAR << "Legacy: Ignore expired or unknown key: " << file_r << " " << GpgmeErr(sig->status) << endl;
         // for now treat expired keys as good signature
         if ( status == GPG_ERR_KEY_EXPIRED )
           foundGoodSignature = true;
@@ -230,7 +263,6 @@ std::list<std::string> KeyManagerCtx::Impl::readSignaturesFprsOptVerify( const P
   return signatures;
 }
 
-
 KeyManagerCtx::KeyManagerCtx()
 : _pimpl( new Impl )
 {}
@@ -465,7 +497,28 @@ bool KeyManagerCtx::importKey(const Pathname &keyfile)
     return false;
   }
 
-  err = gpgme_op_import(_pimpl->_ctx, data.get());
+  return _pimpl->importKey( data, [&](){ return PathInfo(keyfile).size(); } );
+}
+
+bool KeyManagerCtx::importKey( const ByteArray &keydata )
+{
+  GpgmeDataPtr data(nullptr, gpgme_data_release);
+  GpgmeErr err;
+
+  err = gpgme_data_new_from_mem( &data.get(), keydata.data(), keydata.size(), 1);
+  if (err) {
+    ERR << "Error importing key: "<< err << endl;
+    return false;
+  }
+
+  return _pimpl->importKey( data, [&](){ return keydata.size(); } );
+}
+
+template<typename Callback>
+bool KeyManagerCtx::Impl::importKey(GpgmeDataPtr &data, Callback &&calcDataSize)
+{
+  GpgmeErr err;
+  err = gpgme_op_import( _ctx, data.get() );
   if (err) {
     ERR << "Error importing key: "<< err << endl;
     return false;
@@ -473,9 +526,9 @@ bool KeyManagerCtx::importKey(const Pathname &keyfile)
 
   // Work around bsc#1127220 [libgpgme] no error upon incomplete import due to signal received.
   // We need this error, otherwise RpmDb will report the missing keys as 'probably v3'.
-  if ( gpgme_import_result_t res = gpgme_op_import_result(_pimpl->_ctx) )
+  if ( gpgme_import_result_t res = gpgme_op_import_result(_ctx) )
   {
-    if ( ! res->considered && PathInfo(keyfile).size() )
+    if ( ! res->considered && std::forward<Callback>(calcDataSize)() )
     {
       DBG << *res << endl;
       ERR << "Error importing key: No keys considered (bsc#1127220, [libgpgme] signal received?)" << endl;
@@ -517,5 +570,8 @@ bool KeyManagerCtx::deleteKey(const std::string &id)
 std::list<std::string> KeyManagerCtx::readSignatureFingerprints(const Pathname &signature)
 { return _pimpl->readSignaturesFprs(signature); }
 
+std::list<std::string> KeyManagerCtx::readSignatureFingerprints(const ByteArray &keyData)
+{ return _pimpl->readSignaturesFprs(keyData); }
+
 } // namespace zypp
 ///////////////////////////////////////////////////////////////////
index 9458b5e..4a5999e 100644 (file)
@@ -15,6 +15,7 @@
 #include <zypp/base/PtrTypes.h>
 #include <zypp/Pathname.h>
 #include <zypp/PublicKey.h>
+#include <zypp-core/ByteArray.h>
 
 #include <memory>
 
@@ -70,12 +71,18 @@ class KeyManagerCtx
         /** Tries to import a key from \a keyfile, returns true on success */
         bool importKey(const Pathname & keyfile);
 
+        /** Tries to import a key from \a buffer, returns true on success */
+        bool importKey(const ByteArray & keydata);
+
         /** Tries to delete a key specified by \a id, returns true on success */
         bool deleteKey (const std::string & id);
 
         /** Reads all fingerprints from the \a signature file , returns a list of all found fingerprints */
         std::list<std::string> readSignatureFingerprints(const Pathname & signature);
 
+        /** Reads all fingerprints from the \a buffer, returns a list of all found fingerprints */
+        std::list<std::string> readSignatureFingerprints( const ByteArray & keyData );
+
     private:
       KeyManagerCtx();
 
index 2892fa9..d2e7de2 100644 (file)
@@ -9,24 +9,4 @@
 /** \file      zypp/ManagedFile.h
  *
 */
-#ifndef ZYPP_MANAGEDFILE_H
-#define ZYPP_MANAGEDFILE_H
-
-#include <iosfwd>
-
-#include <zypp/Pathname.h>
-#include <zypp/AutoDispose.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  /** A Pathname plus associated cleanup code to be executed when
-   *  path is no longer needed.
-   */
-  typedef AutoDispose<const Pathname> ManagedFile;
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_MANAGEDFILE_H
+#include <zypp-core/ManagedFile.h>
index fac8112..946c8b9 100644 (file)
@@ -90,12 +90,12 @@ namespace zypp
   {
     media::MediaManager media_mgr;
     // open the media
-    media::MediaId id = media_mgr.open(url_r);
+    media::MediaAccessId id = media_mgr.open(url_r);
     media_mgr.attach(id);
     Pathname products_file = Pathname("media.1/products");
 
     try  {
-      media_mgr.provideFile (id, products_file);
+      media_mgr.provideFile (id, OnMediaLocation(products_file) );
       products_file = media_mgr.localPath (id, products_file);
       scanProductsFile (products_file, result);
     }
index 138e2ea..a9077c4 100644 (file)
 #include <zypp/base/LogTools.h>
 #include <zypp/base/Regex.h>
 #include <zypp/base/UserRequestException.h>
+#include <zypp/media/MediaException.h>
 #include <zypp/ZYppCallbacks.h>
 #include <zypp/MediaSetAccess.h>
 #include <zypp/PathInfo.h>
 #include <zypp/TmpPath.h>
 //#include <zypp/source/MediaSetAccessReportReceivers.h>
 
+#undef ZYPP_BASE_LOGGER_LOGGROUP
+#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::fetcher"
+
 using std::endl;
 
 ///////////////////////////////////////////////////////////////////
@@ -111,34 +115,35 @@ IMPL_PTR_TYPE(MediaSetAccess);
   struct ProvideFileOperation
   {
     Pathname result;
-    ByteCount expectedFileSize;
-    void operator()( media::MediaAccessId media, const Pathname &file )
+    void operator()( media::MediaAccessId media, const OnMediaLocation &file )
     {
       media::MediaManager media_mgr;
-      media_mgr.provideFile(media, file, expectedFileSize);
-      result = media_mgr.localPath(media, file);
+      media_mgr.provideFile( media, file );
+      result = media_mgr.localPath( media, file.filename() );
     }
   };
 
   struct ProvideDirTreeOperation
   {
     Pathname result;
-    void operator()( media::MediaAccessId media, const Pathname &file )
+    void operator()( media::MediaAccessId media, const OnMediaLocation &file )
     {
+      const auto &fName = file.filename();
       media::MediaManager media_mgr;
-      media_mgr.provideDirTree(media, file);
-      result = media_mgr.localPath(media, file);
+      media_mgr.provideDirTree( media, fName );
+      result = media_mgr.localPath( media, fName );
     }
   };
 
   struct ProvideDirOperation
   {
     Pathname result;
-    void operator()( media::MediaAccessId media, const Pathname &file )
+    void operator()( media::MediaAccessId media, const OnMediaLocation &file )
     {
+      const auto &fName = file.filename();
       media::MediaManager media_mgr;
-      media_mgr.provideDir(media, file);
-      result = media_mgr.localPath(media, file);
+      media_mgr.provideDir( media, fName );
+      result = media_mgr.localPath( media, fName );
     }
   };
 
@@ -149,30 +154,29 @@ IMPL_PTR_TYPE(MediaSetAccess);
         : result(false)
     {}
 
-    void operator()( media::MediaAccessId media, const Pathname &file )
+    void operator()( media::MediaAccessId media, const OnMediaLocation &file )
     {
+      const auto &fName = file.filename();
       media::MediaManager media_mgr;
-      result = media_mgr.doesFileExist(media, file);
+      result = media_mgr.doesFileExist( media, fName );
     }
   };
 
-
-
-  Pathname MediaSetAccess::provideFile( const OnMediaLocation & resource, ProvideFileOptions options, const Pathname &deltafile )
+  Pathname MediaSetAccess::provideFile( const OnMediaLocation &resource, ProvideFileOptions options )
   {
     ProvideFileOperation op;
-    op.expectedFileSize = resource.downloadSize();
-    provide( boost::ref(op), resource, options, deltafile );
+    provide( boost::ref(op), resource, options );
     return op.result;
   }
 
+  Pathname MediaSetAccess::provideFile( const OnMediaLocation & resource, ProvideFileOptions options, const Pathname &deltafile )
+  {
+    return provideFile( OnMediaLocation( resource ).setDeltafile( deltafile ), options );
+  }
+
   Pathname MediaSetAccess::provideFile(const Pathname & file, unsigned media_nr, ProvideFileOptions options )
   {
-    OnMediaLocation resource;
-    ProvideFileOperation op;
-    resource.setLocation(file, media_nr);
-    provide( boost::ref(op), resource, options, Pathname() );
-    return op.result;
+    return provideFile( OnMediaLocation( file, media_nr ), options );
   }
 
   Pathname MediaSetAccess::provideOptionalFile( const Pathname & file, unsigned media_nr )
@@ -180,7 +184,7 @@ IMPL_PTR_TYPE(MediaSetAccess);
     try
     {
       if ( doesFileExist( file, media_nr ) )
-       return provideFile( file, media_nr, PROVIDE_NON_INTERACTIVE );
+        return provideFile( OnMediaLocation( file, media_nr ), PROVIDE_NON_INTERACTIVE );
     }
     catch ( const media::MediaFileNotFoundException & excpt_r )
     { ZYPP_CAUGHT( excpt_r ); }
@@ -195,12 +199,13 @@ IMPL_PTR_TYPE(MediaSetAccess);
   {
     Url url(file_url);
     Pathname path(url.getPathName());
+
     url.setPathName ("/");
     MediaSetAccess access(url);
 
     ManagedFile tmpFile = filesystem::TmpFile::asManagedFile();
 
-    Pathname file = access.provideFile(path, 1, options);
+    Pathname file = access.provideFile( OnMediaLocation(path, 1), options );
 
     //prevent the file from being deleted when MediaSetAccess gets out of scope
     if ( filesystem::hardlinkCopy(file, tmpFile) != 0 )
@@ -225,18 +230,37 @@ IMPL_PTR_TYPE(MediaSetAccess);
   bool MediaSetAccess::doesFileExist(const Pathname & file, unsigned media_nr )
   {
     ProvideFileExistenceOperation op;
-    OnMediaLocation resource;
-    resource.setLocation(file, media_nr);
-    provide( boost::ref(op), resource, PROVIDE_DEFAULT, Pathname());
+    OnMediaLocation resource(file, media_nr);
+    provide( boost::ref(op), resource, PROVIDE_DEFAULT );
     return op.result;
   }
 
+  void MediaSetAccess::precacheFiles(const std::vector<OnMediaLocation> &files)
+  {
+    media::MediaManager media_mgr;
+
+    for ( const auto &resource : files ) {
+      Pathname file(resource.filename());
+      unsigned media_nr(resource.medianr());
+      media::MediaAccessId media = getMediaAccessId( media_nr );
+
+      if ( !media_mgr.isOpen( media ) ) {
+        MIL << "Skipping precache of file " << resource.filename() << " media is not open";
+        continue;
+      }
+
+      if ( ! media_mgr.isAttached(media) )
+        media_mgr.attach(media);
+
+      media_mgr.precacheFiles( media, { resource } );
+    }
+  }
+
   void MediaSetAccess::provide( ProvideOperation op,
                                 const OnMediaLocation &resource,
-                                ProvideFileOptions options,
-                                const Pathname &deltafile )
+                                ProvideFileOptions options )
   {
-    Pathname file(resource.filename());
+    const auto &file(resource.filename());
     unsigned media_nr(resource.medianr());
 
     callback::SendReport<media::MediaChangeReport> report;
@@ -248,7 +272,6 @@ IMPL_PTR_TYPE(MediaSetAccess);
     {
       // get the mediaId, but don't try to attach it here
       media = getMediaAccessId( media_nr);
-      bool deltafileset = false;
 
       try
       {
@@ -257,17 +280,12 @@ IMPL_PTR_TYPE(MediaSetAccess);
         // try to attach the media
         if ( ! media_mgr.isAttached(media) )
           media_mgr.attach(media);
-       media_mgr.setDeltafile(media, deltafile);
-       deltafileset = true;
-        op(media, file);
-       media_mgr.setDeltafile(media, Pathname());
+        op(media, resource);
         break;
       }
       catch ( media::MediaException & excp )
       {
         ZYPP_CAUGHT(excp);
-       if (deltafileset)
-         media_mgr.setDeltafile(media, Pathname());
         media::MediaChangeReport::Action user = media::MediaChangeReport::ABORT;
         unsigned int devindex = 0;
         std::vector<std::string> devices;
@@ -391,16 +409,15 @@ IMPL_PTR_TYPE(MediaSetAccess);
                                       unsigned media_nr,
                                       ProvideFileOptions options )
   {
-    OnMediaLocation resource;
-    resource.setLocation(dir, media_nr);
+    OnMediaLocation resource(dir, media_nr);
     if ( recursive )
     {
         ProvideDirTreeOperation op;
-        provide( boost::ref(op), resource, options, Pathname());
+        provide( boost::ref(op), resource, options );
         return op.result;
     }
     ProvideDirOperation op;
-    provide( boost::ref(op), resource, options, Pathname());
+    provide( boost::ref(op), resource, options );
     return op.result;
   }
 
index b2707dd..7f570ec 100644 (file)
@@ -122,6 +122,18 @@ namespace zypp
       ZYPP_DECLARE_FLAGS(ProvideFileOptions,ProvideFileOption);
 
       /**
+         * Tries to fetch the given files and precaches them. Those files
+         * need to be queried using provideFile and can be read from the cache directly.
+         * The implementation is not allowed to block but needs to use seperate means to
+         * download the files concurrently.
+         * A backend can choose to completely ignore this functionaly, the default implementation
+         * does nothing.
+         *
+         * \param files List of files that should be precached
+         */
+      void precacheFiles(const std::vector<OnMediaLocation> &files);
+
+      /**
        * Provides a file from a media location.
        *
        * \param resource location of the file on media
@@ -148,7 +160,12 @@ namespace zypp
        *
        * \see zypp::media::MediaManager::provideFile()
        */
-      Pathname provideFile( const OnMediaLocation & resource, ProvideFileOptions options = PROVIDE_DEFAULT, const Pathname &deltafile = Pathname() );
+      Pathname provideFile( const OnMediaLocation & resource, ProvideFileOptions options = PROVIDE_DEFAULT );
+
+      /**
+       * \deprecated The deltafile argument is part of the OnMediaLocation now, use the version of \ref provideFile( const OnMediaLocation & resource, ProvideFileOptions options )
+       */
+      ZYPP_DEPRECATED Pathname provideFile( const OnMediaLocation & resource, ProvideFileOptions options, const Pathname &deltafile );
 
       /**
        * Provides \a file from media \a media_nr.
@@ -339,9 +356,9 @@ namespace zypp
        */
       Pathname provideFileInternal( const OnMediaLocation &resource, ProvideFileOptions options );
 
-      typedef function<void( media::MediaAccessId, const Pathname & )> ProvideOperation;
+      typedef function<void( media::MediaAccessId, const OnMediaLocation & )> ProvideOperation;
 
-      void provide( ProvideOperation op, const OnMediaLocation &resource, ProvideFileOptions options, const Pathname &deltafile );
+      void provide( ProvideOperation op, const OnMediaLocation &resource, ProvideFileOptions options );
 
       media::MediaAccessId getMediaAccessId (media::MediaNr medianr);
       virtual std::ostream & dumpOn( std::ostream & str ) const;
index 5a8ee83..84b250d 100644 (file)
@@ -48,6 +48,8 @@ namespace zypp
     ByteCount _headerSize;
     CheckSum  _headerChecksum;
 
+    Pathname  _deltafile;
+
   public:
     /** Offer default Impl. */
     static shared_ptr<Impl> nullimpl()
@@ -60,7 +62,7 @@ namespace zypp
 
   /** \relates OnMediaLocation::Impl Stream output */
   inline std::ostream & operator<<( std::ostream & str, const OnMediaLocation::Impl & obj )
-  { return str << "[" << obj._medianr << "]" << obj._filename << "{" << obj._downloadSize << "|" << obj._checksum << "}"; }
+  { return str << "[" << obj._medianr << "]" << obj._filename << "{" << obj._downloadSize << "|" << obj._checksum << "|" << obj._deltafile <<  "}"; }
 
   /** \relates OnMediaLocation::Impl Verbose stream output */
   inline std::ostream & dumpOn( std::ostream & str, const OnMediaLocation::Impl & obj )
@@ -145,6 +147,11 @@ namespace zypp
   OnMediaLocation & OnMediaLocation::setHeaderChecksum( CheckSum val_r )
   { _pimpl->_headerChecksum = val_r; return *this; }
 
+  const Pathname &OnMediaLocation::deltafile() const
+  { return _pimpl->_deltafile; }
+
+  OnMediaLocation &OnMediaLocation::setDeltafile( Pathname path )
+  { _pimpl->_deltafile = std::move(path); return *this; }
 
   std::ostream & operator<<( std::ostream & str, const OnMediaLocation & obj )
   { return str << *obj._pimpl; }
index 264f6fa..7466c1c 100644 (file)
@@ -116,6 +116,12 @@ namespace zypp
     /** Set the \ref headerChecksum. */
     OnMediaLocation & setHeaderChecksum( CheckSum val_r );
 
+    /** The existing deltafile that can be used to reduce download size ( zchunk or metalink ) */
+    const Pathname & deltafile() const;
+    /** Set the \ref deltafile. */
+    OnMediaLocation & setDeltafile( Pathname path );
+
+
   public:
     class Impl;                 ///< Implementation class.
   private:
index 63a71d9..32b5169 100644 (file)
  *
 */
 
-#include <utime.h>     // for ::utime
-#include <sys/statvfs.h>
-#include <sys/sysmacros.h> // for ::minor, ::major macros
-
-#include <iostream>
-#include <fstream>
-#include <iomanip>
-
-#include <zypp/base/LogTools.h>
-#include <zypp/base/String.h>
-#include <zypp/base/IOStream.h>
-#include <zypp/base/StrMatcher.h>
-#include <zypp/base/Errno.h>
-
-#include <zypp/AutoDispose.h>
-#include <zypp/ExternalProgram.h>
 #include <zypp/PathInfo.h>
-#include <zypp/Digest.h>
-#include <zypp/TmpPath.h>
+#include <zypp/base/StrMatcher.h>
 
 using std::endl;
 using std::string;
@@ -38,509 +21,7 @@ namespace zypp
 { /////////////////////////////////////////////////////////////////
   ///////////////////////////////////////////////////////////////////
   namespace filesystem
-  { /////////////////////////////////////////////////////////////////
-
-    /******************************************************************
-     **
-     **        FUNCTION NAME : operator<<
-     **        FUNCTION TYPE : std::ostream &
-    */
-    std::ostream & operator<<( std::ostream & str, FileType obj )
-    {
-      switch ( obj ) {
-#define EMUMOUT(T) case T: return str << #T; break
-        EMUMOUT( FT_NOT_AVAIL );
-        EMUMOUT( FT_NOT_EXIST );
-        EMUMOUT( FT_FILE );
-        EMUMOUT( FT_DIR );
-        EMUMOUT( FT_CHARDEV );
-        EMUMOUT( FT_BLOCKDEV );
-        EMUMOUT( FT_FIFO );
-        EMUMOUT( FT_LINK );
-        EMUMOUT( FT_SOCKET );
-#undef EMUMOUT
-      }
-      return str;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : StatMode::fileType
-    // METHOD TYPE : FileType
-    //
-    FileType StatMode::fileType() const
-    {
-      if ( isFile() )
-        return FT_FILE;
-      if ( isDir() )
-        return FT_DIR;
-      if ( isLink() )
-        return FT_LINK;
-      if ( isChr() )
-        return FT_CHARDEV;
-      if ( isBlk() )
-        return FT_BLOCKDEV;
-      if ( isFifo() )
-        return FT_FIFO;
-      if ( isSock() )
-        return FT_SOCKET ;
-
-      return FT_NOT_AVAIL;
-    }
-
-    /******************************************************************
-     **
-     **        FUNCTION NAME : operator<<
-     **        FUNCTION TYPE : std::ostream &
-    */
-    std::ostream & operator<<( std::ostream & str, const StatMode & obj )
-    {
-      iostr::IosFmtFlagsSaver autoResoreState( str );
-
-      char t = '?';
-      if ( obj.isFile() )
-        t = '-';
-      else if ( obj.isDir() )
-        t = 'd';
-      else if ( obj.isLink() )
-        t = 'l';
-      else if ( obj.isChr() )
-        t = 'c';
-      else if ( obj.isBlk() )
-        t = 'b';
-      else if ( obj.isFifo() )
-        t = 'p';
-      else if ( obj.isSock() )
-        t = 's';
-
-      str << t << " " << std::setfill( '0' ) << std::setw( 4 ) << std::oct << obj.perm();
-      return str;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // Class : PathInfo
-    //
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : PathInfo::PathInfo
-    // METHOD TYPE : Constructor
-    //
-    PathInfo::PathInfo()
-    : mode_e( STAT )
-    , error_i( -1 )
-    {}
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : PathInfo::PathInfo
-    // METHOD TYPE : Constructor
-    //
-    PathInfo::PathInfo( const Pathname & path, Mode initial )
-    : path_t( path )
-    , mode_e( initial )
-    , error_i( -1 )
-    {
-      operator()();
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : PathInfo::PathInfo
-    // METHOD TYPE : Constructor
-    //
-    PathInfo::PathInfo( const std::string & path, Mode initial )
-    : path_t( path )
-    , mode_e( initial )
-    , error_i( -1 )
-    {
-      operator()();
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : PathInfo::PathInfo
-    // METHOD TYPE : Constructor
-    //
-    PathInfo::PathInfo( const char * path, Mode initial )
-    : path_t( path )
-    , mode_e( initial )
-    , error_i( -1 )
-    {
-      operator()();
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : PathInfo::~PathInfo
-    // METHOD TYPE : Destructor
-    //
-    PathInfo::~PathInfo()
-    {
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : PathInfo::operator()
-    // METHOD TYPE : bool
-    //
-    bool PathInfo::operator()()
-    {
-      if ( path_t.empty() ) {
-        error_i = -1;
-      } else {
-        switch ( mode_e ) {
-        case STAT:
-          error_i = ::stat( path_t.asString().c_str(), &statbuf_C );
-          break;
-        case LSTAT:
-          error_i = ::lstat( path_t.asString().c_str(), &statbuf_C );
-          break;
-        }
-        if ( error_i == -1 )
-          error_i = errno;
-      }
-      return !error_i;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : PathInfo::fileType
-    // METHOD TYPE : File_type
-    //
-    FileType PathInfo::fileType() const
-    {
-      if ( isExist() )
-        return asStatMode().fileType();
-      return FT_NOT_EXIST;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : PathInfo::userMay
-    // METHOD TYPE : mode_t
-    //
-    mode_t PathInfo::userMay() const
-    {
-      if ( !isExist() )
-        return 0;
-      if ( owner() == geteuid() ) {
-        return( uperm()/0100 );
-      } else if ( group() == getegid() ) {
-        return( gperm()/010 );
-      }
-      return operm();
-    }
-
-    /******************************************************************
-     **
-     **        FUNCTION NAME : PathInfo::devMajor
-     **        FUNCTION TYPE : unsigned int
-     */
-    unsigned int PathInfo::devMajor() const
-    {
-      return isBlk() || isChr() ? major(statbuf_C.st_rdev) : 0;
-    }
-
-    /******************************************************************
-     **
-     **        FUNCTION NAME : PathInfo::devMinor
-     **        FUNCTION TYPE : unsigned int
-     */
-    unsigned int PathInfo::devMinor() const
-    {
-      return isBlk() || isChr() ? minor(statbuf_C.st_rdev) : 0;
-    }
-
-    /******************************************************************
-     **
-     **        FUNCTION NAME : operator<<
-     **        FUNCTION TYPE :  std::ostream &
-    */
-    std::ostream & operator<<( std::ostream & str, const PathInfo & obj )
-    {
-      iostr::IosFmtFlagsSaver autoResoreState( str );
-
-      str << obj.asString() << "{";
-      if ( !obj.isExist() ) {
-        str << Errno( obj.error() );
-      } else {
-        str << obj.asStatMode() << " " << std::dec << obj.owner() << "/" << obj.group();
-
-        if ( obj.isFile() )
-          str << " size " << obj.size();
-      }
-
-      return str << "}";
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // filesystem utilities
-    //
-    ///////////////////////////////////////////////////////////////////
-
-#define logResult MIL << endl, doLogResult
-    namespace {
-      /**  Helper function to log return values. */
-      inline int doLogResult( const int res, const char * rclass = 0 /*errno*/ )
-      {
-       if ( res )
-       {
-         if ( rclass )
-           WAR << " FAILED: " << rclass << " " << res << endl;
-         else
-           WAR << " FAILED: " << str::strerror( res ) << endl;
-       }
-       return res;
-      }
-    } // namespace
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : PathInfo::mkdir
-    // METHOD TYPE : int
-    //
-    int mkdir( const Pathname & path, unsigned mode )
-    {
-      MIL << "mkdir " << path << ' ' << str::octstring( mode );
-      if ( ::mkdir( path.asString().c_str(), mode ) == -1 ) {
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : assert_dir()
-    // METHOD TYPE : int
-    //
-    int assert_dir( const Pathname & path, unsigned mode )
-    {
-      if ( path.empty() )
-        return ENOENT;
-
-      { // Handle existing paths in advance.
-        PathInfo pi( path );
-        if ( pi.isDir() )
-          return 0;
-        if ( pi.isExist() )
-          return EEXIST;
-      }
-
-      string spath = path.asString()+"/";
-      std::string::size_type lastpos = ( path.relative() ? 2 : 1 ); // skip leasding './' or '/'
-      std::string::size_type pos = std::string::npos;
-      int ret = 0;
-
-      while ( (pos = spath.find('/',lastpos)) != std::string::npos )
-      {
-        string dir( spath.substr(0,pos) );
-        ret = ::mkdir( dir.c_str(), mode );
-        if ( ret == -1 )
-        {
-          if ( errno == EEXIST ) // ignore errors about already existing paths
-            ret = 0;
-          else
-          {
-            ret = errno;
-            WAR << " FAILED: mkdir " << dir << ' ' << str::octstring( mode ) << " errno " << ret << endl;
-          }
-        }
-        else
-        {
-          MIL << "mkdir " << dir << ' ' << str::octstring( mode ) << endl;
-        }
-        lastpos = pos+1;
-      }
-
-      return ret;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : rmdir
-    // METHOD TYPE : int
-    //
-    int rmdir( const Pathname & path )
-    {
-      MIL << "rmdir " << path;
-      if ( ::rmdir( path.asString().c_str() ) == -1 ) {
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : recursive_rmdir
-    // METHOD TYPE : int
-    //
-    static int recursive_rmdir_1( const Pathname & dir, bool removeDir = true )
-    {
-      DIR * dp;
-      struct dirent * d;
-
-      if ( ! (dp = opendir( dir.c_str() )) )
-        return logResult( errno );
-
-      while ( (d = readdir(dp)) )
-      {
-        std::string direntry = d->d_name;
-        if ( direntry == "." || direntry == ".." )
-          continue;
-        Pathname new_path( dir / d->d_name );
-
-        struct stat st;
-        if ( ! lstat( new_path.c_str(), &st ) )
-        {
-          if ( S_ISDIR( st.st_mode ) )
-            recursive_rmdir_1( new_path );
-          else
-            ::unlink( new_path.c_str() );
-        }
-      }
-      closedir( dp );
-
-      if ( removeDir && ::rmdir( dir.c_str() ) < 0 )
-        return errno;
-
-      return 0;
-    }
-    ///////////////////////////////////////////////////////////////////
-    int recursive_rmdir( const Pathname & path )
-    {
-      MIL << "recursive_rmdir " << path << ' ';
-      PathInfo p( path );
-
-      if ( !p.isExist() ) {
-        return logResult( 0 );
-      }
-
-      if ( !p.isDir() ) {
-        return logResult( ENOTDIR );
-      }
-
-      p.lstat();       // get dir symlinks
-      if ( !p.isDir() ) {
-       MIL << "unlink symlink ";
-       if ( ::unlink( path.asString().c_str() ) == -1 ) {
-         return logResult( errno );
-       }
-       return logResult( 0 );
-      }
-
-      return logResult( recursive_rmdir_1( path ) );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : clean_dir
-    // METHOD TYPE : int
-    //
-    int clean_dir( const Pathname & path )
-    {
-      MIL << "clean_dir " << path << ' ';
-      PathInfo p( path );
-
-      if ( !p.isExist() ) {
-        return logResult( 0 );
-      }
-
-      if ( !p.isDir() ) {
-        return logResult( ENOTDIR );
-      }
-
-      return logResult( recursive_rmdir_1( path, false/* don't remove path itself */ ) );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : copy_dir
-    // METHOD TYPE : int
-    //
-    int copy_dir( const Pathname & srcpath, const Pathname & destpath )
-    {
-      MIL << "copy_dir " << srcpath << " -> " << destpath << ' ';
-
-      PathInfo sp( srcpath );
-      if ( !sp.isDir() ) {
-        return logResult( ENOTDIR );
-      }
-
-      PathInfo dp( destpath );
-      if ( !dp.isDir() ) {
-        return logResult( ENOTDIR );
-      }
-
-      PathInfo tp( destpath + srcpath.basename() );
-      if ( tp.isExist() ) {
-        return logResult( EEXIST );
-      }
-
-
-      const char *const argv[] = {
-        "/bin/cp",
-        "-dR",
-        "--",
-        srcpath.asString().c_str(),
-        destpath.asString().c_str(),
-        NULL
-      };
-      ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
-      for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
-        MIL << "  " << output;
-      }
-      int ret = prog.close();
-      return logResult( ret, "returned" );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : copy_dir_content
-    // METHOD TYPE : int
-    //
-    int copy_dir_content(const Pathname & srcpath, const Pathname & destpath)
-    {
-      MIL << "copy_dir " << srcpath << " -> " << destpath << ' ';
-
-      PathInfo sp( srcpath );
-      if ( !sp.isDir() ) {
-        return logResult( ENOTDIR );
-      }
-
-      PathInfo dp( destpath );
-      if ( !dp.isDir() ) {
-        return logResult( ENOTDIR );
-      }
-
-      if ( srcpath == destpath ) {
-        return logResult( EEXIST );
-      }
-
-      std::string src( srcpath.asString());
-      src += "/.";
-      const char *const argv[] = {
-        "/bin/cp",
-        "-dR",
-        "--",
-        src.c_str(),
-        destpath.asString().c_str(),
-        NULL
-      };
-      ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
-      for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
-        MIL << "  " << output;
-      }
-      int ret = prog.close();
-      return logResult( ret, "returned" );
-    }
-
-    ///////////////////////////////////////////////////////////////////////
-    // dirForEach
-    ///////////////////////////////////////////////////////////////////////
+  {
 
     const StrMatcher & matchNoDots()
     {
@@ -548,34 +29,6 @@ namespace zypp
       return noDots;
     }
 
-    int dirForEach( const Pathname & dir_r, function<bool(const Pathname &, const char *const)> fnc_r )
-    {
-      if ( ! fnc_r )
-       return 0;
-
-      AutoDispose<DIR *> dir( ::opendir( dir_r.c_str() ),
-                             []( DIR * dir_r ) { if ( dir_r ) ::closedir( dir_r ); } );
-
-      MIL << "readdir " << dir_r << ' ';
-      if ( ! dir )
-       return logResult( errno );
-      MIL << endl; // close line before callbacks are invoked.
-
-      int ret = 0;
-      for ( struct dirent * entry = ::readdir( dir ); entry; entry = ::readdir( dir ) )
-      {
-        if ( entry->d_name[0] == '.' && ( entry->d_name[1] == '\0' || ( entry->d_name[1] == '.' && entry->d_name[2] == '\0' ) ) )
-         continue; // omitt . and ..
-
-       if ( ! fnc_r( dir_r, entry->d_name ) )
-       {
-         ret = -1;
-         break;
-       }
-      }
-      return ret;
-    }
-
     int dirForEach( const Pathname & dir_r, const StrMatcher & matcher_r, function<bool( const Pathname &, const char *const)> fnc_r )
     {
       if ( ! fnc_r )
@@ -591,620 +44,6 @@ namespace zypp
                         } );
     }
 
-    ///////////////////////////////////////////////////////////////////
-    // readdir
-    ///////////////////////////////////////////////////////////////////
-
-    int readdir( std::list<std::string> & retlist_r, const Pathname & path_r, bool dots_r )
-    {
-      retlist_r.clear();
-      return dirForEach( path_r,
-                        [&]( const Pathname & dir_r, const char *const name_r )->bool
-                        {
-                          if ( dots_r || name_r[0] != '.' )
-                            retlist_r.push_back( name_r );
-                          return true;
-                        } );
-    }
-
-
-    int readdir( std::list<Pathname> & retlist_r, const Pathname & path_r, bool dots_r )
-    {
-      retlist_r.clear();
-      return dirForEach( path_r,
-                        [&]( const Pathname & dir_r, const char *const name_r )->bool
-                        {
-                          if ( dots_r || name_r[0] != '.' )
-                            retlist_r.push_back( dir_r/name_r );
-                          return true;
-                        } );
-    }
-
-    bool DirEntry::operator==( const DirEntry &rhs ) const
-    {
-      // if one of the types is not known, use the name only
-      if ( type == FT_NOT_AVAIL || rhs.type == FT_NOT_AVAIL )
-        return ( name == rhs.name );
-      return ((name == rhs.name ) && (type == rhs.type));
-    }
-
-    int readdir( DirContent & retlist_r, const Pathname & path_r, bool dots_r, PathInfo::Mode statmode_r )
-    {
-      retlist_r.clear();
-      return dirForEach( path_r,
-                        [&]( const Pathname & dir_r, const char *const name_r )->bool
-                        {
-                          if ( dots_r || name_r[0] != '.' )
-                            retlist_r.push_back( DirEntry( name_r, PathInfo( dir_r/name_r, statmode_r ).fileType() ) );
-                          return true;
-                        } );
-    }
-
-    std::ostream & operator<<( std::ostream & str, const DirContent & obj )
-    { return dumpRange( str, obj.begin(), obj.end() ); }
-
-    ///////////////////////////////////////////////////////////////////
-    // is_empty_dir
-    ///////////////////////////////////////////////////////////////////
-
-    int is_empty_dir( const Pathname & path_r )
-    {
-      return dirForEach( path_r,
-                        [&]( const Pathname & dir_r, const char *const name_r )->bool
-                        { return false; } );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : unlink
-    // METHOD TYPE : int
-    //
-    int unlink( const Pathname & path )
-    {
-      MIL << "unlink " << path;
-      if ( ::unlink( path.asString().c_str() ) == -1 ) {
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    namespace
-    {
-      int safe_rename( const Pathname & oldpath, const Pathname & newpath )
-      {
-        int ret = ::rename( oldpath.asString().c_str(), newpath.asString().c_str() );
-
-        // rename(2) can fail on OverlayFS. Fallback to using mv(1), which is
-        // explicitly mentioned in the kernel docs to deal correctly with OverlayFS.
-        if ( ret == -1 && errno == EXDEV ) {
-          const char *const argv[] = {
-            "/usr/bin/mv",
-            oldpath.asString().c_str(),
-            newpath.asString().c_str(),
-            NULL
-          };
-          ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
-          for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
-            MIL << "  " << output;
-          }
-          ret = prog.close();
-        }
-
-        return ret;
-      }
-    } // namespace
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : rename
-    // METHOD TYPE : int
-    //
-    int rename( const Pathname & oldpath, const Pathname & newpath )
-    {
-      MIL << "rename " << oldpath << " -> " << newpath;
-      if ( safe_rename( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) {
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : exchange
-    // METHOD TYPE : int
-    //
-    int exchange( const Pathname & lpath, const Pathname & rpath )
-    {
-      MIL << "exchange " << lpath << " <-> " << rpath;
-      if ( lpath.empty() || rpath.empty() )
-        return logResult( EINVAL );
-
-      PathInfo linfo( lpath );
-      PathInfo rinfo( rpath );
-
-      if ( ! linfo.isExist() )
-      {
-        if ( ! rinfo.isExist() )
-          return logResult( 0 ); // both don't exist.
-
-        // just rename rpath -> lpath
-        int ret = assert_dir( lpath.dirname() );
-        if ( ret != 0 )
-          return logResult( ret );
-        if ( safe_rename( rpath.c_str(), lpath.c_str() ) == -1 ) {
-          return logResult( errno );
-        }
-        return logResult( 0 );
-      }
-
-      // HERE: lpath exists:
-      if ( ! rinfo.isExist() )
-      {
-        // just rename lpath -> rpath
-        int ret = assert_dir( rpath.dirname() );
-        if ( ret != 0 )
-          return logResult( ret );
-        if ( safe_rename( lpath.c_str(), rpath.c_str() ) == -1 ) {
-          return logResult( errno );
-        }
-        return logResult( 0 );
-      }
-
-      // HERE: both exist
-      TmpFile tmpfile( TmpFile::makeSibling( rpath ) );
-      if ( ! tmpfile )
-        return logResult( errno );
-      Pathname tmp( tmpfile.path() );
-      ::unlink( tmp.c_str() );
-
-      if ( safe_rename( lpath.c_str(), tmp.c_str() ) == -1 ) {
-        return logResult( errno );
-      }
-      if ( safe_rename( rpath.c_str(), lpath.c_str() ) == -1 ) {
-        safe_rename( tmp.c_str(), lpath.c_str() );
-        return logResult( errno );
-      }
-      if ( safe_rename( tmp.c_str(), rpath.c_str() ) == -1 ) {
-        safe_rename( lpath.c_str(), rpath.c_str() );
-        safe_rename( tmp.c_str(), lpath.c_str() );
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : copy
-    // METHOD TYPE : int
-    //
-    int copy( const Pathname & file, const Pathname & dest )
-    {
-      MIL << "copy " << file << " -> " << dest << ' ';
-
-      PathInfo sp( file );
-      if ( !sp.isFile() ) {
-        return logResult( EINVAL );
-      }
-
-      PathInfo dp( dest );
-      if ( dp.isDir() ) {
-        return logResult( EISDIR );
-      }
-
-      const char *const argv[] = {
-        "/bin/cp",
-        "--remove-destination",
-        "--",
-        file.asString().c_str(),
-        dest.asString().c_str(),
-        NULL
-      };
-      ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
-      for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
-        MIL << "  " << output;
-      }
-      int ret = prog.close();
-      return logResult( ret, "returned" );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : symlink
-    // METHOD TYPE : int
-    //
-    int symlink( const Pathname & oldpath, const Pathname & newpath )
-    {
-      MIL << "symlink " << newpath << " -> " << oldpath;
-      if ( ::symlink( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) {
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : hardlink
-    // METHOD TYPE : int
-    //
-    int hardlink( const Pathname & oldpath, const Pathname & newpath )
-    {
-      MIL << "hardlink " << newpath << " -> " << oldpath;
-      if ( ::link( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 ) {
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : hardlink
-    // METHOD TYPE : int
-    //
-    int hardlinkCopy( const Pathname & oldpath, const Pathname & newpath )
-    {
-      MIL << "hardlinkCopy " << oldpath << " -> " << newpath;
-
-      PathInfo pi( oldpath, PathInfo::LSTAT );
-      if ( pi.isLink() )
-      {
-       // dont hardlink symlinks!
-       MIL << " => copy" << endl;
-       return copy( oldpath, newpath );
-      }
-
-      pi.lstat( newpath );
-      if ( pi.isExist() )
-      {
-       int res = unlink( newpath );
-       if ( res != 0 )
-         return logResult( res );
-      }
-
-      // Here: no symlink, no newpath
-      if ( ::link( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 )
-      {
-        switch ( errno )
-        {
-         case EPERM: // /proc/sys/fs/protected_hardlink in proc(5)
-          case EXDEV: // oldpath  and  newpath are not on the same mounted file system
-           MIL << " => copy" << endl;
-            return copy( oldpath, newpath );
-            break;
-        }
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : readlink
-    // METHOD TYPE : int
-    //
-    int readlink( const Pathname & symlink_r, Pathname & target_r )
-    {
-      static const ssize_t bufsiz = 2047;
-      static char buf[bufsiz+1];
-      ssize_t ret = ::readlink( symlink_r.c_str(), buf, bufsiz );
-      if ( ret == -1 )
-      {
-        target_r = Pathname();
-        MIL << "readlink " << symlink_r;
-        return logResult( errno );
-      }
-      buf[ret] = '\0';
-      target_r = buf;
-      return 0;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    //  METHOD NAME : expandlink
-    //  METHOD TYPE : Pathname
-    //
-    Pathname expandlink( const Pathname & path_r )
-    {
-      static const unsigned int level_limit = 256;
-      static unsigned int count;
-      Pathname path(path_r);
-      PathInfo info(path_r, PathInfo::LSTAT);
-
-      for (count = level_limit; info.isLink() && count; count--)
-      {
-        DBG << "following symlink " << path;
-        path = path.dirname() / readlink(path);
-        DBG << "->" << path << std::endl;
-        info = PathInfo(path, PathInfo::LSTAT);
-      }
-
-      // expand limit reached
-      if (count == 0)
-      {
-        ERR << "Expand level limit reached. Probably a cyclic symbolic link." << endl;
-        return Pathname();
-      }
-      // symlink
-      else if (count < level_limit)
-      {
-        // check for a broken link
-        if (PathInfo(path).isExist())
-          return path;
-        // broken link, return an empty path
-        else
-        {
-          ERR << path << " is broken (expanded from " << path_r << ")" << endl;
-          return Pathname();
-        }
-      }
-
-      // not a symlink, return the original pathname
-      DBG << "not a symlink" << endl;
-      return path;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : copy_file2dir
-    // METHOD TYPE : int
-    //
-    int copy_file2dir( const Pathname & file, const Pathname & dest )
-    {
-      MIL << "copy_file2dir " << file << " -> " << dest << ' ';
-
-      PathInfo sp( file );
-      if ( !sp.isFile() ) {
-        return logResult( EINVAL );
-      }
-
-      PathInfo dp( dest );
-      if ( !dp.isDir() ) {
-        return logResult( ENOTDIR );
-      }
-
-      const char *const argv[] = {
-        "/bin/cp",
-        "--",
-        file.asString().c_str(),
-        dest.asString().c_str(),
-        NULL
-      };
-      ExternalProgram prog( argv, ExternalProgram::Stderr_To_Stdout );
-      for ( string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) {
-        MIL << "  " << output;
-      }
-      int ret = prog.close();
-      return logResult( ret, "returned" );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : md5sum
-    // METHOD TYPE : std::string
-    //
-    std::string md5sum( const Pathname & file )
-    {
-      if ( ! PathInfo( file ).isFile() ) {
-        return string();
-      }
-      std::ifstream istr( file.asString().c_str() );
-      if ( ! istr ) {
-        return string();
-      }
-      return Digest::digest( "MD5", istr );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : sha1sum
-    // METHOD TYPE : std::string
-    //
-    std::string sha1sum( const Pathname & file )
-    {
-      return checksum(file, "SHA1");
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    //  METHOD NAME : checksum
-    //  METHOD TYPE : std::string
-    //
-    std::string checksum( const Pathname & file, const std::string &algorithm )
-    {
-      if ( ! PathInfo( file ).isFile() ) {
-        return string();
-      }
-      std::ifstream istr( file.asString().c_str() );
-      if ( ! istr ) {
-        return string();
-      }
-      return Digest::digest( algorithm, istr );
-    }
-
-    bool is_checksum( const Pathname & file, const CheckSum &checksum )
-    {
-      return ( filesystem::checksum(file,  checksum.type()) == checksum.checksum() );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : erase
-    // METHOD TYPE : int
-    //
-    int erase( const Pathname & path )
-    {
-      int res = 0;
-      PathInfo p( path, PathInfo::LSTAT );
-      if ( p.isExist() )
-        {
-          if ( p.isDir() )
-            res = recursive_rmdir( path );
-          else
-            res = unlink( path );
-        }
-      return res;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : chmod
-    // METHOD TYPE : int
-    //
-    int chmod( const Pathname & path, mode_t mode )
-    {
-      MIL << "chmod " << path << ' ' << str::octstring( mode );
-      if ( ::chmod( path.asString().c_str(), mode ) == -1 ) {
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
-    int addmod( const Pathname & path, mode_t mode )
-    {
-      mode_t omode( PathInfo( path ).st_mode() );
-      mode_t tmode( omode | mode );
-      if ( omode != mode )
-        return chmod( path, tmode );
-      return 0;
-    }
-
-    int delmod( const Pathname & path, mode_t mode )
-    {
-      mode_t omode( PathInfo( path ).st_mode() );
-      mode_t tmode( omode & ~mode );
-      if ( omode != mode )
-        return chmod( path, tmode );
-      return 0;
-    }
-
-   //////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : zipType
-    // METHOD TYPE : ZIP_TYPE
-    //
-    ZIP_TYPE zipType( const Pathname & file )
-    {
-      ZIP_TYPE ret = ZT_NONE;
-
-      int fd = open( file.asString().c_str(), O_RDONLY|O_CLOEXEC );
-
-      if ( fd != -1 ) {
-        const int magicSize = 5;
-        unsigned char magic[magicSize];
-        memset( magic, 0, magicSize );
-        if ( read( fd, magic, magicSize ) == magicSize ) {
-          if ( magic[0] == 0037 && magic[1] == 0213 ) {
-            ret = ZT_GZ;
-          } else if ( magic[0] == 'B' && magic[1] == 'Z' && magic[2] == 'h' ) {
-            ret = ZT_BZ2;
-          } else if ( magic[0] == '\0' && magic[1] == 'Z' && magic[2] == 'C' && magic[3] == 'K' && magic[4] == '1') {
-            ret = ZT_ZCHNK;
-
-          }
-        }
-        close( fd );
-      }
-
-      return ret;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : df
-    // METHOD TYPE : ByteCount
-    //
-    ByteCount df( const Pathname & path_r )
-    {
-      ByteCount ret( -1 );
-      struct statvfs sb;
-      if ( statvfs( path_r.c_str(), &sb ) == 0 )
-        {
-          ret = sb.f_bfree * sb.f_bsize;
-        }
-      return ret;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : getUmask
-    // METHOD TYPE : mode_t
-    //
-    mode_t getUmask()
-    {
-      mode_t mask = ::umask( 0022 );
-      ::umask( mask );
-      return mask;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : getUmask
-    // METHOD TYPE : mode_t
-    //
-    int assert_file( const Pathname & path, unsigned mode )
-    {
-      int ret = assert_dir( path.dirname() );
-      MIL << "assert_file " << str::octstring( mode ) << " " << path;
-      if ( ret != 0 )
-        return logResult( ret );
-
-      PathInfo pi( path );
-      if ( pi.isExist() )
-        return logResult( pi.isFile() ? 0 : EEXIST );
-
-      int fd = ::creat( path.c_str(), mode );
-      if ( fd == -1 )
-        return logResult( errno );
-
-      ::close( fd );
-      return logResult( 0 );
-    }
-
-    int assert_file_mode( const Pathname & path, unsigned mode )
-    {
-      int ret = assert_dir( path.dirname() );
-      MIL << "assert_file_mode " << str::octstring( mode ) << " " << path;
-      if ( ret != 0 )
-        return logResult( ret );
-
-      PathInfo pi( path );
-      if ( pi.isExist() )
-      {
-       if ( ! pi.isFile() )
-         return logResult( EEXIST );
-
-       mode = applyUmaskTo( mode );
-       if ( pi.st_mode() != mode )
-         return chmod( path, mode );
-
-       return logResult( 0 );
-      }
-
-      int fd = ::creat( path.c_str(), mode );
-      if ( fd == -1 )
-        return logResult( errno );
-      ::close( fd );
-      return logResult( 0 );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    //  METHOD NAME : touch
-    //  METHOD TYPE : int
-    //
-    int touch (const Pathname & path)
-    {
-      MIL << "touch " << path;
-      struct ::utimbuf times;
-      times.actime = ::time( 0 );
-      times.modtime = ::time( 0 );
-      if ( ::utime( path.asString().c_str(), &times ) == -1 ) {
-        return logResult( errno );
-      }
-      return logResult( 0 );
-    }
-
     /////////////////////////////////////////////////////////////////
   } // namespace filesystem
   ///////////////////////////////////////////////////////////////////
index cb05df5..7d5a3f6 100644 (file)
 #ifndef ZYPP_PATHINFO_H
 #define ZYPP_PATHINFO_H
 
-extern "C"
-{
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <dirent.h>
-}
-
-#include <cerrno>
-#include <iosfwd>
-#include <list>
-#include <set>
-#include <map>
-
-#include <zypp/Pathname.h>
-#include <zypp/CheckSum.h>
-#include <zypp/ByteCount.h>
+#include <zypp-core/fs/PathInfo.h>
+#include <zypp-core/Pathname.h>
+#include <zypp-core/base/Function.h>
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
@@ -46,412 +31,7 @@ namespace zypp
    * using an insert_iterator to be independent from std::container.
   */
   namespace filesystem
-  { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    /** File type information.
-     * \todo Think about an \ref g_EnumerationClass
-    */
-    enum FileType
-      {
-        FT_NOT_AVAIL = 0x00, // no typeinfo available
-        FT_NOT_EXIST = 0x01, // file does not exist
-        FT_FILE      = 0x02,
-        FT_DIR       = 0x04,
-        FT_CHARDEV   = 0x08,
-        FT_BLOCKDEV  = 0x10,
-        FT_FIFO      = 0x20,
-        FT_LINK      = 0x40,
-        FT_SOCKET    = 0x80
-      };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates FileType Stram output. */
-    extern std::ostream & operator<<( std::ostream & str, FileType obj );
-
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : StatMode
-    /**
-     * @short Wrapper class for mode_t values as derived from ::stat
-     **/
-    class StatMode
-    {
-      friend std::ostream & operator<<( std::ostream & str, const StatMode & obj );
-
-    public:
-      /** Ctor taking  mode_t value from ::stat. */
-      StatMode( const mode_t & mode_r = 0 )
-      : _mode( mode_r )
-      {}
-
-    public:
-
-      /** \name Query FileType. */
-      //@{
-      FileType fileType() const;
-
-      bool   isFile()  const { return S_ISREG( _mode ); }
-      bool   isDir ()  const { return S_ISDIR( _mode ); }
-      bool   isLink()  const { return S_ISLNK( _mode ); }
-      bool   isChr()   const { return S_ISCHR( _mode ); }
-      bool   isBlk()   const { return S_ISBLK( _mode ); }
-      bool   isFifo()  const { return S_ISFIFO( _mode ); }
-      bool   isSock()  const { return S_ISSOCK( _mode ); }
-      //@}
-
-      /** \name Query user permissions. */
-      //@{
-      bool   isRUsr()  const { return (_mode & S_IRUSR); }
-      bool   isWUsr()  const { return (_mode & S_IWUSR); }
-      bool   isXUsr()  const { return (_mode & S_IXUSR); }
-
-      /** Short for isRUsr().*/
-      bool   isR()     const { return isRUsr(); }
-      /** Short for isWUsr().*/
-      bool   isW()     const { return isWUsr(); }
-      /** Short for isXUsr().*/
-      bool   isX()     const { return isXUsr(); }
-      //@}
-
-      /** \name Query group permissions. */
-      //@{
-      bool   isRGrp()  const { return (_mode & S_IRGRP); }
-      bool   isWGrp()  const { return (_mode & S_IWGRP); }
-      bool   isXGrp()  const { return (_mode & S_IXGRP); }
-      //@}
-
-      /** \name Query others permissions. */
-      //@{
-      bool   isROth()  const { return (_mode & S_IROTH); }
-      bool   isWOth()  const { return (_mode & S_IWOTH); }
-      bool   isXOth()  const { return (_mode & S_IXOTH); }
-      //@}
-
-      /** \name Query special permissions. */
-      //@{
-      /** Set UID bit. */
-      bool   isUid()   const { return (_mode & S_ISUID); }
-      /** Set GID bit. */
-      bool   isGid()   const { return (_mode & S_ISGID); }
-      /** Sticky bit. */
-      bool   isVtx()   const { return (_mode & S_ISVTX); }
-      //@}
-
-      /** \name Query permission */
-      //@{
-      /** Test for equal permission bits. */
-      bool   isPerm ( mode_t m ) const { return (m == perm()); }
-      /** Test for set permission bits. */
-      bool   hasPerm( mode_t m ) const { return (m == (m & perm())); }
-      //@}
-
-      /** \name Extract permission bits only. */
-      //@{
-      mode_t uperm()   const { return (_mode & S_IRWXU); }
-      mode_t gperm()   const { return (_mode & S_IRWXG); }
-      mode_t operm()   const { return (_mode & S_IRWXO); }
-      mode_t perm()    const { return (_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)); }
-      //@}
-
-      /** Return the mode_t value. */
-      mode_t st_mode() const { return _mode; }
-
-    private:
-      mode_t _mode;
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates StatMode Stream output. */
-    extern std::ostream & operator<<( std::ostream & str, const StatMode & obj );
-
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : DevInoCache
-    /** Simple cache remembering device/inode to detect hardlinks.
-     * \code
-     *     DevInoCache trace;
-     *     for ( all files ) {
-     *       if ( trace.insert( file.device, file.inode ) ) {
-     *         // 1st occurance of file
-     *       }
-     *         // else: hardlink; already counted this device/inode
-     *       }
-     *     }
-     * \endcode
-     **/
-    class DevInoCache
-    {
-    public:
-      /** Ctor */
-      DevInoCache() {}
-
-      /** Clear cache. */
-      void clear() { _devino.clear(); }
-
-      /** Remember dev/ino.
-       * \Return <code>true</code> if it's inserted the first
-       * time, <code>false</code> if alredy present in cache
-       * (a hardlink to a previously remembered file).
-       **/
-      bool insert( const dev_t & dev_r, const ino_t & ino_r ) {
-        return _devino[dev_r].insert( ino_r ).second;
-      }
-
-    private:
-      std::map<dev_t,std::set<ino_t> > _devino;
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : PathInfo
-    /** Wrapper class for ::stat/::lstat.
-     *
-     * \note All attribute quieries test for isExist(), and return \c false or
-     * \c 0, if stat was not successful.
-     *
-     * \note For convenience PathInfo is available as zypp::PathInfo too.
-     **/
-    class PathInfo
-    {
-      friend std::ostream & operator<<( std::ostream & str, const PathInfo & obj );
-
-    public:
-      /** stat() or lstat() */
-      enum Mode { STAT, LSTAT };
-
-    public:
-      /** \name Construct from Pathname.
-       * Default mode is \c STAT.
-      */
-      //@{
-      PathInfo();
-      explicit
-      PathInfo( const Pathname & path, Mode initial = STAT );
-      explicit
-      PathInfo( const std::string & path, Mode initial = STAT );
-      explicit
-      PathInfo( const char * path, Mode initial = STAT );
-      //@}
-
-      /**Dtor */
-      ~PathInfo();
-
-      /** Return current Pathname. */
-      const Pathname &    path()     const { return path_t; }
-      /** Return current Pathname as String. */
-      const std::string & asString() const { return path_t.asString(); }
-      /** Return current Pathname as C-string. */
-      const char * c_str()           const { return path_t.asString().c_str(); }
-      /** Return current stat Mode. */
-      Mode                mode()     const { return mode_e; }
-      /** Return error returned from last stat/lstat call. */
-      int                 error()    const { return error_i; }
-
-      /** Set a new Pathname. */
-      void setPath( const Pathname & path ) { if ( path != path_t ) error_i = -1; path_t = path; }
-      /** Set a new Mode . */
-      void setMode( Mode mode )             { if ( mode != mode_e ) error_i = -1; mode_e = mode; }
-
-      /** STAT \a path. */
-      bool stat      ( const Pathname & path ) { setPath( path ); setMode( STAT );  return operator()(); }
-      /** LSTAT \a path. */
-      bool lstat     ( const Pathname & path ) { setPath( path ); setMode( LSTAT ); return operator()(); }
-      /** Restat \a path using current mode. */
-      bool operator()( const Pathname & path ) { setPath( path ); return operator()(); }
-
-      /** STAT current path. */
-      bool stat()   { setMode( STAT );  return operator()(); }
-      /** LSTAT current path. */
-      bool lstat()  { setMode( LSTAT ); return operator()(); }
-      /** Restat current path using current mode. */
-      bool operator()();
-
-    public:
-
-      /** Return whether valid stat info exists.
-       * That's usg. whether the file exist and you had permission to
-       * stat it.
-      */
-      bool   isExist() const { return !error_i; }
-
-      /** \name Query StatMode attibutes.
-       * Combines \ref zypp::PathInfo::isExist and \ref zypp::filesystem::StatMode query.
-      */
-      //@{
-      FileType fileType() const;
-
-      bool   isFile()  const { return isExist() && S_ISREG( statbuf_C.st_mode ); }
-      bool   isDir ()  const { return isExist() && S_ISDIR( statbuf_C.st_mode ); }
-      bool   isLink()  const { return isExist() && S_ISLNK( statbuf_C.st_mode ); }
-      bool   isChr()   const { return isExist() && S_ISCHR( statbuf_C.st_mode ); }
-      bool   isBlk()   const { return isExist() && S_ISBLK( statbuf_C.st_mode ); }
-      bool   isFifo()  const { return isExist() && S_ISFIFO( statbuf_C.st_mode ); }
-      bool   isSock()  const { return isExist() && S_ISSOCK( statbuf_C.st_mode ); }
-
-      // permission
-      bool   isRUsr()  const { return isExist() && (statbuf_C.st_mode & S_IRUSR); }
-      bool   isWUsr()  const { return isExist() && (statbuf_C.st_mode & S_IWUSR); }
-      bool   isXUsr()  const { return isExist() && (statbuf_C.st_mode & S_IXUSR); }
-
-      bool   isR()     const { return isRUsr(); }
-      bool   isW()     const { return isWUsr(); }
-      bool   isX()     const { return isXUsr(); }
-
-      bool   isRGrp()  const { return isExist() && (statbuf_C.st_mode & S_IRGRP); }
-      bool   isWGrp()  const { return isExist() && (statbuf_C.st_mode & S_IWGRP); }
-      bool   isXGrp()  const { return isExist() && (statbuf_C.st_mode & S_IXGRP); }
-
-      bool   isROth()  const { return isExist() && (statbuf_C.st_mode & S_IROTH); }
-      bool   isWOth()  const { return isExist() && (statbuf_C.st_mode & S_IWOTH); }
-      bool   isXOth()  const { return isExist() && (statbuf_C.st_mode & S_IXOTH); }
-
-      bool   isUid()   const { return isExist() && (statbuf_C.st_mode & S_ISUID); }
-      bool   isGid()   const { return isExist() && (statbuf_C.st_mode & S_ISGID); }
-      bool   isVtx()   const { return isExist() && (statbuf_C.st_mode & S_ISVTX); }
-
-      bool   isPerm ( mode_t m ) const { return isExist() && (m == perm()); }
-      bool   hasPerm( mode_t m ) const { return isExist() && (m == (m & perm())); }
-
-      mode_t uperm()   const { return isExist() ? (statbuf_C.st_mode & S_IRWXU) : 0; }
-      mode_t gperm()   const { return isExist() ? (statbuf_C.st_mode & S_IRWXG) : 0; }
-      mode_t operm()   const { return isExist() ? (statbuf_C.st_mode & S_IRWXO) : 0; }
-      mode_t perm()    const { return isExist() ? (statbuf_C.st_mode & (S_IRWXU|S_IRWXG|S_IRWXO|S_ISUID|S_ISGID|S_ISVTX)) : 0; }
-
-      mode_t st_mode() const { return isExist() ? statbuf_C.st_mode : 0; }
-      //@}
-
-      /** Return st_mode() as filesystem::StatMode. */
-      StatMode asStatMode() const { return st_mode(); }
-
-      nlink_t nlink()  const { return isExist() ? statbuf_C.st_nlink : 0; }
-
-      /** \name Owner and group */
-      //@{
-      uid_t  owner()   const { return isExist() ? statbuf_C.st_uid : 0; }
-      gid_t  group()   const { return isExist() ? statbuf_C.st_gid : 0; }
-      //@}
-
-      /** \name Permission according to current uid/gid. */
-      //@{
-      /** Returns current users permission (<tt>[0-7]</tt>)*/
-      mode_t userMay() const;
-
-      bool   userMayR() const { return( userMay() & 04 ); }
-      bool   userMayW() const { return( userMay() & 02 ); }
-      bool   userMayX() const { return( userMay() & 01 ); }
-
-      bool   userMayRW()  const { return( (userMay() & 06) == 06 ); }
-      bool   userMayRX()  const { return( (userMay() & 05) == 05 ); }
-      bool   userMayWX()  const { return( (userMay() & 03) == 03 ); }
-
-      bool   userMayRWX() const { return( userMay() == 07 ); }
-      //@}
-
-      /** \name Device and inode info. */
-      //@{
-      ino_t  ino()     const { return isExist() ? statbuf_C.st_ino  : 0; }
-      dev_t  dev()     const { return isExist() ? statbuf_C.st_dev  : 0; }
-      dev_t  rdev()    const { return isExist() ? statbuf_C.st_rdev : 0; }
-
-      unsigned int devMajor() const;
-      unsigned int devMinor() const;
-      //@}
-
-      /** \name Size info. */
-      //@{
-      off_t         size()    const { return isExist() ? statbuf_C.st_size : 0; }
-      unsigned long blksize() const { return isExist() ? statbuf_C.st_blksize : 0; }
-      unsigned long blocks()  const { return isExist() ? statbuf_C.st_blocks  : 0; }
-      //@}
-
-      /** \name Time stamps. */
-      //@{
-      time_t atime()   const { return isExist() ? statbuf_C.st_atime : 0; } /* time of last access */
-      time_t mtime()   const { return isExist() ? statbuf_C.st_mtime : 0; } /* time of last modification */
-      time_t ctime()   const { return isExist() ? statbuf_C.st_ctime : 0; }
-      //@}
-
-    private:
-      Pathname    path_t;
-      struct stat statbuf_C;
-      Mode        mode_e;
-      int         error_i;
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates PathInfo Stream output. */
-    extern std::ostream & operator<<( std::ostream & str, const PathInfo & obj );
-
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name Directory related functions. */
-    //@{
-    /**
-     * Like '::mkdir'. Attempt to create a new directory named path. mode
-     * specifies the permissions to use. It is modified by the process's
-     * umask in the usual way.
-     *
-     * @return 0 on success, errno on failure
-     **/
-    int mkdir( const Pathname & path, unsigned mode = 0755 );
-
-    /**
-     * Like 'mkdir -p'. No error if directory exists. Make parent directories
-     * as needed. mode specifies the permissions to use, if directories have to
-     * be created. It is modified by the process's umask in the usual way.
-     *
-     * @return 0 on success, errno on failure
-     **/
-    int assert_dir( const Pathname & path, unsigned mode = 0755 );
-
-    /**
-     * Like '::rmdir'. Delete a directory, which must be empty.
-     *
-     * @return 0 on success, errno on failure
-     **/
-    int rmdir( const Pathname & path );
-
-    /**
-     * Like 'rm -r DIR'. Delete a directory, recursively removing its contents.
-     *
-     * @return 0 on success, ENOTDIR if path is not a directory, otherwise the
-     * commands return value.
-     **/
-    int recursive_rmdir( const Pathname & path );
-
-    /**
-     * Like 'rm -r DIR/ *'. Delete directory contents, but keep the directory itself.
-     *
-     * @return 0 on success, ENOTDIR if path is not a directory, otherwise the
-     * commands return value.
-     **/
-    int clean_dir( const Pathname & path );
-
-    /**
-     * Like 'cp -a srcpath destpath'. Copy directory tree. srcpath/destpath must be
-     * directories. 'basename srcpath' must not exist in destpath.
-     *
-     * @return 0 on success, ENOTDIR if srcpath/destpath is not a directory, EEXIST if
-     * 'basename srcpath' exists in destpath, otherwise the commands return value.
-     **/
-    int copy_dir( const Pathname & srcpath, const Pathname & destpath );
-
-    /**
-     * Like 'cp -a srcpath/. destpath'. Copy the content of srcpath recursively
-     * into destpath. Both \p srcpath and \p destpath has to exists.
-     *
-     * @return 0 on success, ENOTDIR if srcpath/destpath is not a directory,
-     * EEXIST if srcpath and destpath are equal, otherwise the commands
-     * return value.
-     */
-    int copy_dir_content( const Pathname & srcpath, const Pathname & destpath);
+  {
 
     /**
      * Convenience returning <tt>StrMatcher( "[^.]*", Match::GLOB )</tt>
@@ -460,20 +40,6 @@ namespace zypp
     const StrMatcher & matchNoDots();
 
     /**
-     * Invoke callback function \a fnc_r for each entry in directory \a dir_r.
-     *
-     * If \a fnc_r is a \c NULL function \c 0 is returned immediately without even
-     * testing or accessing \a dir_r.
-     *
-     * Otherwise \c ::readdir is used to read the name of every entry in \a dir_r,
-     * omitting  \c '.' and \c '..'. \a dir_r and the current entries name are passed
-     * as arguments to \a fnc_r. If \a fnc_r returns \c false processing is aborted.
-     *
-     * @return 0 on success, -1 if aborted by callback, errno > 0 on ::readdir failure.
-     */
-    int dirForEach( const Pathname & dir_r, function<bool(const Pathname &, const char *const)> fnc_r );
-
-    /**
      * \overload taking a \ref StrMatcher to filter the entries for which \a fnc_r is invoked.
      *
      * For convenience a \ref StrMatcher \ref matchNoDots is provided in this namespace.</tt>
@@ -498,322 +64,6 @@ namespace zypp
      */
     int dirForEach( const Pathname & dir_r, const StrMatcher & matcher_r, function<bool(const Pathname &, const char *const)> fnc_r );
 
-    /**
-     * Return content of directory via retlist. If dots is false
-     * entries starting with '.' are not reported. "." and ".."
-     * are never reported.
-     *
-     * Returns just the directory entries as string.
-     *
-     * @return 0 on success, errno on failure.
-     *
-     * \todo provide some readdirIterator.
-     **/
-
-    int readdir( std::list<std::string> & retlist,
-                 const Pathname & path, bool dots = true );
-
-    /**
-     * Return content of directory via retlist. If dots is false
-     * entries starting with '.' are not reported. "." and ".."
-     * are never reported.
-     *
-     * Returns the directory entries prefixed with \a path.
-     *
-     * @return 0 on success, errno on failure.
-     *
-     * \todo provide some readdirIterator.
-     **/
-
-    int readdir( std::list<Pathname> & retlist,
-                 const Pathname & path, bool dots = true );
-
-    /** Listentry returned by readdir. */
-    struct DirEntry {
-      std::string name;
-      FileType    type;
-      DirEntry( const std::string & name_r = std::string(), FileType type_r = FT_NOT_AVAIL )
-      : name( name_r )
-      , type( type_r )
-      {}
-
-      bool operator==( const DirEntry &rhs ) const;
-    };
-
-    inline std::ostream & operator<<( std::ostream & str, const DirEntry & obj )
-    { return str << '[' << obj.type << "] " << obj.name; }
-
-    /** Returned by readdir. */
-    typedef std::list<DirEntry> DirContent;
-
-    std::ostream & operator<<( std::ostream & str, const DirContent & obj );
-
-    /**
-     * Return content of directory via retlist. If dots is false
-     * entries starting with '.' are not reported. "." and ".."
-     * are never reported.
-     *
-     * The type of individual directory entries is determined accoding to
-     * statmode (i.e. via stat or lstat).
-     *
-     * @return 0 on success, errno on failure.
-     **/
-    int readdir( DirContent & retlist, const Pathname & path,
-                 bool dots = true, PathInfo::Mode statmode = PathInfo::STAT );
-
-    /**
-     * Check if the specified directory is empty.
-     * \param path The path of the directory to check.
-     * \return 0 if directory is empty, -1 if not, errno > 0 on failure.
-     */
-    int is_empty_dir(const Pathname & path);
-
-    //@}
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name File related functions. */
-    //@{
-    /**
-     * Create an empty file if it does not yet exist. Make parent directories
-     * as needed. mode specifies the permissions to use. It is modified by the
-     * process's umask in the usual way.
-     *
-     * @return 0 on success, errno on failure
-     **/
-    int assert_file( const Pathname & path, unsigned mode = 0644 );
-    /**
-     * Like \ref assert_file but enforce \a mode even if the file already exists.
-     */
-    int assert_file_mode( const Pathname & path, unsigned mode = 0644 );
-
-    /**
-     * Change file's modification and access times.
-     *
-     * \return 0 on success, errno on failure
-     * \see man utime
-     */
-    int touch (const Pathname & path);
-
-    /**
-     * Like '::unlink'. Delete a file (symbolic link, socket, fifo or device).
-     *
-     * @return 0 on success, errno on failure
-     **/
-    int unlink( const Pathname & path );
-
-    /**
-     * Like '::rename'. Renames a file, moving it between directories if
-     * required. It falls back to using mv(1) in case errno is set to
-     * EXDEV, indicating a cross-device rename, which is likely to happen when
-     * oldpath and newpath are not on the same OverlayFS layer.
-     *
-     * @return 0 on success, errno on failure
-     **/
-    int rename( const Pathname & oldpath, const Pathname & newpath );
-
-    /** Exchanges two files or directories.
-     *
-     * Most common use is when building a new config file (or dir)
-     * in a tempfile. After the job is done, configfile and tempfile
-     * are exchanged. This includes moving away the configfile in case
-     * the tempfile does not exist. Parent directories are created as
-     * needed.
-     *
-     * \note Paths are exchanged using \c ::rename, so take care both paths
-     * are located on the same filesystem.
-     *
-     * \code
-     * Pathname configfile( "/etc/myconfig" );
-     * TmpFile  newconfig( TmpFile::makeSibling( configfile ) );
-     * // now write the new config:
-     * std::ofstream o( newconfig.path().c_str() );
-     * o << "mew values << endl;
-     * o.close();
-     * // If everything is fine, exchange the files:
-     * exchange( newconfig.path(), configfile );
-     * // Now the old configfile is still available at newconfig.path()
-     * // until newconfig goes out of scope.
-     * \endcode
-     *
-     * @return 0 on success, errno on failure
-     */
-    int exchange( const Pathname & lpath, const Pathname & rpath );
-
-    /**
-     * Like 'cp file dest'. Copy file to destination file.
-     *
-     * @return 0 on success, EINVAL if file is not a file, EISDIR if
-     * destiantion is a directory, otherwise the commands return value.
-     **/
-    int copy( const Pathname & file, const Pathname & dest );
-
-    /**
-     * Like '::symlink'. Creates a symbolic link named newpath which contains
-     * the string oldpath. If newpath exists it will not be overwritten.
-     *
-     * @return 0 on success, errno on failure.
-     **/
-    int symlink( const Pathname & oldpath, const Pathname & newpath );
-
-    /**
-     * Like '::link'. Creates a hard link named newpath to an existing file
-     * oldpath. If newpath exists it will not be overwritten.
-     *
-     * @return 0 on success, errno on failure.
-     **/
-    int hardlink( const Pathname & oldpath, const Pathname & newpath );
-
-    /**
-     * Create \a newpath as hardlink or copy of \a oldpath.
-     *
-     * @return 0 on success, errno on failure.
-     */
-    int hardlinkCopy( const Pathname & oldpath, const Pathname & newpath );
-
-    /**
-     * Like '::readlink'. Return the contents of the symbolic link
-     * \a symlink_r via \a target_r.
-     *
-     * @return 0 on success, errno on failure.
-     */
-    int readlink( const Pathname & symlink_r, Pathname & target_r );
-    /** \overload Return an empty Pathname on error. */
-    inline Pathname readlink( const Pathname & symlink_r )
-    {
-      Pathname target;
-      readlink( symlink_r, target );
-      return target;
-    }
-
-    /**
-     * Recursively follows the symlink pointed to by \a path_r and returns
-     * the Pathname to the real file or directory pointed to by the link.
-     *
-     * There is a recursion limit of 256 iterations to protect against a cyclic
-     * link.
-     *
-     * @return Pathname of the file or directory pointed to by the given link
-     *   if it is a valid link. If \a path_r is not a link, an exact copy of
-     *   it is returned. If \a path_r is a broken or a cyclic link, an empty
-     *   Pathname is returned and the event logged.
-     */
-    Pathname expandlink( const Pathname & path_r );
-
-    /**
-     * Like 'cp file dest'. Copy file to dest dir.
-     *
-     * @return 0 on success, EINVAL if file is not a file, ENOTDIR if dest
-     * is no directory, otherwise the commands return value.
-     **/
-    int copy_file2dir( const Pathname & file, const Pathname & dest );
-    //@}
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name Digest computaion.
-     * \todo check cooperation with zypp::Digest
-    */
-    //@{
-    /**
-     * Compute a files md5sum.
-     *
-     * @return the files md5sum on success, otherwise an empty string..
-     **/
-    std::string md5sum( const Pathname & file );
-
-    /**
-     * Compute a files sha1sum.
-     *
-     * @return the files sha1sum on success, otherwise an empty string..
-     **/
-    std::string sha1sum( const Pathname & file );
-    //@}
-
-    /**
-     * Compute a files checksum
-     *
-     * @return the files checksum on success, otherwise an empty string..
-     **/
-    std::string checksum( const Pathname & file, const std::string &algorithm );
-
-    /**
-     * check files checksum
-     *
-     * @return true if the checksum matches (an empty Checksum always matches!)
-     **/
-    bool is_checksum( const Pathname & file, const CheckSum &checksum );
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name Changing permissions. */
-    //@{
-    /**
-     * Like '::chmod'. The mode of the file given by path is changed.
-     *
-     * @return 0 on success, errno on failure
-     **/
-    int chmod( const Pathname & path, mode_t mode );
-
-    /**
-     * Add the \c mode bits to the file given by path.
-     *
-     * @return 0 on success, errno on failure
-     */
-    int addmod( const Pathname & path, mode_t mode );
-
-    /**
-     * Remove the \c mode bits from the file given by path.
-     *
-     * @return 0 on success, errno on failure
-     */
-    int delmod( const Pathname & path, mode_t mode );
-    //@}
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name Misc. */
-    //@{
-    /**
-     * Test whether a file is compressed (gzip/bzip2).
-     *
-     * @return ZT_GZ, ZT_BZ2 if file is compressed, otherwise ZT_NONE.
-     **/
-    enum ZIP_TYPE { ZT_NONE, ZT_GZ, ZT_BZ2, ZT_ZCHNK };
-
-    ZIP_TYPE zipType( const Pathname & file );
-
-    /**
-     * Erase whatever happens to be located at path (file or directory).
-     *
-     * @return 0 on success.
-     *
-     * \todo check cooperation with zypp::TmpFile and zypp::TmpDir
-     **/
-    int erase( const Pathname & path );
-
-    /**
-     * Report free disk space on a mounted file system.
-     *
-     * path is the path name of any file within the mounted filesystem.
-     *
-     * @return Free disk space or -1 on error.
-     **/
-    ByteCount df( const Pathname & path );
-
-    /**
-     * Get the current umask (file mode creation mask)
-     *
-     * @return The current umask
-     **/
-    mode_t getUmask();
-
-     /**
-     * Modify \c mode_r according to the current umask
-     * <tt>( mode_r & ~getUmask() )</tt>.
-     * \see \ref getUmask.
-     * @return The resulting permissions.
-     **/
-    inline mode_t applyUmaskTo( mode_t mode_r )
-    { return mode_r & ~getUmask(); }
-    //@}
-
     /////////////////////////////////////////////////////////////////
   } // namespace filesystem
   ///////////////////////////////////////////////////////////////////
index d387807..a3151d5 100644 (file)
@@ -1,217 +1 @@
-
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/Pathname.h
- *
-*/
-#ifndef ZYPP_PATHNAME_H
-#define ZYPP_PATHNAME_H
-
-#include <iosfwd>
-#include <string>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  class Url;
-
-  ///////////////////////////////////////////////////////////////////
-  namespace filesystem
-  { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : Pathname
-    //
-    /** Pathname.
-     *
-     * \note For convenience Pathname is available as zypp::Pathname too.
-     *
-     * Always stores normalized paths (no inner '.' or '..' components
-     * and no consecutive '/'es). Concatenation automatically adds
-     * the path separator '/'.
-     *
-     * \todo Add support for handling extensions incl. stripping
-     * extensions from basename (basename("/path/foo.baa", ".baa") ==> "foo")
-    */
-    class Pathname
-    {
-    public:
-      /** Default ctor: an empty path. */
-      Pathname()
-      {}
-
-      /** Ctor from string. */
-      Pathname( const std::string & name_r )
-      { _assign( name_r ); }
-
-      /** Ctor from char*. */
-      Pathname( const char * name_r )
-      { _assign( name_r ? name_r : "" ); }
-
-      /** Copy Ctor */
-      Pathname( const Pathname & rhs )
-      : _name( rhs._name )
-      {}
-
-      /** Swap */
-      friend void swap( Pathname & lhs, Pathname & rhs )
-      {
-       using std::swap;
-       swap( lhs._name, rhs._name );
-      }
-
-      /** Move Ctor */
-      Pathname( Pathname && tmp )
-      : _name( std::move( tmp._name ) )
-      {}
-
-      /** Assign */
-      Pathname & operator=( Pathname rhs )
-      { swap( *this, rhs ); return *this; }
-
-      /** Concatenate and assign. \see cat */
-      Pathname & operator/=( const Pathname & path_tv )
-      { return( *this = cat( *this, path_tv ) ); }
-
-      /** Concatenate and assign. \see cat
-       * \deprecated: use /=
-      */
-      Pathname & operator+=( const Pathname & path_tv )
-      { return( *this = cat( *this, path_tv ) ); }
-
-      /** String representation. */
-      const std::string & asString() const
-      { return _name; }
-
-      /** String representation as "(root)/path" */
-      static std::string showRoot( const Pathname & root_r, const Pathname & path_r );
-
-      /** String representation as "(root)/path", unless \a root is \c "/" or empty. */
-      static std::string showRootIf( const Pathname & root_r, const Pathname & path_r );
-
-      /** Url representation using \c scheme_r schema . */
-      Url asUrl( const std::string & scheme_r ) const;
-      /** \overload using \c dir schema. */
-      Url asUrl() const;
-      /** \overload using \c dir schema. */
-      Url asDirUrl() const;
-      /** \overload using \c file schema. */
-      Url asFileUrl() const;
-
-      /** String representation. */
-      const char * c_str() const
-      { return _name.c_str(); }
-
-      /** Test for an empty path. */
-      bool empty()    const { return _name.empty(); }
-      /** Test for an absolute path. */
-      bool absolute() const { return *_name.c_str() == '/'; }
-      /** Test for a relative path. */
-      bool relative() const { return !( absolute() || empty() ); }
-
-      /** Test for "" or "/". */
-      bool emptyOrRoot() const { return( _name.empty() || _name == "/" ); }
-
-      /** Return all but the last component od this path. */
-      Pathname dirname() const { return dirname( *this ); }
-      static Pathname dirname( const Pathname & name_r );
-
-      /** Return the last component of this path. */
-      std::string basename() const { return basename( *this ); }
-      static std::string basename( const Pathname & name_r );
-
-      /** Return all of the characters in name after and including
-       * the last dot in the last element of name.  If there is no dot
-       * in the last element of name then returns the empty string.
-      */
-      std::string extension() const { return extension( *this ); }
-      static std::string extension( const Pathname & name_r );
-
-      /** Return this path, adding a leading '/' if relative. */
-      Pathname absolutename() const { return absolutename( *this ); }
-      static Pathname absolutename( const Pathname & name_r )
-      { return name_r.relative() ? cat( "/", name_r ) : name_r; }
-
-      /** Return this path, removing a leading '/' if absolute.*/
-      Pathname relativename() const { return relativename( *this ); }
-      static Pathname relativename( const Pathname & name_r )
-      { return name_r.absolute() ? cat( ".", name_r ) : name_r; }
-
-      /** Return \c path_r prefixed with \c root_r, unless it is already prefixed. */
-      static Pathname assertprefix( const Pathname & root_r, const Pathname & path_r );
-
-      /** Return \c path_r with any \c root_r dir prefix striped. */
-      static Pathname stripprefix( const Pathname & root_r, const Pathname & path_r );
-
-      /** Concatenation of pathnames.
-       * \code
-       *   "foo"  / "baa"  ==> "foo/baa"
-       *   "foo/" / "baa"  ==> "foo/baa"
-       *   "foo"  / "/baa" ==> "foo/baa"
-       *   "foo/" / "/baa" ==> "foo/baa"
-       * \endcode
-      */
-      Pathname cat( const Pathname & r ) const { return cat( *this, r ); }
-      static Pathname cat( const Pathname & l, const Pathname & r );
-
-      /** Append string \a r to the last component of the path.
-       * \code
-       *   "foo/baa".extend( ".h" ) ==> "foo/baa.h"
-       * \endcode
-      */
-      Pathname extend( const std::string & r ) const { return extend( *this, r ); }
-      static Pathname extend( const Pathname & l, const std::string & r );
-
-    private:
-      std::string _name;
-      void _assign( const std::string & name_r );
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates Pathname */
-    inline bool operator==( const Pathname & l, const Pathname & r )
-    { return l.asString() == r.asString(); }
-
-    /** \relates Pathname */
-    inline bool operator!=( const Pathname & l, const Pathname & r )
-    { return l.asString() != r.asString(); }
-
-    /** \relates Pathname Concatenate two Pathname. */
-    inline Pathname operator/( const Pathname & l, const Pathname & r )
-    { return Pathname::cat( l, r ); }
-
-    /** \relates Pathname Concatenate two Pathname.
-     * \deprecated: use /
-    */
-    inline Pathname operator+( const Pathname & l, const Pathname & r )
-    { return Pathname::cat( l, r ); }
-
-    /** \relates Pathname */
-    inline bool operator<( const Pathname & l, const Pathname & r )
-    { return l.asString() < r.asString(); }
-
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates Pathname Stream output */
-    inline std::ostream & operator<<( std::ostream & str, const Pathname & obj )
-    { return str << obj.asString(); }
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace filesystem
-  ///////////////////////////////////////////////////////////////////
-
-  /** Dragged into namespace zypp. */
-  using filesystem::Pathname;
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_PATHNAME_H
+#include <zypp-core/Pathname.h>
index 96e6ce4..1af89ba 100644 (file)
@@ -454,6 +454,9 @@ namespace zypp
 
     /** Kinds to search */
     Kinds _kinds;
+
+    /** comments */
+    std::string _comment;
     //@}
 
   public:
@@ -867,6 +870,9 @@ namespace zypp
   void PoolQuery::addKind(const ResKind & kind)
   { _pimpl->_kinds.insert(kind); }
 
+  void PoolQuery::setComment(const std::string & comment)
+  { _pimpl->_comment = comment; }
+
   void PoolQuery::addString(const std::string & value)
   { _pimpl->_strings.insert(value); }
 
@@ -998,6 +1004,9 @@ namespace zypp
   PoolQuery::repos() const
   { return _pimpl->_repos; }
 
+  const std::string &
+  PoolQuery::comment() const
+  { return _pimpl->_comment; }
 
   bool PoolQuery::caseSensitive() const
   { return !_pimpl->_flags.test( Match::NOCASE ); }
@@ -1077,6 +1086,7 @@ namespace zypp
     // PoolQuery's own attributes
     static const PoolQueryAttr repoAttr;
     static const PoolQueryAttr kindAttr;
+    static const PoolQueryAttr commentAttr;
     static const PoolQueryAttr stringAttr;
     static const PoolQueryAttr stringTypeAttr;
     static const PoolQueryAttr requireAllAttr; // LEAGACY: attribute was defined but never implemented.
@@ -1090,6 +1100,7 @@ namespace zypp
 
   const PoolQueryAttr PoolQueryAttr::repoAttr( "repo" );
   const PoolQueryAttr PoolQueryAttr::kindAttr( "type" );
+  const PoolQueryAttr PoolQueryAttr::commentAttr( "comment" );
   const PoolQueryAttr PoolQueryAttr::stringAttr( "query_string" );
   const PoolQueryAttr PoolQueryAttr::stringTypeAttr("match_type");
   const PoolQueryAttr PoolQueryAttr::requireAllAttr("require_all");    // LEAGACY: attribute was defined but never implemented.
@@ -1176,6 +1187,10 @@ namespace zypp
       {
         addKind( ResKind(attrValue) );
       }
+      else if ( attribute==PoolQueryAttr::commentAttr )
+      {
+        setComment( attrValue );
+      }
       else if ( attribute==PoolQueryAttr::stringAttr
         || attribute=="global_string")
       {
@@ -1461,6 +1476,9 @@ namespace zypp
       str << "complex: "<< it->serialize() << delim;
     }
 
+    str << PoolQueryAttr::commentAttr.asString() << ": "
+        << comment() << delim ;
+
     //separating delim - protection
     str << delim;
   }
index 401d74b..8568f4a 100644 (file)
@@ -159,6 +159,8 @@ namespace zypp
      * only the specified repo will be returned (multiple repos will be ORed).
      */
     void addRepo(const std::string &repoalias);
+    void setComment(const std::string & comment);
+
 
     /** Installed status filter setters. */
     //@{
@@ -392,6 +394,8 @@ namespace zypp
 
     const StrContainer & repos() const;
 
+    const std::string & comment() const;
+
     const Edition edition() const;
     const Rel editionRel() const;
 
index 5e7c2cc..9c1928c 100644 (file)
@@ -68,7 +68,10 @@ namespace zypp {
 
         _detectedRunning = true;
 
-        MIL << "Detected running kernel: " << _runningKernelEdition << " " << _runningKernelFlavour << " " << _kernelArch << std::endl;
+        MIL << "Detected running kernel: Flavour: " << _runningKernelFlavour << " Arch: " << _kernelArch << "\n";
+        for ( const auto &edVar : _runningKernelEditionVariants )
+          MIL << "Edition variant: " << edVar << "\n";
+        MIL << std::endl;
 
       } else {
         MIL << "Failed to detect running kernel: " << errno << std::endl;
@@ -88,17 +91,27 @@ namespace zypp {
 
       version = str::regex_substitute( version, str::regex( "-[^-]*$", str::regex::match_extended | str::regex::newline ), "", true );
 
-      // from purge-kernels script, was copied from kernel-source/rpm/mkspec
-      version = str::regex_substitute( version, str::regex( "\\.0-rc", str::regex::match_extended ), ".rc", true );
-      version = str::regex_substitute( version, str::regex( "-rc\\d+", str::regex::match_extended ), "", true );
-      version = str::regex_substitute( version, str::regex( "-", str::regex::match_extended ), ".", true );
 
-      _runningKernelEdition = Edition( version, release );
+      auto makeRcVariant = [ &release ]( std::string myVersion, const std::string &replace ){
+        // from purge-kernels script, was copied from kernel-source/rpm/mkspec
+        myVersion = str::regex_substitute( myVersion, str::regex( "\\.0-rc", str::regex::match_extended ), replace, true );
+        myVersion = str::regex_substitute( myVersion, str::regex( "-rc\\d+", str::regex::match_extended ), "", true );
+        myVersion = str::regex_substitute( myVersion, str::regex( "-", str::regex::match_extended ), ".", true );
+        return Edition( myVersion, release );
+      };
+
+      _runningKernelEditionVariants.clear();
+      _runningKernelEditionVariants.insert( makeRcVariant( version, "~rc") );
+      _runningKernelEditionVariants.insert( makeRcVariant( version, ".rc") );
+
       _runningKernelFlavour = flavour;
 
       MIL << "Parsed info from uname: " << std::endl;
       MIL << "Kernel Flavour: " << _runningKernelFlavour << std::endl;
-      MIL << "Kernel Edition: " << _runningKernelEdition << std::endl;
+      MIL << "Kernel Edition Variants: \n";
+      for ( const auto &var : _runningKernelEditionVariants )
+        MIL << "    " << var << "\n";
+      MIL << std::endl;
     }
 
     bool removePackageAndCheck( const sat::Solvable slv, const std::set<sat::Solvable> &keepList , const std::set<sat::Solvable> &removeList ) const;
@@ -110,7 +123,12 @@ namespace zypp {
     std::set<size_t>  _keepOldestOffsets;
     std::set<Edition> _keepSpecificEditions;
     std::string       _uname_r;
-    Edition           _runningKernelEdition;
+    /*!
+     *  A kernel uname can expand into multiple variants especially with rc kernels,
+     *  older rc releases replaced the upstream tag -rc with .rc, however newer code
+     *  replaces it with ~rc. We need to check against all variants to match the correct one.
+     */
+    std::set<Edition> _runningKernelEditionVariants;
     Flavour           _runningKernelFlavour;
     Arch              _kernelArch;
     std::string       _keepSpec = ZConfig::instance().multiversionKernels();
@@ -356,9 +374,10 @@ namespace zypp {
       removeList.erase( pck );
     };
 
-    const auto versionPredicate = []( const auto &edition ){
-      return [ &edition ]( const auto &elem ) {
-        return versionMatch( edition, elem.first );
+    const auto versionPredicate = []( const auto &editionVariants ){
+      return [ &editionVariants ]( const auto &elem ) {
+        const auto &f = std::bind( versionMatch, std::placeholders::_1, elem.first );
+        return std::any_of( editionVariants.begin(), editionVariants.end(), f );
       };
     };
 
@@ -380,14 +399,21 @@ namespace zypp {
              && ( ( archMap.first == _kernelArch && groupInfo.second.groupFlavour == _runningKernelFlavour )
                   || groupInfo.second.groupType == GroupInfo::Sources ) ) {
 
-          MIL << "Matching packages against running kernel "<< _runningKernelEdition << "-" << _runningKernelFlavour << "-" <<_kernelArch << std::endl;
+          MIL << "Matching packages against running kernel "<< _runningKernelFlavour << "-" <<_kernelArch << "\nVariants:\n";
+          for ( const auto &var : _runningKernelEditionVariants )
+            MIL << var << "\n";
+          MIL << std::endl;
 
-          auto it = std::find_if( map.begin(), map.end(), versionPredicate( _runningKernelEdition ) );
+          const auto &editionPredicate = versionPredicate( _runningKernelEditionVariants );
+          auto it = std::find_if( map.begin(), map.end(), editionPredicate );
           if ( it == map.end() ) {
 
             // If we look at Sources we cannot match the flavour but we still want to keep on checking the rest of the keep spec
             if ( groupInfo.second.groupType != GroupInfo::Sources  ) {
-              MIL << "Running kernel "<< _runningKernelEdition << "-" << _runningKernelFlavour << "-" <<_kernelArch << " not installed."<<std::endl;
+              MIL << "Running kernel " << _runningKernelFlavour << "-" <<_kernelArch << "\n";
+              for ( const auto &var : _runningKernelEditionVariants )
+                MIL << " Possible Variant:" << var << "\n";
+              MIL << "Not installed! \n";
               MIL << "NOT removing any packages for flavor "<<_runningKernelFlavour<<"-"<<_kernelArch<<" ."<<std::endl;
 
               for ( const auto &kernelMap : map ) {
@@ -401,7 +427,7 @@ namespace zypp {
             // there could be multiple matches here because of rebuild counter, lets try to find the last one
             MIL << "Found possible running candidate edition: " << it->first << std::endl;
             auto nit = it;
-            for ( nit++ ; nit != map.end() && versionMatch( _runningKernelEdition, nit->first ) ; nit++ ) {
+            for ( nit++ ; nit != map.end() && editionPredicate( *nit ) ; nit++ ) {
               MIL << "Found possible more recent running candidate edition: " << nit->first << std::endl;
               it = nit;
             }
index cb6b6b7..534cee1 100644 (file)
@@ -28,7 +28,6 @@
 #include <zypp/ZConfig.h>
 #include <zypp/repo/RepoMirrorList.h>
 #include <zypp/ExternalProgram.h>
-#include <zypp/media/MediaAccess.h>
 
 #include <zypp/base/IOStream.h>
 #include <zypp/base/InputStream.h>
index 9e51e01..6081493 100644 (file)
@@ -35,6 +35,7 @@
 
 #include <zypp/media/MediaManager.h>
 #include <zypp/media/CredentialManager.h>
+#include <zypp/media/MediaException.h>
 #include <zypp/MediaSetAccess.h>
 #include <zypp/ExternalProgram.h>
 #include <zypp/ManagedFile.h>
index a3b61cc..5c294c0 100644 (file)
@@ -9,312 +9,3 @@
 /** \file zypp/TmpPath.cc
  *
 */
-
-#include <cstdlib>
-#include <cstring>
-#include <cerrno>
-
-#include <iostream>
-
-#include <zypp/base/ReferenceCounted.h>
-#include <zypp/base/NonCopyable.h>
-#include <zypp/base/Logger.h>
-#include <zypp/PathInfo.h>
-#include <zypp/TmpPath.h>
-
-using std::endl;
-
-namespace zypp {
-  namespace filesystem {
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : TmpPath::Impl
-    /**
-     * Clean or delete a directory on destruction.
-     **/
-    class TmpPath::Impl : public base::ReferenceCounted, private base::NonCopyable
-    {
-      public:
-
-        enum Flags
-          {
-            NoOp         = 0,
-            Autodelete   = 1L << 0,
-            KeepTopdir   = 1L << 1,
-            //
-            CtorDefault  = Autodelete
-          };
-
-      public:
-
-        Impl( const Pathname & path_r, Flags flags_r = CtorDefault )
-        : _path( path_r ), _flags( flags_r )
-        {}
-
-        ~Impl()
-        {
-          if ( ! (_flags & Autodelete) || _path.empty() )
-            return;
-
-          PathInfo p( _path, PathInfo::LSTAT );
-          if ( ! p.isExist() )
-            return;
-
-          int res = 0;
-          if ( p.isDir() )
-            {
-              if ( _flags & KeepTopdir )
-                res = clean_dir( _path );
-              else
-                res = recursive_rmdir( _path );
-            }
-          else
-            res = unlink( _path );
-
-          if ( res )
-            INT << "TmpPath cleanup error (" << res << ") " << p << endl;
-          else
-            DBG << "TmpPath cleaned up " << p << endl;
-        }
-
-        const Pathname &
-        path() const
-        { return _path; }
-
-        bool autoCleanup() const
-        { return( _flags & Autodelete ); }
-
-        void autoCleanup( bool yesno_r )
-       { _flags = yesno_r ? CtorDefault : NoOp; }
-
-      private:
-        Pathname _path;
-        Flags    _flags;
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : TmpPath
-    //
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpPath::TmpPath
-    // METHOD TYPE : Constructor
-    //
-    TmpPath::TmpPath()
-    {}
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpPath::TmpPath
-    // METHOD TYPE : Constructor
-    //
-    TmpPath::TmpPath( const Pathname & tmpPath_r )
-    :_impl( tmpPath_r.empty() ? nullptr : new Impl( tmpPath_r ) )
-    {}
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpPath::~TmpPath
-    // METHOD TYPE : Destructor
-    //
-    TmpPath::~TmpPath()
-    {
-      // virtual not inlined dtor.
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    //      METHOD NAME : TmpPath::operator const void *
-    //      METHOD TYPE :
-    //
-    TmpPath::operator bool() const
-    {
-      return _impl.get();
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpPath::path
-    // METHOD TYPE : Pathname
-    //
-    Pathname
-    TmpPath::path() const
-    {
-      return _impl.get() ? _impl->path() : Pathname();
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpPath::defaultLocation
-    // METHOD TYPE : const Pathname &
-    //
-    const Pathname &
-    TmpPath::defaultLocation()
-    {
-      static Pathname p( getenv("ZYPPTMPDIR") ? getenv("ZYPPTMPDIR") : "/var/tmp" );
-      return p;
-    }
-
-    bool TmpPath::autoCleanup() const
-    { return _impl.get() ? _impl->autoCleanup() : false; }
-
-    void TmpPath::autoCleanup( bool yesno_r )
-    { if ( _impl.get() ) _impl->autoCleanup( yesno_r ); }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : TmpFile
-    //
-    ///////////////////////////////////////////////////////////////////
-
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpFile::TmpFile
-    // METHOD TYPE : Constructor
-    //
-    TmpFile::TmpFile( const Pathname & inParentDir_r,
-                      const std::string & prefix_r )
-    {
-      // parent dir must exist
-      if ( filesystem::assert_dir( inParentDir_r ) != 0 )
-      {
-        ERR << "Parent directory '" << inParentDir_r << "' can't be created." << endl;
-        return;
-      }
-
-      // create the temp file
-      Pathname tmpPath = (inParentDir_r + prefix_r).extend( "XXXXXX");
-      char * buf = ::strdup( tmpPath.asString().c_str() );
-      if ( ! buf )
-        {
-          ERR << "Out of memory" << endl;
-          return;
-        }
-
-      int tmpFd = ::mkostemp( buf, O_CLOEXEC );
-      if ( tmpFd != -1 )
-        {
-          // success; create _impl
-          ::close( tmpFd );
-          _impl = RW_pointer<Impl>( new Impl( buf ) );
-        }
-      else
-        ERR << "Cant create '" << buf << "' " << ::strerror( errno ) << endl;
-
-      ::free( buf );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpFile::makeSibling
-    // METHOD TYPE : TmpFile
-    //
-    TmpFile TmpFile::makeSibling( const Pathname & sibling_r )
-    {
-      TmpFile ret( sibling_r.dirname(), sibling_r.basename() );
-      // clone mode if sibling_r exists
-      PathInfo p( sibling_r );
-      if ( p.isFile() )
-      {
-        ::chmod( ret.path().c_str(), p.st_mode() );
-      }
-      return ret;
-    }
-
-    ManagedFile TmpFile::asManagedFile()
-    {
-      filesystem::TmpFile tmpFile;
-      ManagedFile mFile ( tmpFile.path(), filesystem::unlink );
-      tmpFile.autoCleanup(false); //cleaned up by ManagedFile
-      return mFile;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpFile::defaultPrefix
-    // METHOD TYPE : const std::string &
-    //
-    const std::string &
-    TmpFile::defaultPrefix()
-    {
-      static std::string p( "TmpFile." );
-      return p;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : TmpDir
-    //
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpDir::TmpDir
-    // METHOD TYPE : Constructor
-    //
-    TmpDir::TmpDir( const Pathname & inParentDir_r,
-                    const std::string & prefix_r )
-    {
-      // parent dir must exist
-      if ( filesystem::assert_dir( inParentDir_r ) != 0  )
-      {
-        ERR << "Parent directory '" << inParentDir_r << "' can't be created." << endl;
-        return;
-      }
-
-      // create the temp dir
-      Pathname tmpPath = (inParentDir_r + prefix_r).extend( "XXXXXX");
-      char * buf = ::strdup( tmpPath.asString().c_str() );
-      if ( ! buf )
-        {
-          ERR << "Out of memory" << endl;
-          return;
-        }
-
-      char * tmp = ::mkdtemp( buf );
-      if ( tmp )
-        // success; create _impl
-        _impl = RW_pointer<Impl>( new Impl( tmp ) );
-      else
-        ERR << "Cant create '" << tmpPath << "' " << ::strerror( errno ) << endl;
-
-      ::free( buf );
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpDir::makeSibling
-    // METHOD TYPE : TmpDir
-    //
-    TmpDir TmpDir::makeSibling( const Pathname & sibling_r )
-    {
-      TmpDir ret( sibling_r.dirname(), sibling_r.basename() );
-      // clone mode if sibling_r exists
-      PathInfo p( sibling_r );
-      if ( p.isDir() )
-      {
-        ::chmod( ret.path().c_str(), p.st_mode() );
-      }
-      return ret;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // METHOD NAME : TmpDir::defaultPrefix
-    // METHOD TYPE : const std::string &
-    //
-    const std::string &
-    TmpDir::defaultPrefix()
-    {
-      static std::string p( "TmpDir." );
-      return p;
-    }
-
-  } // namespace filesystem
-} // namespace zypp
index bdf5b5f..4035418 100644 (file)
@@ -9,204 +9,4 @@
 /** \file zypp/TmpPath.h
  *
 */
-#ifndef ZYPP_TMPPATH_H
-#define ZYPP_TMPPATH_H
-
-#include <iosfwd>
-
-#include <zypp/Pathname.h>
-#include <zypp/base/PtrTypes.h>
-#include <zypp/ManagedFile.h>
-
-namespace zypp {
-  namespace filesystem {
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : TmpPath
-    /**
-     * @short Automaticaly deletes files or directories when no longer needed.
-     *
-     * TmpPath is constructed from a Pathname. Multiple TmpPath instances
-     * created by copy and assign, share the same reference counted internal
-     * repesentation.
-     *
-     * When the last reference drops any file or directory located at the path
-     * passed to the ctor is deleted (recursivly in case of directories). This
-     * behavior can be canged by calling \ref autoCleanup.
-     *
-     * Principally serves as base class, but standalone usable.
-     **/
-    class TmpPath
-    {
-      public:
-        /**
-         * Default Ctor. An empty Pathname.
-         **/
-        TmpPath();
-
-        /**
-         * Ctor. Takes a Pathname.
-         **/
-        explicit
-        TmpPath( const Pathname & tmpPath_r );
-
-        /**
-         * Dtor.
-         **/
-        virtual
-        ~TmpPath();
-
-        /**
-         * Test whether the Pathname is valid (i.e. not empty. NOT whether
-         * it really denotes an existing file or directory).
-         **/
-        explicit operator bool() const;
-
-        /**
-         * @return The Pathname.
-         **/
-        Pathname
-        path() const;
-
-        /**
-         * Type conversion to Pathname.
-         **/
-        operator Pathname() const
-        { return path(); }
-
-        /**
-        * Whether path is valid and deleted when the last reference drops.
-        */
-        bool autoCleanup() const;
-
-        /**
-        * Turn \ref autoCleanup on/off if path is valid.
-        */
-       void autoCleanup( bool yesno_r );
-
-      public:
-        /**
-         * @return The default directory where temporary
-         * files should be are created (/var/tmp).
-         **/
-        static const Pathname &
-        defaultLocation();
-
-      protected:
-        class Impl;
-        RW_pointer<Impl> _impl;
-
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /**
-     * Stream output as pathname.
-     **/
-    inline std::ostream &
-    operator<<( std::ostream & str, const TmpPath & obj )
-    { return str << static_cast<Pathname>(obj); }
-
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : TmpFile
-    /**
-     * @short Provide a new empty temporary file and delete it when no
-     * longer needed.
-     *
-     * The temporary file is per default created in '/var/tmp' and named
-     * 'TmpFile.XXXXXX', with XXXXXX replaced by a string which makes the
-     * name unique. Different location and file prefix may be passed to
-     * the ctor. TmpFile is created with mode 0600.
-     *
-     * TmpFile provides the Pathname of the temporary file, or an empty
-     * path in case of any error.
-     **/
-    class TmpFile : public TmpPath
-    {
-      public:
-        /**
-         * Ctor. Takes a Pathname.
-         **/
-        explicit
-        TmpFile( const Pathname & inParentDir_r = defaultLocation(),
-                 const std::string & prefix_r = defaultPrefix() );
-
-        /** Provide a new empty temporary directory as sibling.
-         * \code
-         *   TmpFile s = makeSibling( "/var/lib/myfile" );
-         *   // returns: /var/lib/myfile.XXXXXX
-         * \endcode
-         * If \c sibling_r exists, sibling is created using the same mode.
-         */
-        static TmpFile makeSibling( const Pathname & sibling_r );
-
-        /**
-         * Create a temporary file and convert it to a automatically
-         * cleaned up ManagedFile
-         */
-        static ManagedFile asManagedFile ();
-
-      public:
-        /**
-         * @return The default prefix for temporary files (TmpFile.)
-         **/
-        static const std::string &
-        defaultPrefix();
-
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : TmpDir
-    /**
-     * @short Provide a new empty temporary directory and recursively
-     * delete it when no longer needed.
-     *
-     * The temporary directory is per default created in '/var/tmp' and
-     * named 'TmpDir.XXXXXX', with XXXXXX replaced by a string which makes
-     * the  name unique. Different location and file prefix may be passed
-     * to the ctor. TmpDir is created with mode 0700.
-     *
-     * TmpDir provides the Pathname of the temporary directory , or an empty
-     * path in case of any error.
-     **/
-    class TmpDir : public TmpPath
-    {
-      public:
-        /**
-         * Ctor. Takes a Pathname.
-         **/
-        explicit
-        TmpDir( const Pathname & inParentDir_r = defaultLocation(),
-                const std::string & prefix_r = defaultPrefix() );
-
-        /** Provide a new empty temporary directory as sibling.
-         * \code
-         *   TmpDir s = makeSibling( "/var/lib/mydir" );
-         *   // returns: /var/lib/mydir.XXXXXX
-         * \endcode
-         * If \c sibling_r exists, sibling is created using the same mode.
-         */
-        static TmpDir makeSibling( const Pathname & sibling_r );
-
-      public:
-        /**
-         * @return The default prefix for temporary directories (TmpDir.)
-         **/
-        static const std::string &
-        defaultPrefix();
-    };
-    ///////////////////////////////////////////////////////////////////
-
-  } // namespace filesystem
-
-  /** Global access to the zypp.TMPDIR (created on demand, deleted when libzypp is unloaded) */
-  Pathname myTmpDir(); // implemented in ZYppImpl.cc
-
-} // namespace zypp
-
-#endif // ZYPP_TMPPATH_H
+#include <zypp-core/fs/TmpPath.h>
index f2c5cfe..1e15bcf 100644 (file)
@@ -1,74 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/TriBool.h
- *
-*/
-#ifndef ZYPP_TRIBOOL_H
-#define ZYPP_TRIBOOL_H
-
-#include <iosfwd>
-#include <string>
-#include <boost/logic/tribool.hpp>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  /** 3-state boolean logic (\c true, \c false and \c indeterminate).
-   * \code
-   * namespace zypp
-   * {
-   *   typedef boost::logic::tribool TriBool;
-   *   using   boost::logic::tribool;
-   *   using   boost::logic::indeterminate;
-   * }
-   * \endcode
-   *
-   * \warning Be carefull.esp. when comparing \ref TriBool using
-   * \c operator==, as <b><tt>( indeterminate == indeterminate )</tt></b>
-   * does \b not evaluate \b true. It's \c indeterminate.
-   *
-   * \see http://www.boost.org/doc/html/tribool.html
-   * \ingroup BOOST
-  */
-  typedef boost::logic::tribool TriBool;
-  using   boost::logic::tribool;
-  using   boost::logic::indeterminate;
-
-  inline std::string asString( const TriBool & val_r, const std::string & istr_r = std::string(),
-                                                     const std::string & tstr_r = std::string(),
-                                                     const std::string & fstr_r = std::string() )
-  {
-    std::string ret;
-    if (indeterminate(val_r))
-      ret = ( istr_r.empty() ? "indeterminate" : istr_r );
-    else if (val_r)
-      ret = ( tstr_r.empty() ? "true" : tstr_r );
-    else
-      ret = ( fstr_r.empty() ? "false" : fstr_r );
-    return ret;
-  }
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-namespace boost
-{
-    namespace logic
-    {
-      /** \relates TriBool stream output */
-      inline std::ostream & operator<<(std::ostream & s, const tribool & obj)
-      { return s << zypp::asString( obj ); }
-
-      /** \relates TriBool whether 2 tribool have the same state (this is NOT ==) */
-      inline bool sameTriboolState( tribool lhs, tribool rhs )
-      { return( ( indeterminate(lhs) && indeterminate(rhs) ) || ( bool )( lhs == rhs ) ); }
-    }
-}
-#endif // ZYPP_TRIBOOL_H
+#include <zypp-core/TriBool.h>
index 9323fcf..14da27d 100644 (file)
@@ -1,854 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/**
- * \file zypp/Url.h
- */
-#ifndef   ZYPP_URL_H
-#define   ZYPP_URL_H
-
-#include <zypp/url/UrlBase.h>
-#include <zypp/url/UrlUtils.h>
-
-
-//////////////////////////////////////////////////////////////////////
-namespace zypp
-{ ////////////////////////////////////////////////////////////////////
-
-  class Url;
-  namespace hotfix1050625 {
-    std::string asString( const Url & url_r );
-  }
-  namespace filesystem {
-    class Pathname;
-  }
-  using filesystem::Pathname;
-
-  /**
-   * \class Url
-   * \brief Url manipulation class.
-   *
-   * The generic URL (URI) syntax and its main components are defined in
-   * RFC3986 (http://rfc.net/rfc3986.html) Section 3, "Syntax Components".
-   * The scheme specific URL syntax and semantics is defined in the
-   * specification of the particular scheme. See also RFC1738
-   * (http://rfc.net/rfc1738.html), that defines specific syntax for
-   * several URL schemes.
-   *
-   * This class provides methods to access and manipulate generic and
-   * common scheme-specific URL components (or using the more general
-   * term, URI components).
-   * To consider the scheme-specifics of a URL, the Url class contains
-   * a reference object pointing to a UrlBase or derived object, that
-   * implements the scheme specifics.
-   *
-   * Using the Url::registerScheme() method, it is possible to register
-   * a preconfigured or derived UrlBase object for a specific scheme
-   * name. The registered object will be cloned to handle all URLs
-   * containing the specified scheme name.
-   *
-   * \par RFC3986, Syntax Components:
-   *
-   * The generic URI syntax consists of a hierarchical sequence of
-   * components referred to as the scheme, authority, path, query,
-   * and fragment.
-   *
-   * \code
-   *    URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
-   *
-   *    hier-part   = "//" authority path-abempty
-   *                / path-absolute
-   *                / path-rootless
-   *                / path-empty
-   * \endcode
-   *
-   * The scheme and path components are required, though the path may be
-   * empty (no characters).
-   * When authority is present, the path must either be empty or begin
-   * with a slash ("/") character.
-   * When authority is not present, the path cannot begin with two slash
-   * characters ("//").
-   * These restrictions result in five different ABNF rules for a path
-   * (Section 3.3), only one of which will match any given URI reference.
-   *
-   * The following are two example URIs and their component parts:
-   * \code
-   *      foo://example.com:8042/over/there?name=ferret#nose
-   *      \_/   \______________/\_________/ \_________/ \__/
-   *       |           |            |            |        |
-   *    scheme     authority       path        query   fragment
-   *       |   _____________________|__
-   *      / \ /                        \
-   *      urn:example:animal:ferret:nose
-   * \endcode
-   *
-   */
-  class Url
-  {
-  public:
-    /**
-     * Encoding flags.
-     */
-    typedef zypp::url::EEncoding    EEncoding;
-
-    /**
-     * View options.
-     */
-    typedef zypp::url::ViewOptions  ViewOptions;
-
-
-    ~Url();
-    Url();
-
-    /**
-     * Create a new Url object as shared copy of the given one.
-     *
-     * Upon return, both objects will point to the same underlying
-     * object. This state will remain until one of the object is
-     * modified.
-     *
-     * \param url The Url object to make a copy of.
-     * \throws url::UrlException if copy fails (should not happen).
-     */
-    Url(const Url &url);
-
-
-    /**
-     * Create a new Url object as shared copy of the given reference.
-     *
-     * Upon return, both objects will point to the same underlying
-     * object. This state will remain until one of the object is
-     * modified.
-     *
-     * \param url The URL implementation reference to make a copy of.
-     * \throws url::UrlException if reference is empty.
-     */
-    Url(const zypp::url::UrlRef &url);
-
-
-    /**
-     * \brief Construct a Url object from percent-encoded URL string.
-     *
-     * Parses the \p encodedUrl string using the parseUrl() method
-     * and assigns the result to the newly created object.
-     *
-     * \param encodedUrl A percent-encoded URL string.
-     * \throws url::UrlParsingException if parsing of the url fails.
-     * \throws url::UrlNotAllowedException if one of the components
-     *         is not allowed for the scheme.
-     * \throws url::UrlBadComponentException if one of the components
-     *         contains an invalid character.
-     */
-    Url(const std::string &encodedUrl);
-
-
-    // -----------------
-    /**
-     * \brief Parse a percent-encoded URL string.
-     *
-     * Tries to parse the given string into generic URL components
-     * and creates a clone of a scheme-specialized object or a new
-     * UrlBase object.
-     *
-     * \param encodedUrl A percent-encoded URL string.
-     * \return           A reference to a (derived) UrlBase object or
-     *                   empty reference if the \p encodedUrl string
-     *                   does not match the generic URL syntax.
-     * \throws url::UrlNotAllowedException if one of the components
-     *         is not allowed for the scheme.
-     * \throws url::UrlBadComponentException if one of the components
-     *         contains an invalid character.
-     */
-    static url::UrlRef
-    parseUrl(const std::string &encodedUrl);
-
-
-    // -----------------
-    /**
-     * \brief Assigns parsed percent-encoded URL string to the object.
-     *
-     * Parses \p encodedUrl string using the parseUrl() method
-     * and assigns the result to the current object.
-     *
-     * \param encodedUrl A percent-encoded URL string.
-     * \return A reference to this Url object.
-     * \throws url::UrlParsingException if parsing of the url fails.
-     * \throws url::UrlNotAllowedException if one of the components
-     *         is not allowed for the scheme.
-     * \throws url::UrlBadComponentException if one of the components
-     *         contains an invalid character.
-     */
-    Url&
-    operator = (const std::string &encodedUrl);
-
-
-    /**
-     * \brief Assign a shared copy of \p url to the current object.
-     *
-     * Upon return, both objects will point to the same underlying
-     * object. This state will remain until one of the objects is
-     * modified.
-     *
-     * \param url The Url object to make a copy of.
-     * \return A reference to this Url object.
-     */
-    Url&
-    operator = (const Url &url);
-
-
-    // -----------------
-    /**
-     * \brief Register a scheme-specific implementation.
-     *
-     * \param scheme  A name of a scheme.
-     * \param urlImpl A UrlBase object specialized for this scheme.
-     * \return True, if the object claims to implement the scheme.
-     */
-    static bool
-    registerScheme(const std::string &scheme,
-                   url::UrlRef       urlImpl);
-
-    /**
-     * \brief Returns all registered scheme names.
-     * \return A vector with registered URL scheme names.
-     */
-    static zypp::url::UrlSchemes
-    getRegisteredSchemes();
-
-    /**
-     * \brief Returns if scheme name is registered.
-     * \return True, if scheme name is registered.
-     */
-    static bool
-    isRegisteredScheme(const std::string &scheme);
-
-
-    // -----------------
-    /**
-     * \brief Returns scheme names known to this object.
-     * \return A vector with scheme names known by this object.
-     */
-    zypp::url::UrlSchemes
-    getKnownSchemes() const;
-
-
-    /**
-     * \brief Verifies the specified scheme name.
-     *
-     * Verifies the generic syntax of the specified \p scheme name
-     * and if it is contained in the current object's list of known
-     * schemes (see getKnownSchemes()) if the list is not empty.
-     *
-     * The default implementation in the UrlBase class returns an
-     * emtpy list of known schemes, causing a check of the generic
-     * syntax only.
-     *
-     * \return True, if generic scheme name syntax is valid and
-     *         the scheme name is known to the current object.
-     */
-    bool
-    isValidScheme(const std::string &scheme) const;
-
-
-    /** hd cd dvd dir file iso */
-    static bool schemeIsLocal( const std::string & scheme_r );
-    /** \overload nonstatic version */
-    bool schemeIsLocal() const { return schemeIsLocal( getScheme() ); }
-
-    /** nfs nfs4 smb cifs http https ftp sftp tftp */
-    static bool schemeIsRemote( const std::string & scheme_r );
-    /** \overload nonstatic version */
-    bool schemeIsRemote() const { return schemeIsRemote( getScheme() ); }
-
-    /** cd dvd */
-    static bool schemeIsVolatile( const std::string & scheme_r );
-    /** \overload nonstatic version */
-    bool schemeIsVolatile() const { return schemeIsVolatile( getScheme() ); }
-
-    /** http https ftp sftp tftp */
-    static bool schemeIsDownloading( const std::string & scheme_r );
-    /** \overload nonstatic version */
-    bool schemeIsDownloading() const { return schemeIsDownloading( getScheme() ); }
-
-    /**
-     * \brief Verifies the Url.
-     *
-     * Verifies if the current object contains a non-empty scheme
-     * name. Additional semantical URL checks may be performed by
-     * derived UrlBase objects.
-     *
-     * \return True, if the Url seems to be valid.
-     */
-    bool
-    isValid() const;
-
-
-    // -----------------
-    /**
-     * Returns a default string representation of the Url object.
-     *
-     * By default, a password in the URL will be hidden.
-     *
-     * \return A default string representation of the Url object.
-     */
-    std::string
-    asString() const;
-
-    /**
-     * Returns a string representation of the Url object.
-     *
-     * To include a password in the resulting Url string, use:
-     * \code
-     *    url.asString(url.getViewOptions() +
-     *                 url::ViewOptions::WITH_PASSWORD);
-     * \endcode
-     *
-     * \param opts  A combination of view options.
-     * \return A string representation of the Url object.
-     */
-    std::string
-    asString(const ViewOptions &opts) const;
-
-    /**
-     * Returns a complete string representation of the Url object.
-     *
-     * This function ignores the configuration of the view options
-     * in the current object (see setViewOption()) and forces to
-     * return a string with all URL components included.
-     *
-     * \return A complete string representation of the Url object.
-     */
-    std::string
-    asCompleteString() const;
-
-
-    // -----------------
-    /**
-     * Returns the scheme name of the URL.
-     * \return Scheme name of the current Url object.
-     */
-    std::string
-    getScheme() const;
-
-
-    // -----------------
-    /**
-     * Returns the encoded authority component of the URL.
-     *
-     * The returned authority string does not contain the leading
-     * "//" separator characters, but just its "user:pass@host:port"
-     * content only.
-     *
-     * \return The encoded authority component string.
-     */
-    std::string
-    getAuthority() const;
-
-    /**
-     * Returns the username from the URL authority.
-     * \param eflag Flag if the usename should be percent-decoded or not.
-     * \return The username sub-component from the URL authority.
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    std::string
-    getUsername(EEncoding eflag = zypp::url::E_DECODED) const;
-
-    /**
-     * Returns the password from the URL authority.
-     * \param eflag Flag if the password should be percent-decoded or not.
-     * \return The password sub-component from the URL authority.
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    std::string
-    getPassword(EEncoding eflag = zypp::url::E_DECODED) const;
-
-    /**
-     * Returns \c true if username \b and password are encoded in the authority component.
-     */
-    bool hasCredentialsInAuthority() const
-    { return ! ( getUsername().empty() || getPassword().empty() ); }
-
-    /**
-     * Returns the hostname or IP from the URL authority.
-     *
-     * In case the Url contains an IP number, it may be surrounded
-     * by "[" and "]" characters, for example "[::1]" for an IPv6
-     * localhost address.
-     *
-     * \param eflag Flag if the host should be percent-decoded or not.
-     * \return The host sub-component from the URL authority.
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    std::string
-    getHost(EEncoding eflag = zypp::url::E_DECODED) const;
-
-    /**
-     * Returns the port from the URL authority.
-     * \return The port sub-component from the URL authority.
-     */
-    std::string
-    getPort() const;
-
-
-    // -----------------
-    /**
-     * Returns the encoded path component of the URL.
-     *
-     * The path data contains the path name, optionally
-     * followed by path parameters separated with a ";"
-     * character, for example "/foo/bar;version=1.1".
-     *
-     * \return The encoded path component of the URL.
-     */
-    std::string
-    getPathData() const;
-
-    /**
-     * Returns the path name from the URL.
-     * \param eflag Flag if the path should be decoded or not.
-     * \return The path name sub-component without path parameters
-     *  from Path-Data component of the URL.
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    std::string
-    getPathName(EEncoding eflag = zypp::url::E_DECODED) const;
-
-    /**
-     * Returns the path parameters from the URL.
-     * \return The encoded path parameters from the URL.
-     */
-    std::string
-    getPathParams() const;
-
-    /**
-     * Returns a vector with path parameter substrings.
-     *
-     * The default path parameter separator is the \c ',' character.
-     * A schema specific object may overide the default separators.
-     *
-     * For example, the path parameters string "foo=1,bar=2" is splited
-     * by default into a vector containing the substrings "foo=1" and
-     * "bar=2".
-     *
-     * \return The path parameters splited into a vector of substrings.
-     */
-    zypp::url::ParamVec
-    getPathParamsVec() const;
-
-    /**
-     * Returns a string map with path parameter keys and values.
-     *
-     * The default path parameter separator is the \c ',' character,
-     * the default key/value separator for the path parameters is
-     * the \c '=' character.
-     * A schema specific object may overide the default separators.
-     *
-     * For example, the path parameters string "foo=1,bar=2" is splited
-     * into a map containing "foo" = "1" and "bar" = "2" by default.
-     *
-     * \param eflag Flag if the path parameter keys and values should
-     *               be decoded or not.
-     * \return The path parameters key and values as a string map.
-     * \throws url::UrlNotSupportedException if parameter parsing
-     *         is not supported for a URL (scheme).
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    zypp::url::ParamMap
-    getPathParamsMap(EEncoding eflag = zypp::url::E_DECODED) const;
-
-    /**
-     * Return the value for the specified path parameter.
-     *
-     * For example, if the path parameters string is "foo=1,bar=2"
-     * the method will return the substring "1" for the param key
-     * "foo" and "2" for the param key "bar".
-     *
-     * \param param The path parameter key.
-     * \param eflag Flag if the path parameter keys and values should
-     *              be decoded or not.
-     * \return The value for the path parameter key or empty string.
-     * \throws url::UrlNotSupportedException if parameter parsing
-     *         is not supported for a URL (scheme).
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    std::string
-    getPathParam(const std::string &param,
-                 EEncoding eflag = zypp::url::E_DECODED) const;
-
-
-    // -----------------
-    /**
-     * Returns the encoded query string component of the URL.
-     *
-     * The query string is returned without first "?" (separator)
-     * character. Further "?" characters as in e.g. LDAP URLs
-     * remain in the returned string.
-     *
-     * \return The encoded query string component of the URL.
-     */
-    std::string
-    getQueryString() const;
-
-    /**
-     * Returns a vector with query string parameter substrings.
-     *
-     * The default query string parameter separator is the \c '&'
-     * character.
-     * A schema specific object may overide the default separators.
-     *
-     * For example, the query string "foo=1&bar=2" is splited by
-     * default into a vector containing the substrings "foo=1" and
-     * "bar=2".
-     *
-     * \return The query string splited into a vector of substrings.
-     */
-    zypp::url::ParamVec
-    getQueryStringVec() const;
-
-    /**
-     * Returns a string map with query parameter and their values.
-     *
-     * The default query string parameter separator is the \c ','
-     * character, the default key/value separator the \c '=' character.
-     * A schema specific object may overide the default separators.
-     *
-     * For example, the query string "foo=1&bar=2" is splited by
-     * default into a map containing "foo" = "1" and "bar" = "2".
-     *
-     * \param eflag Flag if the query string keys and values should
-     *               be decoded or not.
-     * \return The query string as a key/value string map.
-     * \throws url::UrlNotSupportedException if parameter parsing
-     *         is not supported for a URL (scheme).
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    zypp::url::ParamMap
-    getQueryStringMap(EEncoding eflag = zypp::url::E_DECODED) const;
-
-    /**
-     * Return the value for the specified query parameter.
-     *
-     * For example, if the query string is "foo=1,bar=2" the method
-     * will return the substring "1" for the param key "foo" and
-     * "2" for the param key "bar".
-     *
-     * \param param The query parameter key.
-     * \param eflag Flag if the query parameter keys and values should
-     *              be decoded or not.
-     * \return The value for the query parameter key or empty string.
-     * \throws url::UrlNotSupportedException if parameter parsing
-     *         is not supported for a URL (scheme).
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    std::string
-    getQueryParam(const std::string &param,
-                  EEncoding eflag = zypp::url::E_DECODED) const;
-
-
-    // -----------------
-    /**
-     * Returns the encoded fragment component of the URL.
-     * \param eflag Flag if the fragment should be percent-decoded or not.
-     * \return The encoded fragment component of the URL.
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    std::string
-    getFragment(EEncoding eflag = zypp::url::E_DECODED) const;
-
-
-    // -----------------
-    /**
-     * \brief Set the scheme name in the URL.
-     * \param scheme The new scheme name.
-     * \throws url::UrlBadComponentException if the \p scheme
-     *         contains an invalid character or is empty.
-     */
-    void
-    setScheme(const std::string &scheme);
-
-
-    // -----------------
-    /**
-     * \brief Set the authority component in the URL.
-     *
-     * The \p authority string shoud contain the "user:pass@host:port"
-     * sub-components without any leading "//" separator characters.
-     *
-     * \param authority The encoded authority component string.
-     * \throws url::UrlNotAllowedException if the \p authority
-     *         has to be empty in for the current scheme.
-     * \throws url::UrlBadComponentException if the \p authority
-     *         contains an invalid character.
-     * \throws url::UrlParsingException if \p authority parsing fails.
-     */
-    void
-    setAuthority(const std::string &authority);
-
-    /**
-     * \brief Set the username in the URL authority.
-     * \param user  The new username.
-     * \param eflag If the \p username is encoded or not.
-     * \throws url::UrlNotAllowedException if the \p user
-     *         has to be empty in for the current scheme
-     * \throws url::UrlBadComponentException if the \p user
-     *         contains an invalid character.
-     */
-    void
-    setUsername(const std::string &user,
-                EEncoding         eflag = zypp::url::E_DECODED);
-
-    /**
-     * \brief Set the password in the URL authority.
-     * \param pass  The new password.
-     * \param eflag If the \p password is encoded or not.
-     * \throws url::UrlNotAllowedException if the \p pass
-     *         has to be empty in for the current scheme.
-     * \throws url::UrlBadComponentException if the \p pass
-     *         contains an invalid character.
-     */
-    void
-    setPassword(const std::string &pass,
-                EEncoding         eflag = zypp::url::E_DECODED);
-
-    /**
-     * \brief Set the hostname or IP in the URL authority.
-     *
-     * The \p host parameter may contain a hostname, an IPv4 address
-     * in dotted-decimal form or an IPv6 address literal encapsulated
-     * within square brackets (RFC3513, Sect. 2.2).
-     *
-     * A hostname may contain national alphanumeric UTF8 characters
-     * (letters other than ASCII a-z0-9), that will be encoded.
-     * This function allows to specify both, a encoded or decoded
-     * hostname.
-     *
-     * Other IP literals in "[v ... ]" square bracket format are not
-     * supported by the implementation in UrlBase class.
-     *
-     * \param host The new hostname or IP address.
-     * \throws url::UrlNotAllowedException if the \p host (authority)
-     *         has to be empty in for the current scheme.
-     * \throws url::UrlBadComponentException if the \p host is invalid.
-     */
-    void
-    setHost(const std::string &host);
-
-    /**
-     * \brief Set the port number in the URL authority.
-     * \param port The new port number.
-     * \throws url::UrlNotAllowedException if the \p port (authority)
-     *         has to be empty in for the current scheme.
-     * \throws url::UrlBadComponentException if the \p port is invalid.
-     */
-    void
-    setPort(const std::string &port);
-
-
-    // -----------------
-    /**
-     * \brief Set the path data component in the URL.
-     *
-     * By default, the \p pathdata string may include path
-     * parameters separated by the ";" separator character.
-     *
-     * \param pathdata The encoded path data component string.
-     * \throws url::UrlBadComponentException if the \p pathdata
-     *         contains an invalid character.
-     */
-    void
-    setPathData(const std::string &pathdata);
-
-    /**
-     * \brief Set the path name.
-     * \param path  The new path name.
-     * \param eflag If the \p path name is encoded or not.
-     * \throws url::UrlBadComponentException if the \p path name
-     *         contains an invalid character.
-     */
-    void
-    setPathName(const std::string &path,
-                EEncoding         eflag = zypp::url::E_DECODED);
-    /** \overload */
-    void
-    setPathName(const Pathname &path,
-                EEncoding         eflag = zypp::url::E_DECODED);
-    /** \overload */
-    void
-    setPathName(const char *path,
-                EEncoding         eflag = zypp::url::E_DECODED);
-
-    /**
-     * \brief Extend the path name.
-     */
-    void appendPathName( const Pathname & path_r, EEncoding eflag_r = zypp::url::E_DECODED );
-
-    /**
-     * \brief Set the path parameters.
-     * \param params The new encoded path parameter string.
-     * \throws url::UrlBadComponentException if the path \p params
-     *         contains an invalid character.
-     */
-    void
-    setPathParams(const std::string &params);
-
-    /**
-     * \brief Set the path parameters.
-     * \param pvec The vector with encoded path parameters.
-     * \throws url::UrlBadComponentException if the \p pvec
-     *         contains an invalid character.
-     */
-    void
-    setPathParamsVec(const zypp::url::ParamVec &pvec);
-
-    /**
-     * \brief Set the path parameters.
-     * \param pmap The map with decoded path parameters.
-     * \throws url::UrlNotSupportedException if parameter parsing
-     *         is not supported for a URL (scheme).
-     */
-    void
-    setPathParamsMap(const zypp::url::ParamMap &pmap);
-
-    /**
-     * \brief Set or add value for the specified path parameter.
-     * \param param The decoded path parameter name.
-     * \param value The decoded path parameter value.
-     * \throws url::UrlNotSupportedException if parameter parsing
-     *         is not supported for a URL (scheme).
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    void
-    setPathParam(const std::string &param, const std::string &value);
-
-
-    // -----------------
-    /**
-     * \brief Set the query string in the URL.
-     * \param querystr The new encoded query string.
-     * \throws url::UrlBadComponentException if the \p querystr
-     *         contains an invalid character.
-     */
-    void
-    setQueryString(const std::string &querystr);
-
-    /**
-     * \brief Set the query parameters.
-     * \param qvec The vector with encoded query parameters.
-     * \throws url::UrlBadComponentException if the \p qvec
-     *         contains an invalid character.
-     */
-    void
-    setQueryStringVec(const zypp::url::ParamVec &qvec);
-
-    /**
-     * \brief Set the query parameters.
-     * \param qmap The map with decoded query parameters.
-     * \throws url::UrlNotSupportedException if parameter parsing
-     *         is not supported for a URL (scheme).
-     */
-    void
-    setQueryStringMap(const zypp::url::ParamMap &qmap);
-
-    /**
-     * \brief Set or add value for the specified query parameter.
-     * \param param The decoded query parameter name.
-     * \param value The decoded query parameter value.
-     * \throws url::UrlNotSupportedException if parameter parsing
-     *         is not supported for a URL (scheme).
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    void
-    setQueryParam(const std::string &param, const std::string &value);
-
-    /**
-     * \brief remove the specified query parameter.
-     * \param param The decoded query parameter name.
-     * \throws url::UrlNotSupportedException if parameter parsing
-     *         is not supported for a URL (scheme).
-     * \throws url::UrlDecodingException if the decoded result string
-     *         would contain a '\\0' character.
-     */
-    void
-    delQueryParam(const std::string &param);
-
-
-    // -----------------
-    /**
-     * \brief Set the fragment string in the URL.
-     * \param fragment The new fragment string.
-     * \param eflag If the \p fragment is encoded or not.
-     * \throws url::UrlBadComponentException if the \p fragment
-     *         contains an invalid character.
-     */
-    void
-    setFragment(const std::string &fragment,
-                EEncoding         eflag = zypp::url::E_DECODED);
-
-
-    // -----------------
-    /**
-     * Return the view options of the current object.
-     *
-     * This method is used to query the view options
-     * used by the asString() method.
-     *
-     * \return The current view option combination.
-     */
-    ViewOptions
-    getViewOptions() const;
-
-    /**
-     * Change the view options of the current object.
-     *
-     * This method is used to change the view options
-     * used by the asString() method.
-     *
-     * \param vopts New view options combination.
-     */
-    void
-    setViewOptions(const ViewOptions &vopts);
-
-  private:
-    friend std::string hotfix1050625::asString( const Url & url_r );
-    url::UrlRef m_impl;
-  };
-
-  std::ostream & operator<<( std::ostream & str, const Url & url );
-
-  /**
-   * needed for std::set
-   */
-  bool operator<( const Url &lhs, const Url &rhs );
-
-  /**
-   * needed for find
-   */
-  bool operator==( const Url &lhs, const Url &rhs );
-
-
-  bool operator!=( const Url &lhs, const Url &rhs );
-
-  ////////////////////////////////////////////////////////////////////
-} // namespace zypp
-//////////////////////////////////////////////////////////////////////
-
-#endif /* ZYPP_URL_H */
-/*
-** vim: set ts=2 sts=2 sw=2 ai et:
-*/
+#include <zypp-core/Url.h>
index 6f0a3f0..264a0de 100644 (file)
 #include <zypp/KeyRing.h>
 #include <zypp/DiskUsageCounter.h>
 
+namespace zyppng {
+  class Context;
+}
+
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
index edc1e52..be07039 100644 (file)
@@ -668,6 +668,174 @@ namespace zypp
        {}
       };
 #endif
+
+      // Generic transaction reports, this is used for verifying and preparing tasks, the name param
+      // for the start function defines which report we are looking at
+      struct TransactionReportSA : public callback::ReportBase
+      {
+        enum Error {
+          NO_ERROR, // everything went perfectly fine
+          FINISHED_WITH_ERRORS, // the transaction was finished, but some errors happened
+          FAILED // the transaction failed completely
+        };
+
+        virtual void start(
+          const std::string &/*name*/,
+          const UserData & = UserData() /*userdata*/
+          ) {}
+
+        virtual void progress(
+          int /*value*/,
+          const UserData & = UserData() /*userdata*/
+          ) { }
+
+        virtual void finish(
+          Error /*error*/,
+          const UserData & = UserData() /*userdata*/
+          ) {}
+
+      /** "zypp-rpm/transactionsa": Additional rpm output (sent immediately).
+       * Data:
+       * line     : std::reference_wrapper<const std::string>
+       */
+        static const UserData::ContentType contentRpmout;
+      };
+
+
+      // progress for installing a resolvable in single transaction mode
+      struct InstallResolvableReportSA : public callback::ReportBase
+      {
+        enum Error {
+          NO_ERROR,
+          NOT_FOUND,   // the requested Url was not found
+          IO,          // IO error
+          INVALID      // th resolvable is invalid
+        };
+
+        virtual void start(
+          Resolvable::constPtr /*resolvable*/,
+          const UserData & = UserData() /*userdata*/
+          ) {}
+
+        virtual void progress(
+          int /*value*/,
+          Resolvable::constPtr /*resolvable*/,
+          const UserData & = UserData() /*userdata*/
+          ) { return; }
+
+        virtual void finish(
+          Resolvable::constPtr /*resolvable*/
+          , Error /*error*/,
+          const UserData & = UserData() /*userdata*/
+          ) {}
+
+        /** "zypp-rpm/installpkgsa": Additional rpm output (sent immediately).
+         * Data:
+         * solvable : satSolvable processed
+         * line     : std::reference_wrapper<const std::string>
+         */
+        static const UserData::ContentType contentRpmout;
+      };
+
+      // progress for removing a resolvable in single transaction mode
+      struct RemoveResolvableReportSA : public callback::ReportBase
+      {
+        enum Error {
+          NO_ERROR,
+          NOT_FOUND,   // the requested Url was not found
+          IO,          // IO error
+          INVALID       // th resolvable is invalid
+        };
+
+        virtual void start(
+          Resolvable::constPtr /*resolvable*/,
+          const UserData & = UserData() /*userdata*/
+          ) {}
+
+        virtual void progress(
+          int /*value*/,
+          Resolvable::constPtr /*resolvable*/,
+          const UserData & = UserData() /*userdata*/
+          ) { return; }
+
+        virtual void finish(
+          Resolvable::constPtr /*resolvable*/
+          , Error /*error*/
+          , const UserData & = UserData() /*userdata*/
+          ) {}
+
+        /** "zypp-rpm/removepkgsa": Additional rpm output (sent immediately).
+         * For data \see \ref InstallResolvableReportSA::contentRpmout
+         */
+        static const UserData::ContentType contentRpmout;
+      };
+
+      // progress for cleaning up the old version of a package after it was upgraded to a new version
+      struct CleanupPackageReportSA : public callback::ReportBase
+      {
+        enum Error {
+          NO_ERROR
+        };
+
+        virtual void start(
+          const std::string & /*nvra*/,
+          const UserData & = UserData() /*userdata*/
+          ) {}
+
+        virtual void progress(
+          int /*value*/,
+          const UserData & = UserData() /*userdata*/
+          ) { return; }
+
+        virtual void finish(
+          Error /*error*/,
+          const UserData & = UserData() /*userdata*/
+          ) {}
+
+        /** "zypp-rpm/cleanupkgsa": Additional rpm output (sent immediately).
+         * For data \see \ref InstallResolvableReportSA::contentRpmout
+         */
+        static const UserData::ContentType contentRpmout;
+      };
+
+
+      // progress for script thats executed during a commit transaction
+      // the resolvable can be null, for things like posttrans scripts
+      struct CommitScriptReportSA : public callback::ReportBase
+      {
+        enum Error {
+          NO_ERROR,
+          WARN,
+          CRITICAL // the script failure prevented solvable installation
+        };
+
+        virtual void start(
+          const std::string &  /*scriptType*/,
+          const std::string &  /*packageName ( can be empty )*/,
+          Resolvable::constPtr /*resolvable  ( can be null )*/,
+          const UserData & = UserData() /*userdata*/
+          ) {}
+
+        virtual void progress(
+          int /*value*/,
+          Resolvable::constPtr /*resolvable*/,
+          const UserData & = UserData() /*userdata*/
+          ) { return; }
+
+        virtual void finish(
+          Resolvable::constPtr /*resolvable*/
+          , Error /*error*/,
+          const UserData & = UserData() /*userdata*/
+          ) {}
+
+        /** "zypp-rpm/scriptsa": Additional rpm output (sent immediately).
+         * Data:
+         * solvable : satSolvable processed ( can be empty )
+         * line     : std::reference_wrapper<const std::string>
+         */
+        static const UserData::ContentType contentRpmout;
+      };
+
       /////////////////////////////////////////////////////////////////
     } // namespace rpm
     ///////////////////////////////////////////////////////////////////
index 9254296..84d8d96 100644 (file)
 
 #include <iostream>
 
-#include <zypp/base/String.h>
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/StringV.h>
 
 #include <zypp/ZConfig.h>
 #include <zypp/ZYppCommitPolicy.h>
+#include <zypp-core/base/LogControl.h>
+#include <zypp-core/TriBool.h>
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
 
+
+  bool singleTransInEnv ()
+  {
+    static TriBool singleTrans = indeterminate;
+    if ( indeterminate(singleTrans) ) {
+      const char *val = ::getenv("ZYPP_SINGLE_RPMTRANS");
+      if ( val && std::string_view( val ) == "1"  )
+        singleTrans = true;
+      else
+        singleTrans = false;
+    }
+    // for some reason some compilers do not accept the implicit conversion to bool here.
+    return bool( singleTrans );
+  }
+
   ///////////////////////////////////////////////////////////////////
   //
   //   CLASS NAME : ZYppCommitPolicy::Impl
@@ -32,18 +50,18 @@ namespace zypp
     public:
       Impl()
       : _restrictToMedia       ( 0 )
-      , _dryRun                        ( false )
       , _downloadMode          ( ZConfig::instance().commit_downloadMode() )
       , _rpmInstFlags          ( ZConfig::instance().rpmInstallFlags() )
       , _syncPoolAfterCommit   ( true )
+      , _singleTransMode        ( singleTransInEnv() )
       {}
 
     public:
       unsigned                 _restrictToMedia;
-      bool                     _dryRun;
       DownloadMode             _downloadMode;
       target::rpm::RpmInstFlags        _rpmInstFlags;
       bool                     _syncPoolAfterCommit;
+      bool                      _singleTransMode; //< run everything in one big rpm transaction
 
     private:
       friend Impl * rwcowClone<Impl>( const Impl * rhs );
@@ -70,18 +88,28 @@ namespace zypp
 
 
   ZYppCommitPolicy & ZYppCommitPolicy::dryRun( bool yesNo_r )
-  { _pimpl->_dryRun = yesNo_r; return *this; }
+  {  _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_TEST, yesNo_r ); return *this; }
 
   bool ZYppCommitPolicy::dryRun() const
-  { return _pimpl->_dryRun; }
-
+  { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_TEST );}
 
   ZYppCommitPolicy & ZYppCommitPolicy::downloadMode( DownloadMode val_r )
-  { _pimpl->_downloadMode = val_r; return *this; }
+  {
+    if ( singleTransModeEnabled() && val_r == DownloadAsNeeded ) {
+      DBG << val_r << " is not compatible with singleTransMode, falling back to " << DownloadInAdvance << std::endl;
+      _pimpl->_downloadMode = DownloadInAdvance;
+    }
+    _pimpl->_downloadMode = val_r; return *this;
+  }
 
   DownloadMode ZYppCommitPolicy::downloadMode() const
-  { return _pimpl->_downloadMode; }
-
+  {
+    if ( singleTransModeEnabled() && _pimpl->_downloadMode == DownloadAsNeeded ) {
+      DBG << _pimpl->_downloadMode << " is not compatible with singleTransMode, falling back to " << DownloadInAdvance << std::endl;
+      return DownloadInAdvance;
+    }
+    return _pimpl->_downloadMode;
+  }
 
   ZYppCommitPolicy &  ZYppCommitPolicy::rpmInstFlags( target::rpm::RpmInstFlags newFlags_r )
   { _pimpl->_rpmInstFlags = newFlags_r; return *this; }
@@ -101,6 +129,17 @@ namespace zypp
   bool ZYppCommitPolicy::rpmExcludeDocs() const
   { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_EXCLUDEDOCS ); }
 
+  ZYppCommitPolicy &ZYppCommitPolicy::allowDowngrade(bool yesNo_r)
+  { _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_ALLOWDOWNGRADE, yesNo_r ); return *this; }
+
+  bool ZYppCommitPolicy::allowDowngrade() const
+  { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_ALLOWDOWNGRADE ); }
+
+  ZYppCommitPolicy &ZYppCommitPolicy::replaceFiles( bool yesNo_r )
+  { _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_REPLACEFILES, yesNo_r ); return *this; }
+
+  bool ZYppCommitPolicy::replaceFiles( ) const
+  { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_REPLACEFILES ); }
 
   ZYppCommitPolicy & ZYppCommitPolicy::syncPoolAfterCommit( bool yesNo_r )
   { _pimpl->_syncPoolAfterCommit = yesNo_r; return *this; }
@@ -108,6 +147,8 @@ namespace zypp
   bool ZYppCommitPolicy::syncPoolAfterCommit() const
   { return _pimpl->_syncPoolAfterCommit; }
 
+  bool ZYppCommitPolicy::singleTransModeEnabled() const
+  { return _pimpl->_singleTransMode; }
 
   std::ostream & operator<<( std::ostream & str, const ZYppCommitPolicy & obj )
   {
index 9ebc420..1e25864 100644 (file)
@@ -84,12 +84,20 @@ namespace zypp
 
       bool rpmExcludeDocs() const;
 
+      /** Allow to replace a newer package with an older one (rollback to a older version). */
+      ZYppCommitPolicy & allowDowngrade( bool yesNo_r );
+      bool allowDowngrade() const;
+
+      /** If enabled it allows installation of packages even if they replace files from other, already installed, packages. */
+      ZYppCommitPolicy & replaceFiles( bool yesNo_r );
+      bool replaceFiles() const;
 
       /** Kepp pool in sync with the Target databases after commit (default: true) */
       ZYppCommitPolicy & syncPoolAfterCommit( bool yesNo_r );
-
       bool syncPoolAfterCommit() const;
 
+      bool singleTransModeEnabled () const;
+
     public:
       /** Implementation  */
       class Impl;
index 3a57692..6e5e711 100644 (file)
@@ -34,6 +34,7 @@ namespace zypp
     public:
       Pathname                 _root;
       FalseBool                        _attemptToModify;
+      FalseBool                 _singleTransactionMode;
       sat::Transaction          _transaction;
       TransactionStepList       _transactionStepList;
       UpdateNotifications      _updateMessages;
@@ -74,6 +75,12 @@ namespace zypp
   void ZYppCommitResult::attemptToModify( bool yesno_r )
   { _pimpl->_attemptToModify = yesno_r; }
 
+  bool ZYppCommitResult::singleTransactionMode() const
+  { return _pimpl->_singleTransactionMode; }
+
+  void ZYppCommitResult::setSingleTransactionMode( bool yesno_r )
+  { _pimpl->_singleTransactionMode = yesno_r; }
+
   const sat::Transaction & ZYppCommitResult::transaction() const
   { return _pimpl->_transaction; }
 
index 356b2eb..dc972b8 100644 (file)
@@ -87,6 +87,14 @@ namespace zypp
       /** Set \ref attemptToModify */
       void attemptToModify( bool yesno_r );
 
+      /**
+       * \c True if the commit was executed in one big rpm transaction, this can be used to figure out
+       *    when its required to show more information about which packages failed during the transaction
+       *    because otherwise those informations might get lost in the backlog.
+       */
+      bool singleTransactionMode() const;
+      void setSingleTransactionMode( bool yesno_r );
+
       /** The full transaction list.
        * The complete list including transaction steps that do not require
        * any action (like obsoletes or non-package actions). Depending on
index 720ba6a..a16f861 100644 (file)
@@ -17,11 +17,13 @@ extern "C"
 #include <fstream>
 #include <signal.h>
 
+#include <zypp/base/Logger.h>
 #include <zypp/base/LogControl.h>
 #include <zypp/base/Gettext.h>
 #include <zypp/base/IOStream.h>
 #include <zypp/base/Functional.h>
 #include <zypp/base/Backtrace.h>
+#include <zypp/base/LogControl.h>
 #include <zypp/PathInfo.h>
 
 #include <zypp/ZYppFactory.h>
@@ -31,6 +33,8 @@ extern "C"
 #include <boost/interprocess/sync/scoped_lock.hpp>
 #include <boost/interprocess/sync/sharable_lock.hpp>
 
+#include <iostream>
+
 using boost::interprocess::file_lock;
 using boost::interprocess::scoped_lock;
 using boost::interprocess::sharable_lock;
@@ -52,6 +56,7 @@ namespace zypp
     void sigsegvHandler( int sig )
     {
       INT << "Error: signal " << sig << endl << dumpBacktrace << endl;
+      base::LogControl::instance().emergencyShutdown();
       ::signal( SIGSEGV, lastSigsegvHandler );
     }
   }
@@ -365,41 +370,32 @@ namespace zypp
       else if ( globalLock().zyppLocked() )
       {
        bool failed = true;
-       const long LOCK_TIMEOUT = str::strtonum<long>( getenv( "ZYPP_LOCK_TIMEOUT" ) ); // <0 means forever
-       if ( LOCK_TIMEOUT != 0 )
+       const long LOCK_TIMEOUT = str::strtonum<long>( getenv( "ZYPP_LOCK_TIMEOUT" ) );
+       if ( LOCK_TIMEOUT > 0 )
        {
-         Date logwait = Date::now();
-         Date giveup; /* 0 = forever */
-         if ( LOCK_TIMEOUT > 0 ) {
-           giveup = logwait+LOCK_TIMEOUT;
-           MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Waiting for the zypp lock until " << giveup << endl;
-         }
-         else
-           MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Waiting for the zypp lock..." << endl;
-
-         unsigned delay = 0;
-         do {
-           if ( delay < 60 )
-             delay += 1;
-           else {
-             Date now { Date::now() };
-             if ( now - logwait > Date::day ) {
-               WAR << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Another day has passed waiting for the zypp lock..." << endl;
-               logwait = now;
-             }
-           }
-           sleep( delay );
+         MIL << "Waiting whether pid " << globalLock().lockerPid() << " ends within $LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec." << endl;
+         unsigned delay = 1;
+          Pathname procdir( Pathname("/proc")/str::numstring(globalLock().lockerPid()) );
+         for ( long i = 0; i < LOCK_TIMEOUT; i += delay )
+         {
+           if ( PathInfo( procdir ).isDir() )  // wait for /proc/pid to disapear
+             sleep( delay );
+           else
            {
-             zypp::base::LogControl::TmpLineWriter shutUp;     // be quiet
+             MIL << "Retry after " << i << " sec." << endl;
              failed = globalLock().zyppLocked();
+             if ( failed )
+             {
+               // another proc locked faster. maybe it ends fast as well....
+               MIL << "Waiting whether pid " << globalLock().lockerPid() << " ends within " << (LOCK_TIMEOUT-i) << " sec." << endl;
+                procdir = Pathname( Pathname("/proc")/str::numstring(globalLock().lockerPid()) );
+             }
+             else
+             {
+               MIL << "Finally got the lock!" << endl;
+               break;  // gotcha
+             }
            }
-         } while ( failed && ( not giveup || Date::now() <= giveup ) );
-
-         if ( failed ) {
-           MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Gave up waiting for the zypp lock." << endl;
-         }
-         else {
-           MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Finally got the zypp lock." << endl;
          }
        }
        if ( failed )
index 0b1898d..96526c2 100644 (file)
@@ -1,116 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Easy.h
- *
-*/
-#ifndef ZYPP_BASE_EASY_H
-#define ZYPP_BASE_EASY_H
-
-#include <cstdio>
-#include <type_traits>
-
-/** Convenient for-loops using iterator.
- * \code
- *  std::set<std::string>; _store;
- *  for_( it, _store.begin(), _store.end() )
- *  {
- *    cout << *it << endl;
- *  }
- * \endcode
-*/
-#ifndef __GXX_EXPERIMENTAL_CXX0X__
-#define for_(IT,BEG,END) for ( __typeof__(BEG) IT = BEG, _for_end = END; IT != _for_end; ++IT )
-#else
-#define for_(IT,BEG,END) for ( auto IT = BEG, _for_end = END; IT != _for_end; ++IT )
-#endif
-#define for_each_(IT,CONT) for_( IT, (CONT).begin(), (CONT).end() )
-
-/** Simple C-array iterator
- * \code
- *  const char * defstrings[] = { "",  "a", "default", "two words" };
- *  for_( it, arrayBegin(defstrings), arrayEnd(defstrings) )
- *    cout << *it << endl;
- * \endcode
-*/
-#define arrayBegin(A) (&A[0])
-#define arraySize(A)  (sizeof(A)/sizeof(*A))
-#define arrayEnd(A)   (&A[0] + arraySize(A))
-
-/**
- * \code
- * defConstStr( strANY(), "ANY" );
- * std::str str = strANY();
- * \endcode
- */
-#define defConstStr(FNC,STR) inline const std::string & FNC { static const std::string val( STR ); return val; }
-
-#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100  + __GNUC_PATCHLEVEL__)
-#if GCC_VERSION < 40600 || not defined(__GXX_EXPERIMENTAL_CXX0X__)
-#define nullptr NULL
-#endif
-
-/** Delete copy ctor and copy assign */
-#define NON_COPYABLE(CLASS)                    \
-  CLASS( const CLASS & ) = delete;             \
-  CLASS & operator=( const CLASS & ) = delete
-
-/** Default copy ctor and copy assign */
-#define DEFAULT_COPYABLE(CLASS)                        \
-  CLASS( const CLASS & ) = default;            \
-  CLASS & operator=( const CLASS & ) = default
-
-/** Delete move ctor and move assign */
-#define NON_MOVABLE(CLASS)                     \
-  CLASS( CLASS && ) = delete;                  \
-  CLASS & operator=( CLASS && ) = delete
-
-/** Default move ctor and move assign */
-#define DEFAULT_MOVABLE(CLASS)                 \
-  CLASS( CLASS && ) = default;                 \
-  CLASS & operator=( CLASS && ) = default
-
-/** Delete copy ctor and copy assign but enable default move */
-#define NON_COPYABLE_BUT_MOVE( CLASS )                 \
-  NON_COPYABLE(CLASS);                         \
-  DEFAULT_MOVABLE(CLASS)
-
-/** Default move ctor and move assign but enable default copy */
-#define NON_MOVABLE_BUT_COPY( CLASS )          \
-  NON_MOVABLE(CLASS);                          \
-  DEFAULT_COPYABLE(CLASS)
-
-
-/** Prevent an universal ctor to be chosen as copy ctor.
- * \code
- *  struct FeedStrings
- *  {
- *    template<typename TARG, typename X = disable_use_as_copy_ctor<FeedStrings,TARG>>
- *    FeedStrings( TARG && arg_r )
- *    : _value { std::forward<TARG>( arg_r ) }
- *    {}
- *
- *    // Same with variadic template. Could be chosen as copy_ctor.
- *    template<typename ... Us>
- *    FeedStrings( Us &&... us )
- *    : ...
- *
- *  private:
- *    std::string _value;
- * \endcode
- */
-template<typename TBase, typename TDerived>
-using disable_use_as_copy_ctor = typename std::enable_if<!std::is_base_of<TBase,typename std::remove_reference<TDerived>::type>::value>::type;
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_EASY_H
+#include <zypp-core/base/Easy.h>
index 101764d..54ca819 100644 (file)
@@ -1,91 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/EnumClass.h
- */
-#ifndef ZYPP_BASE_ENUMCLASS_H
-#define ZYPP_BASE_ENUMCLASS_H
-
-#include <iosfwd>
-
-#include <zypp/base/PtrTypes.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{
-  ///////////////////////////////////////////////////////////////////
-  namespace base
-  {
-    ///////////////////////////////////////////////////////////////////
-    /// \class EnumClass
-    /// \brief Type safe enum (workaround SWIG not supporting enum class)
-    /// \code
-    /// struct EColorDef { enum Enum { R, G ,B }; };
-    /// typedef EnumClass<EColorDef> Color;
-    /// \endcode
-    /// Conversion to from string can be easily added, e.g. like this:
-    /// \code
-    /// struct EColorDef {
-    ///   enum Enum { R, G ,B };
-    ///   static Enum fromString( const std::string & val_r );
-    ///   static const std::string & asString( Enum val_r );
-    /// };
-    /// std::ostream & operator<<( std::ostream & str, const EColorDef & obj )
-    /// { return str << EColorDef::asString( obj.inSwitch() ); }
-    ///
-    /// typedef EnumClass<EColorDef> Color;
-    /// Color red = Color::fromString("red");
-    /// cout << red << endl; // "red"
-    /// \endcode
-    ///////////////////////////////////////////////////////////////////
-    template<typename TEnumDef>
-    class EnumClass : public TEnumDef
-    {
-    public:
-      typedef typename TEnumDef::Enum Enum;            ///< The underlying enum type
-      typedef typename std::underlying_type<Enum>::type Integral;///< The underlying integral type
-
-      EnumClass( Enum val_r ) : _val( val_r ) {}
-
-      /** Underlying enum value for use in switch
-       * \code
-       * struct EColorDef { enum Enum { R, G ,B }; }
-       * typedef EnumClass<EColorDef> Color;
-       *
-       * Color a;
-       * switch ( a.asEnum() )
-       * \endcode
-       */
-      Enum asEnum() const { return _val; }
-
-      /** Underlying integral value (e.g. array index)
-       * \code
-       * struct EColorDef { enum Enum { R, G ,B }; }
-       * typedef EnumClass<EColorDef> Color;
-       *
-       * Color a;
-       * std::string table[] = { "red", "green", "blue" };
-       * std::cout << table[a.asIntegral()] << std::endl;
-       */
-      Integral asIntegral() const { return static_cast<Integral>(_val); }
-
-      friend bool operator==( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val == rhs._val; }
-      friend bool operator!=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val != rhs._val; }
-      friend bool operator< ( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val <  rhs._val; }
-      friend bool operator<=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val <= rhs._val; }
-      friend bool operator> ( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val >  rhs._val; }
-      friend bool operator>=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val >= rhs._val; }
-
-    private:
-      Enum _val;
-    };
-  } // namespace base
-  ///////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_ENUMCLASS_H
+#include <zypp-core/base/EnumClass.h>
index 220ab64..c3ffab3 100644 (file)
@@ -1,65 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Errno.h
- *
-*/
-#ifndef ZYPP_BASE_ERRNO_H
-#define ZYPP_BASE_ERRNO_H
-
-#include <cerrno>
-#include <iosfwd>
-
-#include <zypp/base/String.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  /** Convenience \c errno wrapper. */
-  class Errno
-  {
-    public:
-      /** Default ctor: \c errno */
-      Errno() : _errno( errno ) {}
-
-      /** Ctor set to \c errno if error condition, else \c 0.
-       * \code
-       *  int ret = ::write( fd, buffer, size );
-       *  DBG << "write returns: " << Errno( ret != size ) << end;
-       *  // on success:    "write returns: [0-Success]"
-       *  // on error e.g.: "write returns: [11-Resource temporarily unavailable]"
-       * \endcode
-       */
-      Errno( bool error_r ) : _errno( error_r ? errno : 0 ) {}
-
-      /** Ctor taking an explicit errno value. */
-      Errno( int errno_r ) : _errno( errno_r ) {}
-
-    public:
-      /** Return the stored errno. */
-      int get() const { return _errno; }
-
-      /** Allow implicit conversion to \c int. */
-      operator int() const { return get(); }
-
-      /** Return human readable error string. */
-      std::string asString() const { return str::form( "[%d-%s]", _errno, ::strerror(_errno) ); }
-
-    private:
-      int _errno;
-  };
-
-  /** \relates Errno Stream output */
-  inline std::ostream & operator<<( std::ostream & str, const Errno & obj )
-  { return str << obj.asString(); }
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_ERRNO_H
+#include <zypp-core/base/Errno.h>
index 444022e..56a820a 100644 (file)
@@ -1,428 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/base/Exception.h
- *
-*/
-#ifndef ZYPP_BASE_EXCEPTION_H
-#define ZYPP_BASE_EXCEPTION_H
-
-#include <iosfwd>
-#include <string>
-#include <list>
-#include <stdexcept>
-#include <typeinfo>
-#include <type_traits>
-
-#include <zypp/base/Errno.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  ///////////////////////////////////////////////////////////////////
-  namespace exception_detail
-  { /////////////////////////////////////////////////////////////////
-
-    /** Keep _FILE_, _FUNCTION_ and _LINE_.
-     * Construct it using the \ref ZYPP_EX_CODELOCATION macro.
-    */
-    struct CodeLocation
-    {
-      friend std::ostream & operator<<( std::ostream & str, const CodeLocation & obj );
-
-      /** Ctor */
-      CodeLocation()
-      : _line( 0 )
-      {}
-
-      /** Ctor */
-      CodeLocation( const std::string & file_r,
-                    const std::string & func_r,
-                    unsigned            line_r )
-      : _file( file_r ), _func( func_r ), _line( line_r )
-      {}
-
-      /** Location as string */
-      std::string asString() const;
-
-    private:
-      std::string _file;
-      std::string _func;
-      unsigned    _line;
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /** Create CodeLocation object storing the current location. */
-    //#define ZYPP_EX_CODELOCATION ::zypp::exception_detail::CodeLocation(__FILE__,__FUNCTION__,__LINE__)
-#define ZYPP_EX_CODELOCATION ::zypp::exception_detail::CodeLocation(( *__FILE__ == '/' ? strrchr( __FILE__, '/' ) + 1 : __FILE__ ),__FUNCTION__,__LINE__)
-
-    /** \relates CodeLocation Stream output */
-    std::ostream & operator<<( std::ostream & str, const CodeLocation & obj );
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace exception_detail
-  ///////////////////////////////////////////////////////////////////
-
-  ///////////////////////////////////////////////////////////////////
-  //
-  //   CLASS NAME : Exception
-  /** Base class for Exception.
-   *
-   * Exception offers to store a message string passed to the ctor.
-   * Derived classes may provide additional information. Overload
-   * \ref dumpOn to provide a proper error text.
-   *
-   * \li Use \ref ZYPP_THROW to throw exceptions.
-   * \li Use \ref ZYPP_CAUGHT If you caught an exceptions in order to handle it.
-   * \li Use \ref ZYPP_RETHROW to rethrow a caught exception.
-   *
-   * The use of these macros is not mandatory. but \c ZYPP_THROW and
-   * \c ZYPP_RETHROW will adjust the code location information stored in
-   * the Exception. All three macros will drop a line in the logfile.
-
-   * \code
-   *  43   try
-   *  44     {
-   *  45       try
-   *  46         {
-   *  47           ZYPP_THROW( Exception("Something bad happened.") );
-   *  48         }
-   *  49       catch ( Exception & excpt )
-   *  50         {
-   *  51           ZYPP_RETHROW( excpt );
-   *  52         }
-   *  53
-   *  54     }
-   *  55   catch ( Exception & excpt )
-   *  56     {
-   *  57       ZYPP_CAUGHT( excpt );
-   *  58     }
-   * \endcode
-   * The above produces the following log lines:
-   * \code
-   *  Main.cc(main):47 THROW:    Main.cc(main):47: Something bad happened.
-   *  Main.cc(main):51 RETHROW:  Main.cc(main):47: Something bad happened.
-   *  Main.cc(main):57 CAUGHT:   Main.cc(main):51: Something bad happened.
-   * \endcode
-   *
-   *
-   * Class Exception now offers a history list of message strings.
-   * These messages should describe what lead to the exception.
-   *
-   * The Exceptions message itself is NOT included in the history.
-   *
-   * Rethrow, remembering an old exception:
-   * \code
-   * try
-   * {
-   *   ....
-   * }
-   * catch( const Exception & olderr_r )
-   * {
-   *    ZYPP_CAUGHT( olderr_r )
-   *    HighLevelException newerr( "Something failed." );
-   *    newerr.rember( olderr_r );
-   *    ZYPP_THROW( newerr );
-   * }
-   * \endcode
-   *
-   * Print an Exception followed by it's history if available:
-   * \code
-   * Exception error;
-   * ERR << error << endl << error.historyAsString();
-   * \endcode
-   *
-   * \todo That's a draft to have a common way of throwing exceptions.
-   * Most probabely we'll finally use blocxx exceptions. Here, but not
-   * in the remaining code of zypp. If we can we should try to wrap
-   * the blocxx macros and typedef the classes in here.
-   **/
-  class Exception : public std::exception
-  {
-    friend std::ostream & operator<<( std::ostream & str, const Exception & obj );
-
-  public:
-    typedef exception_detail::CodeLocation CodeLocation;
-    typedef std::list<std::string>         History;
-    typedef History::const_iterator        HistoryIterator;
-    typedef History::size_type             HistorySize;
-
-    /** Default ctor.
-     * Use \ref ZYPP_THROW to throw exceptions.
-    */
-    Exception();
-
-    /** Ctor taking a message.
-     * Use \ref ZYPP_THROW to throw exceptions.
-    */
-    Exception( const std::string & msg_r );
-    /** \overload */
-    Exception( std::string && msg_r );
-
-    /** Ctor taking a message and an exception to remember as history
-     * \see \ref remember
-     * Use \ref ZYPP_THROW to throw exceptions.
-    */
-    Exception( const std::string & msg_r, const Exception & history_r );
-    /** \overload moving */
-    Exception( std::string && msg_r, const Exception & history_r );
-    /** \overload moving */
-    Exception( const std::string & msg_r, Exception && history_r );
-    /** \overload moving */
-    Exception( std::string && msg_r, Exception && history_r );
-
-    /** Dtor. */
-    virtual ~Exception() throw();
-
-    /** Return CodeLocation. */
-    const CodeLocation & where() const
-    { return _where; }
-
-    /** Exchange location on rethrow. */
-    void relocate( const CodeLocation & where_r ) const
-    { _where = where_r; }
-
-    /** Return the message string provided to the ctor.
-     * \note This is not necessarily the complete error message.
-     * The whole error message is provided by \ref asString or
-     * \ref dumpOn.
-    */
-    const std::string & msg() const
-    { return _msg; }
-
-    /** Error message provided by \ref dumpOn as string. */
-    std::string asString() const;
-
-    /** Translated error message as string suitable for the user.
-     * \see \ref asUserStringHistory
-    */
-    std::string asUserString() const;
-
-  public:
-    /** \name History list of message strings.
-     * Maintain a simple list of individual error messages, that lead
-     * to this Exception. The Exceptions message itself is not included
-     * in the history. The History list stores the most recent message
-     * fist.
-     */
-    //@{
-
-    /** Store an other Exception as history. */
-    void remember( const Exception & old_r );
-    /** \overload moving */
-    void remember( Exception && old_r );
-
-    /** Add some message text to the history. */
-    void addHistory( const std::string & msg_r );
-    /** \overload moving */
-    void addHistory( std::string && msg_r );
-
-    /** \ref addHistory from string container types (oldest first) */
-    template<class TContainer>
-    void addToHistory( const TContainer & msgc_r )
-    {
-      for ( const std::string & el : msgc_r )
-       addHistory( el );
-    }
-    /** \ref addHistory from string container types (oldest first) moving */
-    template<class TContainer>
-    void moveToHistory( TContainer && msgc_r )
-    {
-      for ( std::string & el : msgc_r )
-       addHistory( std::move(el) );
-    }
-
-    /** Iterator pointing to the most recent message. */
-    HistoryIterator historyBegin() const
-    { return _history.begin(); }
-
-    /** Iterator pointing behind the last message. */
-    HistoryIterator historyEnd() const
-    { return _history.end(); }
-
-    /** Whether the history list is empty. */
-    bool historyEmpty() const
-    { return _history.empty(); }
-
-    /** The size of the history list. */
-    HistorySize historySize() const
-    { return _history.size(); }
-
-    /** The history as string. Empty if \ref historyEmpty.
-     * Otherwise:
-     * \code
-     * History:
-     *  - most recent message
-     *  - 2nd message
-     * ...
-     *  - oldest message
-     * \endcode
-    */
-    std::string historyAsString() const;
-
-    /** A single (multiline) string composed of \ref asUserString  and  \ref historyAsString. */
-    std::string asUserHistory() const;
-    //@}
-
-  protected:
-
-    /** Overload this to print a proper error message. */
-    virtual std::ostream & dumpOn( std::ostream & str ) const;
-
-  public:
-     /** Make a string from \a errno_r. */
-    static std::string strErrno( int errno_r );
-     /** Make a string from \a errno_r and \a msg_r. */
-    static std::string strErrno( int errno_r, const std::string & msg_r );
-    /** \overload moving */
-    static std::string strErrno( int errno_r, std::string && msg_r );
-
-  public:
-    /** Drop a logline on throw, catch or rethrow.
-     * Used by \ref ZYPP_THROW macros.
-    */
-    static void log( const Exception & excpt_r, const CodeLocation & where_r,
-                     const char *const prefix_r );
-    /** \overrload for not-Exception types thrown via ZYPP_THROW */
-    static void log( const char * typename_r, const CodeLocation & where_r,
-                     const char *const prefix_r );
-  private:
-    mutable CodeLocation _where;
-    std::string          _msg;
-    History              _history;
-
-    /** Return message string. */
-    virtual const char * what() const throw()
-    { return _msg.c_str(); }
-
-    /** Called by <tt>std::ostream & operator\<\<</tt>.
-     * Prints \ref CodeLocation and the error message provided by
-     * \ref dumpOn.
-    */
-    std::ostream & dumpError( std::ostream & str ) const;
-  };
-  ///////////////////////////////////////////////////////////////////
-
-  /** \relates Exception Stream output */
-  std::ostream & operator<<( std::ostream & str, const Exception & obj );
-
-  ///////////////////////////////////////////////////////////////////
-  namespace exception_detail
-  {
-    /** SFINAE: Hide template signature unless \a TExcpt is derived from \ref Exception. */
-    template<class TExcpt>
-    using EnableIfIsException = typename std::enable_if< std::is_base_of<Exception,TExcpt>::value, int>::type;
-
-    /** SFINAE: Hide template signature if \a TExcpt is derived from  \ref Exception. */
-    template<class TExcpt>
-    using EnableIfNotException = typename std::enable_if< !std::is_base_of<Exception,TExcpt>::value, int>::type;
-
-
-    /** Helper for \ref ZYPP_THROW( Exception ). */
-    template<class TExcpt, EnableIfIsException<TExcpt> = 0>
-    void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn));
-    template<class TExcpt, EnableIfIsException<TExcpt>>
-    void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r )
-    {
-      excpt_r.relocate( where_r );
-      Exception::log( excpt_r, where_r, "THROW:   " );
-      throw( excpt_r );
-    }
-
-    /** Helper for \ref ZYPP_THROW( not Exception ). */
-    template<class TExcpt, EnableIfNotException<TExcpt> = 0>
-    void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn));
-    template<class TExcpt, EnableIfNotException<TExcpt>>
-    void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r )
-    {
-      Exception::log( typeid(excpt_r).name(), where_r, "THROW:   " );
-      throw( excpt_r );
-    }
-
-
-    /** Helper for \ref ZYPP_THROW( Exception ). */
-    template<class TExcpt, EnableIfIsException<TExcpt> = 0>
-    void do_ZYPP_CAUGHT( const TExcpt & excpt_r, const CodeLocation & where_r )
-    {
-      Exception::log( excpt_r, where_r, "CAUGHT:  " );
-    }
-
-    /** Helper for \ref ZYPP_THROW( not Exception ). */
-    template<class TExcpt, EnableIfNotException<TExcpt> = 0>
-    void do_ZYPP_CAUGHT( const TExcpt & excpt_r, const CodeLocation & where_r )
-    {
-      Exception::log( typeid(excpt_r).name(), where_r, "CAUGHT:  " );
-    }
-
-
-    /** Helper for \ref ZYPP_THROW( Exception ). */
-    template<class TExcpt, EnableIfIsException<TExcpt> = 0>
-    void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn));
-    template<class TExcpt, EnableIfIsException<TExcpt>>
-    void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r )
-    {
-      Exception::log( excpt_r, where_r, "RETHROW: " );
-      excpt_r.relocate( where_r );
-      throw;
-    }
-
-    /** Helper for \ref ZYPP_THROW( not Exception ). */
-    template<class TExcpt, EnableIfNotException<TExcpt> = 0>
-    void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn));
-    template<class TExcpt, EnableIfNotException<TExcpt>>
-    void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r )
-    {
-      Exception::log( excpt_r, where_r, "RETHROW: " );
-      throw;
-    }
-  } // namespace exception_detail
-  ///////////////////////////////////////////////////////////////////
-
-  /** \defgroup ZYPP_THROW ZYPP_THROW macros
-   * Macros for throwing Exception.
-   * \see \ref zypp::Exception for an example.
-  */
-  //@{
-  /** Drops a logline and throws the Exception. */
-#define ZYPP_THROW(EXCPT)\
-  ::zypp::exception_detail::do_ZYPP_THROW( EXCPT, ZYPP_EX_CODELOCATION )
-
-  /** Drops a logline telling the Exception was caught (in order to handle it). */
-#define ZYPP_CAUGHT(EXCPT)\
-  ::zypp::exception_detail::do_ZYPP_CAUGHT( EXCPT, ZYPP_EX_CODELOCATION )
-
-  /** Drops a logline and rethrows, updating the CodeLocation. */
-#define ZYPP_RETHROW(EXCPT)\
-  ::zypp::exception_detail::do_ZYPP_RETHROW( EXCPT, ZYPP_EX_CODELOCATION )
-
-
-  /** Throw Exception built from a message string. */
-#define ZYPP_THROW_MSG(EXCPTTYPE, MSG)\
-  ZYPP_THROW( EXCPTTYPE( MSG ) )
-
-  /** Throw Exception built from errno. */
-#define ZYPP_THROW_ERRNO(EXCPTTYPE)\
-  ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(errno) ) )
-
-  /** Throw Exception built from errno provided as argument. */
-#define ZYPP_THROW_ERRNO1(EXCPTTYPE, ERRNO)\
-  ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(ERRNO) ) )
-
-  /** Throw Exception built from errno and a message string. */
-#define ZYPP_THROW_ERRNO_MSG(EXCPTTYPE, MSG)\
-  ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(errno,MSG) ) )
-
-  /** Throw Exception built from errno provided as argument and a message string */
-#define ZYPP_THROW_ERRNO_MSG1(EXCPTTYPE, ERRNO,MSG)\
-  ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(ERRNO,MSG) ) )
-  //@}
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_EXCEPTION_H
+#include <zypp-core/base/Exception.h>
index 9acc2f4..753692a 100644 (file)
@@ -1,130 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/base/ExternalDataSource.h
- */
-
-#ifndef ZYPP_EXTERNALDATASOURCE_H
-#define ZYPP_EXTERNALDATASOURCE_H
-
-#include <stdio.h>
-
-#include <string>
-#include <optional>
-#include <zypp/base/IOTools.h>
-
-namespace zypp {
-  namespace externalprogram {
-
-    /**
-     * @short Bidirectional stream to external data
-     */
-    class ExternalDataSource
-    {
-    protected:
-      FILE *inputfile;
-      FILE *outputfile;
-
-    private:
-      char *linebuffer;
-      size_t linebuffer_size;
-
-    public:
-      /**
-       * Create a new instance.
-       * @param inputfile The stream for reading
-       * @param outputfile The stream for writing
-       * Either can be NULL if no reading/writing is allowed.
-       */
-      ExternalDataSource( FILE *inputfile = 0, FILE *outputfile = 0 );
-
-      /**
-       * Implicitly close the connection.
-       */
-      virtual ~ExternalDataSource ();
-
-      /**
-       * Send some data to the output stream.
-       * @param buffer The data to send
-       * @param length The size of it
-       */
-      bool send( const char *buffer, size_t length );
-
-      /**
-       * Send some data down the stream.
-       * @param string The data to send
-       */
-      bool send( std::string s );
-
-      /**
-       * Read some data from the input stream.
-       * @param buffer Where to put the data
-       * @param length How much to read at most
-       * Returns the amount actually received
-       */
-      size_t receive( char *buffer, size_t length );
-
-      /**
-       * Read one line from the input stream.
-       * Returns the line read, including the terminator.
-       */
-      std::string receiveLine();
-
-      /**
-       * Read one line from the input stream.
-       * Returns the line read, including the terminator.
-       * \note The delimiter is not removed from the string.
-       * \note The \a timeout value is to be specified in milliseconds.
-       * \throws io::TimeoutException if the timeout is reached
-       */
-      std::string receiveLine( io::timeout_type timeout );
-
-      /**
-       * Read characters into a string until delimiter \a c or EOF is
-       * read.
-       * \note The delimiter is not removed from the string.
-       */
-      std::string receiveUpto( char c );
-
-      /**
-       * Read characters into a string until delimiter \a c or EOF is
-       * read or the \a timeout is reached.
-       * \note The delimiter is not removed from the string.
-       * \note The \a timeout value is to be specified in milliseconds.
-       * \throws io::TimeoutException if the timeout is reached
-       */
-      std::string receiveUpto( char c, io::timeout_type timeout );
-
-      /**
-       * Set the blocking mode of the input stream.
-       * @param mode True if the reader should be blocked waiting for input.
-       * This is the initial default.
-       */
-      void setBlocking( bool mode );
-
-      /**
-       * Close the input and output streams.
-       */
-      virtual int close();
-
-      /**
-       * Return the input stream.
-       */
-      FILE *inputFile() const  { return inputfile; }
-
-      /**
-       * Return the output stream.
-       */
-      FILE *outputFile() const { return outputfile; }
-    };
-
-  } // namespace externalprogram
-} // namespace zypp
-
-#endif // ZYPP_EXTERNALDATASOURCE_H
-
+#include <zypp-core/base/ExternalDataSource.h>
index 8485b4b..38edf7d 100644 (file)
@@ -1,199 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Flags.h
- *
-*/
-#ifndef ZYPP_BASE_FLAGS_H
-#define ZYPP_BASE_FLAGS_H
-
-#include <zypp/base/String.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  ///////////////////////////////////////////////////////////////////
-  namespace base
-  { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : Flags<Enum>
-    //
-    /** A type-safe way of storing OR-combinations of enum values (like QTs QFlags).
-     * \see <a href="http://doc.trolltech.com/4.1/qflags.html">QFlags Class Reference</a>
-     * \code
-     *  class RpmDb
-     *  {
-     *    public:
-     *      enum DbStateInfoBits {
-     *        DbSI_NO_INIT     = 0x0000,
-     *        DbSI_HAVE_V4     = 0x0001,
-     *        DbSI_MADE_V4     = 0x0002,
-     *        DbSI_MODIFIED_V4 = 0x0004,
-     *        DbSI_HAVE_V3     = 0x0008,
-     *        DbSI_HAVE_V3TOV4 = 0x0010,
-     *        DbSI_MADE_V3TOV4 = 0x0020
-     *      };
-     *
-     *      ZYPP_DECLARE_FLAGS(DbStateInfo,DbStateInfoBits);
-     *  };
-     *  ZYPP_DECLARE_OPERATORS_FOR_FLAGS(RpmDb::DbStateInfo);
-     *
-     *  ...
-     *  enum Other { OTHERVAL = 13 };
-     *  {
-     *    XRpmDb::DbStateInfo s;
-     *    s = XRpmDb::DbSI_MODIFIED_V4|XRpmDb::DbSI_HAVE_V4;
-     *    // s |= OTHERVAL; // As desired: it does not compile
-     *  }
-     * \endcode
-     */
-    template<typename TEnum>
-    class Flags
-    {
-      public:
-        typedef TEnum Enum;    ///< The underlying enum type
-        typedef typename std::underlying_type<Enum>::type Integral;    ///< The underlying integral type
-
-      public:
-        constexpr Flags()                              : _val( 0 ) {}
-        constexpr Flags( Enum flag_r )                 : _val( integral(flag_r) ) {}
-        constexpr explicit Flags( Integral flag_r )    : _val( flag_r ) {}
-
-        constexpr static Flags none()                  { return Flags( Integral(0) ); }
-        constexpr static Flags all()                   { return Flags( ~Integral(0) ); }
-
-        constexpr bool isNone() const                  { return _val == Integral(0); }
-        constexpr bool isAll() const                   { return _val == ~Integral(0); }
-
-        Flags & operator&=( Flags rhs )                        { _val &= integral(rhs); return *this; }
-        Flags & operator&=( Enum rhs )                 { _val &= integral(rhs); return *this; }
-
-        Flags & operator|=( Flags rhs )                        { _val |= integral(rhs); return *this; }
-        Flags & operator|=( Enum rhs )                 { _val |= integral(rhs); return *this; }
-
-        Flags & operator^=( Flags rhs )                        { _val ^= integral(rhs); return *this; }
-        Flags & operator^=( Enum rhs )                 { _val ^= integral(rhs); return *this; }
-
-      public:
-        constexpr operator Integral() const            { return _val; }
-
-        constexpr Flags operator&( Flags rhs ) const   { return Flags( _val & integral(rhs) ); }
-        constexpr Flags operator&( Enum rhs ) const    { return Flags( _val & integral(rhs) ); }
-
-        constexpr Flags operator|( Flags rhs ) const   { return Flags( _val | integral(rhs) ); }
-        constexpr Flags operator|( Enum rhs ) const    { return Flags( _val | integral(rhs) ); }
-
-        constexpr Flags operator^( Flags rhs ) const   { return Flags( _val ^ integral(rhs) ); }
-        constexpr Flags operator^( Enum rhs ) const    { return Flags( _val ^ integral(rhs) ); }
-
-        constexpr Flags operator~() const              { return Flags( ~_val ); }
-
-        constexpr bool operator==( Enum rhs ) const    {  return( _val == integral(rhs) ); }
-        constexpr bool operator!=( Enum rhs ) const    {  return( _val != integral(rhs) ); }
-
-      public:
-        Flags & setFlag( Flags flag_r, bool newval_r ) { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); }
-        Flags & setFlag( Enum flag_r, bool newval_r )  { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); }
-
-        Flags & setFlag( Flags flag_r )                        { _val |= integral(flag_r); return *this; }
-        Flags & setFlag( Enum flag_r )                 { _val |= integral(flag_r); return *this; }
-
-        Flags & unsetFlag( Flags flag_r )              { _val &= ~integral(flag_r); return *this; }
-        Flags & unsetFlag( Enum flag_r )               { _val &= ~integral(flag_r); return *this; }
-
-        constexpr bool testFlag( Flags flag_r ) const  { return testFlag( integral(flag_r) ); }
-        constexpr bool testFlag( Enum flag_r ) const   { return testFlag( integral(flag_r) ); }
-
-      private:
-       constexpr bool testFlag( Integral flag ) const  { return flag ? ( _val & flag ) == flag : !_val; }
-
-       constexpr static Integral integral( Flags obj ) { return obj._val; }
-       constexpr static Integral integral( Enum obj )  { return static_cast<Integral>(obj); }
-
-        Integral _val;
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates Flags Stringify
-     * Build a string of OR'ed names of each flag value set in \a flag_r.
-     * Remaining bits in \a flag_r are added as hexstring.
-     * \code
-     *          enum E { a=1, b=2, c=4 };
-     *   ZYPP_DECLARE_FLAGS( E, MyFlags );
-     *
-     *   MyFlags f = a|b|c;
-     *   cout << f << " = " << stringify( f, { {a,"A"}, {b,"B"} } ) << endl;
-     *   // prints: 0x0007 = [A|B|0x4]
-     * \endcode
-     */
-    template<typename Enum>
-    std::string stringify( const Flags<Enum> & flag_r, const std::initializer_list<std::pair<Flags<Enum>,std::string> > & flaglist_r = {},
-                          std::string intro_r = "[", std::string sep_r = "|", std::string extro_r = "]" )
-    {
-      std::string ret( std::move(intro_r) );
-      std::string sep;
-
-      Flags<Enum> mask;
-      for ( const auto & pair : flaglist_r )
-      {
-       if ( flag_r.testFlag( pair.first ) )
-       {
-         mask |= pair.first;
-         ret += sep;
-         ret += pair.second;
-         if ( sep.empty() && !sep_r.empty() )
-         { sep = std::move(sep_r); }
-       }
-      }
-      mask = flag_r & ~mask;
-      if ( mask )
-      {
-       ret += sep;
-       ret += str::hexstring( mask, 0 );
-      }
-      ret += std::move(extro_r);
-      return ret;
-    }
-
-    template<typename TEnum>
-    inline std::ostream & operator<<( std::ostream & str, const Flags<TEnum> & obj )
-    { return str << str::hexstring(obj); }
-
-    template<typename TEnum>
-    inline std::ostream & operator<<( std::ostream & str, const typename Flags<TEnum>::Enum & obj )
-    { return str << Flags<TEnum>(obj); }
-
-    /** \relates Flags */
-#define ZYPP_DECLARE_FLAGS(Name,Enum) typedef zypp::base::Flags<Enum> Name
-
-    /** \relates Flags */
-#define ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name) \
-inline constexpr bool operator==( Name::Enum lhs, Name rhs )           { return( rhs == lhs ); }       \
-inline constexpr bool operator!=(Name:: Enum lhs, Name rhs )           { return( rhs != lhs ); }       \
-inline constexpr Name operator&( Name::Enum lhs, Name::Enum rhs )      { return Name( lhs ) & rhs; }   \
-inline constexpr Name operator&( Name::Enum lhs, Name rhs )            { return rhs & lhs; }           \
-inline constexpr Name operator|( Name::Enum lhs, Name::Enum rhs )      { return Name( lhs ) | rhs; }   \
-inline constexpr Name operator|( Name::Enum lhs, Name rhs )            { return rhs | lhs; }           \
-inline constexpr Name operator^( Name::Enum lhs, Name::Enum rhs )      { return Name( lhs ) ^ rhs; }   \
-inline constexpr Name operator^( Name::Enum lhs, Name rhs )            { return rhs ^ lhs; }           \
-inline constexpr Name operator~( Name::Enum lhs )                      { return ~Name( lhs ); }
-
-    /** \relates Flags */
-#define ZYPP_DECLARE_FLAGS_AND_OPERATORS(Name,Enum) \
-    ZYPP_DECLARE_FLAGS(Name,Enum); \
-    ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name)
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace base
-  ///////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_FLAGS_H
+#include <zypp-core/base/Flags.h>
index 3750cf1..74d3c95 100644 (file)
@@ -1,79 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Function.h
- *
-*/
-#ifndef ZYPP_BASE_FUNCTION_H
-#define ZYPP_BASE_FUNCTION_H
-
-#include <boost/function.hpp>
-#define BOOST_BIND_GLOBAL_PLACEHOLDERS
-#include <boost/bind.hpp>
-#include <boost/ref.hpp>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  /* http://www.boost.org/doc/html/function.html
-
-   The Boost.Function library contains a family of class templates
-   that are function object wrappers. The notion is similar to a
-   generalized callback. It shares features with function pointers
-   in that both define a call interface (e.g., a function taking
-   two integer arguments and returning a floating-point value)
-   through which some implementation can be called, and the
-   implementation that is invoked may change throughout the
-   course of the program.
-
-   Generally, any place in which a function pointer would be used
-   to defer a call or make a callback, Boost.Function can be used
-   instead to allow the user greater flexibility in the implementation
-   of the target. Targets can be any 'compatible' function object
-   (or function pointer), meaning that the arguments to the interface
-   designated by Boost.Function can be converted to the arguments of
-   the target function object.
-  */
-  using boost::function;
-
-  /* http://www.boost.org/libs/bind/bind.html
-
-   boost::bind is a generalization of the standard functions std::bind1st
-   and std::bind2nd. It supports arbitrary function objects, functions,
-   function pointers, and member function pointers, and is able to bind
-   any argument to a specific value or route input arguments into arbitrary
-   positions. bind  does not place any requirements on the function object;
-   in particular, it does not need the result_type, first_argument_type and
-   second_argument_type  standard typedefs.
-  */
-  using boost::bind;
-
-  /* http://www.boost.org/doc/html/ref.html
-
-   The Ref library is a small library that is useful for passing references
-   to function templates (algorithms) that would usually take copies of their
-   arguments. It defines the class template boost::reference_wrapper<T>, the
-   two functions boost::ref and boost::cref that return instances of
-   boost::reference_wrapper<T>, and the two traits classes
-   boost::is_reference_wrapper<T>  and boost::unwrap_reference<T>.
-
-   The purpose of boost::reference_wrapper<T> is to contain a reference to an
-   object of type T. It is primarily used to "feed" references to function
-   templates (algorithms) that take their parameter by value.
-
-   To support this usage, boost::reference_wrapper<T> provides an implicit
-   conversion to T&. This usually allows the function templates to work on
-   references unmodified.
-  */
-  using boost::ref;
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_FUNCTION_H
+#include <zypp-core/base/Function.h>
index 4457131..e136e3a 100644 (file)
@@ -1,65 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Gettext.h
- *
- * Interface to gettext.
- *
-*/
-#ifndef ZYPP_BASE_GETTEXT_H
-#define ZYPP_BASE_GETTEXT_H
-
-#ifdef ZYPP_DLL //defined if zypp is compiled as DLL
-
-/** Just tag text for translation. */
-#undef N_
-#define N_(MSG) MSG
-
-/** Return translated text. */
-#undef _
-#define _(MSG) ::zypp::gettext::dgettext( MSG )
-
-/** Return translated text (plural form). */
-#undef PL_
-#define PL_(MSG1,MSG2,N) ::zypp::gettext::dngettext( MSG1, MSG2, N )
-
-#else
-
-#ifndef N_
-#define N_(MSG) MSG
-#endif
-#ifndef _
-#define _(MSG) ::gettext( MSG )
-#endif
-#ifndef PL_
-#define PL_(MSG1,MSG2,N) ::ngettext( MSG1, MSG2, N )
-#endif
-
-#endif
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  ///////////////////////////////////////////////////////////////////
-  namespace gettext
-  { /////////////////////////////////////////////////////////////////
-
-    /** Return translated text. */
-    const char * dgettext( const char * msgid );
-
-    /** Return translated text (plural form). */
-    const char * dngettext( const char * msgid1, const char * msgid2,
-                            unsigned long n );
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace gettext
-  ///////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_GETTEXT_H
+#include <zypp-core/base/Gettext.h>
index 382e283..4bd3d65 100644 (file)
@@ -1,50 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Hash.h
- *
-*/
-#ifndef ZYPP_BASE_HASH_H
-#define ZYPP_BASE_HASH_H
-
-#include <iosfwd>
-#include <unordered_set>
-#include <unordered_map>
-
-/** Define hash function for id based classes.
- * Class has to provide a method \c id() retuning a unique number.
- * \code
- *  // in global namespace define:
- *  ZYPP_DEFINE_ID_HASHABLE( ::zypp::sat::Solvable )
- * \endcode
- */
-#define ZYPP_DEFINE_ID_HASHABLE(C)             \
-namespace std {                                        \
-  template<class Tp> struct hash;              \
-  template<> struct hash<C>                    \
-  {                                            \
-    size_t operator()( const C & __s ) const   \
-    { return __s.id(); }                       \
-  };                                           \
-}
-
-///////////////////////////////////////////////////////////////////
-namespace std
-{
-  /** clone function for RW_pointer */
-  template<class D>
-  inline unordered_set<D> * rwcowClone( const std::unordered_set<D> * rhs )
-  { return new std::unordered_set<D>( *rhs ); }
-
-  /** clone function for RW_pointer */
-  template<class K, class V>
-  inline std::unordered_map<K,V> * rwcowClone( const std::unordered_map<K,V> * rhs )
-  { return new std::unordered_map<K,V>( *rhs ); }
-} // namespace std
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_HASH_H
+#include <zypp-core/base/Hash.h>
index b35aa6a..37fe07d 100644 (file)
@@ -1,212 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/IOStream.h
- *
-*/
-#ifndef ZYPP_BASE_IOSTREAM_H
-#define ZYPP_BASE_IOSTREAM_H
-
-#include <iosfwd>
-#include <boost/io/ios_state.hpp>
-
-#include <zypp/base/Flags.h>
-#include <zypp/base/PtrTypes.h>
-#include <zypp/base/Function.h>
-#include <zypp/base/NonCopyable.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  ///////////////////////////////////////////////////////////////////
-  /** Iostream related utilities.
-  */
-  namespace iostr
-  { /////////////////////////////////////////////////////////////////
-
-    /** Save and restore streams \c width, \c precision
-     * and \c fmtflags.
-     */
-    typedef boost::io::ios_base_all_saver IosFmtFlagsSaver;
-
-
-    /** Read one line from stream.
-     *
-     * Reads everything up to the next newline or EOF. newline
-     * is read but not returned.
-     *
-     * \see \ref forEachLine
-     */
-    std::string getline( std::istream & str );
-
-    /** Copy istream to ostream.
-     * \return reference to the ostream.
-     */
-    inline std::ostream & copy( std::istream & from_r, std::ostream & to_r )
-    {
-      if ( from_r && to_r )
-      {
-        char ch;
-        while ( from_r && from_r.get( ch ) )
-          to_r.put( ch );
-      }
-      return to_r;
-    }
-
-    /** Copy istream to ostream, prefixing each line with \a indent_r (default <tt>"> "</tt> ).
-     * \return reference to the ostream.
-     */
-    inline std::ostream & copyIndent( std::istream & from_r, std::ostream & to_r, const std::string & indent_r = "> " )
-    {
-      if ( from_r && to_r )
-      {
-        char ch;
-        bool indent = true;
-        while ( from_r && from_r.get( ch ) )
-        {
-          if ( indent )
-            to_r << indent_r;
-          indent = ( ch == '\n' );
-          to_r.put( ch );
-        }
-      }
-      return to_r;
-    }
-
-    /** Copy istream to ostream, prefixing each line with \a indent_r (default <tt>"> "</tt> ).
-     * \return reference to the ostream.
-     */
-    inline void tee( std::istream & from_r, std::ostream & to1_r, std::ostream & to2_r )
-    {
-      if ( from_r && ( to1_r ||to2_r ) )
-      {
-        char ch;
-        while ( from_r && from_r.get( ch ) )
-        {
-          to1_r.put( ch );
-          to2_r.put( ch );
-        }
-      }
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : EachLine
-    //
-    /** Simple lineparser: Traverse each line in a file.
-     *
-     * \code
-     * std::ifstream infile( "somefile" );
-     * for( iostr::EachLine in( infile ); in; in.next() )
-     * {
-     *   DBG << *in << endl;
-     * }
-     * \endcode
-     */
-    class EachLine : private base::NonCopyable
-    {
-      public:
-       /** Ctor taking a stream and reading the 1st line from it. */
-       EachLine( std::istream & str_r, unsigned lineNo_r = 0 );
-
-       /** Whether \c this contains a valid line to consume. */
-       bool valid() const
-       { return _valid; }
-
-       /** Evaluate class in a boolean context. */
-       explicit operator bool() const
-       { return _valid; }
-
-       /** Return the current line number. */
-       unsigned lineNo() const
-       { return _lineNo; }
-
-       std::streamoff lineStart() const
-       { return _lineStart; };
-
-       /** Set current line number. */
-       void setLineNo( unsigned lineNo_r )
-       { _lineNo = lineNo_r; }
-
-       /** Access the current line. */
-       const std::string & operator*() const
-       { return _line; }
-       /** \overload non const access */
-       std::string & operator*()
-       { return _line; }
-
-       /** Access the current line. */
-       const std::string * operator->() const
-       { return &_line; }
-
-       /** Advance to next line. */
-       bool next();
-
-       /** Advance \a num_r lines. */
-       bool next( unsigned num_r )
-       {
-         while ( num_r-- && next() )
-           ; /* EMPTY */
-         return valid();
-       }
-
-      private:
-       std::istream & _str;
-       std::string    _line;
-       std::streamoff _lineStart;
-       unsigned       _lineNo;
-       bool           _valid;
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /** Simple lineparser: Call functor \a consume_r for each line.
-     *
-     * \param str_r istream to read from.
-     * \param consume_r callback function taking linenumber and content
-     *
-     * The loop is aborted if the callback  returns \c false.
-     *
-     * \code
-     *   iostr::forEachLine( InputStream( "/my/file/to/read.txt" ),
-     *                       []( int num_r, std::string line_r )->bool
-     *                       {
-     *                         MIL << " [" num_r << "]'" << line_r << "'" << endl;
-     *                         return true;
-     *                       } );
-     * \endcode
-     *
-     * \return Number if lines consumed (negative if aborted by callback).
-     */
-     int forEachLine( std::istream & str_r, function<bool(int, std::string)> consume_r );
-
-     /** \ref simpleParseFile modifications before consuming a line. */
-     enum ParseFlag
-     {
-       PF_LTRIM                        = 1 << 0,               //< left trim whitespace
-       PF_RTRIM                        = 1 << 1,               //< right trim whitespace
-       PF_TRIM                 = PF_LTRIM | PF_RTRIM,  //< trim whitespace
-       PF_SKIP_EMPTY           = 1 << 2,               //< skip lines containing whitespace only
-       PF_SKIP_SHARP_COMMENT   = 1 << 3                //< skip lines beginning with '#'
-     };
-     ZYPP_DECLARE_FLAGS( ParseFlags, ParseFlag );
-     ZYPP_DECLARE_OPERATORS_FOR_FLAGS( ParseFlags );
-
-     /** Simple lineparser optionally trimming and skipping comments. */
-     int simpleParseFile( std::istream & str_r, ParseFlags flags_r, function<bool(int, std::string)> consume_r );
-
-     /** \overload trimming lines, skipping '#'-comments and empty lines. */
-     inline int simpleParseFile( std::istream & str_r, function<bool(int, std::string)> consume_r )
-     { return simpleParseFile( str_r, PF_TRIM | PF_SKIP_EMPTY | PF_SKIP_SHARP_COMMENT , consume_r ); }
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace iostr
-  ///////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_IOSTREAM_H
+#include <zypp-core/base/IOStream.h>
index df6a679..81827fb 100644 (file)
@@ -1,74 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/IOTools.h
- *
-*/
-#ifndef ZYPP_BASE_IOTOOLS_H
-#define ZYPP_BASE_IOTOOLS_H
-
-#include <stdio.h>
-#include <utility>
-#include <string>
-#include <zypp/base/Exception.h>
-
-namespace zypp::io {
-
-  enum class BlockingMode{
-    FailedToSetMode = -1, ///< Failed to block or unblock the fd
-    WasBlocking,          ///< FD was blocking before
-    WasNonBlocking        ///< FD was non blocking before
-  };
-
-  /**
-   * Enables or disabled non blocking mode on a file descriptor.
-   * The return value is one of the \ref zypp::io::BlockingMode values
-   */
-  BlockingMode setFILEBlocking ( FILE *file, bool mode = true );
-
-
-  class TimeoutException : public Exception
-  {
-  public:
-    /** Ctor taking message.
-       * Use \ref ZYPP_THROW to throw exceptions.
-      */
-    TimeoutException() : Exception( "Timeout Exception" )
-    {}
-    /** Ctor taking message.
-       * Use \ref ZYPP_THROW to throw exceptions.
-      */
-    TimeoutException( const std::string & msg_r )
-      : Exception( msg_r )
-    {}
-
-    /** Dtor. */
-    virtual ~TimeoutException() noexcept override;
-  };
-
-  enum ReceiveUpToResult {
-    Success,
-    Timeout,
-    EndOfFile,
-    Error,
-  };
-
-  using timeout_type = size_t;
-  static const timeout_type no_timeout = static_cast<timeout_type>(-1);
-
-  /*!
-   * Reads data from \a file until it finds a seperator \a c, hits the end of the file or times out.
-   * The \a timeout value is specified in milliseconds, a timeout of -1 means no timeout.
-   * If \a failOnUnblockError is set to false the function will not error out if unblocking
-   * the file descriptor did not work. The default is to fail if it's not possible to unblock the file.
-   */
-  std::pair<ReceiveUpToResult, std::string> receiveUpto( FILE * file, char c, timeout_type timeout, bool failOnUnblockError = true );
-
-}
-
-#endif
+#include <zypp-core/base/IOTools.h>
index 8bf5533..ca98e83 100644 (file)
@@ -1,97 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Iterable.h
- */
-#ifndef ZYPP_BASE_ITERABLE_H
-#define ZYPP_BASE_ITERABLE_H
-
-#include <iterator>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{
-  ///////////////////////////////////////////////////////////////////
-  /// \class Iterable
-  /// \brief
-  /// \code
-  ///   struct Foo
-  ///   {
-  ///     class Iterator;
-  ///     typedef Iterable<Iterator> IterableType;
-  ///
-  ///     Iterator myBegin();
-  ///     Iterator myEnd();
-  ///
-  ///     IterableType iterate() { return makeIterable( myBegin(), myEnd() ); }
-  ///   };
-  /// \endcode
-  ///////////////////////////////////////////////////////////////////
-  template <class TIterator>
-  class Iterable
-  {
-  public:
-    typedef size_t size_type;
-    typedef TIterator iterator_type;
-    typedef typename std::iterator_traits<iterator_type>::value_type           value_type;
-    typedef typename std::iterator_traits<iterator_type>::difference_type      difference_type;
-    typedef typename std::iterator_traits<iterator_type>::pointer              pointer;
-    typedef typename std::iterator_traits<iterator_type>::reference            reference;
-    typedef typename std::iterator_traits<iterator_type>::iterator_category    iterator_category;
-
-    /** Ctor taking the iterator pair */
-    Iterable()
-    {}
-
-    /** Ctor taking the iterator pair */
-    Iterable( iterator_type begin_r, iterator_type end_r )
-    : _begin( std::move(begin_r) )
-    , _end( std::move(end_r) )
-    {}
-
-    /** Ctor taking the iterator pair */
-    Iterable( std::pair<iterator_type,iterator_type> range_r )
-    : _begin( std::move(range_r.first) )
-    , _end( std::move(range_r.second) )
-    {}
-
-    iterator_type begin() const
-    { return _begin; }
-
-    iterator_type end() const
-    { return _end; }
-
-    bool empty() const
-    { return( _begin == _end ); }
-
-    size_type size() const
-    { size_type ret = 0; for ( iterator_type i = _begin; i != _end; ++i ) ++ret; return ret; }
-
-    bool contains( const value_type & val_r ) const
-    { return( find( val_r ) != _end ); }
-
-    iterator_type find( const value_type & val_r ) const
-    { iterator_type ret = _begin; for ( ; ret != _end; ++ret ) if ( *ret == val_r ) break; return ret; }
-
-  private:
-    iterator_type _begin;
-    iterator_type _end;
-  };
-
-  /** \relates Iterable convenient construction. */
-  template <class TIterator>
-  Iterable<TIterator> makeIterable( TIterator && begin_r, TIterator && end_r )
-  { return Iterable<TIterator>( std::forward<TIterator>(begin_r), std::forward<TIterator>(end_r) ); }
-
-  /** \relates Iterable convenient construction. */
-  template <class TIterator>
-  Iterable<TIterator> makeIterable( std::pair<TIterator,TIterator> && range_r )
-  { return Iterable<TIterator>( std::forward<std::pair<TIterator,TIterator>>(range_r) ); }
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_ITERABLE_H
+#include <zypp-core/base/Iterable.h>
index b3a0c27..2cbfbb7 100644 (file)
@@ -1,299 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Iterator.h
- *
-*/
-#ifndef ZYPP_BASE_ITERATOR_H
-#define ZYPP_BASE_ITERATOR_H
-
-#include <iterator>
-#include <utility>
-
-#include <boost/functional.hpp>
-#include <boost/iterator/filter_iterator.hpp>
-#include <boost/iterator/transform_iterator.hpp>
-#include <boost/iterator/function_output_iterator.hpp>
-
-#include <zypp/base/Iterable.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  /** \defgroup ITERATOR Boost.Iterator Library
-   *
-   * \see http://www.boost.org/libs/iterator/doc/index.html
-   *
-   * \li \b counting_iterator: an iterator over a sequence of
-   *        consecutive values. Implements a "lazy sequence"
-   * \li \b filter_iterator: an iterator over the subset of elements
-   *        of some sequence which satisfy a given predicate
-   * \li \b function_output_iterator: an output iterator wrapping a
-   *        unary function object; each time an element is written into
-   *        the dereferenced iterator, it is passed as a parameter to
-   *        the function object.
-   * \li \b indirect_iterator: an iterator over the objects pointed-to
-   *        by the elements of some sequence.
-   * \li \b permutation_iterator: an iterator over the elements of
-   *        some random-access sequence, rearranged according to some
-   *        sequence of integer indices.
-   * \li \b reverse_iterator: an iterator which traverses the elements
-   *        of some bidirectional sequence in reverse. Corrects many of the shortcomings of C++98's std::reverse_iterator.
-   * \li \b shared_container_iterator: an iterator over elements of
-   *        a container whose lifetime is maintained by a shared_ptr
-   *        stored in the iterator.
-   * \li \b transform_iterator: an iterator over elements which are
-   *        the result of applying some functional transformation to
-   *        the elements of an underlying sequence. This component
-   *        also replaces the old projection_iterator_adaptor.
-   * \li \b zip_iterator: an iterator over tuples of the elements
-   *        at corresponding positions of heterogeneous underlying
-   *        iterators.
-   *
-   * There are in fact more interesting iterator concepts
-   * available than the ones listed above. Have a look at them.
-   *
-   * Some of the iterator types are already dragged into namespace
-   * zypp. Feel free to add what's missing.
-   *
-   * \todo Separate them into individual zypp header files.
-  */
-  //@{
-
-  /** \class filter_iterator
-   * An iterator over the subset of elements of some sequence
-   * which satisfy a given predicate.
-   *
-   * Provides boost::filter_iterator and boost::make_filter_iterator
-   * convenience function.
-   * \see http://www.boost.org/libs/iterator/doc/filter_iterator.html
-   * \code
-   * template <class Predicate, class Iterator>
-   *   filter_iterator<Predicate,Iterator>
-   *   make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
-   *
-   * template <class Predicate, class Iterator>
-   *   filter_iterator<Predicate,Iterator>
-   *   make_filter_iterator(Iterator x, Iterator end = Iterator());
-   * \endcode
-   * Remember the deduction rules for template arguments.
-   * \code
-   * struct MyDefaultConstructibleFilter;
-   * make_filter_iterator<MyDefaultConstructibleFilter>( c.begin(), c.end() );
-   * make_filter_iterator( MyDefaultConstructibleFilter(), c.begin(), c.end() );
-   * ...
-   * make_filter_iterator( resfilter::ByName("foo"), c.begin(), c.end() );
-   *
-   * \endcode
-  */
-  using boost::filter_iterator;
-  using boost::make_filter_iterator;
-
-  /** Convenience to create filter_iterator from container::begin(). */
-  template<class TFilter, class TContainer>
-    filter_iterator<TFilter, typename TContainer::const_iterator>
-    make_filter_begin( TFilter f, const TContainer & c )
-    {
-      return make_filter_iterator( f, c.begin(), c.end() );
-    }
-
-  /** Convenience to create filter_iterator from container::begin(). */
-  template<class TFilter, class TContainer>
-    filter_iterator<TFilter, typename TContainer::const_iterator>
-    make_filter_begin( const TContainer & c )
-    {
-      return make_filter_iterator( TFilter(), c.begin(), c.end() );
-    }
-
-  /** Convenience to create filter_iterator from container::end(). */
-  template<class TFilter, class TContainer>
-    filter_iterator<TFilter, typename TContainer::const_iterator>
-    make_filter_end( TFilter f, const TContainer & c )
-    {
-      return make_filter_iterator( f, c.end(), c.end() );
-    }
-
-  /** Convenience to create filter_iterator from container::end(). */
-  template<class TFilter, class TContainer>
-    filter_iterator<TFilter, typename TContainer::const_iterator>
-    make_filter_end( const TContainer & c )
-    {
-      return make_filter_iterator( TFilter(), c.end(), c.end() );
-    }
-
-  /** \class transform_iterator
-   * An iterator over elements which are the result of applying
-   * some functional transformation to the elements of an underlying
-   * sequence.
-   *
-   * Provides boost::transform_iterator and boost::make_transform_iterator
-   * convenience function.
-   * \see http://www.boost.org/libs/iterator/doc/transform_iterator.html
-   * \code
-   * template <class UnaryFunction, class Iterator>
-   *   transform_iterator<UnaryFunction, Iterator>
-   *   make_transform_iterator(Iterator it, UnaryFunction fun);
-   *
-   * template <class UnaryFunction, class Iterator>
-   *   transform_iterator<UnaryFunction, Iterator>
-   *   make_transform_iterator(Iterator it);
-   * \endcode
-  */
-  using boost::transform_iterator;
-  using boost::make_transform_iterator;
-
-  /** Functor taking a \c std::pair returning \c std::pair.first.
-   * \see MapKVIteratorTraits
-  */
-  template<class TPair>
-    struct GetPairFirst : public std::unary_function<TPair, const typename TPair::first_type &>
-    {
-      const typename TPair::first_type & operator()( const TPair & pair_r ) const
-      { return pair_r.first; }
-    };
-
-  /** Functor taking a \c std::pair returning \c std::pair.second .
-   * \see MapKVIteratorTraits
-  */
-  template<class TPair>
-    struct GetPairSecond : public std::unary_function<TPair, const typename TPair::second_type &>
-    {
-      const typename TPair::second_type & operator()( const TPair & pair_r ) const
-      { return pair_r.second; }
-    };
-
-  /** Traits for std::map key and value iterators.
-   *
-   * \ref GetPairFirst and \ref GetPairSecond help building a transform_iterator
-   * that iterates over keys or values of a std::map. Class MapKVIteratorTraits
-   * provides some typedefs, you usg. do not want to write explicitly.
-   *
-   * \code
-   * // typedefs
-   * typedef std::map<K,V> MapType;
-   *
-   * // transform_iterator<GetPairFirst<MapType::value_type>,  MapType::const_iterator>
-   * typedef MapKVIteratorTraits<MapType>::Key_const_iterator MapTypeKey_iterator;
-   * // transform_iterator<GetPairSecond<MapType::value_type>, MapType::const_iterator>
-   * typedef MapKVIteratorTraits<MapType>::Value_const_iterator  MapTypeValue_iterator;
-   *
-   * // usage
-   * MapType mymap;
-   *
-   * MapTypeKey_const_iterator keyBegin( make_map_key_begin( mymap ) );
-   * MapTypeKey_const_iterator keyEnd  ( make_map_key_end( mymap ) );
-   *
-   * MapTypeValue_const_iterator valBegin( make_map_value_begin( mymap ) );
-   * MapTypeValue_const_iterator valEnd  ( make_map_value_end( mymap ) );
-   *
-   * std::for_each( keyBegin, keyEnd, DoSomething() );
-   * std::for_each( valBegin, valEnd, DoSomething() );
-   * \endcode
-   *
-   * Or short:
-   *
-   * \code
-   * typedef std::map<K,V> MapType;
-   * MapType mymap;
-   *
-   * std::for_each( make_map_key_begin( mymap ),   make_map_key_end( mymap ),   DoSomething() );
-   * std::for_each( make_map_value_begin( mymap ), make_map_value_end( mymap ), DoSomething() );
-   * \endcode
-   */
-  template<class TMap>
-    struct MapKVIteratorTraits
-    {
-      /** The map type */
-      typedef TMap                       MapType;
-      /** The maps key type */
-      typedef typename TMap::key_type    KeyType;
-      /** The key iterator type */
-      typedef transform_iterator<GetPairFirst<typename MapType::value_type>,
-                                 typename MapType::const_iterator> Key_const_iterator;
-      /** The maps value (mapped) type */
-      typedef typename TMap::mapped_type ValueType;
-      /** The value iterator type */
-      typedef transform_iterator<GetPairSecond<typename MapType::value_type>,
-                                 typename MapType::const_iterator> Value_const_iterator;
-    };
-
-  /** Convenience to create the key iterator from container::begin() */
-  template<class TMap>
-    inline typename MapKVIteratorTraits<TMap>::Key_const_iterator make_map_key_begin( const TMap & map_r )
-    { return make_transform_iterator( map_r.begin(), GetPairFirst<typename TMap::value_type>() ); }
-
-  /** Convenience to create the key iterator from container::end() */
-  template<class TMap>
-    inline typename MapKVIteratorTraits<TMap>::Key_const_iterator make_map_key_end( const TMap & map_r )
-    { return make_transform_iterator( map_r.end(), GetPairFirst<typename TMap::value_type>() ); }
-
-  /** Convenience to create the value iterator from container::begin() */
-  template<class TMap>
-    inline typename MapKVIteratorTraits<TMap>::Value_const_iterator make_map_value_begin( const TMap & map_r )
-    { return make_transform_iterator( map_r.begin(), GetPairSecond<typename TMap::value_type>() ); }
-
-  /** Convenience to create the value iterator from container::end() */
-  template<class TMap>
-    inline typename MapKVIteratorTraits<TMap>::Value_const_iterator make_map_value_end( const TMap & map_r )
-    { return make_transform_iterator( map_r.end(), GetPairSecond<typename TMap::value_type>() ); }
-
-  /** Convenience to create the key iterator from container::lower_bound() */
-  template<class TMap>
-    inline typename MapKVIteratorTraits<TMap>::Key_const_iterator make_map_key_lower_bound( const TMap & map_r, const typename TMap::key_type & key_r )
-    { return make_transform_iterator( map_r.lower_bound( key_r ), GetPairFirst<typename TMap::value_type>() ); }
-
-  /** Convenience to create the key iterator from container::upper_bound() */
-  template<class TMap>
-    inline typename MapKVIteratorTraits<TMap>::Key_const_iterator make_map_key_upper_bound( const TMap & map_r, const typename TMap::key_type & key_r )
-    { return make_transform_iterator( map_r.upper_bound( key_r ), GetPairFirst<typename TMap::value_type>() ); }
-
-  /** Convenience to create the value iterator from container::lower_bound() */
-  template<class TMap>
-    inline typename MapKVIteratorTraits<TMap>::Value_const_iterator make_map_value_lower_bound( const TMap & map_r, const typename TMap::key_type & key_r )
-    { return make_transform_iterator( map_r.lower_bound( key_r ), GetPairSecond<typename TMap::value_type>() ); }
-
-  /** Convenience to create the value iterator from container::upper_bound() */
-  template<class TMap>
-    inline typename MapKVIteratorTraits<TMap>::Value_const_iterator make_map_value_upper_bound( const TMap & map_r, const typename TMap::key_type & key_r )
-    { return make_transform_iterator( map_r.upper_bound( key_r ), GetPairSecond<typename TMap::value_type>() ); }
-
-
-  /** Convenience to create an \ref Iterable over the container keys */
-  template<class TMap>
-  inline Iterable<typename MapKVIteratorTraits<TMap>::Key_const_iterator> make_map_key_Iterable( const TMap & map_r )
-  { return makeIterable( make_map_key_begin( map_r ), make_map_key_end( map_r ) ); }
-
-  /** Convenience to create an \ref Iterable over the container values */
-  template<class TMap>
-  inline Iterable<typename MapKVIteratorTraits<TMap>::Value_const_iterator> make_map_value_Iterable( const TMap & map_r )
-  { return makeIterable( make_map_value_begin( map_r ), make_map_value_end( map_r ) ); }
-
-
-  /** \class function_output_iterator
-   * An output iterator wrapping a unary function object; each time an
-   * element is written into the dereferenced iterator, it is passed as
-   * a parameter to the function object.
-   *
-   * Provides boost::function_output_iterator and boost::make_function_output_iterator
-   * convenience function.
-   * \see http://www.boost.org/libs/iterator/doc/function_output_iterator.html
-   * \code
-   * template <class UnaryFunction>
-   *   function_output_iterator<UnaryFunction>
-   *   make_function_output_iterator(const UnaryFunction& f = UnaryFunction());
-   * \endcode
-  */
-  using boost::function_output_iterator;
-  using boost::make_function_output_iterator;
-
-  //@}
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_ITERATOR_H
+#include <zypp-core/base/Iterator.h>
index 50d3d2b..58da1b1 100644 (file)
@@ -1,209 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/LogControl.h
- *
-*/
-#ifndef ZYPP_BASE_LOGCONTROL_H
-#define ZYPP_BASE_LOGCONTROL_H
-
-#include <iosfwd>
-#include <ostream> //for std::endl
-
-#include <zypp/base/Logger.h>
-#include <zypp/base/PtrTypes.h>
-#include <zypp/Pathname.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  ///////////////////////////////////////////////////////////////////
-  namespace log
-  { /////////////////////////////////////////////////////////////////
-
-    /** If you want to log the (formated) loglines by yourself,
-     *  derive from this, and overload \c writeOut.
-     * Expect \a formated_r to be a formated log line without trailing \c NL.
-     * Ready to be written to the log.
-     */
-    struct LineWriter
-    {
-      virtual void writeOut( const std::string & /*formated_r*/ )
-      {}
-      virtual ~LineWriter()
-      {}
-    };
-
-    /** Base class for ostream based \ref LineWriter */
-    struct StreamLineWriter : public LineWriter
-    {
-      StreamLineWriter( std::ostream & str_r ) : _str( &str_r ) {}
-
-      virtual void writeOut( const std::string & formated_r )
-      { (*_str) << formated_r << std::endl; }
-
-      protected:
-        StreamLineWriter() : _str( 0 ) {}
-        std::ostream *_str;
-    };
-
-    /** \ref LineWriter to stdout. */
-    struct StdoutLineWriter : public StreamLineWriter
-    {
-      StdoutLineWriter();
-    };
-
-    /** \ref LineWriter to stderr. */
-    struct StderrLineWriter : public StreamLineWriter
-    {
-      StderrLineWriter();
-    };
-
-    /** \ref LineWriter to file.
-     * If \c mode_r is not \c 0, \c file_r persissions are changed
-     * accordingly. \c "-" logs to \c cerr.
-    */
-    struct FileLineWriter : public StreamLineWriter
-    {
-      FileLineWriter( const Pathname & file_r, mode_t mode_r = 0 );
-      protected:
-        shared_ptr<void> _outs;
-    };
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace log
-  ///////////////////////////////////////////////////////////////////
-
-
-  ///////////////////////////////////////////////////////////////////
-  namespace base
-  { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : LogControl
-    //
-    /** Maintain logfile related options.
-     * \note A Singleton using a Singleton implementation class,
-     * that's why there is no _pimpl like in other classes.
-    */
-    class LogControl
-    {
-      friend std::ostream & operator<<( std::ostream & str, const LogControl & obj );
-
-    public:
-      /** Singleton access. */
-      static LogControl instance()
-      { return LogControl(); }
-
-
-      /** \see \ref log::LineWriter */
-      typedef log::LineWriter LineWriter;
-
-      /** If you want to format loglines by yourself,
-       *  derive from this, and overload \c format.
-       * Return a formated logline without trailing \c NL.
-       * Ready to be written to the log.
-      */
-      struct LineFormater
-      {
-        virtual std::string format( const std::string & /*group_r*/,
-                                    logger::LogLevel    /*level_r*/,
-                                    const char *        /*file_r*/,
-                                    const char *        /*func_r*/,
-                                    int                 /*line_r*/,
-                                    const std::string & /*message_r*/ );
-        virtual ~LineFormater() {}
-      };
-
-    public:
-      /** Assign a LineFormater.
-       * If you want to format loglines by yourself. NULL installs the
-       * default formater.
-      */
-      void setLineFormater( const shared_ptr<LineFormater> & formater_r );
-
-    public:
-      /** Set path for the logfile.
-       * Permission for logfiles is set to 0640 unless an explicit mode_t
-       * value is given. An empty pathname turns off logging. <tt>"-"</tt>
-       * logs to std::err.
-       * \throw if \a logfile_r is not usable.
-      */
-      void logfile( const Pathname & logfile_r );
-      void logfile( const Pathname & logfile_r, mode_t mode_r );
-
-      /** Turn off logging. */
-      void logNothing();
-
-      /** Log to std::err. */
-      void logToStdErr();
-
-    public:
-      /** Get the current LineWriter */
-      shared_ptr<LineWriter> getLineWriter() const;
-
-      /** Assign a LineWriter.
-       * If you want to log the (formated) loglines by yourself.
-       * NULL turns off logging (same as logNothing)
-       * \see \ref log::LineWriter
-       */
-      void setLineWriter( const shared_ptr<LineWriter> & writer_r );
-
-    public:
-      /** Turn on excessive logging for the lifetime of this object.*/
-      struct TmpExcessive
-      {
-        TmpExcessive();
-        ~TmpExcessive();
-      };
-
-      /** Exchange LineWriter for the lifetime of this object.
-       * \see \ref log::LineWriter
-      */
-      struct TmpLineWriter
-      {
-        TmpLineWriter( const shared_ptr<LineWriter> & writer_r = shared_ptr<LineWriter>() )
-          : _writer( LogControl::instance().getLineWriter() )
-        { LogControl::instance().setLineWriter( writer_r ); }
-
-        /** Convenience ctor taking over ownership of an allocated LineWriter.
-         *\code
-         * TmpLineWriter mylw( new log::StderrLineWriter );
-         * \endcode
-        */
-        template<class TLineWriter>
-        TmpLineWriter( TLineWriter * _allocated_r )
-          : _writer( LogControl::instance().getLineWriter() )
-        { LogControl::instance().setLineWriter( shared_ptr<LineWriter>( _allocated_r ) ); }
-
-        ~TmpLineWriter()
-        { LogControl::instance().setLineWriter( _writer ); }
-
-      private:
-        shared_ptr<LineWriter> _writer;
-      };
-
-    private:
-      /** Default ctor: Singleton */
-      LogControl()
-      {}
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates LogControl Stream output */
-    std::ostream & operator<<( std::ostream & str, const LogControl & obj );
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace base
-  ///////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_LOGCONTROL_H
+#include <zypp-core/base/LogControl.h>
index 09850a9..e7bf2ba 100644 (file)
@@ -1,440 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/LogTools.h
- *
-*/
-#ifndef ZYPP_BASE_LOGTOOLS_H
-#define ZYPP_BASE_LOGTOOLS_H
-
-#include <iostream>
-#include <string>
-#include <vector>
-#include <list>
-#include <set>
-#include <map>
-
-#include <zypp/base/Hash.h>
-#include <zypp/base/Logger.h>
-#include <zypp/base/Iterator.h>
-#include <zypp/APIConfig.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  using std::endl;
-
-  /** Print range defined by iterators (multiline style).
-   * \code
-   * intro [ pfx ITEM [ { sep ITEM }+ ] sfx ] extro
-   * \endcode
-   *
-   * The defaults print the range enclosed in \c {}, one item per
-   * line indented by 2 spaces.
-   * \code
-   * {
-   *   item1
-   *   item2
-   * }
-   * {} // on empty range
-   * \endcode
-   *
-   * A comma separated list enclosed in \c () would be:
-   * \code
-   * dumpRange( stream, begin, end, "(", "", ", ", "", ")" );
-   * // or shorter:
-   * dumpRangeLine( stream, begin, end );
-   * \endcode
-   *
-   * \note Some special handling is required for printing std::maps.
-   * Therefore iomaipulators \ref dumpMap, \ref dumpKeys and \ref dumpValues
-   * are provided.
-   * \code
-   * std::map<string,int> m;
-   * m["a"]=1;
-   * m["b"]=2;
-   * m["c"]=3;
-   *
-   * dumpRange( DBG, dumpMap(m).begin(), dumpMap(m).end() ) << endl;
-   * // {
-   * //   [a] = 1
-   * //   [b] = 2
-   * //   [c] = 3
-   * // }
-   * dumpRange( DBG, dumpKeys(m).begin(), dumpKeys(m).end() ) << endl;
-   * // {
-   * //   a
-   * //   b
-   * //   c
-   * // }
-   * dumpRange( DBG, dumpValues(m).begin(), dumpValues(m).end() ) << endl;
-   * // {
-   * //   1
-   * //   2
-   * //   3
-   * // }
-   * dumpRangeLine( DBG, dumpMap(m).begin(), dumpMap(m).end() ) << endl;
-   * // ([a] = 1, [b] = 2, [c] = 3)
-   * dumpRangeLine( DBG, dumpKeys(m).begin(), dumpKeys(m).end() ) << endl;
-   * // (a, b, c)
-   * dumpRangeLine( DBG, dumpValues(m).begin(), dumpValues(m).end() ) << endl;
-   * // (1, 2, 3)
-   * \endcode
-  */
-  template<class TIterator>
-    std::ostream & dumpRange( std::ostream & str,
-                              TIterator begin, TIterator end,
-                              const std::string & intro = "{",
-                              const std::string & pfx   = "\n  ",
-                              const std::string & sep   = "\n  ",
-                              const std::string & sfx   = "\n",
-                              const std::string & extro = "}" )
-    {
-      str << intro;
-      if ( begin != end )
-        {
-          str << pfx << *begin;
-          for (  ++begin; begin != end; ++begin )
-            str << sep << *begin;
-          str << sfx;
-        }
-      return str << extro;
-    }
-
-  /** Print range defined by iterators (single line style).
-   * \see dumpRange
-   */
-  template<class TIterator>
-    std::ostream & dumpRangeLine( std::ostream & str,
-                                  TIterator begin, TIterator end )
-    { return dumpRange( str, begin, end, "(", "", ", ", "", ")" ); }
-  /** \overload for container */
-  template<class TContainer>
-    std::ostream & dumpRangeLine( std::ostream & str, const TContainer & cont )
-    { return dumpRangeLine( str, cont.begin(), cont.end() ); }
-
-
-  ///////////////////////////////////////////////////////////////////
-  namespace iomanip
-  {
-    ///////////////////////////////////////////////////////////////////
-    /// \class RangeLine<TIterator>
-    /// \brief Iomanip helper printing dumpRangeLine style
-    ///////////////////////////////////////////////////////////////////
-    template<class TIterator>
-    struct RangeLine
-    {
-      RangeLine( TIterator begin, TIterator end )
-      : _begin( begin )
-      , _end( end )
-      {}
-      TIterator _begin;
-      TIterator _end;
-    };
-
-    /** \relates RangeLine<TIterator> */
-    template<class TIterator>
-    std::ostream & operator<<( std::ostream & str, const RangeLine<TIterator> & obj )
-    { return dumpRangeLine( str, obj._begin, obj._end ); }
-
-  } // namespce iomanip
-  ///////////////////////////////////////////////////////////////////
-
-  /** Iomanip printing dumpRangeLine style
-   * \code
-   *   std::vector<int> c( { 1, 1, 2, 3, 5, 8 } );
-   *   std::cout << rangeLine(c) << std::endl;
-   *   -> (1, 1, 2, 3, 5, 8)
-   * \endcode
-   */
-  template<class TIterator>
-  iomanip::RangeLine<TIterator> rangeLine( TIterator begin, TIterator end )
-  { return iomanip::RangeLine<TIterator>( begin, end ); }
-  /** \overload for container */
-  template<class TContainer>
-  auto rangeLine( const TContainer & cont ) -> decltype( rangeLine( cont.begin(), cont.end() ) )
-  { return rangeLine( cont.begin(), cont.end() ); }
-
-  template<class Tp>
-    std::ostream & operator<<( std::ostream & str, const std::vector<Tp> & obj )
-    { return dumpRange( str, obj.begin(), obj.end() ); }
-
-  template<class Tp, class TCmp, class TAlloc>
-    std::ostream & operator<<( std::ostream & str, const std::set<Tp,TCmp,TAlloc> & obj )
-    { return dumpRange( str, obj.begin(), obj.end() ); }
-
-  template<class Tp>
-    std::ostream & operator<<( std::ostream & str, const std::unordered_set<Tp> & obj )
-    { return dumpRange( str, obj.begin(), obj.end() ); }
-
-  template<class Tp>
-    std::ostream & operator<<( std::ostream & str, const std::multiset<Tp> & obj )
-    { return dumpRange( str, obj.begin(), obj.end() ); }
-
-  template<class Tp>
-    std::ostream & operator<<( std::ostream & str, const std::list<Tp> & obj )
-    { return dumpRange( str, obj.begin(), obj.end() ); }
-
-  template<class Tp>
-    std::ostream & operator<<( std::ostream & str, const Iterable<Tp> & obj )
-    { return dumpRange( str, obj.begin(), obj.end() ); }
-
-  ///////////////////////////////////////////////////////////////////
-  namespace _logtoolsdetail
-  { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    // mapEntry
-    ///////////////////////////////////////////////////////////////////
-
-    /** std::pair wrapper for std::map output.
-     * Just because we want a special output format for std::pair
-     * used in a std::map. The mapped std::pair is printed as
-     * <tt>[key] = value</tt>.
-    */
-    template<class TPair>
-      class MapEntry
-      {
-      public:
-        MapEntry( const TPair & pair_r )
-        : _pair( &pair_r )
-        {}
-
-        const TPair & pair() const
-        { return *_pair; }
-
-      private:
-        const TPair *const _pair;
-      };
-
-    /** \relates MapEntry Stream output. */
-    template<class TPair>
-      std::ostream & operator<<( std::ostream & str, const MapEntry<TPair> & obj )
-      {
-        return str << '[' << obj.pair().first << "] = " << obj.pair().second;
-      }
-
-    /** \relates MapEntry Convenience function to create MapEntry from std::pair. */
-    template<class TPair>
-      MapEntry<TPair> mapEntry( const TPair & pair_r )
-      { return MapEntry<TPair>( pair_r ); }
-
-    ///////////////////////////////////////////////////////////////////
-    // dumpMap
-    ///////////////////////////////////////////////////////////////////
-
-    /** std::map wrapper for stream output.
-     * Uses a transform_iterator to wrap the std::pair into MapEntry.
-     *
-     */
-    template<class TMap>
-      class DumpMap
-      {
-      public:
-        typedef TMap                        MapType;
-        typedef typename TMap::value_type   PairType;
-        typedef MapEntry<PairType>          MapEntryType;
-
-        struct Transformer : public std::unary_function<PairType, MapEntryType>
-        {
-          MapEntryType operator()( const PairType & pair_r ) const
-          { return mapEntry( pair_r ); }
-        };
-
-        typedef transform_iterator<Transformer, typename MapType::const_iterator>
-                MapEntry_const_iterator;
-
-      public:
-        DumpMap( const TMap & map_r )
-        : _map( &map_r )
-        {}
-
-        const TMap & map() const
-        { return *_map; }
-
-        MapEntry_const_iterator begin() const
-        { return make_transform_iterator( map().begin(), Transformer() ); }
-
-        MapEntry_const_iterator end() const
-        { return make_transform_iterator( map().end(), Transformer() );}
-
-      private:
-        const TMap *const _map;
-      };
-
-    /** \relates DumpMap Stream output. */
-    template<class TMap>
-      std::ostream & operator<<( std::ostream & str, const DumpMap<TMap> & obj )
-      { return dumpRange( str, obj.begin(), obj.end() ); }
-
-    /** \relates DumpMap Convenience function to create DumpMap from std::map. */
-    template<class TMap>
-      DumpMap<TMap> dumpMap( const TMap & map_r )
-      { return DumpMap<TMap>( map_r ); }
-
-    ///////////////////////////////////////////////////////////////////
-    // dumpKeys
-    ///////////////////////////////////////////////////////////////////
-
-    /** std::map wrapper for stream output of keys.
-     * Uses MapKVIterator iterate and write the key values.
-     * \code
-     * std::map<...> mymap;
-     * std::cout << dumpKeys(mymap) << std::endl;
-     * \endcode
-     */
-    template<class TMap>
-      class DumpKeys
-      {
-      public:
-        typedef typename MapKVIteratorTraits<TMap>::Key_const_iterator MapKey_const_iterator;
-
-      public:
-        DumpKeys( const TMap & map_r )
-        : _map( &map_r )
-        {}
-
-        const TMap & map() const
-        { return *_map; }
-
-        MapKey_const_iterator begin() const
-        { return make_map_key_begin( map() ); }
-
-        MapKey_const_iterator end() const
-        { return make_map_key_end( map() ); }
-
-      private:
-        const TMap *const _map;
-      };
-
-    /** \relates DumpKeys Stream output. */
-    template<class TMap>
-      std::ostream & operator<<( std::ostream & str, const DumpKeys<TMap> & obj )
-      { return dumpRange( str, obj.begin(), obj.end() ); }
-
-    /** \relates DumpKeys Convenience function to create DumpKeys from std::map. */
-    template<class TMap>
-      DumpKeys<TMap> dumpKeys( const TMap & map_r )
-      { return DumpKeys<TMap>( map_r ); }
-
-    ///////////////////////////////////////////////////////////////////
-    // dumpValues
-    ///////////////////////////////////////////////////////////////////
-
-    /** std::map wrapper for stream output of values.
-     * Uses MapKVIterator iterate and write the values.
-     * \code
-     * std::map<...> mymap;
-     * std::cout << dumpValues(mymap) << std::endl;
-     * \endcode
-     */
-    template<class TMap>
-      class DumpValues
-      {
-      public:
-        typedef typename MapKVIteratorTraits<TMap>::Value_const_iterator MapValue_const_iterator;
-
-      public:
-        DumpValues( const TMap & map_r )
-        : _map( &map_r )
-        {}
-
-        const TMap & map() const
-        { return *_map; }
-
-        MapValue_const_iterator begin() const
-        { return make_map_value_begin( map() ); }
-
-        MapValue_const_iterator end() const
-        { return make_map_value_end( map() ); }
-
-      private:
-        const TMap *const _map;
-      };
-
-    /** \relates DumpValues Stream output. */
-    template<class TMap>
-      std::ostream & operator<<( std::ostream & str, const DumpValues<TMap> & obj )
-      { return dumpRange( str, obj.begin(), obj.end() ); }
-
-    /** \relates DumpValues Convenience function to create DumpValues from std::map. */
-    template<class TMap>
-      DumpValues<TMap> dumpValues( const TMap & map_r )
-      { return DumpValues<TMap>( map_r ); }
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace _logtoolsdetail
-  ///////////////////////////////////////////////////////////////////
-
-  // iomanipulator
-  using _logtoolsdetail::mapEntry;   // std::pair as '[key] = value'
-  using _logtoolsdetail::dumpMap;    // dumpRange '[key] = value'
-  using _logtoolsdetail::dumpKeys;   // dumpRange keys
-  using _logtoolsdetail::dumpValues; // dumpRange values
-
-  template<class TKey, class Tp>
-    std::ostream & operator<<( std::ostream & str, const std::map<TKey, Tp> & obj )
-    { return str << dumpMap( obj ); }
-
-  template<class TKey, class Tp>
-    std::ostream & operator<<( std::ostream & str, const std::unordered_map<TKey, Tp> & obj )
-    { return str << dumpMap( obj ); }
-
-  template<class TKey, class Tp>
-    std::ostream & operator<<( std::ostream & str, const std::multimap<TKey, Tp> & obj )
-    { return str << dumpMap( obj ); }
-
-  /** Print stream status bits.
-   * Prints the values of a streams \c good, \c eof, \c failed and \c bad bit.
-   *
-   * \code
-   *  [g___] - good
-   *  [_eF_] - eof and fail bit set
-   *  [__FB] - fail and bad bit set
-   * \endcode
-  */
-  inline std::ostream & operator<<( std::ostream & str, const std::basic_ios<char> & obj )
-  {
-    std::string ret( "[" );
-    ret += ( obj.good() ? 'g' : '_' );
-    ret += ( obj.eof()  ? 'e' : '_' );
-    ret += ( obj.fail() ? 'F' : '_' );
-    ret += ( obj.bad()  ? 'B' : '_' );
-    ret += "]";
-    return str << ret;
-  }
-
-  ///////////////////////////////////////////////////////////////////
-  // iomanipulator: str << dump(val) << ...
-  // calls:         std::ostream & dumpOn( std::ostream & str, const Type & obj )
-  ///////////////////////////////////////////////////////////////////
-
-  namespace detail
-  {
-    template<class Tp>
-    struct Dump
-    {
-      Dump( const Tp & obj_r ) : _obj( obj_r ) {}
-      const Tp & _obj;
-    };
-
-    template<class Tp>
-    std::ostream & operator<<( std::ostream & str, const Dump<Tp> & obj )
-    { return dumpOn( str, obj._obj ); }
-  }
-
-  template<class Tp>
-  detail::Dump<Tp> dump( const Tp & obj_r )
-  { return detail::Dump<Tp>(obj_r); }
-
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_LOGTOOLS_H
+#include <zypp-core/base/LogTools.h>
index 142a832..adb9515 100644 (file)
@@ -1,173 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/base/Logger.h
- *
-*/
-#ifndef ZYPP_BASE_LOGGER_H
-#define ZYPP_BASE_LOGGER_H
-#include <cstring>
-#include <iosfwd>
-#include <string>
-
-///////////////////////////////////////////////////////////////////
-#ifndef ZYPP_NDEBUG
-namespace zypp
-{
-  namespace debug
-  { // impl in LogControl.cc
-
-    // Log code loacaton and block leave
-    // Indent if nested
-    struct TraceLeave
-    {
-      TraceLeave( const TraceLeave & ) =delete;
-      TraceLeave & operator=( const TraceLeave & ) =delete;
-      TraceLeave( const char * file_r, const char * fnc_r, int line_r );
-      ~TraceLeave();
-    private:
-      static unsigned _depth;
-      const char *    _file;
-      const char *    _fnc;
-      int             _line;
-    };
-#define TRACE ::zypp::debug::TraceLeave _TraceLeave( __FILE__, __FUNCTION__, __LINE__ )
-
-    // OnScreenDebug messages colored to stderr
-    struct Osd
-    {
-      Osd( std::ostream &, int = 0 );
-      ~Osd();
-
-      template<class Tp>
-      Osd & operator<<( Tp && val )
-      {
-       _strout << std::forward<Tp>(val);
-       _strlog << std::forward<Tp>(val);
-       return *this;
-      }
-
-      Osd & operator<<( std::ostream& (*iomanip)( std::ostream& ) );
-
-    private:
-      std::ostream & _strout;
-      std::ostream & _strlog;
-    };
-#define OSD ::zypp::debug::Osd(L_USR("OSD"))
-  }
-}
-#endif // ZYPP_NDEBUG
-///////////////////////////////////////////////////////////////////
-
-/** \defgroup ZYPP_BASE_LOGGER_MACROS ZYPP_BASE_LOGGER_MACROS
- *  Convenience macros for logging.
- *
- * The macros finaly call @ref getStream, providing appropriate arguments,
- * to return the log stream.
- *
- * @code
- * L_DBG("foo") << ....
- * @endcode
- * Logs a debug message for group @a "foo".
- *
- * @code
- * #undef ZYPP_BASE_LOGGER_LOGGROUP
- * #define ZYPP_BASE_LOGGER_LOGGROUP "foo"
- *
- * DBG << ....
- * @endcode
- * Defines group @a "foo" as default for log messages and logs a
- * debug message.
- */
-/*@{*/
-
-#ifndef ZYPP_BASE_LOGGER_LOGGROUP
-/** Default log group if undefined. */
-#define ZYPP_BASE_LOGGER_LOGGROUP "DEFINE_LOGGROUP"
-#endif
-
-#define XXX L_XXX( ZYPP_BASE_LOGGER_LOGGROUP )
-#define DBG L_DBG( ZYPP_BASE_LOGGER_LOGGROUP )
-#define MIL L_MIL( ZYPP_BASE_LOGGER_LOGGROUP )
-#define WAR L_WAR( ZYPP_BASE_LOGGER_LOGGROUP )
-#define ERR L_ERR( ZYPP_BASE_LOGGER_LOGGROUP )
-#define SEC L_SEC( ZYPP_BASE_LOGGER_LOGGROUP )
-#define INT L_INT( ZYPP_BASE_LOGGER_LOGGROUP )
-#define USR L_USR( ZYPP_BASE_LOGGER_LOGGROUP )
-
-#define L_XXX(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_XXX )
-#define L_DBG(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP"++", zypp::base::logger::E_MIL )
-#define L_MIL(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_MIL )
-#define L_WAR(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_WAR )
-#define L_ERR(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_ERR )
-#define L_SEC(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_SEC )
-#define L_INT(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_INT )
-#define L_USR(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_USR )
-
-#define L_BASEFILE ( *__FILE__ == '/' ? strrchr( __FILE__, '/' ) + 1 : __FILE__ )
-
-/** Actual call to @ref getStream. */
-#define ZYPP_BASE_LOGGER_LOG(GROUP,LEVEL) \
-        zypp::base::logger::getStream( GROUP, LEVEL, L_BASEFILE, __FUNCTION__, __LINE__ )
-
-/*@}*/
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  ///////////////////////////////////////////////////////////////////
-  namespace base
-  { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    namespace logger
-    { /////////////////////////////////////////////////////////////////
-
-      /** Definition of log levels.
-       *
-       * @see getStream
-      */
-      enum LogLevel {
-        E_XXX = 999, /**< Excessive logging. */
-        E_DBG = 0,   /**< Debug or verbose. */
-        E_MIL,       /**< Milestone. */
-        E_WAR,       /**< Warning. */
-        E_ERR,       /**< Error. */
-        E_SEC,       /**< Secutrity related. */
-        E_INT,       /**< Internal error. */
-        E_USR        /**< User log. */
-      };
-
-      /** Return a log stream to write on.
-       *
-       * The returned log stream is determined by @a group_r and
-       * @a level_r. The remaining arguments @a file_r, @a func_r
-       * and @a line_r are expected to denote the location in the
-       * source code that issued the message.
-       *
-       * @note You won't call @ref getStream directly, but use the
-       * @ref ZYPP_BASE_LOGGER_MACROS.
-      */
-      extern std::ostream & getStream( const char * group_r,
-                                       LogLevel     level_r,
-                                       const char * file_r,
-                                       const char * func_r,
-                                       const int    line_r );
-      extern bool isExcessive();
-
-      /////////////////////////////////////////////////////////////////
-    } // namespace logger
-    ///////////////////////////////////////////////////////////////////
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace base
-  ///////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_LOGGER_H
+#include <zypp-core/base/Logger.h>
index 78d2cfb..8377350 100644 (file)
@@ -1,34 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/base/NonCopyable.h
-*/
-#ifndef ZYPP_BASE_NONCOPYABLE_H
-#define ZYPP_BASE_NONCOPYABLE_H
-
-#include <boost/noncopyable.hpp>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  ///////////////////////////////////////////////////////////////////
-  namespace base
-  { /////////////////////////////////////////////////////////////////
-
-    /** Ensure derived classes cannot be copied.
-     * Use private inheritance.
-    */
-    typedef boost::noncopyable NonCopyable;
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace base
-  ///////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_NONCOPYABLE_H
+#include <zypp-core/base/NonCopyable.h>
index 3980064..21048bd 100644 (file)
@@ -1,44 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/ProfilingFormater.h
- *
-*/
-#ifndef ZYPP_BASE_PROFILINGFORMATER_H
-#define ZYPP_BASE_PROFILINGFORMATER_H
-
-#include <iosfwd>
-#include <string>
-#include <zypp/base/LogControl.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  ///////////////////////////////////////////////////////////////////
-  namespace base
-  { /////////////////////////////////////////////////////////////////
-
-    struct ProfilingFormater : public LogControl::LineFormater
-    {
-      virtual std::string format( const std::string & /*group_r*/,
-                                  logger::LogLevel    /*level_r*/,
-                                  const char *        /*file_r*/,
-                                  const char *        /*func_r*/,
-                                  int                 /*line_r*/,
-                                  const std::string & /*message_r*/ );
-      virtual ~ProfilingFormater() {}
-    };
-
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace base
-  ///////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_PROFILINGFORMATER_H
+#include <zypp-core/base/ProfilingFormater.h>
index d0a6cf4..4f408e7 100644 (file)
@@ -1,631 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/base/PtrTypes.h
- *  \ingroup ZYPP_SMART_PTR
- *  \see ZYPP_SMART_PTR
-*/
-#ifndef ZYPP_BASE_PTRTYPES_H
-#define ZYPP_BASE_PTRTYPES_H
-
-#include <iosfwd>
-#include <string>
-
-#include <boost/scoped_ptr.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/weak_ptr.hpp>
-#include <boost/intrusive_ptr.hpp>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  namespace str
-  {
-    // printing void* (prevents us from including <ostream>)
-    std::string form( const char * format, ... ) __attribute__ ((format (printf, 1, 2)));
-  }
-
-    /** \defgroup ZYPP_SMART_PTR Smart pointer types
-     *  Smart pointer types.
-     *
-     * Namespace zypp provides 3 smart pointer types \b using the
-     * boost smart pointer library.
-     *
-     * \li \c scoped_ptr Simple sole ownership of single objects. Noncopyable.
-     *
-     * \li \c shared_ptr Object ownership shared among multiple pointers
-     *
-     * \li \c weak_ptr Non-owning observers of an object owned by shared_ptr.
-     *
-     * And \ref zypp::RW_pointer, as wrapper around a smart pointer,
-     * poviding \c const correct read/write access to the object it refers.
-    */
-    /*@{*/
-
-    /** shared_ptr custom deleter doing nothing.
-     * A custom deleter is a function being called when the
-     * last shared_ptr goes out of score. Per default the
-     * object gets deleted, but you can insall custom deleters
-     * as well. This one does nothing.
-     *
-     * \code
-     *  // Some class providing a std::istream
-     *  struct InpuStream
-     * {
-     *   // Per deafult use std::cin.
-     *   InputStream()
-     *   : _stream( &std::cin, NullDeleter() )
-     *   {}
-     *   // Or read from a file.
-     *   InputStream( const Pathname & file_r )
-     *   : _stream( new ifgzstream( _path.asString().c_str() ) )
-     *   {}
-     *   // Or use a stream priovided by the application.
-     *   InputStream( std::istream & stream_r )
-     *   : _stream( &stream_r, NullDeleter() )
-     *   {}
-     *
-     *   std::istream & stream()
-     *   { return *_stream; }
-     *
-     * private:
-     *   shared_ptr<std::istream> _stream;
-     * };
-     * \endcode
-    */
-    struct NullDeleter
-    {
-      void operator()( const void *const ) const
-      {}
-    };
-
-    /** \class scoped_ptr */
-    using boost::scoped_ptr;
-
-    /** \class shared_ptr */
-    using boost::shared_ptr;
-
-    /** \class weak_ptr */
-    using boost::weak_ptr;
-
-    /** \class intrusive_ptr */
-    using boost::intrusive_ptr;
-
-    /** */
-    using boost::static_pointer_cast;
-    /**  */
-    using boost::const_pointer_cast;
-    /**  */
-    using boost::dynamic_pointer_cast;
-
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////
-namespace std
-{ /////////////////////////////////////////////////////////////////
-
-  // namespace sub {
-  //    class Foo;
-  //    typedef zypp::intrusive_ptr<Foo> Foo_Ptr; // see DEFINE_PTR_TYPE(NAME) macro below
-  // }
-
-  // Defined in namespace std g++ finds the output operator (König-Lookup),
-  // even if we typedef the pointer in a different namespace than ::zypp.
-  // Otherwise we had to define an output operator always in the same namespace
-  // as the typedef (else g++ will just print the pointer value).
-
-  /** \relates zypp::shared_ptr Stream output. */
-  template<class D>
-  inline std::ostream & operator<<( std::ostream & str, const zypp::shared_ptr<D> & obj )
-  {
-    if ( obj )
-      return str << *obj;
-    return str << std::string("NULL");
-  }
-  /** \overload specialize for void */
-  template<>
-  inline std::ostream & operator<<( std::ostream & str, const zypp::shared_ptr<void> & obj )
-  {
-    if ( obj )
-      return str << zypp::str::form( "%p", (void*)obj.get() );
-    return str << std::string("NULL");
-  }
-
-  /** \relates zypp::shared_ptr Stream output. */
-  template<class D>
-  inline std::ostream & dumpOn( std::ostream & str, const zypp::shared_ptr<D> & obj )
-  {
-    if ( obj )
-      return dumpOn( str, *obj );
-    return str << std::string("NULL");
-  }
-  /** \overload specialize for void */
-  template<>
-  inline std::ostream & dumpOn( std::ostream & str, const zypp::shared_ptr<void> & obj )
-  { return str << obj; }
-
-  /** \relates zypp::intrusive_ptr Stream output. */
-  template<class D>
-  inline std::ostream & operator<<( std::ostream & str, const zypp::intrusive_ptr<D> & obj )
-  {
-    if ( obj )
-      return str << *obj;
-    return str << std::string("NULL");
-  }
-  /** \relates zypp::intrusive_ptr Stream output. */
-  template<class D>
-  inline std::ostream & dumpOn( std::ostream & str, const zypp::intrusive_ptr<D> & obj )
-  {
-    if ( obj )
-      return dumpOn( str, *obj );
-    return str << std::string("NULL");
-  }
-  /////////////////////////////////////////////////////////////////
-} // namespace std
-///////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // RW_pointer traits
-    //
-    ///////////////////////////////////////////////////////////////////
-    /**
-     * Don't forgett to provide versions for PtrType and constPtrType,
-     * esp. if creation a of temporary is not acceptable (eg. when
-     * checking the ref count value).
-    */
-    namespace rw_pointer {
-
-      template<class D>
-        struct Shared
-        {
-          typedef shared_ptr<D>       PtrType;
-          typedef shared_ptr<const D> constPtrType;
-          /** Check whether pointer is not shared. */
-          bool unique( const constPtrType & ptr_r )
-          { return !ptr_r || ptr_r.unique(); }
-          bool unique( const PtrType & ptr_r )
-          { return !ptr_r || ptr_r.unique(); }
-          /** Return number of references. */
-          long use_count( const constPtrType & ptr_r ) const
-          { return ptr_r.use_count(); }
-          long use_count( const PtrType & ptr_r ) const
-          { return ptr_r.use_count(); }
-        };
-
-      template<class D>
-        struct Intrusive
-        {
-          typedef intrusive_ptr<D>       PtrType;
-          typedef intrusive_ptr<const D> constPtrType;
-          /** Check whether pointer is not shared. */
-          bool unique( const constPtrType & ptr_r )
-          { return !ptr_r || (ptr_r->refCount() <= 1); }
-          bool unique( const PtrType & ptr_r )
-          { return !ptr_r || (ptr_r->refCount() <= 1); }
-          /** Return number of references. */
-          long use_count( const constPtrType & ptr_r ) const
-          { return ptr_r ? ptr_r->refCount() : 0; }
-          long use_count( const PtrType & ptr_r ) const
-          { return ptr_r ? ptr_r->refCount() : 0; }
-        };
-
-       template<class D>
-        struct Scoped
-        {
-          typedef scoped_ptr<D>       PtrType;
-          typedef scoped_ptr<const D> constPtrType;
-          /** Check whether pointer is not shared. */
-          bool unique( const constPtrType & ptr_r )
-          { return true; }
-          bool unique( const PtrType & ptr_r )
-          { return true; }
-          /** Return number of references. */
-          long use_count( const constPtrType & ptr_r ) const
-          { return ptr_r ? 1 : 0; }
-          long use_count( const PtrType & ptr_r ) const
-          { return ptr_r ? 1 : 0; }
-        };
-
-   }
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : RW_pointer
-    //
-    /** Wrapper for \c const correct access via \ref ZYPP_SMART_PTR.
-     *
-     * zypp::RW_pointer<tt>\<D,DTraits></tt> stores a \ref ZYPP_SMART_PTR
-     * of type \c DTraits::PtrType, which must be convertible into a <tt>D *</tt>.
-     * Pointer style access (via \c -> and \c *) offers a <tt>const D *</tt> in const
-     * a context, otherwise a <tt>D *</tt>. Thus \em RW_ means \em read/write,
-     * as you get a different type, dependent on whether you're allowed to
-     * read or write.
-     *
-     * Forwarding access from an interface to an implemantation class, an
-     * RW_pointer prevents const interface methods from accidentally calling
-     * nonconst implementation methods.
-     *
-     * The second template argument defaults to
-     * <tt>DTraits = rw_pointer::Shared<D></tt> thus wraping a
-     * <tt>shared_ptr<D></tt>. To wrap an <tt>intrusive_ptr<D></tt>
-     * use <tt>rw_pointer::Intrusive<D></tt>.
-     *
-     * \see zypp::RWCOW_pointer for 'copy on write' functionality.
-     *
-     * \code
-     * #include "zypp/base/PtrTypes.h"
-     *
-     * class Foo
-     * {
-     *   ...
-     *   private:
-     *     // Implementation class
-     *     struct Impl;
-     *     // Pointer to implementation; actually a shared_ptr<Impl>
-     *     RW_pointer<Impl> _pimpl;
-     *
-     *     void baa()       { _pimpl->... } // is Impl *
-     *     void baa() const { _pimpl->... } // is Impl const *
-     * };
-     * \endcode
-    */
-    template<class D, class DTraits = rw_pointer::Shared<D> >
-      struct RW_pointer
-      {
-        typedef typename DTraits::PtrType               PtrType;
-        typedef typename DTraits::constPtrType          constPtrType;
-
-        RW_pointer()
-        {}
-
-        RW_pointer( std::nullptr_t )
-        {}
-
-        explicit
-        RW_pointer( typename PtrType::element_type * dptr )
-        : _dptr( dptr )
-        {}
-
-        explicit
-        RW_pointer( PtrType dptr )
-        : _dptr( dptr )
-        {}
-
-        RW_pointer & operator=( std::nullptr_t )
-       { reset(); return *this; }
-
-        void reset()
-        { PtrType().swap( _dptr ); }
-
-        void reset( typename PtrType::element_type * dptr )
-        { PtrType( dptr ).swap( _dptr ); }
-
-        void swap( RW_pointer & rhs )
-        { _dptr.swap( rhs._dptr ); }
-
-        void swap( PtrType & rhs )
-        { _dptr.swap( rhs ); }
-
-        explicit operator bool() const
-        { return _dptr.get() != nullptr; }
-
-        const D & operator*() const
-        { return *_dptr; };
-
-        const D * operator->() const
-        { return _dptr.operator->(); }
-
-        const D * get() const
-        { return _dptr.get(); }
-
-        D & operator*()
-        { return *_dptr; }
-
-        D * operator->()
-        { return _dptr.operator->(); }
-
-        D * get()
-        { return _dptr.get(); }
-
-      public:
-        bool unique() const
-       { return DTraits().unique( _dptr ); }
-
-       long use_count() const
-       { return DTraits().use_count( _dptr ); }
-
-        constPtrType getPtr() const
-        { return _dptr; }
-
-        PtrType getPtr()
-        { return _dptr; }
-
-        constPtrType cgetPtr()
-        { return _dptr; }
-
-      private:
-        PtrType _dptr;
-      };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates RW_pointer Stream output.
-     *
-     * Print the \c D object the RW_pointer refers, or \c "NULL"
-     * if the pointer is \c NULL.
-     */
-    template<class D, class DPtr>
-      inline std::ostream & operator<<( std::ostream & str, const RW_pointer<D, DPtr> & obj )
-      {
-        if ( obj.get() )
-          return str << *obj.get();
-        return str << std::string("NULL");
-      }
-
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const RW_pointer<D, DPtr> & lhs, const RW_pointer<D, DPtr> & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const RW_pointer<D, DPtr> & lhs, const typename DPtr::PtrType & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const typename DPtr::PtrType & lhs, const RW_pointer<D, DPtr> & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const RW_pointer<D, DPtr> & lhs, const typename DPtr::constPtrType & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const typename DPtr::constPtrType & lhs, const RW_pointer<D, DPtr> & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const RW_pointer<D, DPtr> & lhs, std::nullptr_t )
-      { return( lhs.get() == nullptr ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( std::nullptr_t, const RW_pointer<D, DPtr> & rhs )
-      { return( nullptr == rhs.get() ); }
-
-
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const RW_pointer<D, DPtr> & lhs, const RW_pointer<D, DPtr> & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const RW_pointer<D, DPtr> & lhs, const typename DPtr::PtrType & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const typename DPtr::PtrType & lhs, const RW_pointer<D, DPtr> & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const RW_pointer<D, DPtr> & lhs, const typename DPtr::constPtrType & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const typename DPtr::constPtrType & lhs, const RW_pointer<D, DPtr> & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const RW_pointer<D, DPtr> & lhs, std::nullptr_t )
-      { return( lhs.get() != nullptr ); }
-    /** \relates RW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( std::nullptr_t, const RW_pointer<D, DPtr> & rhs )
-      { return( nullptr != rhs.get() ); }
-
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates RWCOW_pointer Clone the underlying object.
-     * Calls \a rhs <tt>-\>clone()</tt>. Being defined as a
-     * function outside \ref RWCOW_pointer allows to overload
-     * it, in case a specific \a D does not have <tt>clone()</tt>.
-     */
-    template<class D>
-      inline D * rwcowClone( const D * rhs )
-      { return rhs->clone(); }
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : RWCOW_pointer
-    //
-    /** \ref RW_pointer supporting 'copy on write' functionality.
-     *
-     * \em Write access to the underlying object creates a copy, iff
-     * the object is shared.
-     *
-     * See \ref RW_pointer.
-    */
-    template<class D, class DTraits = rw_pointer::Shared<D> >
-      struct RWCOW_pointer
-      {
-        typedef typename DTraits::PtrType               PtrType;
-        typedef typename DTraits::constPtrType          constPtrType;
-
-       RWCOW_pointer()
-       {}
-
-       RWCOW_pointer( std::nullptr_t )
-       {}
-
-        explicit
-        RWCOW_pointer( typename PtrType::element_type * dptr )
-        : _dptr( dptr )
-        {}
-
-        explicit
-        RWCOW_pointer( PtrType dptr )
-        : _dptr( dptr )
-        {}
-
-        RWCOW_pointer & operator=( std::nullptr_t )
-       { reset(); return *this; }
-
-        void reset()
-        { PtrType().swap( _dptr ); }
-
-        void reset( typename PtrType::element_type * dptr )
-        { PtrType( dptr ).swap( _dptr ); }
-
-        void swap( RWCOW_pointer & rhs )
-        { _dptr.swap( rhs._dptr ); }
-
-        void swap( PtrType & rhs )
-        { _dptr.swap( rhs ); }
-
-        explicit operator bool() const
-       { return _dptr.get() != nullptr; }
-
-        const D & operator*() const
-        { return *_dptr; };
-
-        const D * operator->() const
-        { return _dptr.operator->(); }
-
-        const D * get() const
-        { return _dptr.get(); }
-
-        D & operator*()
-        { assertUnshared(); return *_dptr; }
-
-        D * operator->()
-        { assertUnshared(); return _dptr.operator->(); }
-
-        D * get()
-        { assertUnshared(); return _dptr.get(); }
-
-      public:
-        bool unique() const
-       { return DTraits().unique( _dptr ); }
-
-       long use_count() const
-       { return DTraits().use_count( _dptr ); }
-
-        constPtrType getPtr() const
-        { return _dptr; }
-
-        PtrType getPtr()
-        { assertUnshared(); return _dptr; }
-
-        constPtrType cgetPtr()
-        { return _dptr; }
-
-      private:
-
-        void assertUnshared()
-        {
-          if ( !unique() )
-            PtrType( rwcowClone( _dptr.get() ) ).swap( _dptr );
-        }
-
-      private:
-        PtrType _dptr;
-      };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates RWCOW_pointer Stream output.
-     *
-     * Print the \c D object the RWCOW_pointer refers, or \c "NULL"
-     * if the pointer is \c NULL.
-     */
-    template<class D, class DPtr>
-      inline std::ostream & operator<<( std::ostream & str, const RWCOW_pointer<D, DPtr> & obj )
-      {
-        if ( obj.get() )
-          return str << *obj.get();
-        return str << std::string("NULL");
-      }
-
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const RWCOW_pointer<D, DPtr> & lhs, const RWCOW_pointer<D, DPtr> & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const RWCOW_pointer<D, DPtr> & lhs, const typename DPtr::PtrType & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const typename DPtr::PtrType & lhs, const RWCOW_pointer<D, DPtr> & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const RWCOW_pointer<D, DPtr> & lhs, const typename DPtr::constPtrType & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const typename DPtr::constPtrType & lhs, const RWCOW_pointer<D, DPtr> & rhs )
-      { return( lhs.get() == rhs.get() ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( const RWCOW_pointer<D, DPtr> & lhs, std::nullptr_t )
-      { return( lhs.get() == nullptr ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator==( std::nullptr_t, const RWCOW_pointer<D, DPtr> & rhs )
-      { return( nullptr == rhs.get() ); }
-
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const RWCOW_pointer<D, DPtr> & lhs, const RWCOW_pointer<D, DPtr> & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const RWCOW_pointer<D, DPtr> & lhs, const typename DPtr::PtrType & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const typename DPtr::PtrType & lhs, const RWCOW_pointer<D, DPtr> & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const RWCOW_pointer<D, DPtr> & lhs, const typename DPtr::constPtrType & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const typename DPtr::constPtrType & lhs, const RWCOW_pointer<D, DPtr> & rhs )
-      { return ! ( lhs == rhs ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( const RWCOW_pointer<D, DPtr> & lhs, std::nullptr_t )
-      { return( lhs.get() != nullptr ); }
-    /** \relates RWCOW_pointer */
-    template<class D, class DPtr>
-      inline bool operator!=( std::nullptr_t, const RWCOW_pointer<D, DPtr> & rhs )
-      { return( nullptr != rhs.get() ); }
-
-    ///////////////////////////////////////////////////////////////////
-
-    /*@}*/
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-
-/** Forward declaration of Ptr types */
-#define DEFINE_PTR_TYPE(NAME) \
-class NAME;                                                      \
-extern void intrusive_ptr_add_ref( const NAME * );               \
-extern void intrusive_ptr_release( const NAME * );               \
-typedef zypp::intrusive_ptr<NAME>       NAME##_Ptr;        \
-typedef zypp::intrusive_ptr<const NAME> NAME##_constPtr;
-
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_PTRTYPES_H
+#include <zypp-core/base/PtrTypes.h>
index 0e0a4cc..3e892ce 100644 (file)
 #ifndef ZYPP_BASE_REFERENCECOUNTED_H
 #define ZYPP_BASE_REFERENCECOUNTED_H
 
-#include <iosfwd>
+#include <zypp-core/base/ReferenceCounted.h>
 
-#include <zypp/base/PtrTypes.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  ///////////////////////////////////////////////////////////////////
-  namespace base
-  { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : ReferenceCounted
-    //
-    /** Base class for reference counted objects.
-     * \todo Make counter thread safe.
-    */
-    class ReferenceCounted
-    {
-      /** Stream output via dumpOn. */
-      friend std::ostream & operator<<( std::ostream & str, const ReferenceCounted & obj );
-
-    public:
-      /** Default ctor.
-       * Initial reference count is zero.
-      */
-      ReferenceCounted();
-
-      /** Copy ctor.
-       * Initial reference count is zero.
-      */
-      ReferenceCounted( const ReferenceCounted & rhs );
-
-      /** Dtor.
-       * \throw std::out_of_range if reference count is not zero.
-      */
-      virtual ~ReferenceCounted();
-
-      /** Assignment.
-       * Reference count remains untouched.
-      */
-      ReferenceCounted & operator=( const ReferenceCounted & )
-      { return *this; }
-
-    public:
-      /** Return reference counter value. */
-      unsigned refCount() const
-      { return _counter; }
-
-      /** Add a reference. */
-      void ref() const
-      { ref_to( ++_counter ); }
-
-      /** Release a reference.
-       * Deletes the object if reference count gets zero.
-       * \throw std::out_of_range if reference count is zero.
-      */
-      void unref() const
-      {
-        if ( !_counter )
-          unrefException(); // will throw!
-        if ( --_counter )
-          unref_to( _counter );
-        else
-          delete this;
-      }
-
-      /** Called by zypp::intrusive_ptr to add a reference.
-       * \see ZYPP_SMART_PTR
-      */
-      static void add_ref( const ReferenceCounted * ptr_r )
-      { if( ptr_r ) ptr_r->ref(); }
-
-      /** Called by zypp::intrusive_ptr to add a reference.
-       * \see ZYPP_SMART_PTR
-      */
-      static void release( const ReferenceCounted * ptr_r )
-      { if( ptr_r ) ptr_r->unref(); }
-
-    protected:
-      /** Overload to realize std::ostream & operator\<\<. */
-      virtual std::ostream & dumpOn( std::ostream & str ) const;
-
-      /** Trigger derived classes after refCount was increased. */
-      virtual void ref_to( unsigned /* rep_cnt_r */ ) const {}
-
-      /** Trigger derived classes after refCount was decreased.
-       * No trigger is sent, if refCount got zero (i.e. the
-       * object is deleted).
-       **/
-      virtual void unref_to( unsigned /* rep_cnt_r */ ) const {}
-
-    private:
-      /** The reference counter. */
-      mutable unsigned _counter;
-
-      /** Throws Exception on unref. */
-      void unrefException() const;
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates ReferenceCounted intrusive_ptr hook to add_ref. */
-    inline void intrusive_ptr_add_ref( const ReferenceCounted * ptr_r )
-    { ReferenceCounted::add_ref( ptr_r ); }
-
-    /** \relates ReferenceCounted intrusive_ptr hook to release. */
-    inline void intrusive_ptr_release( const ReferenceCounted * ptr_r )
-    { ReferenceCounted::release( ptr_r ); }
-
-    /** \relates ReferenceCounted Stream output. */
-    inline std::ostream & operator<<( std::ostream & str, const ReferenceCounted & obj )
-    { return obj.dumpOn( str ); }
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace base
-  ///////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-
-#define IMPL_PTR_TYPE(NAME) \
-void intrusive_ptr_add_ref( const NAME * ptr_r )               \
-{ zypp::base::ReferenceCounted::add_ref( ptr_r ); }                  \
-void intrusive_ptr_release( const NAME * ptr_r )               \
-{ zypp::base::ReferenceCounted::release( ptr_r ); }
-
-///////////////////////////////////////////////////////////////////
 #endif // ZYPP_BASE_REFERENCECOUNTED_H
index 85a8e8a..77bd206 100644 (file)
@@ -1,188 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/base/Regex.h
- *
-*/
-#ifndef ZYPP_BASE_REGEX_H
-#define ZYPP_BASE_REGEX_H
-
-#include <iosfwd>
-#include <string>
-#include <regex.h>
-
-#include <zypp/base/Exception.h>
-
-//////////////////////////////////////////////////////////////////
-namespace zypp
-{
-  //////////////////////////////////////////////////////////////////
-  /// \namespace str
-  /// \brief String related utilities and \ref ZYPP_STR_REGEX.
-  namespace str
-  {
-    //////////////////////////////////////////////////////////////////
-    /// \defgroup ZYPP_STR_REGEX Regular expression matching
-    /// \brief Regular expressions using the glibc regex library.
-    ///
-    /// \see also \ref StrMatcher string matcher also supporting globing, etc.
-    ///
-    /// \code
-    ///  str::regex rxexpr( "^(A)?([0-9]*) im" );
-    ///  str::smatch what;
-    ///
-    ///  std::string mytext( "Y123 imXXXX" );
-    ///  if ( str::regex_match( mytext, what, rxexpr ) )
-    ///  {
-    ///    MIL << "MATCH '" << what[0] << "'" << endl;
-    ///    MIL << " subs: " << what.size()-1 << endl;
-    ///    for_( i, 1U, what.size() )
-    ///      MIL << "      [" << i << "] " << what[i] << endl;
-    ///  }
-    ///  else
-    ///  {
-    ///    WAR << "NO MATCH '" << rxexpr << "' in '" <<  mytext << endl;
-    ///  }
-    /// \endcode
-    //////////////////////////////////////////////////////////////////
-
-    typedef Exception regex_error;
-
-    class smatch;
-    class regex;
-
-    //////////////////////////////////////////////////////////////////
-    /// \brief Regular expression matching
-    ///
-    /// \ingroup ZYPP_STR_REGEX
-    /// \relates regex
-    /// Return whether a \ref regex matches a specific string. An optionally
-    /// passed \ref smatch object will contain the match reults.
-    //////////////////////////////////////////////////////////////////
-    bool regex_match( const char * s, smatch & matches, const regex & regex );
-
-    /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */
-    inline bool regex_match(const std::string & s, smatch & matches, const regex & regex)
-    { return regex_match( s.c_str(), matches, regex ); }
-
-    /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */
-    bool regex_match( const char * s, const regex & regex );
-
-    /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */
-    inline bool regex_match( const std::string & s, const regex & regex )
-    { return regex_match( s.c_str(), regex ); }
-
-    /**
-     * Replaces the matched regex with the string passed in \a replacement.
-     * If \a global is set the search continues after the first match
-     *
-     * \note Using backreferences in the replacement string is NOT supported.
-     */
-    std::string regex_substitute ( const std::string & s, const regex & regex, const std::string &replacement, bool global = true );
-
-    //////////////////////////////////////////////////////////////////
-    /// \class regex
-    /// \brief Regular expression
-    ///
-    /// \ingroup ZYPP_STR_REGEX
-    //////////////////////////////////////////////////////////////////
-    class regex
-    {
-    public:
-
-      enum RegFlags {
-        icase          = REG_ICASE,    ///< Do not differentiate case
-        nosubs         = REG_NOSUB,    ///< Support for substring addressing of matches is not required
-        match_extended = REG_EXTENDED, ///< Use POSIX Extended Regular Expression syntax when interpreting regex.
-        newline         = REG_NEWLINE,  ///< Match newline
-        rxdefault       = match_extended|newline ///< These are enforced even if you don't pass them as flag argument
-      };
-
-      enum MatchFlags {
-        none    = 0,
-        not_bol = REG_NOTBOL ///< Do not match begin of line
-      };
-
-      regex();
-      regex( const std::string & s, int flags = rxdefault );
-      regex( const char* s, int flags = rxdefault ) : regex( std::string(s?s:""), flags ) {}
-      ~regex();
-
-      regex( const regex & rhs )
-      { assign( rhs.m_str, rhs.m_flags ); }
-
-      regex & operator=( const regex & rhs )
-      { assign( rhs.m_str, rhs.m_flags ); return *this; }
-
-      /**
-       * string representation of the regular expression
-       */
-      std::string asString() const
-      { return m_str; }
-
-      bool matches( const char * s, str::smatch & matches, int flags = none ) const;
-      bool matches( const char * s ) const;
-
-    public:
-      /** Expert backdoor. Returns pointer to the compiled regex for direct use in regexec() */
-      regex_t * get()
-      { return & m_preg; }
-
-    private:
-      void assign( const std::string & s, int flags );
-
-    private:
-      friend class smatch;
-      std::string m_str;
-      int m_flags;
-      regex_t m_preg;
-      bool m_valid = false;
-    };
-
-    /** \relates regex Stream output */
-    inline std::ostream & operator<<( std::ostream & str, const regex & obj )
-    { return str << obj.asString(); }
-
-    //////////////////////////////////////////////////////////////////
-    /// \class smatch
-    /// \brief Regular expression match result
-    ///
-    /// \ingroup ZYPP_STR_REGEX
-    ///
-    /// Index \c n=0 returns the string object representing the character
-    /// sequence that matched the whole regular expression.
-    /// If \c n is out of range, or if \c n is an unmatched sub-expression,
-    /// then an empty string is returned.
-    //////////////////////////////////////////////////////////////////
-    class smatch
-    {
-    public:
-      smatch();
-
-      std::string operator[](unsigned i) const;
-
-      unsigned size() const;
-
-      /** Begin index of subexpression \c i in \a match_str (or std::string::npos) */
-      std::string::size_type begin( unsigned i ) const;
-
-      /** End index of subexpression \c i in \a match_str (or std::string::npos) */
-      std::string::size_type end( unsigned i ) const;
-
-      /** Size of subexpression \c i (or std::string::npos) */
-      std::string::size_type size( unsigned i ) const;
-
-      std::string match_str;
-      std::vector<regmatch_t> pmatch;
-    };
-
-  } // namespace str
-  //////////////////////////////////////////////////////////////////
-} // namespace zypp
-//////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_STRING_H
+#include <zypp-core/base/Regex.h>
index 00c6fd6..62cb1ec 100644 (file)
@@ -1,1102 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/base/String.h
- *
-*/
-#ifndef ZYPP_BASE_STRING_H
-#define ZYPP_BASE_STRING_H
-
-#include <cstring>
-
-#include <iosfwd>
-#include <vector>
-#include <string>
-#include <sstream>
-#include <boost/format.hpp>
-#include <boost/utility/string_ref.hpp>
-
-#include <zypp/base/Easy.h>
-#include <zypp/base/PtrTypes.h>
-#include <zypp/base/Function.h>
-
-///////////////////////////////////////////////////////////////////
-namespace boost { namespace logic { class tribool; } }
-namespace zypp { typedef boost::logic::tribool TriBool; }
-///////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{
-  /** Request a human readable (translated) string representation of Tp [Tp.asUserString()]
-   * Classes may implement a default as member function.
-   */
-  template <class Tp>
-  std::string asUserString( const Tp & val_r )
-  { return val_r.asUserString(); }
-
-}// namespace zypp
-///////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-
-  /** Convenience \c char* constructible from \c std::string and \c char*,
-   *  it maps \c (char*)0 to an empty string.
-   *
-   * \code
-   * bool hasPrefix( const std::string & str_r, const std::string & prefix_r )
-   * { return( ::strncmp( str_r.c_str(), prefix_r.c_str(), prefix_r.size() ) == 0 ); }
-   * \endcode
-   *
-   * Called with a plain \c char* as argument, the \c std::string is created form
-   * for nothing. The implementation actually does not use the \c std::string.
-   *
-   * Best would be to implement \c hasPrefix for each combination of \c char*
-   * and \c std::string arguments:
-   *
-   * \code
-   * bool hasPrefix( const std::string & str_r, const std::string & prefix_r )
-   * { return( ::strncmp( str_r.c_str(), prefix_r.c_str(), prefix_r.size() ) == 0 ); }
-   *
-   * bool hasPrefix( const std::string & str_r, const char * prefix_r )
-   * { return( !prefix_r || ::strncmp( str_r.c_str(), prefix_r, ::strlen(prefix_r) ) == 0 ); }
-   *
-   * bool hasPrefix( const char * str_r, const std::string & prefix_r )
-   * { return( str_r ? ::strncmp( str_r, prefix_r.c_str(), prefix_r.size() ) == 0 : prefix_r.empty() ); }
-   *
-   * bool hasPrefix( const char * str_r, const char * prefix_r )
-   * { return( str && prefix_r ? ::strncmp( str_r, prefix_r, ::strlen(prefix_r) ) == 0
-   *                           : !((str_r && *str_r) || (prefix_r && *prefix_r)); }
-   * \endcode
-   *
-   * This is where \ref C_Str can help. Constructible from \c std::string and \c char*,
-   * it \e reduces the \c std::string to it's \c char*. At the same time it converts
-   * \c (char*)0 into an \c "" string.
-   *
-   * \code
-   * bool hasPrefix( const C_Str & str_r, const C_Str & prefix_r )
-   * { return( ::strncmp( str_r, prefix_r, prefix_r.size() ) == 0 ); }
-   * \endcode
-   *
-   * \todo Check whether to replace by boost::string_ref
-   */
-  class C_Str
-  {
-    public:
-      typedef std::string::size_type size_type;
-
-    public:
-      C_Str()                            : _val( 0 ),             _sze( 0 ) {}
-      C_Str( char * c_str_r )            : _val( c_str_r ),       _sze( std::string::npos ) {}
-      C_Str( const char * c_str_r )      : _val( c_str_r ),       _sze( std::string::npos ) {}
-      C_Str( const std::string & str_r ) : _val( str_r.c_str() ), _sze( str_r.size() ) {}
-      C_Str( const boost::string_ref & str_r ) : _val( str_r.data() ), _sze( str_r.size() ) {}
-
-    public:
-      bool      isNull()       const { return !_val; }
-      bool      empty()        const { return !(_val && *_val); }
-      size_type size()         const
-      {
-        if ( _sze == std::string::npos )
-        { _sze = _val ? ::strlen( _val ) : 0; }
-        return _sze;
-      };
-
-      operator const char *() const { return c_str(); }
-      const char * c_str()    const { return _val ? _val : ""; }
-
-    private:
-      const char *const _val;
-      mutable size_type _sze;
-  };
-
-  /** \relates C_Str Stream output */
-  inline std::ostream & operator<<( std::ostream & str, const C_Str & obj )
-  { return str << obj.c_str(); }
-
-  ///////////////////////////////////////////////////////////////////
-  /** String related utilities and \ref ZYPP_STR_REGEX.
-   \see \ref ZYPP_STR_REGEX
-  */
-
-  namespace str
-  { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    /**
-     * Global asString() that works with std::string too
-     */
-    inline const std::string & asString( const std::string & t )
-    { return t; }
-
-    inline std::string && asString( std::string && t )
-    { return std::move(t); }
-
-    inline std::string asString( const char * t )
-    { return t == nullptr ? std::string() : t; }
-
-    inline std::string asString( char * t )
-    { return t == nullptr ? std::string() : t; }
-
-    template<class Tp>
-        inline std::string asString( const Tp &t )
-        { return t.asString(); }
-
-    template<class Tp>
-        inline std::string asString( const intrusive_ptr<Tp> &p )
-        { return p->asString(); }
-
-    template<class Tp>
-        inline std::string asString( const weak_ptr<Tp> &p )
-        { return p->asString(); }
-
-    template<>
-        inline std::string asString( const bool &t )
-        { return t ? "true" : "false"; }
-
-    ///////////////////////////////////////////////////////////////////
-    /** Printf style construction of std::string. */
-    std::string form( const char * format, ... )
-    __attribute__ ((format (printf, 1, 2)));
-
-    ///////////////////////////////////////////////////////////////////
-    /** Return string describing the \a error_r code.
-     * Like ::strerror, but the numerical value is included in
-     * the string as well.
-    */
-    std::string strerror( int errno_r );
-
-    ///////////////////////////////////////////////////////////////////
-    /** Assert \c free called for allocated <tt>char *</tt>.
-     * \code
-     * ...
-     * SafeBuf safe;
-     * vasprintf( &safe._buf, format, ap );
-     * return safe.asString();
-     * \endcode
-     *
-     * \ingroup g_RAII
-    */
-    struct SafeBuf
-    {
-      char * _buf;
-      SafeBuf() : _buf( 0 ) {}
-      ~SafeBuf() { if ( _buf ) free( _buf ); }
-      std::string asString() const
-      { return _buf ? std::string(_buf) : std::string(); }
-    };
-
-    ///////////////////////////////////////////////////////////////////
-    /// \class Str
-    /// \brief Convenient building of std::string via \ref std::ostringstream
-    /// Basically a \ref std::ostringstream autoconvertible to \ref std::string
-    /// for building string arguments.
-    /// \code
-    ///   void fnc( const std::string & txt_r );
-    ///   fnc( str::Str() << "Hello " << 13 );
-    ///
-    ///   std::string txt( str::Str() << 45 );
-    /// \endcode
-    ///////////////////////////////////////////////////////////////////
-    struct Str
-    {
-      template<class Tp>
-      Str & operator<<( Tp && val )
-      { _str << std::forward<Tp>(val); return *this; }
-
-      Str & operator<<( std::ostream& (*iomanip)( std::ostream& ) )
-      { _str << iomanip; return *this; }
-
-      operator std::string() const             { return _str.str(); }
-      std::string asString() const             { return _str.str(); }
-      std::string str() const                  { return _str.str(); }
-
-      const std::ostream & stream() const      { return _str; }
-      std::ostream & stream()                  { return _str; }
-
-      void clear()                             { _str.str( std::string() ); }
-
-    private:
-      std::ostringstream _str;
-    };
-
-    /** \relates Str Stream output */
-    inline std::ostream & operator<<( std::ostream & str, const Str & obj )
-    { return str << obj.str(); }
-
-    ///////////////////////////////////////////////////////////////////
-    /// \class Format
-    /// \brief Convenient building of std::string with \ref boost::format.
-    /// Basically a \ref boost::format autoconvertible to \ref std::string
-    /// for building string arguments.
-    /// \note It won't complain about malformed or incomplete format
-    /// strings. Usefull when dealing with translations or classes
-    /// providing a default formater.
-    /// \code
-    ///   void fnc( const std::string & txt_r );
-    ///   fnc( str::Format("Hello %1%") % 13 );
-    ///
-    ///   std::string txt( str::Format("Hello %1%") % 13 );
-    /// \endcode
-    ///////////////////////////////////////////////////////////////////
-    struct Format
-    {
-      Format() { _fmter.exceptions( boost::io::no_error_bits ); }
-      Format( const std::string & format_r ) : Format() { _fmter.parse( format_r ); }
-
-      template<class Tp>
-      Format & operator%( Tp && arg )
-      { _fmter % std::forward<Tp>(arg); return *this; }
-
-      operator std::string() const             { return _fmter.str(); }
-      std::string asString() const             { return _fmter.str(); }
-      std::string str() const                  { return _fmter.str(); }
-
-      const boost::format & fmter() const      { return _fmter; }
-      boost::format & fmter()                  { return _fmter; }
-
-    protected:
-      boost::format _fmter;
-    };
-
-    /** \relates Format Stream output */
-    inline std::ostream & operator<<( std::ostream & str, const Format & obj )
-    { return str << obj.fmter(); }
-
-    /** \name String representation of number.
-     *
-     * Optional second argument sets the minimal string width (' ' padded).
-     * Negative values will cause the number to be left adjusted within the string.
-     *
-     * Default width is 0.
-     * \code
-     * numstring(42)           -> "42"
-     * numstring(42, 4)        -> "  42"
-     * numstring(42,-4)        -> "42  "
-     * \endcode
-     **/
-    //@{
-    inline std::string numstring( char n,               int w = 0 ) { return form( "%*hhd",  w, n ); }
-    inline std::string numstring( unsigned char n,      int w = 0 ) { return form( "%*hhu",  w, n ); }
-    inline std::string numstring( short n,              int w = 0 ) { return form( "%*hd",   w, n ); }
-    inline std::string numstring( unsigned short n,     int w = 0 ) { return form( "%*hu",   w, n ); }
-    inline std::string numstring( int n,                int w = 0 ) { return form( "%*d",    w, n ); }
-    inline std::string numstring( unsigned n,           int w = 0 ) { return form( "%*u",    w, n ); }
-    inline std::string numstring( long n,               int w = 0 ) { return form( "%*ld",   w, n ); }
-    inline std::string numstring( unsigned long n,      int w = 0 ) { return form( "%*lu",   w, n ); }
-    inline std::string numstring( long long n,          int w = 0 ) { return form( "%*lld",  w, n ); }
-    inline std::string numstring( unsigned long long n, int w = 0 ) { return form( "%*llu",  w, n ); }
-
-    template<> inline std::string asString( const char & t )                   { return numstring( t ); }
-    template<> inline std::string asString( const unsigned char & t )          { return numstring( t ); }
-    template<> inline std::string asString( const short & t )                  { return numstring( t ); }
-    template<> inline std::string asString( const unsigned short & t )         { return numstring( t ); }
-    template<> inline std::string asString( const int & t )                    { return numstring( t ); }
-    template<> inline std::string asString( const unsigned & t )               { return numstring( t ); }
-    template<> inline std::string asString( const long & t )                   { return numstring( t ); }
-    template<> inline std::string asString( const unsigned long & t )          { return numstring( t ); }
-    template<> inline std::string asString( const long long & t )              { return numstring( t ); }
-    template<> inline std::string asString( const unsigned long long & t )     { return numstring( t ); }
-    //@}
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name String representation of number as hex value with leading '0x'.
-     * Optional second argument sets the minimal
-     * string width (0 padded). Negative values will cause the number to be left adjusted
-     * within the string. Default width is 10 (4 for char).
-     * <PRE>
-     * hexstring(42)           -> "0x0000002a"
-     * hexstring(42, 4)        -> "0x2a"
-     * hexstring(42,-4)        -> "0x2a"
-     * </PRE>
-     **/
-    //@{
-    inline std::string hexstring( char n,               int w = 4 ) { return form( "%#0*hhx", w, n ); }
-    inline std::string hexstring( unsigned char n,      int w = 4 ) { return form( "%#0*hhx", w, n ); }
-    inline std::string hexstring( short n,              int w = 10 ){ return form( "%#0*hx",  w, n ); }
-    inline std::string hexstring( unsigned short n,     int w = 10 ){ return form( "%#0*hx",  w, n ); }
-    inline std::string hexstring( int n,                int w = 10 ){ return form( "%#0*x",   w, n ); }
-    inline std::string hexstring( unsigned n,           int w = 10 ){ return form( "%#0*x",   w, n ); }
-    inline std::string hexstring( long n,               int w = 10 ){ return form( "%#0*lx",  w, n ); }
-    inline std::string hexstring( unsigned long n,      int w = 10 ){ return form( "%#0*lx",  w, n ); }
-    inline std::string hexstring( long long n,          int w = 0 ) { return form( "%#0*llx", w, n ); }
-    inline std::string hexstring( unsigned long long n, int w = 0 ) { return form( "%#0*llx", w, n ); }
-    //@}
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name String representation of number as octal value with leading '0'.
-     * Optional second argument sets the minimal
-     * string width (0 padded). Negative values will cause the number to be left adjusted
-     * within the string. Default width is 5 (4 for char).
-     * <PRE>
-     * octstring(42)           -> "00052"
-     * octstring(42, 4)        -> "0052"
-     * octstring(42,-4)        -> "052 "
-     * </PRE>
-     **/
-    //@{
-    inline std::string octstring( char n,               int w = 4 ) { return form( "%#0*hho",  w, n ); }
-    inline std::string octstring( unsigned char n,      int w = 4 ) { return form( "%#0*hho",  w, n ); }
-    inline std::string octstring( short n,              int w = 5 ) { return form( "%#0*ho",   w, n ); }
-    inline std::string octstring( unsigned short n,     int w = 5 ) { return form( "%#0*ho",   w, n ); }
-    inline std::string octstring( int n,                int w = 5 ) { return form( "%#0*o",    w, n ); }
-    inline std::string octstring( unsigned n,           int w = 5 ) { return form( "%#0*o",    w, n ); }
-    inline std::string octstring( long n,               int w = 5 ) { return form( "%#0*lo",   w, n ); }
-    inline std::string octstring( unsigned long n,      int w = 5 ) { return form( "%#0*lo",   w, n ); }
-    inline std::string octstring( long long n,          int w = 0 ) { return form( "%#0*llo",  w, n ); }
-    inline std::string octstring( unsigned long long n, int w = 0 ) { return form( "%#0*llo",  w, n ); }
-    //@}
-
-
-    ///////////////////////////////////////////////////////////////////
-    /** String representation of number as bit-string with leading '0's. */
-    template <typename TInt>
-    std::string binstring( TInt val_r )
-    {
-      constexpr unsigned bits = sizeof(TInt)*8;
-      std::string ret( bits, ' ' );
-      TInt bit = 1;
-      for ( unsigned pos = bits; pos > 0; )
-      { --pos; ret[pos] = ((val_r & bit)?'1':'0'); bit = bit<<1; }
-      return ret;
-    }
-    
-    ///////////////////////////////////////////////////////////////////
-    /** Parsing numbers from string.
-    */
-    //@{
-    /** String to integer type determined by template arg.
-     * \note Only specializations are defined.
-     * \code
-     * time_t t = strtonum<time_t>( "42" );
-     * \endcode
-    */
-    template<typename TInt>
-      TInt strtonum( const C_Str & str );
-
-    template<>
-      inline short              strtonum( const C_Str & str ) { return ::strtol  ( str, NULL, 0 ); }
-    template<>
-      inline int                strtonum( const C_Str & str ) { return ::strtol  ( str, NULL, 0 ); }
-    template<>
-      inline long               strtonum( const C_Str & str ) { return ::strtol  ( str, NULL, 0 ); }
-    template<>
-      inline long long          strtonum( const C_Str & str ) { return ::strtoll ( str, NULL, 0 ); }
-
-    template<>
-      inline unsigned short     strtonum( const C_Str & str ) { return ::strtoul ( str, NULL, 0 ); }
-    template<>
-      inline unsigned           strtonum( const C_Str & str ) { return ::strtoul ( str, NULL, 0 ); }
-    template<>
-      inline unsigned long      strtonum( const C_Str & str ) { return ::strtoul ( str, NULL, 0 ); }
-    template<>
-      inline unsigned long long strtonum( const C_Str & str ) { return ::strtoull( str, NULL, 0 ); }
-
-    /** String to integer type detemined 2nd function arg \a i.
-     * \code
-     * time_t t; strtonum( "42", t );
-     * \endcode
-    */
-    template<typename TInt>
-      inline TInt strtonum( const C_Str & str, TInt & i )
-      { return i = strtonum<TInt>( str ); }
-    //@}
-
-    ///////////////////////////////////////////////////////////////////
-    /** Parsing boolean from string.
-    */
-    //@{
-    /** Return \c true if str is <tt>1, true, yes, on, always</tt> (or a nonzero number). */
-    bool strToTrue( const C_Str & str );
-
-    /** Return \c false if str is <tt>0, false, no, off, never</tt>. */
-    bool strToFalse( const C_Str & str );
-
-    /** Parse \c str into a bool depending on the default value.
-     * If the \c default is true, look for a legal \c false string.
-     * If the \c default is false, look for a legal \c true string.
-     */
-    inline bool strToBool( const C_Str & str, bool default_r )
-    { return( default_r ? strToFalse( str ) : strToTrue( str ) ); }
-
-    /** Parse \c str into a bool if it's a legal \c true or \c false string.
-     * If \c str is not a recognized \c true or \c false string, \a return_r
-     * is left unchanged.
-     */
-    inline bool strToBoolNodefault( const C_Str & str, bool & return_r )
-    {
-      if ( strToTrue( str ) ) return (return_r = true);
-      if ( !strToFalse( str ) ) return (return_r = false);
-      return return_r;
-    }
-
-    /** Parse \c str into a bool if it's a legal \c true or \c false string; else \c indterminate. */
-    TriBool strToTriBool( const C_Str & str );
-
-    //@}
-
-    /**
-     * \short Return a string with all occurrences of \c from_r replaced with \c to_r.
-     */
-    std::string gsub( const std::string & str_r, const std::string & from_r, const std::string & to_r );
-
-    /** \overload A function is called on demand to compute each replacement value.
-     */
-    std::string gsubFun( const std::string & str_r, const std::string & from_r, function<std::string()> to_r );
-
-    /**
-     * \short Replace all occurrences of \c from_r with \c to_r in \c str_r (inplace).
-     * A reference to \c str_r is also returned for convenience.
-     */
-    std::string & replaceAll( std::string & str_r, const std::string & from_r, const std::string & to_r );
-
-    /** \overload A function is called on demand to compute each replacement value.
-     */
-    std::string & replaceAllFun( std::string & str_r, const std::string & from_r, function<std::string()> to_r );
-
-    /** Enhance readability: insert gaps at regular distance
-     * \code
-     *   // no gaps
-     *   Key Fingerprint:  22C07BA534178CD02EFE22AAB88B2FD43DBDC284
-     *   // gapify 8
-     *   Key Fingerprint:  22C07BA5 34178CD0 2EFE22AA B88B2FD4 3DBDC284
-     *   // gapify 4
-     *   Key Fingerprint:  22C0 7BA5 3417 8CD0 2EFE 22AA B88B 2FD4 3DBD C284
-     *   // gapify 4, '-'
-     *   Key Fingerprint:  22C0-7BA5-3417-8CD0-2EFE-22AA-B88B-2FD4-3DBD-C284
-     * \endcode
-     */
-    inline std::string gapify( std::string inp_r, std::string::size_type gap_r = 1, char gapchar = ' ' )
-    {
-      if ( gap_r &&  inp_r.size() > gap_r )
-      {
-       inp_r.reserve( inp_r.size() + (inp_r.size()-1)/gap_r );
-       for ( std::string::size_type pos = gap_r; pos < inp_r.size(); pos += gap_r+1 )
-         inp_r.insert( pos, 1, gapchar );
-      }
-      return inp_r;
-    }
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name Trimming whitepace.
-     * \todo optimize l/r trim.
-    */
-    //@{
-    /** To define how to trim. */
-    enum Trim {
-      NO_TRIM = 0x00,
-      L_TRIM  = 0x01,
-      R_TRIM  = 0x02,
-      TRIM    = (L_TRIM|R_TRIM)
-    };
-
-    std::string trim( const std::string & s, const Trim trim_r = TRIM );
-    std::string trim( std::string && s, const Trim trim_r = TRIM );
-
-    inline std::string ltrim( const std::string & s )
-    { return trim( s, L_TRIM ); }
-    inline std::string ltrim( std::string && s )
-    { return trim( std::move(s), L_TRIM ); }
-
-    inline std::string rtrim( const std::string & s )
-    { return trim( s, R_TRIM ); }
-    inline std::string rtrim( std::string && s )
-    { return trim( std::move(s), R_TRIM ); }
-    //@}
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name Split. */
-    //@{
-    /** Split \a line_r into words.
-     * Any sequence of characters in \a sepchars_r is treated as
-     * delimiter. The words are passed to OutputIterator \a result_r.
-     * \code
-     * std::vector<std::string> words;
-     * str::split( "some line", std::back_inserter(words) )
-     * \endcode
-     *
-    */
-    template<class TOutputIterator>
-      unsigned split( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = " \t", const Trim trim_r = NO_TRIM )
-      {
-        const char * beg = line_r;
-        const char * cur = beg;
-        // skip leading sepchars
-        while ( *cur && ::strchr( sepchars_r, *cur ) )
-          ++cur;
-        unsigned ret = 0;
-        for ( beg = cur; *beg; beg = cur, ++result_r, ++ret )
-          {
-            // skip non sepchars
-            while( *cur && !::strchr( sepchars_r, *cur ) )
-              ++cur;
-            // build string
-            *result_r = trim( std::string( beg, cur-beg ), trim_r );
-            // skip sepchars
-            while ( *cur && ::strchr( sepchars_r, *cur ) )
-              ++cur;
-          }
-        return ret;
-      }
-
-    template<class TOutputIterator>
-      unsigned split( const C_Str & line_r, TOutputIterator result_r, const Trim trim_r )
-      { return split( line_r, result_r, " \t", trim_r ); }
-
-
-    /** Split \a line_r into words with respect to escape delimeters.
-     * Any sequence of characters in \a sepchars_r is treated as
-     * delimiter if not inside \c "" or \c '' or escaped by \c \.
-     *
-     * \li A non-quoted backslash (\) preserves the literal value of the next character.
-     * \li Enclosing characters in single quotes preserves the literal value of each
-     *     character within the quotes.  A single quote may not occur between single
-     *     quotes, even when preceded by a backslash.
-     * \li Enclosing characters in double quotes preserves the literal value of all
-     *     characters within the quotes, with the exception of \c \. The backslash
-     *     retains its special meaning only when followed by \c " or \c \.
-     *
-     * The words are passed to OutputIterator \a result_r.
-     *
-     * \see \ref splitEscaped
-     *
-     * \code
-     * std::vector<std::string> words;
-     * str::splitEscaped( "some line", std::back_inserter(words) )
-     * \endcode
-     *
-     * \code
-     * example splitted strings
-     * normal line -> 2 elements ( "normal", "line" )
-     * escaped\ line -> 1 element(escaped line)
-     * "quoted line" -> 1 element same as above
-     * 'quoted line' -> 1 element same as above
-     * "escaped quote\"" -> 1 element (escaped quote")
-     *
-     * \param line_r   The string to parse.
-     * \param result_r
-     * \param sepchars_r  String of separator characters.
-     * \param withEmpty   Whether to include empty fields between separators in the result.
-     *
-     * \endcode
-     */
-    template<class TOutputIterator>
-      unsigned splitEscaped( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = " \t", bool withEmpty = false)
-      {
-        const char * beg = line_r;
-        const char * cur = beg;
-        unsigned ret = 0;
-
-        // skip leading sepchars
-        while ( *cur && ::strchr( sepchars_r, *cur ) )
-        {
-          ++cur;
-          if (withEmpty)
-          {
-            *result_r = "";
-            ++ret;
-          }
-        }
-
-        // there were only sepchars in the string
-        if (!*cur && withEmpty)
-        {
-          *result_r = "";
-          return ++ret;
-        }
-
-        // after the leading sepchars
-       enum class Quote { None, Slash, Single, Double, DoubleSlash };
-       std::vector<char> buf;
-       Quote quoting = Quote::None;
-        for ( beg = cur; *beg; beg = cur, ++result_r, ++ret )
-       {
-         // read next value until unquoted sepchar
-         buf.clear();
-         quoting = Quote::None;
-         do {
-           switch ( quoting )
-           {
-             case Quote::None:
-               switch ( *cur )
-               {
-                 case '\\':    quoting = Quote::Slash;         break;
-                 case '\'':    quoting = Quote::Single;        break;
-                 case '"':     quoting = Quote::Double;        break;
-                 default:      buf.push_back( *cur );          break;
-               }
-               break;
-
-             case Quote::Slash:
-               buf.push_back( *cur );
-               quoting = Quote::None;
-               break;
-
-             case Quote::Single:
-               switch ( *cur )
-               {
-                 case '\'':    quoting = Quote::None;          break;
-                 default:      buf.push_back( *cur );          break;
-               }
-               break;
-
-             case Quote::Double:
-               switch ( *cur )
-               {
-                 case '\"':    quoting = Quote::None;          break;
-                 case '\\':    quoting = Quote::DoubleSlash;   break;
-                 default:      buf.push_back( *cur );          break;
-               }
-               break;
-
-             case Quote::DoubleSlash:
-               switch ( *cur )
-               {
-                 case '\"':    /*fallthrough*/
-                 case '\\':    buf.push_back( *cur );          break;
-                 default:
-                   buf.push_back( '\\' );
-                   buf.push_back( *cur );
-                   break;
-               }
-               quoting = Quote::Double;
-               break;
-           }
-           ++cur;
-         } while ( *cur && ( quoting != Quote::None || !::strchr( sepchars_r, *cur ) ) );
-         *result_r = std::string( buf.begin(), buf.end() );
-
-
-         // skip sepchars
-         if ( *cur && ::strchr( sepchars_r, *cur ) )
-           ++cur;
-         while ( *cur && ::strchr( sepchars_r, *cur ) )
-         {
-           ++cur;
-           if (withEmpty)
-           {
-             *result_r = "";
-             ++ret;
-           }
-         }
-         // the last was a separator => one more field
-         if ( !*cur && withEmpty && ::strchr( sepchars_r, *(cur-1) ) )
-         {
-           *result_r = "";
-           ++ret;
-         }
-       }
-        return ret;
-      }
-
-    /** Split \a line_r into fields.
-     * Any single character in \a sepchars_r is treated as a
-     * field separator unless \-escaped. The words are passed
-     * to OutputIterator.
-     * \a result_r.
-     * \code
-     * ""        -> words 0
-     * ":"       -> words 2  |||
-     * "a"       -> words 1  |a|
-     * ":a"      -> words 2  ||a|
-     * "a:"      -> words 2  |a||
-     * ":a:"     -> words 3  ||a||
-     *
-     * \endcode
-     *
-     * \code
-     * std::vector<std::string> words;
-     * str::split( "some line", std::back_inserter(words) )
-     * \endcode
-     *
-    */
-    template<class TOutputIterator>
-      unsigned splitFields( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = ":" )
-      {
-        const char * beg = line_r;
-        const char * cur = beg;
-        unsigned ret = 0;
-        for ( beg = cur; *beg; beg = cur, ++result_r )
-          {
-            // skip non sepchars
-            while( *cur && !::strchr( sepchars_r, *cur ) )
-           {
-             if ( *cur == '\\' && *(cur+1) )
-               ++cur;
-              ++cur;
-           }
-            // build string
-            *result_r = std::string( beg, cur-beg );
-            ++ret;
-            // skip sepchar
-            if ( *cur )
-            {
-              ++cur;
-              if ( ! *cur )                // ending with sepchar
-              {
-                *result_r = std::string(); // add final empty field
-                ++ret;
-                break;
-              }
-            }
-          }
-        return ret;
-      }
-
-    /**
-     * Split \a line_r into fields handling also escaped separators.
-     *
-     * \see splitFields()
-     * \see splitEscaped()
-     */
-    template<class TOutputIterator>
-      unsigned splitFieldsEscaped( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = ":" )
-      {
-        return splitEscaped( line_r, result_r, sepchars_r, true /* withEmpty */ );
-      }
-
-    //@}
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name Join. */
-    //@{
-    /** Join strings using separator \a sep_r (defaults to BLANK). */
-    template <class TIterator>
-      std::string join( TIterator begin, TIterator end, const C_Str & sep_r = " " )
-      {
-        std::string res;
-        for ( TIterator iter = begin; iter != end; ++ iter )
-          {
-            if ( iter != begin )
-              res += sep_r;
-            res += asString(*iter);
-          }
-        return res;
-      }
-
-    /** Join strings using separator \a sep_r (defaults to BLANK). */
-    template <class TContainer>
-      std::string join( const TContainer & cont_r, const C_Str & sep_r = " " )
-      { return join( cont_r.begin(), cont_r.end(), sep_r ); }
-
-    /** Join strings using separator \a sep_r, quoting or escaping the values.
-     * Separator defaults to BLANK. Use \ref splitEscaped to restore the
-     * values.
-     */
-    template <class TIterator>
-      std::string joinEscaped( TIterator begin, TIterator end, const char sep_r = ' ' )
-      {
-        std::vector<char> buf;
-        for ( TIterator iter = begin; iter != end; ++ iter )
-        {
-          if ( iter != begin )
-            buf.push_back( sep_r );
-
-          if ( iter->empty() )
-          {
-            // empty string goes ""
-            buf.push_back( '"' );
-            buf.push_back( '"' );
-          }
-          else
-          {
-            std::string toadd( asString(*iter) );
-            for_( ch, toadd.begin(), toadd.end() )
-            {
-              switch ( *ch )
-              {
-                case '"':
-                case '\'':
-                case '\\':
-                  buf.push_back( '\\' );
-                  buf.push_back( *ch );
-                  break;
-                default:
-                  if ( *ch == sep_r )
-                    buf.push_back( '\\' );
-                  buf.push_back( *ch );
-              }
-            }
-          }
-        }
-        return std::string( buf.begin(), buf.end() );
-      }
-    //@}
-
-
-    ///////////////////////////////////////////////////////////////////
-    /** \name Indent. */
-    //@{
-      /** Indent by string ["  "] optionally wrap.
-       * Prints nothing for an empty string. Asserts a trainling '\n' on
-       * the last line. Optionally wrap lines at ' ' at a given length.
-       */
-      inline std::ostream & printIndented( std::ostream & str, const std::string & text_r, const std::string & indent_r = "  ", unsigned maxWitdh_r = 0 )
-      {
-       if ( maxWitdh_r )
-       {
-         if ( indent_r.size() >= maxWitdh_r )
-           maxWitdh_r = 0;     // nonsense: indent larger than line witdh
-         else
-           maxWitdh_r -= indent_r.size();
-       }
-       unsigned width = 0;
-       for ( const char * e = text_r.c_str(), * s = e; *e; s = ++e )
-       {
-         for ( ; *e && *e != '\n'; ++e ) ;/*searching*/
-         width = e-s;
-         if ( maxWitdh_r && width > maxWitdh_r )
-         {
-           // must break line
-           width = maxWitdh_r;
-           for ( e = s+width; e > s && *e != ' '; --e ) ;/*searching*/
-           if ( e > s )
-             width = e-s;      // on a ' ', replaced by '\n'
-           else
-             e = s+width-1;    // cut line;
-         }
-         str << indent_r;
-         str.write( s, width );
-         str << "\n";
-         if ( !*e )    // on '\0'
-           break;
-       }
-       return str;
-      }
-      /** \overload Indent by number of chars [' '] optionally wrap. */
-      inline std::ostream & printIndented( std::ostream & str, const std::string & text_r, unsigned indent_r, char indentch_r = ' ', unsigned maxWitdh_r = 0 )
-      { return printIndented( str, text_r, std::string( indent_r, indentch_r ), maxWitdh_r ); }
-      /** \overload Indent by number of chars [' '] wrap. */
-      inline std::ostream & printIndented( std::ostream & str, const std::string & text_r, unsigned indent_r, unsigned maxWitdh_r, char indentch_r = ' ' )
-      { return printIndented( str, text_r, std::string( indent_r, indentch_r ), maxWitdh_r ); }
-
-      /** Prefix lines by string computed by function taking line begin/end [std::string(const char*, const char*)]
-       * Prints nothing for an empty string. Asserts a trainling '\n' on the last line.
-       */
-      inline std::ostream & autoPrefix( std::ostream & str, const std::string & text_r, function<std::string(const char*, const char*)> fnc_r )
-      {
-       for ( const char * e = text_r.c_str(); *e; ++e )
-       {
-         const char * s = e;
-         for ( ; *e && *e != '\n'; ++e ) /*searching*/;
-         str << fnc_r( s, e );
-         str.write( s, e-s );
-         str << "\n";
-         if ( !*e )    // on '\0'
-           break;
-       }
-       return str;
-      }
-      /** \overload Prefix lines by string generated by function [std::string()] */
-      inline std::ostream & autoPrefix0( std::ostream & str, const std::string & text_r, function<std::string()> fnc_r )
-      {
-       auto wrap = [&fnc_r]( const char*, const char* )-> std::string {
-         return fnc_r();
-       };
-       return autoPrefix( str, text_r, wrap );
-      }
-    //@}
-    ///////////////////////////////////////////////////////////////////
-    /** \name Escape. */
-    //@{
-      /**
-       * Escape desired character \a c using a backslash.
-       *
-       * For use when printing \a c separated values, and where
-       * \ref joinEscaped() is too heavy.
-       */
-      std::string escape( const C_Str & str_r, const char c = ' ' );
-
-      /** Escape \a next_r and append it to \a str_r using separator \a sep_r. */
-      inline void appendEscaped( std::string & str_r, const C_Str & next_r, const char sep_r = ' ' )
-      {
-        if ( ! str_r.empty() )
-          str_r += sep_r;
-        if ( next_r.empty() )
-          str_r += "\"\"";
-        else
-          str_r += escape( next_r, sep_r );
-      }
-
-      /** Return \a str_r with '\'-escaped chars occurring in \a special_r (and '\'). */
-      std::string bEscape( std::string str_r, const C_Str & special_r );
-
-      /** Escape plain STRING \a str_r for use in a regex (not anchored by "^" or "$"). */
-      std::string rxEscapeStr( std::string str_r );
-
-      /** Escape GLOB \a str_r for use in a regex (not anchored by "^" or "$"). */
-      std::string rxEscapeGlob( std::string str_r );
-
-      //! \todo unsecape()
-
-    //@}
-    ///////////////////////////////////////////////////////////////////
-    ///////////////////////////////////////////////////////////////////
-    /** \name Hexencode.
-     * Encode all characters other than [a-zA-Z0-9] as %XX.
-     * This includes the % character itself, which becomes %25.
-     */
-    //@{
-    /** Encode all characters other than [a-zA-Z0-9] as %XX.
-     * This includes the % character itself, which becomes %25.
-     */
-    std::string hexencode( const C_Str & str_r );
-    /** Decode hexencoded %XX sequences. */
-    std::string hexdecode( const C_Str & str_r );
-    //@}
-    ///////////////////////////////////////////////////////////////////
-
-    /** \name Case conversion. */
-    //@{
-    /** Return lowercase version of \a s
-     * \todo improve
-    */
-    std::string toLower( const std::string & s );
-    std::string toLower( std::string && s );
-    /** \overload */
-    inline std::string toLower( const char * s )
-    { return( s ? toLower( std::string(s) ) : std::string() ); }
-
-    /** Return uppercase version of \a s
-     * \todo improve
-    */
-    std::string toUpper( const std::string & s );
-    std::string toUpper( std::string && s );
-    /** \overload */
-    inline std::string toUpper( const char * s )
-    { return( s ? toUpper( std::string(s) ) : std::string() ); }
-    //@}
-
-
-    /** \name Case insensitive comparison. */
-    //@{
-    inline int compareCI( const C_Str & lhs, const C_Str & rhs )
-    { return ::strcasecmp( lhs, rhs ); }
-    //@}
-
-    /** \name Locate substring. */
-    //@{
-    /** Locate substring case sensitive. */
-    inline bool contains( const C_Str & str_r, const C_Str & val_r )
-    { return ::strstr( str_r, val_r ); }
-    /** Locate substring case insensitive. */
-    inline bool containsCI( const C_Str & str_r, const C_Str & val_r )
-    { return ::strcasestr( str_r, val_r ); }
-    //@}
-
-    std::string stripFirstWord( std::string & line, const bool ltrim_first = true );
-
-    std::string stripLastWord( std::string & line, const bool rtrim_first = true );
-
-    /** Return stream content up to (but not returning) the next newline.
-     * \see \ref receiveUpTo
-     */
-    std::string getline( std::istream & str, bool trim = false );
-
-    /** Return stream content up to (but not returning) the next newline.
-     * \see \ref receiveUpTo
-     */
-    std::string getline( std::istream & str, const Trim trim_r );
-
-    /** Return stream content up to the next ocurrence of \c delim_r or EOF
-     * \c delim_r, if found, is always read from the stream. Whether it is
-     * also returned in the string depends on \c returnDelim_r.
-     * If the stream status is \c good, \c delim_r was found in the stream.
-     * If we reached EOF while looking for \c delim_r, \c eof is set; and
-     * also \c fail, if we did not read any data before.
-     */
-    std::string receiveUpTo( std::istream & str, const char delim_r, bool returnDelim_r = false );
-
-    ///////////////////////////////////////////////////////////////////
-
-    /** \name String prefix/suffix handling.
-     */
-    //@{
-    /** Return whether \a str_r has prefix \a prefix_r. */
-    inline bool hasPrefix( const C_Str & str_r, const C_Str & prefix_r )
-    { return( ::strncmp( str_r, prefix_r, prefix_r.size() ) == 0 ); }
-    /** \overload Case insensitive */
-    inline bool hasPrefixCI( const C_Str & str_r, const C_Str & prefix_r )
-    { return( ::strncasecmp( str_r, prefix_r, prefix_r.size() ) == 0 ); }
-
-    /** Strip a \a prefix_r from \a str_r and return the resulting string. */
-    inline std::string stripPrefix( const C_Str & str_r, const C_Str & prefix_r )
-    { return( hasPrefix( str_r, prefix_r ) ? str_r + prefix_r.size() : str_r.c_str() ); }
-    /** \overload Case insensitive */
-    inline std::string stripPrefixCI( const C_Str & str_r, const C_Str & prefix_r )
-    { return( hasPrefixCI( str_r, prefix_r ) ? str_r + prefix_r.size() : str_r.c_str() ); }
-
-    /** Return whether \a str_r has suffix \a suffix_r. */
-    inline bool hasSuffix( const C_Str & str_r, const C_Str & suffix_r )
-    { return( str_r.size() >= suffix_r.size() && ::strncmp( str_r + str_r.size() - suffix_r.size() , suffix_r, suffix_r.size() ) == 0 ); }
-    /** \overload Case insensitive */
-    inline bool hasSuffixCI( const C_Str & str_r, const C_Str & suffix_r )
-    { return( str_r.size() >= suffix_r.size() && ::strncasecmp( str_r + str_r.size() - suffix_r.size() , suffix_r, suffix_r.size() ) == 0 ); }
-
-    /** Strip a \a suffix_r from \a str_r and return the resulting string. */
-    inline std::string stripSuffix( const C_Str & str_r, const C_Str & suffix_r )
-    {
-      if ( hasSuffix( str_r, suffix_r ) )
-        return std::string( str_r, str_r.size() - suffix_r.size() );
-      return str_r.c_str();
-    }
-    /** \overload Case insensitive */
-    inline std::string stripSuffixCI( const C_Str & str_r, const C_Str & suffix_r )
-    {
-      if ( hasSuffixCI( str_r, suffix_r ) )
-        return std::string( str_r, str_r.size() - suffix_r.size() );
-      return str_r.c_str();
-    }
-
-    /** Return size of the common prefix of \a lhs and \a rhs. */
-    inline std::string::size_type commonPrefix( const C_Str & lhs, const C_Str & rhs )
-    {
-      const char * lp = lhs.c_str();
-      const char * rp = rhs.c_str();
-      std::string::size_type ret = 0;
-      while ( *lp == *rp && *lp != '\0' )
-      { ++lp, ++rp, ++ret; }
-      return ret;
-    }
-    /** \overload Case insensitive */
-    inline std::string::size_type commonPrefixCI( const C_Str & lhs, const C_Str & rhs )
-    {
-      const char * lp = lhs.c_str();
-      const char * rp = rhs.c_str();
-      std::string::size_type ret = 0;
-      while ( tolower(*lp) == tolower(*rp) && *lp != '\0' )
-      { ++lp, ++rp, ++ret; }
-      return ret;
-    }
-
-
-    /** alias for \ref hasPrefix */
-    inline bool startsWith( const C_Str & str_r, const C_Str & prefix_r )
-    { return hasPrefix( str_r, prefix_r ); }
-    /** \overload Case insensitive */
-    inline bool startsWithCI( const C_Str & str_r, const C_Str & prefix_r )
-    { return hasPrefixCI( str_r, prefix_r ); }
-
-    /** alias for \ref hasSuffix */
-    inline bool endsWith( const C_Str & str_r, const C_Str & prefix_r )
-    { return hasSuffix( str_r, prefix_r ); }
-    /** \overload Case insensitive */
-    inline bool endsWithCI( const C_Str & str_r, const C_Str & prefix_r )
-    { return hasSuffixCI( str_r, prefix_r ); }
-    //@}
-  } // namespace str
-  ///////////////////////////////////////////////////////////////////
-
-  // drag into zypp:: namespace
-  using str::asString;
-
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_STRING_H
+#include <zypp-core/base/String.h>
index 2b38abe..620f719 100644 (file)
@@ -1,282 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/base/StringV.h
- * c++17: std::string_view tools
- */
-#ifndef ZYPP_BASE_STRINGV_H
-#define ZYPP_BASE_STRINGV_H
-#include <string_view>
-#ifdef __cpp_lib_string_view
-
-#include <zypp/base/String.h>
-#include <zypp/base/Regex.h>
-#include <zypp/base/Flags.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{
-  namespace strv
-  {
-    using regex = str::regex;
-    using smatch = str::smatch;
-
-    /** Define how to trim. */
-    enum class Trim {
-      notrim = 0,
-      left   = 1<<0,
-      right  = 1<<1,
-      trim   = (left|right),
-    };
-
-    ZYPP_DECLARE_FLAGS_AND_OPERATORS( TrimFlag, Trim );
-
-    /** The default blank. */
-    inline constexpr std::string_view blank = " \t";
-
-    /** Trim \a chars_r at the beginning of \a str_r. */
-    inline std::string_view ltrim( std::string_view str_r, std::string_view chars_r = blank )
-    {
-      if ( str_r.empty() )
-       return str_r;
-      auto pos = str_r.find_first_not_of( chars_r );
-      if ( pos == str_r.npos )
-       str_r.remove_prefix( str_r.size() );
-      else if ( pos )
-       str_r.remove_prefix( pos );
-      return str_r;
-    }
-
-    /** Trim \a chars_r at the end of \a str_r. */
-    inline std::string_view rtrim( std::string_view str_r, std::string_view chars_r = blank )
-    {
-      if ( str_r.empty() )
-       return str_r;
-      auto pos = str_r.find_last_not_of( chars_r );
-      if ( pos == str_r.npos )
-       str_r.remove_suffix( str_r.size() );
-      else if ( (pos = str_r.size()-1-pos) )
-       str_r.remove_suffix( pos );
-      return str_r;
-    }
-
-    /** Trim \a chars_r at both sides of \a str_r. */
-    inline std::string_view trim( std::string_view str_r, std::string_view chars_r = blank )
-    {
-      if ( str_r.empty() )
-       return str_r;
-      str_r = ltrim( std::move(str_r), chars_r );
-      str_r = rtrim( std::move(str_r), chars_r );
-      return str_r;
-    }
-
-    /** Trim \a chars_r at \a trim_r sides of \a str_r. */
-    inline std::string_view trim( std::string_view str_r, std::string_view chars_r, TrimFlag trim_r )
-    {
-      if ( str_r.empty() || trim_r == Trim::notrim )
-       return str_r;
-      if ( trim_r.testFlag( Trim::left ) )
-       str_r = ltrim( std::move(str_r), chars_r );
-      if ( trim_r.testFlag( Trim::right ) )
-       str_r = rtrim( std::move(str_r), chars_r );
-      return str_r;
-    }
-    /** \overload Trimming blanks at \a trim_r sides of \a str_r. */
-    inline std::string_view trim( std::string_view str_r, TrimFlag trim_r )
-    { return trim( std::move(str_r), blank, std::move(trim_r) ); }
-
-    ///////////////////////////////////////////////////////////////////
-    namespace detail
-    {
-      /** Split* functions working horse callback. */
-      using WordConsumer = std::function<bool(std::string_view,unsigned,bool)>;
-
-      /** \name Split* callback signatures accepted for convenience.
-       *
-       * Details may vary for specific split* functions, but basically each separator found
-       * in line will be enclosed by 2 words being reported. The working horse callback
-       * offers the \a word, the \a index of word (starting with 0) and a boolean indicating whether
-       * this is going to be the \a last report.
-       *
-       * A callback may optionally return a value convertible to \c bool. Returning \c false
-       * usually causes split* to stop looking further separators and to finish the reporting.
-       *
-       * Accepted callbacks: [bool|void] callback( [std::string_view[, unsigned[, bool]]] )
-       * (or no callback at all )
-       */
-      //@{
-      /** bool(std::string_view,unsigned,bool) */
-      template <typename Callable, std::enable_if_t<
-      std::is_invocable_r_v<bool,Callable,std::string_view,unsigned,bool>
-      , bool> = true>
-      WordConsumer wordConsumer( Callable && fnc_r )
-      { return std::forward<Callable>(fnc_r); }
-      /** void(std::string_view,unsigned,bool) */
-      template <typename Callable, std::enable_if_t<
-      ! std::is_invocable_r_v<bool,Callable,std::string_view,unsigned,bool>
-      && std::is_invocable_r_v<void,Callable,std::string_view,unsigned,bool>
-      , bool> = true>
-      WordConsumer wordConsumer( Callable && fnc_r )
-      { return [&fnc_r](std::string_view a1,unsigned a2,bool a3)->bool { fnc_r(a1,a2,a3); return true; }; }
-
-      /** bool(std::string_view,unsigned) */
-      template <typename Callable, std::enable_if_t<
-      std::is_invocable_r_v<bool,Callable,std::string_view,unsigned>
-      , bool> = true>
-      WordConsumer wordConsumer( Callable && fnc_r )
-      { return [&fnc_r](std::string_view a1,unsigned a2,bool)->bool { return fnc_r(a1,a2); }; }
-      /** void(std::string_view,unsigned) */
-      template <typename Callable, std::enable_if_t<
-      ! std::is_invocable_r_v<bool,Callable,std::string_view,unsigned>
-      && std::is_invocable_r_v<void,Callable,std::string_view,unsigned>
-      , bool> = true>
-      WordConsumer wordConsumer( Callable && fnc_r )
-      { return [&fnc_r](std::string_view a1,unsigned a2,bool)->bool { fnc_r(a1,a2); return true; }; }
-
-      /** bool(std::string_view) */
-      template <typename Callable, std::enable_if_t<
-      std::is_invocable_r_v<bool,Callable,std::string_view>
-      , bool> = true>
-      WordConsumer wordConsumer( Callable && fnc_r )
-      { return [&fnc_r](std::string_view a1,unsigned,bool)->bool { return fnc_r(a1); }; }
-      /** void(std::string_view) */
-      template <typename Callable, std::enable_if_t<
-      ! std::is_invocable_r_v<bool,Callable,std::string_view>
-      && std::is_invocable_r_v<void,Callable,std::string_view>
-      , bool> = true>
-      WordConsumer wordConsumer( Callable && fnc_r )
-      { return [&fnc_r](std::string_view a1,unsigned,bool)->bool { fnc_r(a1); return true; }; }
-
-      /** bool() */
-      template <typename Callable, std::enable_if_t<
-      std::is_invocable_r_v<bool,Callable>
-      , bool> = true>
-      WordConsumer wordConsumer( Callable && fnc_r )
-      { return [&fnc_r](std::string_view,unsigned,bool)->bool { return fnc_r(); }; }
-      /** void() */
-      template <typename Callable, std::enable_if_t<
-      ! std::is_invocable_r_v<bool,Callable>
-      && std::is_invocable_r_v<void,Callable>
-      , bool> = true>
-      WordConsumer wordConsumer( Callable && fnc_r )
-      { return [&fnc_r](std::string_view,unsigned,bool)->bool { fnc_r(); return true; }; }
-      //@}
-
-      /** \ref split working horse */
-      unsigned _split( std::string_view line_r, std::string_view sep_r, Trim trim_r, WordConsumer && fnc_r );
-
-      /** \ref splitRx working horse */
-      unsigned _splitRx( const std::string & line_r, const regex & rx_r, WordConsumer && fnc_r );
-
-    }  // namespace detail
-    ///////////////////////////////////////////////////////////////////
-
-    /** Split \a line_r into words separated by the regular expression \a rx_r and invoke \a fnc_r with each word.
-     *
-     * Each separator match found in \a line_r will be enclosed by 2 words being reported.
-     * Words may be empty if the separator match is located at the beginning or at the end
-     * of \a line_r, or it there are consecutive separator match occurrences.
-     *
-     * Accepted callbacks: [bool|void]( [std::string_view[, unsigned[, bool]]] )
-     * (or no callback at all)
-     *
-     * A callback may take the \a word, the \a index of word (starting with 0) and a boolean
-     * indicating whether this is going to be the \a last report.
-     *
-     * A callback may optionally return a value convertible to \c bool. Returning \c false
-     * causes split to stop looking further separators. The final report will contain the
-     * remaining part of the \a line_r then.
-     *
-     * If the separator does not occur on the line the whole string is reported.
-     *
-     * \returns the number of words reported.
-     */
-    template <typename Callable = detail::WordConsumer>
-    unsigned splitRx( const std::string & line_r, const regex & rx_r, Callable && fnc_r = Callable() )
-    { return detail::_splitRx( line_r, rx_r, detail::wordConsumer( std::forward<Callable>(fnc_r) ) ); }
-
-
-    /** Split \a line_r into words separated by \a sep_r and invoke \a fnc_r with each word.
-     *
-     * - If \a sep_r is not empty, each separator found in \a line_r will be enclosed by 2
-     * words being reported. Words may be empty if the separator is located at the beginning
-     * or the end of \a line_r or it there are consecutive occurrences.
-     *
-     * - If \a sep_r is unspecified or empty, it splits on whitespace /[BLANK,TAB]+/. In this
-     * case only the (not empty) words found on the line are reported (trimmed).
-     *
-     * The optional \a trim_r argument tells whether whitespace around the words found
-     * should be trimmed before reporting them. The default is not to trim.
-     *
-     * Accepted callbacks: [bool|void]( [std::string_view[, unsigned[, bool]]] )
-     * (or no callback at all)
-     *
-     * A callback may take the \a word, the \a index of word (starting with 0) and a boolean
-     * indicating whether this is going to be the \a last report.
-     *
-     * A callback may optionally return a value convertible to \c bool. Returning \c false
-     * causes split to stop looking further separators. The final report will contain the
-     * remaining part of the \a line_r then.
-     *
-     * If the separator does not occur on the line the whole string is reported.
-     *
-     * \returns the number of words reported.
-     *
-     * \code
-     *   str = ""
-     *
-     *   split( str, fnc );
-     *   // []
-     *
-     *   split( str, " ", fnc );
-     *   // ['']
-     *
-     *
-     *   str = " "
-     *
-     *   split( str, fnc );
-     *   // []
-     *
-     *   split( str, " ", fnc );
-     *   // ['', '']
-     *
-     *
-     *   str = " 1 2 3 4 5 ";
-     *
-     *   split( str, fnc );
-     *   // ['1', '2', '3', '4', '5']
-     *
-     *   split( str, " ", fnc );
-     *   // ['', '1', '2', '3', '4', '5', '']
-     *
-     *   split( str, " 2", fnc );
-     *   // [' 1', ' 3 4 5 ']
-     *
-     *   split( str, " 2", Trim::all, fnc );
-     *   // ['1', '3 4 5']
-     * \endcode
-     */
-    template <typename Callable = detail::WordConsumer>
-    unsigned split( std::string_view line_r, std::string_view sep_r, Trim trim_r, Callable && fnc_r = Callable() )
-    { return detail::_split( line_r, sep_r, trim_r, detail::wordConsumer( std::forward<Callable>(fnc_r) ) ); }
-
-    /** \overload  Split at \a sep_r and Trim::notrim */
-    template <typename Callable = detail::WordConsumer>
-    inline unsigned split( std::string_view line_r, std::string_view sep_r, Callable && fnc_r = Callable() )
-    { return detail::_split( line_r, sep_r, Trim::notrim, detail::wordConsumer( std::forward<Callable>(fnc_r) ) ); }
-
-    /** \overload  Split at whitespace */
-    template <typename Callable = detail::WordConsumer>
-    inline unsigned split( std::string_view line_r, Callable && fnc_r = Callable() )
-    { return detail::_split( line_r, std::string_view(), Trim::notrim, detail::wordConsumer( std::forward<Callable>(fnc_r) ) ); }
-
-  } // namespace strv
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // __cpp_lib_string_view
-#endif // ZYPP_BASE_STRINGV_H
+#include <zypp-core/base/StringV.h>
index 5fb7ac8..e91d22b 100644 (file)
@@ -1,103 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Unit.h
- *
-*/
-#ifndef ZYPP_BASE_UNIT_H
-#define ZYPP_BASE_UNIT_H
-
-#include <iosfwd>
-#include <string>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{ /////////////////////////////////////////////////////////////////
-  ///////////////////////////////////////////////////////////////////
-  namespace base
-  { /////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : Unit
-    //
-    /** Simple handling of Units.
-     *
-     * Unit stores factor and symbol, and a precision value for printing.
-     * \ref form builds a string from a value according to the format
-     * specification.
-     * \code
-     * static const Unit B( 1, "B", 0 );
-     * static const Unit K( 1024, "K", 1 );
-     * static const Unit M( 1048576, "M", 1 );
-     * static const Unit G( 1073741824, "G", 2 );
-     * static const Unit T( 1099511627776, "T", 3 );
-     * \endcode
-    */
-      class Unit
-      {
-      public:
-        typedef long long ValueType;
-
-        /** Default ctor */
-        Unit()
-        : _factor( 1 )
-        , _prec( 0 )
-        {}
-
-        /** ctor */
-        Unit( ValueType factor_r, std::string symbol_r, unsigned prec_r )
-        : _factor( factor_r )
-        , _symbol( symbol_r )
-        , _prec( prec_r )
-        {}
-
-        ValueType factor() const
-        { return _factor; }
-
-        const std::string & symbol() const
-        { return _symbol; }
-
-        unsigned prec() const
-        { return _prec; }
-
-        /** Build string representation of \a val_r. */
-        std::string form( ValueType val_r,
-                          unsigned field_width_r = 0,
-                          unsigned unit_width_r  = 1 ) const
-        { return form( val_r, field_width_r, unit_width_r, _prec ); }
-
-        std::string form( ValueType val_r,
-                          unsigned field_width_r,
-                          unsigned unit_width_r,
-                          unsigned prec_r ) const
-        { return form( double(val_r)/_factor, _symbol,
-                       field_width_r, unit_width_r, prec_r ); }
-
-
-        static std::string form( double val_r,
-                                 const std::string & symbol_r,
-                                 unsigned field_width_r,
-                                 unsigned unit_width_r,
-                                 unsigned prec_r );
-
-      private:
-        ValueType   _factor;
-        std::string _symbol;
-        unsigned    _prec;
-      };
-    ///////////////////////////////////////////////////////////////////
-
-
-    /////////////////////////////////////////////////////////////////
-  } // namespace base
-  ///////////////////////////////////////////////////////////////////
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_UNIT_H
+#include <zypp-core/base/Unit.h>
index b54d692..b852cde 100644 (file)
@@ -1,224 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file      zypp/base/Xml.h
- *
-*/
-#ifndef ZYPP_BASE_XML_H
-#define ZYPP_BASE_XML_H
-
-#include <iosfwd>
-#include <string>
-#include <vector>
-#include <list>
-#include <set>
-#include <map>
-
-#include <zypp/base/Easy.h>
-#include <zypp/base/String.h>
-#include <zypp/parser/xml/XmlEscape.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{
-  ///////////////////////////////////////////////////////////////////
-  namespace xmlout
-  {
-    using xml::escape;
-    using xml::unescape;
-
-    /** \relates NodeAttr NODE ATTRIBUTE representation of types [asString] */
-    template <class Tp>
-    std::string asXmlNodeAttr( const Tp & val_r )
-    { return asString( val_r ); }
-
-    ///////////////////////////////////////////////////////////////////
-    /// \class NodeAttr
-    /// \brief (Key, Value) string pair of XML node attributes
-    struct NodeAttr : public std::pair<std::string,std::string>
-    {
-      typedef std::pair<std::string,std::string> Pair;
-
-      template <typename Tp>
-      NodeAttr( std::string key_r, const Tp & val_r )
-      : Pair( std::move(key_r), asXmlNodeAttr(val_r) )
-      {}
-
-      NodeAttr( std::string key_r, std::string val_r )
-      : Pair( std::move(key_r), std::move(val_r) )
-      {}
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    ///////////////////////////////////////////////////////////////////
-    /// \class Node
-    /// \brief RAII writing a nodes start/end tag
-    /// \code
-    /// {
-    ///   Node node( std::cout, "node", { "attr", "val" } ); // <node attr="val">
-    ///   *node << "write nodes body...."
-    /// }                                                    // </node>
-    /// \endcode
-    /// \note If the \ref optionalContent flag is passed to the \c ctor, the start
-    /// node is kept open, until the first call to \ref operator*. The start node
-    /// is closed before returning the stream.
-    /// \code
-    /// {
-    ///   Node node( std::cout, "node", Node::optionalContent, { "attr", "val" } );
-    ///                                                      // <node attr="val"
-    /// }                                                    // />
-    /// {
-    ///   Node node( std::cout, "node", Node::optionalContent, { "attr", "val" } );
-    ///                                                      // <node attr="val"
-    ///   *node << "write nodes body...."                    // />write nodes body...
-    /// }                                                    // </node>
-    /// \endcode
-    ///
-    /// \note If the nodename is empty or starts with an \c !, a comment is written.
-    ///
-    struct Node
-    {
-      NON_COPYABLE_BUT_MOVE( Node );
-      typedef NodeAttr Attr;
-
-      struct OptionalContentType {};   ///< Ctor arg type
-      static constexpr OptionalContentType optionalContent = OptionalContentType();
-
-      /** Ctor taking nodename and attribute list */
-      Node( std::ostream & out_r, std::string name_r, const std::initializer_list<Attr> & attrs_r = {} )
-      : _out( out_r ), _name( std::move(name_r) ), _hasContent( true )
-      { printStart( attrs_r ); }
-
-      /** Convenience ctor for one attribute pair */
-      Node( std::ostream & out_r, std::string name_r, Attr attr_r )
-      : Node( out_r, std::move(name_r), { attr_r } )
-      {}
-
-      /** Optional content ctor taking nodename and attribute list */
-      Node( std::ostream & out_r, std::string name_r, OptionalContentType, const std::initializer_list<Attr> & attrs_r = {} )
-      : _out( out_r ), _name( std::move(name_r) ), _hasContent( false )
-      { printStart( attrs_r ); }
-
-      /** Optional content Convenience ctor for one attribute pair */
-      Node( std::ostream & out_r, std::string name_r, OptionalContentType, Attr attr_r )
-      : Node( out_r, std::move(name_r), optionalContent, { attr_r } )
-      {}
-
-      /** Dtor wrting end tag */
-      ~Node()
-      {
-       if ( isComment() )
-         _out << "-->";
-       else
-       {
-         if ( _hasContent )
-           _out << "</" << _name << ">";
-         else
-           _out << "/>";
-       }
-      }
-
-      /** Exception type thrown if attributes are added to a closed start node. */
-      struct HasContentException{};
-
-       /** Add additional attributes (requires OptionalContentType)
-       * \throw HasContentException If start node is already closed
-       */
-      Node & addAttr( const std::initializer_list<Attr> & attrs_r = {} )
-      {
-       if ( _hasContent )
-         throw HasContentException();
-       printAttr( attrs_r );
-       return *this;
-      }
-
-      /** \overload for one */
-      Node & addAttr( const Attr & attr_r )
-      { return addAttr( { attr_r } ); }
-
-
-      /** Return the output stream */
-      std::ostream & operator*()
-      {
-       if ( ! _hasContent )
-       {
-         _hasContent = true;
-         if ( isComment() )
-           _out << "|";
-         else
-           _out << ">";
-       }
-       return _out;
-      }
-
-    private:
-      void printStart( const std::initializer_list<Attr> & attrs_r )
-      {
-       if ( _name.empty() || _name[0] == '!' )
-       {
-         _out << "<!--" << _name;
-         _name.clear();        // a comment
-       }
-       else
-         _out << "<" << _name;
-
-       printAttr( attrs_r );
-
-       if ( !isComment() && _hasContent )
-         _out << ">";
-      }
-
-      void printAttr( const std::initializer_list<Attr> & attrs_r )
-      {
-       for ( const auto & pair : attrs_r )
-         _out << " " << pair.first << "=\"" << xml::escape( pair.second ) << "\"";
-      }
-
-      bool isComment() const
-      { return _name.empty();  }
-
-    private:
-      std::ostream & _out;
-      std::string _name;
-      bool _hasContent;
-    };
-    ///////////////////////////////////////////////////////////////////
-
-    /** \relates Node Write a leaf node without PCDATA
-     * \code
-     * <node attr="val"/>
-     * \endcode
-     */
-    inline std::ostream & node( std::ostream & out_r, const std::string & name_r, const std::initializer_list<Node::Attr> & attrs_r = {} )
-    {
-      Node( out_r, name_r, Node::optionalContent, attrs_r );
-      return out_r;
-    }
-    /** \overload for one attribute pair */
-    inline std::ostream & node( std::ostream & out_r, const std::string & name_r, Node::Attr attr_r )
-    { return node( out_r, name_r, { attr_r } ); }
-
-  } // namespace xmlout
-  ///////////////////////////////////////////////////////////////////
-
-  /// \name Default dumpAsXmlOn based on asString.
-  ///
-  //@{
-  template <class Tp>
-  inline std::ostream & dumpAsXmlOn( std::ostream & str, const Tp & obj, const std::string & name_r )
-  {
-    xmlout::Node guard( str, name_r, xmlout::Node::optionalContent );
-    const std::string & content( asString( obj ) );
-    if ( ! content.empty() ) *guard << xml::escape( content );
-    return str;
-  }
-  //@}
-  //
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_BASE_XML_H
+#include <zypp-core/base/Xml.h>
index 662a119..b148518 100644 (file)
@@ -14,6 +14,7 @@
 #include <zypp/base/Logger.h>
 #include <zypp/base/InputStream.h>
 #include <zypp/parser/IniDict.h>
+#include <zypp/PathInfo.h>
 
 #include <zypp/media/CredentialFileReader.h>
 
@@ -57,6 +58,9 @@ namespace zypp
        : _input( input_r )
        , _callback( callback_r )
        {
+          zypp::PathInfo pi( input_r );
+          _lastChange = pi.mtime();
+
          try
          {
            parse( input_r );
@@ -109,6 +113,7 @@ namespace zypp
          {
            if ( _secret->valid() )
            {
+              _secret->setLastDatabaseUpdate( _lastChange );
              if ( !_callback( _secret ) )
                throw( StopParsing() );
            }
@@ -121,6 +126,7 @@ namespace zypp
        const Pathname &                _input;
        const ProcessCredentials &      _callback;
        AuthData_Ptr                    _secret;
+        time_t                          _lastChange;
       };
     } // namespace
     ///////////////////////////////////////////////////////////////////
index e127514..9884b6b 100644 (file)
 #include <zypp/PathInfo.h>
 
 #include <zypp/media/CredentialFileReader.h>
-
 #include <zypp/media/CredentialManager.h>
+#include <zypp/media/MediaException.h>
+
+#include <boost/interprocess/sync/file_lock.hpp>
+#include <boost/interprocess/sync/scoped_lock.hpp>
+#include <boost/interprocess/sync/sharable_lock.hpp>
+
+namespace bpci = boost::interprocess;
+
 
 using std::endl;
 
@@ -175,12 +182,15 @@ namespace zypp
                              url::ViewOption vopt)
   {
     const std::string & username = url.getUsername();
-    for(CredentialManager::CredentialIterator it = set.begin(); it != set.end(); ++it)
+    for( CredentialManager::CredentialIterator it = set.begin(); it != set.end(); ++it )
     {
+      if ( !(*it)->url().isValid() )
+        continue;
+
       // this ignores url params - not sure if it is good or bad...
-      if (url.asString(vopt).find((*it)->url().asString(vopt)) == 0)
+      if ( url.asString(vopt).find((*it)->url().asString(vopt)) == 0 )
       {
-        if (username.empty() || username == (*it)->username())
+        if ( username.empty() || username == (*it)->username() )
           return *it;
       }
     }
@@ -231,6 +241,10 @@ namespace zypp
       // get from /etc/zypp/credentials.d, delete the leading path
       credfile = _options.customCredFileDir / file.basename();
 
+    // make sure only our thread accesses the file
+    bpci::file_lock lockFile ( credfile.c_str() );
+    bpci::scoped_lock lock( lockFile );
+
     CredentialFileReader(credfile, bind(&Impl::processCredentials, this, _1));
     if (_credsTmp.empty())
       WAR << file << " does not contain valid credentials or is not readable." << endl;
@@ -255,9 +269,15 @@ namespace zypp
     if (!fs)
       ret = 1;
 
+    // make sure only our thread accesses the file
+    bpci::file_lock lockFile ( file.c_str() );
+    bpci::scoped_lock lock( lockFile );
+
+
     for_(it, creds.begin(), creds.end())
     {
       (*it)->dumpAsIniOn(fs);
+      (*it)->setLastDatabaseUpdate( time( nullptr ) );
       fs << endl;
     }
     fs.close();
@@ -304,6 +324,9 @@ namespace zypp
 
   void CredentialManager::addCred(const AuthData & cred)
   {
+    if ( !cred.url().isValid() )
+      ZYPP_THROW( MediaInvalidCredentialsException( "URL must be valid in order to save AuthData." ) );
+
     Pathname credfile = cred.url().getQueryParam("credentials");
     if (credfile.empty())
       //! \todo ask user where to store these creds. saving to user creds for now
@@ -315,6 +338,9 @@ namespace zypp
 
   void CredentialManager::addGlobalCred(const AuthData & cred)
   {
+    if ( !cred.url().isValid() )
+      ZYPP_THROW( MediaInvalidCredentialsException( "URL must be valid in order to save AuthData." ) );
+
     AuthData_Ptr c_ptr;
     c_ptr.reset(new AuthData(cred)); // FIX for child classes if needed
     std::pair<CredentialIterator, bool> ret = _pimpl->_credsGlobal.insert(c_ptr);
@@ -331,6 +357,9 @@ namespace zypp
 
   void CredentialManager::addUserCred(const AuthData & cred)
   {
+    if ( !cred.url().isValid() )
+      ZYPP_THROW( MediaInvalidCredentialsException( "URL must be valid in order to save AuthData." ) );
+
     AuthData_Ptr c_ptr;
     c_ptr.reset(new AuthData(cred)); // FIX for child classes if needed
     std::pair<CredentialIterator, bool> ret = _pimpl->_credsUser.insert(c_ptr);
index 4307aef..703ae45 100644 (file)
 using std::endl;
 using namespace zypp;
 
+namespace zypp
+{
+  namespace env
+  {
+    namespace
+    {
+      inline int getZYPP_MEDIA_CURL_IPRESOLVE()
+      {
+       int ret = 0;
+       if ( const char * envp = getenv( "ZYPP_MEDIA_CURL_IPRESOLVE" ) )
+       {
+         WAR << "env set: $ZYPP_MEDIA_CURL_IPRESOLVE='" << envp << "'" << std::endl;
+         if (      strcmp( envp, "4" ) == 0 )  ret = 4;
+         else if ( strcmp( envp, "6" ) == 0 )  ret = 6;
+       }
+         return ret;
+      }
+    } //namespace
+
+    int ZYPP_MEDIA_CURL_IPRESOLVE()
+    {
+      static int _v = getZYPP_MEDIA_CURL_IPRESOLVE();
+      return _v;
+    }
+  } // namespace env
+} // namespace zypp
+
 namespace internal
 {
 
@@ -270,19 +297,6 @@ void fillSettingsSystemProxy( const Url& url, media::TransferSettings &s )
 }
 
 
-int env::getZYPP_MEDIA_CURL_IPRESOLVE()
-{
-  int ret = 0;
-  if ( const char * envp = getenv( "ZYPP_MEDIA_CURL_IPRESOLVE" ) )
-  {
-    WAR << "env set: $ZYPP_MEDIA_CURL_IPRESOLVE='" << envp << "'" << std::endl;
-    if (      strcmp( envp, "4" ) == 0 )       ret = 4;
-    else if ( strcmp( envp, "6" ) == 0 )       ret = 6;
-  }
-  return ret;
-}
-
-
 const char * anonymousIdHeader()
 {
   // we need to add the release and identifier to the
@@ -384,4 +398,74 @@ zypp::Url propagateQueryParams( zypp::Url url_r, const zypp::Url & template_r )
   return url_r;
 }
 
+ProgressData::ProgressData(CURL *_curl, time_t _timeout, const Url &_url, ByteCount expectedFileSize_r, zypp::callback::SendReport< zypp::media::DownloadProgressReport> *_report)
+: curl( _curl )
+, url( _url )
+, timeout( _timeout )
+, reached( false )
+, fileSizeExceeded ( false )
+, report( _report )
+, _expectedFileSize( expectedFileSize_r )
+{}
+
+void ProgressData::updateStats(double dltotal, double dlnow)
+{
+  time_t now = _timeNow = time(0);
+
+  // If called without args (0.0), recompute based on the last values seen
+  if ( dltotal && dltotal != _dnlTotal )
+    _dnlTotal = dltotal;
+
+  if ( dlnow && dlnow != _dnlNow )
+  {
+    _timeRcv = now;
+    _dnlNow = dlnow;
+  }
+  else if ( !_dnlNow && !_dnlTotal )
+  {
+    // Start time counting as soon as first data arrives.
+    // Skip the connection / redirection time at begin.
+    return;
+  }
+
+  // init or reset if time jumps back
+  if ( !_timeStart || _timeStart > now )
+    _timeStart = _timeLast = _timeRcv = now;
+
+  // timeout condition
+  if ( timeout )
+    reached = ( (now - _timeRcv) > timeout );
+
+  // check if the downloaded data is already bigger than what we expected
+  fileSizeExceeded = _expectedFileSize > 0 && _expectedFileSize < static_cast<ByteCount::SizeType>(_dnlNow);
+
+  // percentage:
+  if ( _dnlTotal )
+    _dnlPercent = int(_dnlNow * 100 / _dnlTotal);
+
+  // download rates:
+  _drateTotal = _dnlNow / std::max( int(now - _timeStart), 1 );
+
+  if ( _timeLast < now )
+  {
+    _drateLast = (_dnlNow - _dnlLast) / int(now - _timeLast);
+    // start new period
+    _timeLast  = now;
+    _dnlLast   = _dnlNow;
+  }
+  else if ( _timeStart == _timeLast )
+    _drateLast = _drateTotal;
+}
+
+int ProgressData::reportProgress() const
+{
+  if ( fileSizeExceeded )
+    return 1;
+  if ( reached )
+    return 1;  // no-data timeout
+  if ( report && !(*report)->progress( _dnlPercent, url, _drateTotal, _drateLast ) )
+    return 1;  // user requested abort
+  return 0;
+}
+
 }
index 61f1f92..ebda74c 100644 (file)
@@ -17,6 +17,7 @@
 #include <curl/curl.h>
 #include <zypp/Url.h>
 #include <zypp/media/TransferSettings.h>
+#include <zypp/ZYppCallbacks.h>
 
 #define  CONNECT_TIMEOUT        60
 #define  TRANSFER_TIMEOUT_MAX   60 * 60
 #undef CURLVERSION_AT_LEAST
 #define CURLVERSION_AT_LEAST(M,N,O) LIBCURL_VERSION_NUM >= ((((M)<<8)+(N))<<8)+(O)
 
+namespace zypp
+{
+  namespace env
+  {
+    /** Long number for setting CURLOPT_DEBUGDATA */
+    inline long ZYPP_MEDIA_CURL_DEBUG()
+    {
+      long ret = 0L;
+      if ( char *ptr = ::getenv("ZYPP_MEDIA_CURL_DEBUG"); ptr && *ptr )
+       str::strtonum( ptr, ret );
+      return ret;
+    }
+
+    /** 4/6 to force IPv4/v6 */
+    int ZYPP_MEDIA_CURL_IPRESOLVE();
+  } // namespace env
+} //namespace zypp
 
 //do not export
 namespace internal {
 
-namespace env {
-  int getZYPP_MEDIA_CURL_IPRESOLVE();
-  inline int ZYPP_MEDIA_CURL_IPRESOLVE()
-  {
-    static int _v = getZYPP_MEDIA_CURL_IPRESOLVE();
-    return _v;
-  }
-}
+struct ProgressData
+{
+  ProgressData( CURL *_curl, time_t _timeout = 0, const zypp::Url & _url = zypp::Url(),
+    zypp::ByteCount expectedFileSize_r = 0,
+    zypp::callback::SendReport<zypp::media::DownloadProgressReport> *_report = nullptr );
+
+  CURL *curl;
+  zypp::Url    url;
+  time_t       timeout;
+  bool reached;
+  bool      fileSizeExceeded;
+  zypp::callback::SendReport<zypp::media::DownloadProgressReport> *report;
+  zypp::ByteCount _expectedFileSize;
+
+  time_t _timeStart    = 0;    ///< Start total stats
+  time_t _timeLast     = 0;    ///< Start last period(~1sec)
+  time_t _timeRcv      = 0;    ///< Start of no-data timeout
+  time_t _timeNow      = 0;    ///< Now
+
+  double _dnlTotal     = 0.0;  ///< Bytes to download or 0 if unknown
+  double _dnlLast      = 0.0;  ///< Bytes downloaded at period start
+  double _dnlNow       = 0.0;  ///< Bytes downloaded now
+
+  int    _dnlPercent= 0;       ///< Percent completed or 0 if _dnlTotal is unknown
+
+  double _drateTotal= 0.0;     ///< Download rate so far
+  double _drateLast    = 0.0;  ///< Download rate in last period
+
+  void updateStats( double dltotal = 0.0, double dlnow = 0.0 );
+
+  int reportProgress() const;
+
+
+  // download rate of the last period (cca 1 sec)
+  double                                        drate_period;
+  // bytes downloaded at the start of the last period
+  double                                        dload_period;
+  // seconds from the start of the download
+  long                                          secs;
+  // average download rate
+  double                                        drate_avg;
+  // last time the progress was reported
+  time_t                                        ltime;
+  // bytes downloaded at the moment the progress was last reported
+  double                                        dload;
+  // bytes uploaded at the moment the progress was last reported
+  double                                        uload;
+};
 
 void globalInitCurlOnce();
 int  log_curl(CURL *curl, curl_infotype info,  char *ptr, size_t len, void *max_lvl);
diff --git a/zypp/media/MediaAccess.cc b/zypp/media/MediaAccess.cc
deleted file mode 100644 (file)
index 9f1c04d..0000000
+++ /dev/null
@@ -1,486 +0,0 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/media/MediaAccess.cc
- *
-*/
-
-#include <ctype.h>
-
-#include <iostream>
-#include <map>
-
-#include <zypp/base/Logger.h>
-#include <zypp/ZConfig.h>
-#include <zypp/PluginScript.h>
-#include <zypp/ExternalProgram.h>
-
-#include <zypp/media/MediaException.h>
-#include <zypp/media/MediaAccess.h>
-#include <zypp/media/MediaHandler.h>
-
-#include <zypp/media/MediaNFS.h>
-#include <zypp/media/MediaCD.h>
-#include <zypp/media/MediaDIR.h>
-#include <zypp/media/MediaDISK.h>
-#include <zypp/media/MediaCIFS.h>
-#include <zypp/media/MediaCurl.h>
-#include <zypp/media/MediaMultiCurl.h>
-#include <zypp/media/MediaISO.h>
-#include <zypp/media/MediaPlugin.h>
-#include <zypp/media/UrlResolverPlugin.h>
-
-using std::endl;
-
-namespace zypp {
-  namespace media {
-
-///////////////////////////////////////////////////////////////////
-//
-//     CLASS NAME : MediaAccess
-//
-///////////////////////////////////////////////////////////////////
-
-const Pathname MediaAccess::_noPath; // empty path
-
-///////////////////////////////////////////////////////////////////
-// constructor
-MediaAccess::MediaAccess ()
-    : _handler (0)
-{
-}
-
-// destructor
-MediaAccess::~MediaAccess()
-{
-  try
-    {
-      close(); // !!! make sure handler gets properly deleted.
-    }
-  catch(...) {}
-}
-
-AttachedMedia
-MediaAccess::attachedMedia() const
-{
-       return _handler ? _handler->attachedMedia()
-                       : AttachedMedia();
-}
-
-bool
-MediaAccess::isSharedMedia() const
-{
-       return _handler ? _handler->isSharedMedia()
-                       : false;
-}
-
-void
-MediaAccess::resetParentId()
-{
-       if( _handler) _handler->resetParentId();
-}
-
-bool
-MediaAccess::dependsOnParent() const
-{
-       return _handler ? _handler->dependsOnParent() : false;
-}
-
-bool
-MediaAccess::dependsOnParent(MediaAccessId parentId,
-                             bool exactIdMatch) const
-{
-       return _handler ? _handler->dependsOnParent(parentId, exactIdMatch)
-                       : false;
-}
-
-// open URL
-void
-MediaAccess::open (const Url& o_url, const Pathname & preferred_attach_point)
-{
-    if(!o_url.isValid()) {
-       MIL << "Url is not valid" << endl;
-        ZYPP_THROW(MediaBadUrlException(o_url));
-    }
-
-    close();
-
-    UrlResolverPlugin::HeaderList custom_headers;
-    Url url = UrlResolverPlugin::resolveUrl(o_url, custom_headers);
-
-    std::string scheme = url.getScheme();
-    MIL << "Trying scheme '" << scheme << "'" << endl;
-
-    /*
-    ** WARNING: Don't forget to update MediaAccess::downloads(url)
-    **          if you are adding a new url scheme / handler!
-    */
-    if (scheme == "cd" || scheme == "dvd")
-        _handler = new MediaCD (url,preferred_attach_point);
-    else if (scheme == "nfs" || scheme == "nfs4")
-        _handler = new MediaNFS (url,preferred_attach_point);
-    else if (scheme == "iso")
-        _handler = new MediaISO (url,preferred_attach_point);
-    else if (scheme == "file" || scheme == "dir")
-        _handler = new MediaDIR (url,preferred_attach_point);
-    else if (scheme == "hd")
-        _handler = new MediaDISK (url,preferred_attach_point);
-    else if (scheme == "cifs" || scheme == "smb")
-       _handler = new MediaCIFS (url,preferred_attach_point);
-    else if (scheme == "ftp" || scheme == "tftp" || scheme == "http" || scheme == "https")
-    {
-        bool use_multicurl = true;
-       std::string urlmediahandler ( url.getQueryParam("mediahandler") );
-        if ( urlmediahandler == "multicurl" )
-        {
-          use_multicurl = true;
-        }
-        else if ( urlmediahandler == "curl" )
-        {
-          use_multicurl = false;
-        }
-        else
-        {
-          if ( ! urlmediahandler.empty() )
-          {
-            WAR << "unknown mediahandler set: " << urlmediahandler << endl;
-          }
-          const char *multicurlenv = getenv( "ZYPP_MULTICURL" );
-          // if user disabled it manually
-          if ( use_multicurl && multicurlenv && ( strcmp(multicurlenv, "0" ) == 0 ) )
-          {
-              WAR << "multicurl manually disabled." << endl;
-              use_multicurl = false;
-          }
-          else if ( !use_multicurl && multicurlenv && ( strcmp(multicurlenv, "1" ) == 0 ) )
-          {
-              WAR << "multicurl manually enabled." << endl;
-              use_multicurl = true;
-          }
-        }
-
-        MediaCurl *curl;
-
-        if ( use_multicurl )
-            curl = new MediaMultiCurl (url,preferred_attach_point);
-       else
-            curl = new MediaCurl (url,preferred_attach_point);
-
-        for ( const auto & el : custom_headers ) {
-            std::string header { el.first };
-           header += ": ";
-           header += el.second;
-            MIL << "Added custom header -> " << header << endl;
-            curl->settings().addHeader( std::move(header) );
-        }
-        _handler = curl;
-    }
-    else if (scheme == "plugin" )
-       _handler = new MediaPlugin (url,preferred_attach_point);
-    else
-    {
-       ZYPP_THROW(MediaUnsupportedUrlSchemeException(url));
-    }
-
-    // check created handler
-    if ( !_handler ){
-      ERR << "Failed to create media handler" << endl;
-      ZYPP_THROW(MediaSystemException(url, "Failed to create media handler"));
-    }
-
-    MIL << "Opened: " << *this << endl;
-}
-
-// Type of media if open, otherwise NONE.
-std::string
-MediaAccess::protocol() const
-{
-  if ( !_handler )
-    return "unknown";
-
-  return _handler->protocol();
-}
-
-bool
-MediaAccess::downloads() const
-{
-       return _handler ? _handler->downloads() : false;
-}
-
-///////////////////////////////////////////////////////////////////
-//
-//
-//     METHOD NAME : MediaAccess::url
-//     METHOD TYPE : Url
-//
-Url MediaAccess::url() const
-{
-  if ( !_handler )
-    return Url();
-
-  return _handler->url();
-}
-
-// close handler
-void
-MediaAccess::close ()
-{
-  ///////////////////////////////////////////////////////////////////
-  // !!! make shure handler gets properly deleted.
-  // I.e. release attached media before deleting the handler.
-  ///////////////////////////////////////////////////////////////////
-  if ( _handler ) {
-    try {
-      _handler->release();
-    }
-    catch (const MediaException & excpt_r)
-    {
-      ZYPP_CAUGHT(excpt_r);
-      WAR << "Close: " << *this << " (" << excpt_r << ")" << endl;
-      ZYPP_RETHROW(excpt_r);
-    }
-    MIL << "Close: " << *this << " (OK)" << endl;
-    delete _handler;
-    _handler = 0;
-  }
-}
-
-
-// attach media
-void MediaAccess::attach (bool next)
-{
-  if ( !_handler ) {
-    ZYPP_THROW(MediaNotOpenException("attach"));
-  }
-  _handler->attach(next);
-}
-
-// True if media is open and attached.
-bool
-MediaAccess::isAttached() const
-{
-  return( _handler && _handler->isAttached() );
-}
-
-
-bool MediaAccess::hasMoreDevices() const
-{
-  return _handler && _handler->hasMoreDevices();
-}
-
-
-void
-MediaAccess::getDetectedDevices(std::vector<std::string> & devices,
-                                unsigned int & index) const
-{
-  if (_handler)
-  {
-    _handler->getDetectedDevices(devices, index);
-    return;
-  }
-
-  if (!devices.empty())
-    devices.clear();
-  index = 0;
-}
-
-
-// local directory that corresponds to medias url
-// If media is not open an empty pathname.
-Pathname
-MediaAccess::localRoot() const
-{
-  if ( !_handler )
-    return _noPath;
-
-  return _handler->localRoot();
-}
-
-// Short for 'localRoot() + pathname', but returns an empty
-// * pathname if media is not open.
-Pathname
-MediaAccess::localPath( const Pathname & pathname ) const
-{
-  if ( !_handler )
-    return _noPath;
-
-  return _handler->localPath( pathname );
-}
-
-void
-MediaAccess::disconnect()
-{
-  if ( !_handler )
-    ZYPP_THROW(MediaNotOpenException("disconnect"));
-
-  _handler->disconnect();
-}
-
-
-void
-MediaAccess::release( const std::string & ejectDev )
-{
-  if ( !_handler )
-    return;
-
-  _handler->release( ejectDev );
-}
-
-// provide file denoted by path to attach dir
-//
-// filename is interpreted relative to the attached url
-// and a path prefix is preserved to destination
-void
-MediaAccess::provideFile(const Pathname & filename , const ByteCount &expectedFileSize) const
-{
-  if ( !_handler ) {
-    ZYPP_THROW(MediaNotOpenException("provideFile(" + filename.asString() + ")"));
-  }
-
-  _handler->provideFile( filename, expectedFileSize );
-}
-
-void
-MediaAccess::setDeltafile( const Pathname & filename ) const
-{
-  if ( !_handler ) {
-    ZYPP_THROW(MediaNotOpenException("setDeltafile(" + filename.asString() + ")"));
-  }
-
-  _handler->setDeltafile( filename );
-}
-
-void
-MediaAccess::releaseFile( const Pathname & filename ) const
-{
-  if ( !_handler )
-    return;
-
-  _handler->releaseFile( filename );
-}
-
-// provide directory tree denoted by path to attach dir
-//
-// dirname is interpreted relative to the attached url
-// and a path prefix is preserved to destination
-void
-MediaAccess::provideDir( const Pathname & dirname ) const
-{
-  if ( !_handler ) {
-    ZYPP_THROW(MediaNotOpenException("provideDir(" + dirname.asString() + ")"));
-  }
-
-  _handler->provideDir( dirname );
-}
-
-void
-MediaAccess::provideDirTree( const Pathname & dirname ) const
-{
-  if ( !_handler ) {
-    ZYPP_THROW(MediaNotOpenException("provideDirTree(" + dirname.asString() + ")"));
-  }
-
-  _handler->provideDirTree( dirname );
-}
-
-void
-MediaAccess::releaseDir( const Pathname & dirname ) const
-{
-  if ( !_handler )
-    return;
-
-  _handler->releaseDir( dirname );
-}
-
-void
-MediaAccess::releasePath( const Pathname & pathname ) const
-{
-  if ( !_handler )
-    return;
-
-  _handler->releasePath( pathname );
-}
-
-// Return content of directory on media
-void
-MediaAccess::dirInfo( std::list<std::string> & retlist, const Pathname & dirname, bool dots ) const
-{
-  retlist.clear();
-
-  if ( !_handler ) {
-    ZYPP_THROW(MediaNotOpenException("dirInfo(" + dirname.asString() + ")"));
-  }
-
-  _handler->dirInfo( retlist, dirname, dots );
-}
-
-// Return content of directory on media
-void
-MediaAccess::dirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const
-{
-  retlist.clear();
-
-  if ( !_handler ) {
-    ZYPP_THROW(MediaNotOpenException("dirInfo(" + dirname.asString() + ")"));
-  }
-
-  _handler->dirInfo( retlist, dirname, dots );
-}
-
-// return if a file exists
-bool
-MediaAccess::doesFileExist( const Pathname & filename ) const
-{
-  if ( !_handler ) {
-    ZYPP_THROW(MediaNotOpenException("doesFileExist(" + filename.asString() + ")"));
-  }
-
-  return _handler->doesFileExist( filename );
-}
-
-std::ostream &
-MediaAccess::dumpOn( std::ostream & str ) const
-{
-  if ( !_handler )
-    return str << "MediaAccess( closed )";
-
-  str << _handler->protocol() << "(" << *_handler << ")";
-  return str;
-}
-
-void MediaAccess::getFile( const Url &from, const Pathname &to )
-{
-  DBG << "From: " << from << endl << "To: " << to << endl;
-
-  Pathname path = from.getPathData();
-  Pathname dir = path.dirname();
-  std::string base = path.basename();
-
-  Url u = from;
-  u.setPathData( dir.asString() );
-
-  MediaAccess media;
-
-  try {
-    media.open( u );
-    media.attach();
-    media._handler->provideFileCopy( base, to, 0 );
-    media.release();
-  }
-  catch (const MediaException & excpt_r)
-  {
-    ZYPP_RETHROW(excpt_r);
-  }
-}
-
-    std::ostream & operator<<( std::ostream & str, const MediaAccess & obj )
-    { return obj.dumpOn( str ); }
-
-///////////////////////////////////////////////////////////////////
-  } // namespace media
-} // namespace zypp
diff --git a/zypp/media/MediaAccess.h b/zypp/media/MediaAccess.h
deleted file mode 100644 (file)
index d3d053a..0000000
+++ /dev/null
@@ -1,443 +0,0 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/media/MediaAccess.h
- *
-*/
-#ifndef ZYPP_MEDIA_MEDIAACCESS_H
-#define ZYPP_MEDIA_MEDIAACCESS_H
-
-#include <iosfwd>
-#include <map>
-#include <list>
-#include <string>
-
-#include <zypp/base/ReferenceCounted.h>
-#include <zypp/base/NonCopyable.h>
-#include <zypp/base/PtrTypes.h>
-#include <zypp/APIConfig.h>
-
-#include <zypp/Pathname.h>
-#include <zypp/PathInfo.h>
-
-#include <zypp/media/MediaException.h>
-#include <zypp/media/MediaSource.h>
-
-#include <zypp/Url.h>
-
-namespace zypp {
-  namespace media {
-
-    class MediaHandler;
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : MediaAccess
-    /**
-     * @short Handle access to a medium
-     *
-     * The concrete @ref MediaHandler for a certain url is created
-     * on @ref open and deleted on @close.
-     *
-     * The inteface here basically checks whether the handler exists,
-     * then forwards the request to @ref MediaHandler.
-     **/
-    class MediaAccess : public base::ReferenceCounted, private base::NonCopyable
-    {
-    public:
-       typedef intrusive_ptr<MediaAccess> Ptr;
-       typedef intrusive_ptr<const MediaAccess> constPtr;
-
-    private:
-
-       static const Pathname _noPath;
-
-       /**
-        * handler for 'physical' media
-        * == 0 if not open
-        **/
-       MediaHandler * _handler;
-
-       friend class MediaManager;
-       friend class MediaManager_Impl;
-
-       AttachedMedia        attachedMedia() const;
-
-       bool                 isSharedMedia() const;
-
-       void                 resetParentId();
-       bool                 dependsOnParent() const;
-
-       bool                 dependsOnParent(MediaAccessId parentId,
-                                            bool exactIdMatch) const;
-    public:
-
-       /**
-        * constructor
-        **/
-       MediaAccess();
-
-       /**
-        * open url. If preferred_attach_point is given,
-        * try to use it as attach point.
-        *
-        * <b>Caution:</b> The medium can choose a different attach point.
-        * Only getAttachPoint() knows the real attach point.
-        *
-        * \throws MediaException
-        *
-        **/
-       void open( const Url& url, const Pathname & preferred_attach_point = "" );
-
-       /**
-        * True if media is open.
-        **/
-       bool isOpen() const { return( _handler != 0 ); }
-
-       /**
-        * Hint if files are downloaded or not.
-        * @return True, if the files are downloaded.
-        */
-       bool        downloads() const;
-
-       /**
-        * Used Protocol if media is opened, otherwise 'unknown'.
-        **/
-        std::string protocol() const;
-
-       /**
-        * Url if media is opened, otherwise empty.
-        **/
-        Url url() const;
-
-       /**
-        * close url
-        *
-        * \throws MediaException
-        *
-        **/
-       void close();
-
-    public:
-
-       /**
-        * Use concrete handler to attach the media.
-        *
-        * @param next try next available device in turn until end of device
-        * list is reached (for media which are accessible through multiple
-        * devices like cdroms).
-        *
-        * \throws MediaException
-        *
-        **/
-       void attach(bool next = false);
-
-       /**
-        * True if media is attached.
-        *
-        * \throws MediaException
-        *
-        **/
-       bool isAttached() const;
-
-        bool hasMoreDevices() const;
-
-        /**
-         * Fill in a vector of detected ejectable devices and the index of the
-         * currently attached device within the vector. The contents of the vector
-         * are the device names (/dev/cdrom and such).
-         *
-         * \param devices  vector to load with the device names
-         * \param index    index of the currently used device in the devices vector
-         */
-        virtual void
-        getDetectedDevices(std::vector<std::string> & devices,
-                           unsigned int & index) const;
-
-
-       /**
-        * Return the local directory that corresponds to medias url,
-        * no matter if media isAttached or not. Files requested will
-        * be available at 'localRoot() + filename' or better
-        * 'localPath( filename )'.
-        *
-        * If media is not open an empty pathname is returned.
-        **/
-       Pathname localRoot() const;
-
-       /**
-        * Short for 'localRoot() + pathname', but returns an empty
-        * pathname if media is not open.
-        *
-        * Files provided will be available at 'localPath(filename)'.
-        **/
-       Pathname localPath( const Pathname & pathname ) const;
-
-        /**
-          Use concrete handler to disconnect the media.
-
-          This is useful for media which e.g. holds open a connection to a
-          server like FTP. After calling disconnect() the media object still is
-          valid and files are present.
-
-          After calling disconnect() it's not possible to call provideFile() or
-          provideDir() anymore.
-        *
-        * \throws MediaException
-        *
-        */
-        void disconnect();
-
-        /**
-         * Use concrete handler to release the media.
-         * @param ejectDev Device to eject. None if empty.
-         *
-         * \throws MediaException
-         *
-         **/
-        void release( const std::string & ejectDev = "" );
-
-       /**
-        * Use concrete handler to provide file denoted by path below
-        * 'attach point'. Filename is interpreted relative to the
-        * attached url and a path prefix is preserved.
-         *
-         * @param cached  If cached is set to true, the function checks, if
-         *                the file already exists and doesn't download it again
-         *                if it does. Currently only the existence is checked,
-         *                no other file attributes.
-        * @param checkonly If this and 'cached' are set to true only the
-        *                  existence of the file is checked but it's not
-        *                  downloaded. If 'cached' is unset an errer is
-        *                  returned always.
-        *
-        * \throws MediaException
-        *
-        **/
-       void provideFile( const Pathname & filename, const ByteCount &expectedFileSize ) const;
-
-       /**
-        * Remove filename below attach point IFF handler downloads files
-        * to the local filesystem. Never remove anything from media.
-        *
-        * \throws MediaException
-        *
-        **/
-       void releaseFile( const Pathname & filename ) const;
-
-       /**
-        * Use concrete handler to provide directory denoted
-        * by path below 'attach point' (not recursive!).
-        * 'dirname' is interpreted relative to the
-        * attached url and a path prefix is preserved.
-        *
-        * \throws MediaException
-        *
-        **/
-       void provideDir( const Pathname & dirname ) const;
-
-       /**
-        * Use concrete handler to provide directory tree denoted
-        * by path below 'attach point' (recursive!!).
-        * 'dirname' is interpreted relative to the
-        * attached url and a path prefix is preserved.
-        *
-        * \throws MediaException
-        *
-        **/
-       void provideDirTree( const Pathname & dirname ) const;
-
-       /**
-        * Remove directory tree below attach point IFF handler downloads files
-        * to the local filesystem. Never remove anything from media.
-        *
-        * \throws MediaException
-        *
-        **/
-       void releaseDir( const Pathname & dirname ) const;
-
-       /**
-        * Remove pathname below attach point IFF handler downloads files
-        * to the local filesystem. Never remove anything from media.
-        *
-        * If pathname denotes a directory it is recursively removed.
-        * If pathname is empty or '/' everything below the attachpoint
-        * is recursively removed.
-        *
-        * \throws MediaException
-        *
-        **/
-       void releasePath( const Pathname & pathname ) const;
-
-       /**
-        * set a deltafile to be used in the next download
-        */
-       void setDeltafile( const Pathname & filename ) const;
-
-    public:
-
-       /**
-        * Return content of directory on media via retlist. If dots is false
-        * entries starting with '.' are not reported.
-        *
-        * The request is forwarded to the concrete handler,
-        * which may atempt to retieve the content e.g. via 'readdir'
-        *
-        * <B>Caution:</B> This is not supported by all media types.
-        * Be prepared to handle E_not_supported_by_media.
-        *
-        * \throws MediaException
-        *
-        **/
-        void dirInfo( std::list<std::string> & retlist,
-                        const Pathname & dirname, bool dots = true ) const;
-
-       /**
-        * Basically the same as dirInfo above. The content is returned as
-        * filesystem::DirContent, which includes name and filetype of each directory
-        * entry. Retrieving the filetype usg. requires an additional ::stat call for
-        * each entry, thus it's more expensive than a simple readdir.
-        *
-        * <B>Caution:</B> This is not supported by all media types.
-        * Be prepared to handle E_not_supported_by_media.
-        *
-        * \throws MediaException
-        *
-        **/
-       void dirInfo( filesystem::DirContent & retlist,
-                      const Pathname & dirname, bool dots = true ) const;
-
-        /**
-         * check if a file exists
-         *
-         * Asserted that url is a file and not a dir.
-         *
-         * \throws MediaException
-         *
-         **/
-        bool doesFileExist( const Pathname & filename ) const;
-
-       /**
-        * Destructor
-        **/
-       virtual ~MediaAccess();
-
-    public:
-
-       virtual std::ostream & dumpOn( std::ostream & str ) const;
-
-    public:
-        /**
-         * Get file from location at specified by URL and copy it to
-         * destination.
-         *
-         * @param from Source URL
-         * @param to   Destination file name
-        *
-        * \throws MediaException
-        *
-         **/
-        void getFile( const Url &from, const Pathname &to );
-
-    public:
-
-      /**
-       * Helper class that provides file on construction
-       * and cleans up on destruction.
-       *
-       * <b>Caution:</b> There's no synchronisation between multiple
-       * FileProvider instances, that provide the same file from the
-       * same media. If the first one goes out of scope, the file is
-       * cleaned. It's just a convenience for 'access and forgett'.
-       *
-       * <b>Caution:</b> We should either store the reference MediaAccess'
-       * MediaHandler here (for this MediaHandler must become a
-       * ref counting pointer class), or we need more info from MediaHandler
-       * (whether he's downloading to the local fs. If not, no releasefile
-       * is necessary).
-       * Currently we can not releaseFile after the media was closed
-       * (it's passed to the handler, which is deleted on close).
-       *
-       * \throws MediaBadFilenameException
-       * \throws MediaException
-       **/
-      class FileProvider {
-       FileProvider( const FileProvider & );             // no copy
-       FileProvider & operator=( const FileProvider & ); // no assign
-       private:
-         MediaAccess::constPtr _media;
-         Pathname              _file;
-         Pathname              _local_file;
-       public:
-         /**
-           * \throws MediaException
-           */
-         FileProvider( MediaAccess::constPtr media_r, const Pathname & file_r )
-           : _media( media_r )
-           , _file( file_r )
-           , _local_file( "" )
-         {
-           if ( _file.empty() ) {
-             ZYPP_THROW(MediaBadFilenameException(_file.asString()));
-           } else if ( _media ) {
-             try {
-               _media->provideFile( _file, 0 );
-               _local_file = _media->localPath( _file );
-             }
-             catch (const MediaException & excpt_r)
-              {
-               ZYPP_CAUGHT(excpt_r);
-               _media = NULL;
-               ZYPP_RETHROW(excpt_r);
-             }
-           }
-         }
-
-         ~FileProvider() {
-           if ( _media )
-           {
-             try {
-               _media->releaseFile( _file );
-             }
-             catch (const MediaException &excpt_r)
-             {
-               ZYPP_CAUGHT(excpt_r);
-             }
-              catch(...) {} // No exception from dtor!
-           }
-         }
-
-       public:
-
-         /**
-          * If no error, expect operator() to return the local
-          * Pathname of the provided file.
-          **/
-         Pathname localFile() const { return _local_file; }
-
-         /**
-          * Return the local Pathname of the provided file or
-          * an empty Pathname on error.
-          **/
-         Pathname operator()() const {
-           if ( _media )
-             return _media->localPath( _file );
-           return Pathname();
-         }
-      };
-    };
-
-    std::ostream & operator<<( std::ostream & str, const MediaAccess & obj );
-
-///////////////////////////////////////////////////////////////////
-
-  } // namespace media
-} // namespace zypp
-
-#endif // ZYPP_MEDIA_MEDIAACCESS_H
-
index 640e444..2a29049 100644 (file)
@@ -56,7 +56,12 @@ MediaBlockList::setFileChecksum(std::string ctype, int cl, unsigned char *c)
   memcpy(&fsum[0], c, cl);
 }
 
-const std::vector<unsigned char> &MediaBlockList::getFileChecksum()
+std::string MediaBlockList::fileChecksumType() const
+{
+  return fsumtype;
+}
+
+const UByteArray &MediaBlockList::getFileChecksum()
 {
   return fsum;
 }
@@ -208,16 +213,21 @@ MediaBlockList::checkChecksum(size_t blkno, const unsigned char *buf, size_t buf
   return verifyDigest(blkno, dig);
 }
 
-std::vector<unsigned char> MediaBlockList::getChecksum(size_t blkno)
+UByteArray MediaBlockList::getChecksum(size_t blkno) const
 {
   if ( !haveChecksum(blkno) )
     return {};
 
-  std::vector<unsigned char> buf ( chksumlen, '\0' );
+  UByteArray buf ( chksumlen, '\0' );
   memcpy( buf.data(), chksums.data()+(chksumlen * blkno), chksumlen );
   return buf;
 }
 
+std::string MediaBlockList::getChecksumType() const
+{
+  return chksumtype;
+}
+
 // specialized version of checkChecksum that can deal with a "rotated" buffer
 bool
 MediaBlockList::checkChecksumRotated(size_t blkno, const unsigned char *buf, size_t bufl, size_t start) const
index 9e1e5ec..37fa92e 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <sys/types.h>
 #include <vector>
+#include <optional>
 
 #include <zypp/Digest.h>
 
@@ -80,7 +81,9 @@ public:
    * set / verify the checksum over the whole file
    **/
   void setFileChecksum(std::string ctype, int cl, unsigned char *c);
-  const std::vector<unsigned char> &getFileChecksum( );
+  std::string fileChecksumType () const;
+
+  const UByteArray &getFileChecksum( );
   bool createFileDigest(Digest &digest) const;
   bool verifyFileDigest(Digest &digest) const;
   inline bool haveFileChecksum() const {
@@ -92,7 +95,8 @@ public:
    **/
   void setChecksum(size_t blkno, std::string cstype, int csl, unsigned char *cs, size_t cspad=0);
   bool checkChecksum(size_t blkno, const unsigned char *buf, size_t bufl) const;
-  std::vector<unsigned char> getChecksum( size_t blkno );
+  UByteArray getChecksum( size_t blkno ) const;
+  std::string getChecksumType( ) const;
   bool createDigest(Digest &digest) const;
   bool verifyDigest(size_t blkno, Digest &digest) const;
   inline bool haveChecksum(size_t blkno) const {
@@ -127,7 +131,7 @@ private:
 
   off_t filesize;
   std::string fsumtype;
-  std::vector<unsigned char> fsum;
+  UByteArray fsum;
 
   bool haveblocks;
   std::vector<MediaBlock> blocks;
index f6886e1..fce1c6e 100644 (file)
@@ -653,9 +653,9 @@ namespace zypp
   //
   //  DESCRIPTION : Asserted that media is attached.
   //
-  void MediaCD::getFile(const Pathname & filename , const ByteCount &expectedFileSize_r) const
+  void MediaCD::getFile( const OnMediaLocation &file ) const
   {
-    MediaHandler::getFile( filename, expectedFileSize_r );
+    MediaHandler::getFile( file );
   }
 
   ///////////////////////////////////////////////////////////////////
index 3a369d5..a328046 100644 (file)
@@ -45,7 +45,7 @@ namespace zypp {
 
        virtual void attachTo (bool next = false) override;
         virtual void releaseFrom( const std::string & ejectDev ) override;
-       virtual void getFile(const Pathname & filename, const ByteCount &expectedFileSize_r ) const override;
+       virtual void getFile(const OnMediaLocation & file) const override;
        virtual void getDir( const Pathname & dirname, bool recurse_r ) const override;
         virtual void getDirInfo( std::list<std::string> & retlist,
                                  const Pathname & dirname, bool dots = true ) const override;
index dd58787..41f1900 100644 (file)
@@ -350,9 +350,9 @@ namespace zypp {
     //
     // DESCRIPTION : Asserted that media is attached.
     //
-    void MediaCIFS::getFile (const Pathname & filename, const ByteCount &expectedFileSize_r) const
+    void MediaCIFS::getFile ( const OnMediaLocation &file ) const
     {
-      MediaHandler::getFile( filename, expectedFileSize_r );
+      MediaHandler::getFile( file );
     }
 
     ///////////////////////////////////////////////////////////////////
index ddc0fbf..755927e 100644 (file)
@@ -35,7 +35,7 @@ namespace zypp {
 
       virtual void attachTo (bool next = false) override;
       virtual void releaseFrom( const std::string & ejectDev ) override;
-      virtual void getFile( const Pathname & filename, const ByteCount &expectedFileSize_r ) const override;
+      virtual void getFile( const OnMediaLocation & file ) const override;
       virtual void getDir( const Pathname & dirname, bool recurse_r ) const override;
       virtual void getDirInfo( std::list<std::string> & retlist,
                                const Pathname & dirname, bool dots = true ) const override;
index 80a6fe3..b366fc1 100644 (file)
@@ -47,121 +47,6 @@ namespace zypp {
 
   namespace media {
 
-  namespace {
-    struct ProgressData
-    {
-      ProgressData( CURL *_curl, time_t _timeout = 0, const Url & _url = Url(),
-                    ByteCount expectedFileSize_r = 0,
-                   callback::SendReport<DownloadProgressReport> *_report = nullptr )
-        : curl( _curl )
-       , url( _url )
-       , timeout( _timeout )
-        , reached( false )
-        , fileSizeExceeded ( false )
-        , report( _report )
-        , _expectedFileSize( expectedFileSize_r )
-      {}
-
-      CURL     *curl;
-      Url      url;
-      time_t   timeout;
-      bool     reached;
-      bool      fileSizeExceeded;
-      callback::SendReport<DownloadProgressReport> *report;
-      ByteCount _expectedFileSize;
-
-      time_t _timeStart        = 0;    ///< Start total stats
-      time_t _timeLast = 0;    ///< Start last period(~1sec)
-      time_t _timeRcv  = 0;    ///< Start of no-data timeout
-      time_t _timeNow  = 0;    ///< Now
-
-      double _dnlTotal = 0.0;  ///< Bytes to download or 0 if unknown
-      double _dnlLast  = 0.0;  ///< Bytes downloaded at period start
-      double _dnlNow   = 0.0;  ///< Bytes downloaded now
-
-      int    _dnlPercent= 0;   ///< Percent completed or 0 if _dnlTotal is unknown
-
-      double _drateTotal= 0.0; ///< Download rate so far
-      double _drateLast        = 0.0;  ///< Download rate in last period
-
-      void updateStats( double dltotal = 0.0, double dlnow = 0.0 )
-      {
-       time_t now = _timeNow = time(0);
-
-       // If called without args (0.0), recompute based on the last values seen
-       if ( dltotal && dltotal != _dnlTotal )
-         _dnlTotal = dltotal;
-
-       if ( dlnow && dlnow != _dnlNow )
-       {
-         _timeRcv = now;
-         _dnlNow = dlnow;
-       }
-       else if ( !_dnlNow && !_dnlTotal )
-       {
-         // Start time counting as soon as first data arrives.
-         // Skip the connection / redirection time at begin.
-         return;
-       }
-
-       // init or reset if time jumps back
-       if ( !_timeStart || _timeStart > now )
-         _timeStart = _timeLast = _timeRcv = now;
-
-       // timeout condition
-       if ( timeout )
-         reached = ( (now - _timeRcv) > timeout );
-
-        // check if the downloaded data is already bigger than what we expected
-       fileSizeExceeded = _expectedFileSize > 0 && _expectedFileSize < static_cast<ByteCount::SizeType>(_dnlNow);
-
-       // percentage:
-       if ( _dnlTotal )
-         _dnlPercent = int(_dnlNow * 100 / _dnlTotal);
-
-       // download rates:
-       _drateTotal = _dnlNow / std::max( int(now - _timeStart), 1 );
-
-       if ( _timeLast < now )
-       {
-         _drateLast = (_dnlNow - _dnlLast) / int(now - _timeLast);
-         // start new period
-         _timeLast  = now;
-         _dnlLast   = _dnlNow;
-       }
-       else if ( _timeStart == _timeLast )
-         _drateLast = _drateTotal;
-      }
-
-      int reportProgress() const
-      {
-        if ( fileSizeExceeded )
-          return 1;
-       if ( reached )
-         return 1;     // no-data timeout
-       if ( report && !(*report)->progress( _dnlPercent, url, _drateTotal, _drateLast ) )
-         return 1;     // user requested abort
-       return 0;
-      }
-
-
-      // download rate of the last period (cca 1 sec)
-      double                                        drate_period;
-      // bytes downloaded at the start of the last period
-      double                                        dload_period;
-      // seconds from the start of the download
-      long                                          secs;
-      // average download rate
-      double                                        drate_avg;
-      // last time the progress was reported
-      time_t                                        ltime;
-      // bytes downloaded at the moment the progress was last reported
-      double                                        dload;
-      // bytes uploaded at the moment the progress was last reported
-      double                                        uload;
-    };
-  }
-
 Pathname MediaCurl::_cookieFile = "/var/lib/YaST2/cookies";
 
 // we use this define to unbloat code as this C setting option
@@ -180,9 +65,9 @@ Pathname MediaCurl::_cookieFile = "/var/lib/YaST2/cookies";
 
 MediaCurl::MediaCurl( const Url &      url_r,
                       const Pathname & attach_point_hint_r )
-    : MediaHandler( url_r, attach_point_hint_r,
-                    "/", // urlpath at attachpoint
-                    true ), // does_download
+    : MediaNetworkCommonHandler( url_r, attach_point_hint_r,
+                                "/", // urlpath at attachpoint
+                                true ), // does_download
       _curl( NULL ),
       _customHeaders(0L)
 {
@@ -219,12 +104,6 @@ Url MediaCurl::clearQueryString(const Url &url) const
   return internal::clearQueryString(url);
 }
 
-TransferSettings & MediaCurl::settings()
-{
-    return _settings;
-}
-
-
 void MediaCurl::setCookieFile( const Pathname &fileName )
 {
   _cookieFile = fileName;
@@ -260,8 +139,7 @@ void MediaCurl::checkProtocol(const Url &url) const
 void MediaCurl::setupEasy()
 {
   {
-    char *ptr = getenv("ZYPP_MEDIA_CURL_DEBUG");
-    _curlDebug = (ptr && *ptr) ? str::strtonum<long>( ptr) : 0L;
+    _curlDebug = env::ZYPP_MEDIA_CURL_DEBUG();
     if( _curlDebug > 0)
     {
       curl_easy_setopt( _curl, CURLOPT_VERBOSE, 1L);
@@ -315,13 +193,10 @@ void MediaCurl::setupEasy()
   }
 
   /** Force IPv4/v6 */
-  if ( env::ZYPP_MEDIA_CURL_IPRESOLVE() )
+  switch ( env::ZYPP_MEDIA_CURL_IPRESOLVE() )
   {
-    switch ( env::ZYPP_MEDIA_CURL_IPRESOLVE() )
-    {
-      case 4: SET_OPTION(CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); break;
-      case 6: SET_OPTION(CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); break;
-    }
+    case 4: SET_OPTION(CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); break;
+    case 6: SET_OPTION(CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); break;
   }
 
  /**
@@ -507,13 +382,11 @@ void MediaCurl::setupEasy()
     SET_OPTION(CURLOPT_PROXY_TRANSFER_MODE, 1L );
 #endif
   // append settings custom headers to curl
-  for ( TransferSettings::Headers::const_iterator it = vol_settings.headersBegin();
-        it != vol_settings.headersEnd();
-        ++it )
+  for ( const auto &header : vol_settings.headers() )
   {
     // MIL << "HEADER " << *it << std::endl;
 
-      _customHeaders = curl_slist_append(_customHeaders, it->c_str());
+      _customHeaders = curl_slist_append(_customHeaders, header.c_str());
       if ( !_customHeaders )
           ZYPP_THROW(MediaCurlInitException(_url));
   }
@@ -604,17 +477,20 @@ Url MediaCurl::getFileUrl( const Pathname & filename_r ) const
 
 ///////////////////////////////////////////////////////////////////
 
-void MediaCurl::getFile(const Pathname & filename , const ByteCount &expectedFileSize_r) const
+void MediaCurl::getFile( const OnMediaLocation &file ) const
 {
     // Use absolute file name to prevent access of files outside of the
     // hierarchy below the attach point.
-    getFileCopy(filename, localPath(filename).absolutename(), expectedFileSize_r);
+    getFileCopy( file, localPath(file.filename()).absolutename() );
 }
 
 ///////////////////////////////////////////////////////////////////
 
-void MediaCurl::getFileCopy( const Pathname & filename , const Pathname & target, const ByteCount &expectedFileSize_r ) const
+void MediaCurl::getFileCopy( const OnMediaLocation & srcFile , const Pathname & target ) const
 {
+
+  const auto &filename = srcFile.filename();
+
   callback::SendReport<DownloadProgressReport> report;
 
   Url fileurl(getFileUrl(filename));
@@ -625,7 +501,7 @@ void MediaCurl::getFileCopy( const Pathname & filename , const Pathname & target
   {
     try
     {
-      doGetFileCopy(filename, target, report, expectedFileSize_r);
+      doGetFileCopy( srcFile, target, report );
       retry = false;
     }
     // retry with proper authentication data
@@ -1017,13 +893,13 @@ bool MediaCurl::detectDirIndex() const
 
 ///////////////////////////////////////////////////////////////////
 
-void MediaCurl::doGetFileCopy(const Pathname & filename , const Pathname & target, callback::SendReport<DownloadProgressReport> & report, const ByteCount &expectedFileSize_r, RequestOptions options ) const
+void MediaCurl::doGetFileCopy( const OnMediaLocation &srcFile , const Pathname & target, callback::SendReport<DownloadProgressReport> & report, RequestOptions options ) const
 {
     Pathname dest = target.absolutename();
     if( assert_dir( dest.dirname() ) )
     {
       DBG << "assert_dir " << dest.dirname() << " failed" << endl;
-      ZYPP_THROW( MediaSystemException(getFileUrl(filename), "System error on " + dest.dirname().asString()) );
+      ZYPP_THROW( MediaSystemException(getFileUrl(srcFile.filename()), "System error on " + dest.dirname().asString()) );
     }
 
     ManagedFile destNew { target.extend( ".new.zypp.XXXXXX" ) };
@@ -1033,7 +909,7 @@ void MediaCurl::doGetFileCopy(const Pathname & filename , const Pathname & targe
       if( ! buf )
       {
        ERR << "out of memory for temp file name" << endl;
-       ZYPP_THROW(MediaSystemException(getFileUrl(filename), "out of memory for temp file name"));
+       ZYPP_THROW(MediaSystemException(getFileUrl(srcFile.filename()), "out of memory for temp file name"));
       }
 
       AutoFD tmp_fd { ::mkostemp( buf, O_CLOEXEC ) };
@@ -1069,7 +945,7 @@ void MediaCurl::doGetFileCopy(const Pathname & filename , const Pathname & targe
     }
     try
     {
-      doGetFileCopyFile(filename, dest, file, report, expectedFileSize_r, options);
+      doGetFileCopyFile( srcFile, dest, file, report, options);
     }
     catch (Exception &e)
     {
@@ -1127,9 +1003,9 @@ void MediaCurl::doGetFileCopy(const Pathname & filename , const Pathname & targe
 
 ///////////////////////////////////////////////////////////////////
 
-void MediaCurl::doGetFileCopyFile(const Pathname & filename , const Pathname & dest, FILE *file, callback::SendReport<DownloadProgressReport> & report, const ByteCount &expectedFileSize_r, RequestOptions options ) const
+void MediaCurl::doGetFileCopyFile( const OnMediaLocation & srcFile, const Pathname & dest, FILE *file, callback::SendReport<DownloadProgressReport> & report, RequestOptions options ) const
 {
-    DBG << filename.asString() << endl;
+    DBG << srcFile.filename().asString() << endl;
 
     if(!_url.isValid())
       ZYPP_THROW(MediaBadUrlException(_url));
@@ -1137,7 +1013,7 @@ void MediaCurl::doGetFileCopyFile(const Pathname & filename , const Pathname & d
     if(_url.getHost().empty())
       ZYPP_THROW(MediaBadUrlEmptyHostException(_url));
 
-    Url url(getFileUrl(filename));
+    Url url(getFileUrl(srcFile.filename()));
 
     DBG << "URL: " << url.asString() << endl;
     // Use URL without options and without username and passwd
@@ -1168,7 +1044,7 @@ void MediaCurl::doGetFileCopyFile(const Pathname & filename , const Pathname & d
     }
 
     // Set callback and perform.
-    ProgressData progressData(_curl, _settings.timeout(), url, expectedFileSize_r, &report);
+    internal::ProgressData progressData(_curl, _settings.timeout(), url, srcFile.downloadSize(), &report);
     if (!(options & OPTION_NO_REPORT_START))
       report->start(url, dest);
     if ( curl_easy_setopt( _curl, CURLOPT_PROGRESSDATA, &progressData ) != 0 ) {
@@ -1216,7 +1092,7 @@ void MediaCurl::doGetFileCopyFile(const Pathname & filename , const Pathname & d
         if ( progressData.fileSizeExceeded )
           ZYPP_THROW(MediaFileSizeExceededException(url, progressData._expectedFileSize));
 
-        evaluateCurlCode( filename, ret, progressData.reached );
+        evaluateCurlCode( srcFile.filename(), ret, progressData.reached );
       }
       catch ( const MediaException &e ) {
         // some error, we are not sure about file existence, rethrw
@@ -1246,7 +1122,7 @@ void MediaCurl::getDir( const Pathname & dirname, bool recurse_r ) const
       switch ( it->type ) {
       case filesystem::FT_NOT_AVAIL: // old directory.yast contains no typeinfo at all
       case filesystem::FT_FILE:
-        getFile( filename, 0 );
+        getFile( OnMediaLocation( filename ) );
         break;
       case filesystem::FT_DIR: // newer directory.yast contain at least directory info
         if ( recurse_r ) {
@@ -1285,7 +1161,7 @@ void MediaCurl::getDirInfo( filesystem::DirContent & retlist,
 //
 int MediaCurl::aliveCallback( void *clientp, double /*dltotal*/, double dlnow, double /*ultotal*/, double /*ulnow*/ )
 {
-  ProgressData *pdata = reinterpret_cast<ProgressData *>( clientp );
+  internal::ProgressData *pdata = reinterpret_cast<internal::ProgressData *>( clientp );
   if( pdata )
   {
     // Do not propagate dltotal in alive callbacks. MultiCurl uses this to
@@ -1299,7 +1175,7 @@ int MediaCurl::aliveCallback( void *clientp, double /*dltotal*/, double dlnow, d
 
 int MediaCurl::progressCallback( void *clientp, double dltotal, double dlnow, double ultotal, double ulnow )
 {
-  ProgressData *pdata = reinterpret_cast<ProgressData *>( clientp );
+  internal::ProgressData *pdata = reinterpret_cast<internal::ProgressData *>( clientp );
   if( pdata )
   {
     // work around curl bug that gives us old data
@@ -1315,7 +1191,7 @@ int MediaCurl::progressCallback( void *clientp, double dltotal, double dlnow, do
 
 CURL *MediaCurl::progressCallback_getcurl( void *clientp )
 {
-  ProgressData *pdata = reinterpret_cast<ProgressData *>(clientp);
+  internal::ProgressData *pdata = reinterpret_cast<internal::ProgressData *>(clientp);
   return pdata ? pdata->curl : 0;
 }
 
@@ -1342,7 +1218,7 @@ std::string MediaCurl::getAuthHint() const
  */
 void MediaCurl::resetExpectedFileSize(void *clientp, const ByteCount &expectedFileSize)
 {
-  ProgressData *data = reinterpret_cast<ProgressData *>(clientp);
+  internal::ProgressData *data = reinterpret_cast<internal::ProgressData *>(clientp);
   if ( data ) {
     data->_expectedFileSize = expectedFileSize;
   }
@@ -1454,7 +1330,6 @@ bool MediaCurl::authenticate(const std::string & availAuthTypes, bool firstTry)
 //need a out of line definiton, otherwise vtable is emitted for every translation unit
 MediaCurl::Callbacks::~Callbacks() {}
 
-
   } // namespace media
 } // namespace zypp
 //
index de3ab5c..5891873 100644 (file)
 #define ZYPP_MEDIA_MEDIACURL_H
 
 #include <zypp/base/Flags.h>
-#include <zypp/media/TransferSettings.h>
-#include <zypp/media/MediaHandler.h>
 #include <zypp/ZYppCallbacks.h>
+#include <zypp/media/MediaNetworkCommonHandler.h>
 
 #include <curl/curl.h>
-
 namespace zypp {
   namespace media {
 
@@ -29,7 +27,7 @@ namespace zypp {
  * @short Implementation class for FTP, HTTP and HTTPS MediaHandler
  * @see MediaHandler
  **/
-class MediaCurl : public MediaHandler
+class MediaCurl : public MediaNetworkCommonHandler
 {
   public:
     enum RequestOption
@@ -53,7 +51,7 @@ class MediaCurl : public MediaHandler
 
     virtual void attachTo (bool next = false) override;
     virtual void releaseFrom( const std::string & ejectDev ) override;
-    virtual void getFile( const Pathname & filename, const ByteCount &expectedFileSize_r ) const override;
+    virtual void getFile( const OnMediaLocation & file ) const override;
     virtual void getDir( const Pathname & dirname, bool recurse_r ) const override;
     virtual void getDirInfo( std::list<std::string> & retlist,
                              const Pathname & dirname, bool dots = true ) const override;
@@ -82,14 +80,14 @@ class MediaCurl : public MediaHandler
      * \throws MediaException
      *
      */
-    virtual void getFileCopy( const Pathname & srcFilename, const Pathname & targetFilename, const ByteCount &expectedFileSize_r) const override;
+    virtual void getFileCopy( const OnMediaLocation& srcFile, const Pathname & targetFilename ) const override;
 
     /**
      *
      * \throws MediaException
      *
      */
-    virtual void doGetFileCopy( const Pathname & srcFilename, const Pathname & targetFilename, callback::SendReport<DownloadProgressReport> & _report, const ByteCount &expectedFileSize_r,  RequestOptions options = OPTION_NONE ) const;
+    virtual void doGetFileCopy( const OnMediaLocation &srcFile, const Pathname & targetFilename, callback::SendReport<DownloadProgressReport> & _report,  RequestOptions options = OPTION_NONE ) const;
 
 
     virtual bool checkAttachPoint(const Pathname &apoint) const override;
@@ -101,8 +99,6 @@ class MediaCurl : public MediaHandler
 
     virtual ~MediaCurl() override { try { release(); } catch(...) {} }
 
-    TransferSettings & settings();
-
     static void setCookieFile( const Pathname & );
 
     class Callbacks
@@ -149,7 +145,7 @@ class MediaCurl : public MediaHandler
      */
     void evaluateCurlCode(const zypp::Pathname &filename, CURLcode code, bool timeout) const;
 
-    void doGetFileCopyFile( const Pathname & srcFilename, const Pathname & dest, FILE *file, callback::SendReport<DownloadProgressReport> & _report, const ByteCount &expectedFileSize_r, RequestOptions options = OPTION_NONE ) const;
+    void doGetFileCopyFile( const OnMediaLocation & srcFile, const Pathname & dest, FILE *file, callback::SendReport<DownloadProgressReport> & report, RequestOptions options = OPTION_NONE ) const;
 
     static void resetExpectedFileSize ( void *clientp, const ByteCount &expectedFileSize );
 
@@ -176,7 +172,6 @@ class MediaCurl : public MediaHandler
     CURL *_curl;
     char _curlError[ CURL_ERROR_SIZE ];
     curl_slist *_customHeaders;
-    TransferSettings _settings;
 };
 ZYPP_DECLARE_OPERATORS_FOR_FLAGS(MediaCurl::RequestOptions);
 
index 7569de2..0ab8127 100644 (file)
@@ -130,9 +130,9 @@ namespace zypp {
     //
     // DESCRIPTION : Asserted that media is attached.
     //
-    void MediaDIR::getFile(const Pathname & filename , const ByteCount &expectedFileSize_r) const
+    void MediaDIR::getFile( const OnMediaLocation &file ) const
     {
-      MediaHandler::getFile( filename, expectedFileSize_r );
+      MediaHandler::getFile( file );
     }
 
     ///////////////////////////////////////////////////////////////////
index 297a323..fb25e18 100644 (file)
@@ -31,7 +31,7 @@ namespace zypp {
 
        virtual void attachTo (bool next = false) override;
         virtual void releaseFrom( const std::string & ejectDev ) override;
-       virtual void getFile( const Pathname & filename, const ByteCount &expectedFileSize_r ) const override;
+       virtual void getFile( const OnMediaLocation & file ) const override;
        virtual void getDir( const Pathname & dirname, bool recurse_r ) const override;
         virtual void getDirInfo( std::list<std::string> & retlist,
                                  const Pathname & dirname, bool dots = true ) const override;
index 9ba6e2f..e8cb675 100644 (file)
@@ -354,9 +354,9 @@ namespace zypp {
     //
     // DESCRIPTION : Asserted that media is attached.
     //
-    void MediaDISK::getFile (const Pathname & filename, const ByteCount &expectedFileSize_r) const
+    void MediaDISK::getFile ( const OnMediaLocation &file ) const
     {
-      MediaHandler::getFile( filename, expectedFileSize_r );
+      MediaHandler::getFile( file );
     }
 
     ///////////////////////////////////////////////////////////////////
index d4822e2..50e0b89 100644 (file)
@@ -34,7 +34,7 @@ namespace zypp {
 
        virtual void attachTo (bool next = false) override;
         virtual void releaseFrom( const std::string & ejectDev ) override;
-       virtual void getFile(const Pathname & filename, const ByteCount &expectedFileSize_r ) const override;
+       virtual void getFile( const OnMediaLocation & file ) const override;
        virtual void getDir( const Pathname & dirname, bool recurse_r ) const override;
         virtual void getDirInfo( std::list<std::string> & retlist,
                                  const Pathname & dirname, bool dots = true ) const override;
index 20b932e..3e30ec6 100644 (file)
@@ -533,6 +533,15 @@ namespace zypp
       std::string _msg;
     };
 
+    class MediaInvalidCredentialsException : public MediaException
+    {
+    public:
+      MediaInvalidCredentialsException( const std::string & msg = "" )
+        : MediaException(msg)
+      {}
+      virtual ~MediaInvalidCredentialsException() noexcept {}
+    };
+
   /////////////////////////////////////////////////////////////////
   } // namespace media
 } // namespace zypp
index 3aef0de..4e49d6b 100644 (file)
@@ -990,28 +990,27 @@ MediaHandler::dependsOnParent(MediaAccessId parentId, bool exactIdMatch)
 //
 //     DESCRIPTION :
 //
-void MediaHandler::provideFileCopy(Pathname srcFilename,
-                                       Pathname targetFilename , const ByteCount &expectedFileSize_r) const
+void MediaHandler::provideFileCopy( const OnMediaLocation &srcFile, Pathname targetFilename ) const
 {
   if ( !isAttached() ) {
-    INT << "Media not_attached on provideFileCopy(" << srcFilename
+    INT << "Media not_attached on provideFileCopy(" << srcFile
         << "," << targetFilename << ")" << endl;
     ZYPP_THROW(MediaNotAttachedException(url()));
   }
 
-  getFileCopy( srcFilename, targetFilename, expectedFileSize_r ); // pass to concrete handler
-  DBG << "provideFileCopy(" << srcFilename << "," << targetFilename  << ")" << endl;
+  getFileCopy( srcFile, targetFilename ); // pass to concrete handler
+  DBG << "provideFileCopy(" << srcFile << "," << targetFilename  << ")" << endl;
 }
 
-void MediaHandler::provideFile(Pathname filename , const ByteCount &expectedFileSize_r) const
+void MediaHandler::provideFile( const OnMediaLocation &file ) const
 {
   if ( !isAttached() ) {
-    INT << "Error: Not attached on provideFile(" << filename << ")" << endl;
+    INT << "Error: Not attached on provideFile(" << file << ")" << endl;
     ZYPP_THROW(MediaNotAttachedException(url()));
   }
 
-  getFile( filename, expectedFileSize_r ); // pass to concrete handler
-  DBG << "provideFile(" << filename << ")" << endl;
+  getFile( file ); // pass to concrete handler
+  DBG << "provideFile(" << file << ")" << endl;
 }
 
 
@@ -1174,16 +1173,16 @@ void MediaHandler::getDirectoryYast( filesystem::DirContent & retlist,
   retlist.clear();
 
   // look for directory.yast
-  Pathname dirFile = dirname + "directory.yast";
-  getFile( dirFile, 0 );
+  auto dirFile = OnMediaLocation( dirname + "directory.yast" );
+  getFile( dirFile );
   DBG << "provideFile(" << dirFile << "): " << "OK" << endl;
 
   // using directory.yast
-  std::ifstream dir( localPath( dirFile ).asString().c_str() );
+  std::ifstream dir( localPath( dirFile.filename() ).asString().c_str() );
   if ( dir.fail() ) {
-    ERR << "Unable to load '" << localPath( dirFile ) << "'" << endl;
+    ERR << "Unable to load '" << localPath( dirFile.filename() ) << "'" << endl;
     ZYPP_THROW(MediaSystemException(url(),
-      "Unable to load '" + localPath( dirFile ).asString() + "'"));
+      "Unable to load '" + localPath( dirFile.filename() ).asString() + "'"));
   }
 
   std::string line;
@@ -1222,40 +1221,28 @@ std::ostream & operator<<( std::ostream & str, const MediaHandler & obj )
   return str;
 }
 
-///////////////////////////////////////////////////////////////////
-//
-//
-//     METHOD NAME : MediaHandler::getFile
-//     METHOD TYPE : PMError
-//
-//     DESCRIPTION : Asserted that media is attached.
-//                    Default implementation of pure virtual.
-//
-void MediaHandler::getFile(const Pathname & filename , const ByteCount &) const
+void MediaHandler::getFile( const OnMediaLocation &file ) const
 {
-    PathInfo info( localPath( filename ) );
-    if( info.isFile() ) {
-        return;
-    }
+  PathInfo info( localPath( file.filename() ) );
+  if( info.isFile() ) {
+    return;
+  }
 
-    if (info.isExist())
-      ZYPP_THROW(MediaNotAFileException(url(), localPath(filename)));
-    else
-      ZYPP_THROW(MediaFileNotFoundException(url(), filename));
+  if (info.isExist())
+    ZYPP_THROW(MediaNotAFileException(url(), localPath(file.filename())));
+  else
+    ZYPP_THROW(MediaFileNotFoundException(url(), file.filename()));
 }
 
-
-void MediaHandler::getFileCopy (const Pathname & srcFilename, const Pathname & targetFilename , const ByteCount &expectedFileSize_r) const
+void MediaHandler::getFileCopy( const OnMediaLocation &file, const Pathname &targetFilename ) const
 {
-  getFile(srcFilename, expectedFileSize_r);
-
-  if ( copy( localPath( srcFilename ), targetFilename ) != 0 ) {
+  getFile( file );
+  if ( copy( localPath( file.filename() ), targetFilename ) != 0 ) {
     ZYPP_THROW(MediaWriteException(targetFilename));
   }
 }
 
 
-
 ///////////////////////////////////////////////////////////////////
 //
 //
@@ -1397,13 +1384,9 @@ void MediaHandler::getDetectedDevices(std::vector<std::string> & devices,
   DBG << "No devices for this medium" << endl;
 }
 
-void MediaHandler::setDeltafile( const Pathname & filename ) const
+void MediaHandler::precacheFiles( const std::vector<OnMediaLocation> & )
 {
-  _deltafile = filename;
-}
-
-Pathname MediaHandler::deltafile() const {
-  return _deltafile;
+  /* do nothing */
 }
 
   } // namespace media
index b1b1a8c..f8ae341 100644 (file)
 #include <zypp/media/MediaSource.h>
 #include <zypp/media/MediaException.h>
 #include <zypp/APIConfig.h>
+#include <zypp/OnMediaLocation.h>
+
+#undef ZYPP_BASE_LOGGER_LOGGROUP
+#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::media"
 
 namespace zypp {
   namespace media {
 
+    class MediaManager;
+
 
 ///////////////////////////////////////////////////////////////////
 //
@@ -100,9 +106,6 @@ class MediaHandler {
         /** timestamp of the the last attach verification */
         mutable time_t  _attach_mtime;
 
-       /** file usable for delta downloads */
-       mutable Pathname _deltafile;
-
     protected:
         /**
         * Url to handle
@@ -114,14 +117,7 @@ class MediaHandler {
         */
        MediaAccessId    _parentId;
 
-        /**
-        * MediaAccess (MediaManager) needs access to the attachedMedia()
-        * function to deliver a shared media source and its attach point
-        * to the media manager and then to other media handler instances.
-        * Further, is needs to be able to forward the dependsOnParent()
-        * and resetParentId() functions to the media manager.
-        */
-       friend class MediaAccess;
+     public:
 
        /**
         * Check if the current media handler depends on an
@@ -347,7 +343,7 @@ class MediaHandler {
         **/
        virtual void forceEject( const std::string & device ) {}
 
-       /**
+        /**
         * Call concrete handler to provide file below attach point.
         *
         * Default implementation provided, that returns whether a file
@@ -358,7 +354,7 @@ class MediaHandler {
         * \throws MediaException
         *
         **/
-       virtual void getFile( const Pathname & filename, const ByteCount &expectedFileSize_r ) const;
+        virtual void getFile( const OnMediaLocation &file ) const;
 
         /**
          * Call concrete handler to provide a file under a different place
@@ -371,7 +367,7 @@ class MediaHandler {
         * \throws MediaException
         *
          **/
-        virtual void getFileCopy( const Pathname & srcFilename, const Pathname & targetFilename, const ByteCount &expectedFileSize_r ) const;
+        virtual void getFileCopy( const OnMediaLocation & file, const Pathname & targetFilename ) const;
 
 
        /**
@@ -571,7 +567,7 @@ class MediaHandler {
         * \throws MediaException
         *
         **/
-       void provideFile( Pathname filename, const ByteCount &expectedFileSize_r ) const;
+       void provideFile( const OnMediaLocation &file ) const;
 
        /**
         * Call concrete handler to provide a copy of a file under a different place
@@ -584,7 +580,7 @@ class MediaHandler {
         * \throws MediaException
         *
         **/
-        void provideFileCopy( Pathname srcFilename, Pathname targetFilename, const ByteCount &expectedFileSize_r ) const;
+        void provideFileCopy( const OnMediaLocation &srcFile, Pathname targetFilename ) const;
 
        /**
         * Use concrete handler to provide directory denoted
@@ -640,16 +636,6 @@ class MediaHandler {
         **/
        void releasePath( Pathname pathname ) const;
 
-        /*
-         * set a deltafile to be used in the next download
-         */
-       void setDeltafile( const Pathname &filename = Pathname()) const;
-
-       /*
-        * return the deltafile set with setDeltafile()
-        */
-       Pathname deltafile () const;
-
     public:
 
        /**
@@ -709,6 +695,19 @@ class MediaHandler {
         virtual void
         getDetectedDevices(std::vector<std::string> & devices,
                            unsigned int & index) const;
+
+        /**
+         * Tries to fetch the given files and precaches them. Those files
+         * need to be queried using provideFile and can be read from the cache directly.
+         * The implementation is not allowed to block but needs to use seperate means to
+         * download the files concurrently.
+         * A backend can choose to completely ignore this functionaly, the default implementation
+         * does nothing.
+         *
+         * \param files List of files that should be precached, the OnMediaLocation needs to belong to the handler it is passed to
+         */
+        virtual void
+        precacheFiles ( const std::vector< OnMediaLocation > &files );
 };
 
 ///////////////////////////////////////////////////////////////////
diff --git a/zypp/media/MediaHandlerFactory.cc b/zypp/media/MediaHandlerFactory.cc
new file mode 100644 (file)
index 0000000..6b26a83
--- /dev/null
@@ -0,0 +1,138 @@
+#include "MediaHandlerFactory.h"
+
+
+#include <zypp/base/Logger.h>
+
+#include <zypp/media/MediaException.h>
+#include <zypp/media/MediaHandler.h>
+
+#include <zypp/media/MediaNFS.h>
+#include <zypp/media/MediaCD.h>
+#include <zypp/media/MediaDIR.h>
+#include <zypp/media/MediaDISK.h>
+#include <zypp/media/MediaCIFS.h>
+#include <zypp/media/MediaCurl.h>
+#include <zypp/media/MediaMultiCurl.h>
+#include <zypp/media/MediaISO.h>
+#include <zypp/media/MediaPlugin.h>
+#include <zypp/media/UrlResolverPlugin.h>
+#include <zypp/zyppng/media/MediaNetwork>
+
+namespace zypp::media {
+
+  MediaHandlerFactory::MediaHandlerFactory()
+  {
+
+  }
+
+  std::unique_ptr<MediaHandler> MediaHandlerFactory::createHandler( const Url &o_url, const Pathname &preferred_attach_point )
+  {
+    if(!o_url.isValid()) {
+      MIL << "Url is not valid" << std::endl;
+      ZYPP_THROW(MediaBadUrlException(o_url));
+    }
+
+    std::unique_ptr<MediaHandler> _handler;
+
+    UrlResolverPlugin::HeaderList custom_headers;
+    Url url = UrlResolverPlugin::resolveUrl(o_url, custom_headers);
+
+    std::string scheme = url.getScheme();
+    MIL << "Trying scheme '" << scheme << "'" << std::endl;
+
+    /*
+    ** WARNING: Don't forget to update MediaAccess::downloads(url)
+    **          if you are adding a new url scheme / handler!
+    */
+    if (scheme == "cd" || scheme == "dvd")
+      _handler = std::make_unique<MediaCD> (url,preferred_attach_point);
+    else if (scheme == "nfs" || scheme == "nfs4")
+      _handler = std::make_unique<MediaNFS> (url,preferred_attach_point);
+    else if (scheme == "iso")
+      _handler = std::make_unique<MediaISO> (url,preferred_attach_point);
+    else if (scheme == "file" || scheme == "dir")
+      _handler = std::make_unique<MediaDIR> (url,preferred_attach_point);
+    else if (scheme == "hd")
+      _handler = std::make_unique<MediaDISK> (url,preferred_attach_point);
+    else if (scheme == "cifs" || scheme == "smb")
+      _handler = std::make_unique<MediaCIFS> (url,preferred_attach_point);
+    else if (scheme == "ftp" || scheme == "tftp" || scheme == "http" || scheme == "https")
+    {
+      enum WhichHandler { choose, curl, multicurl, network };
+      WhichHandler which = choose;
+      // Leagcy: choose handler in UUrl query
+      if ( const std::string & queryparam = url.getQueryParam("mediahandler"); ! queryparam.empty() ) {
+       if ( queryparam == "network" )
+         which = network;
+       else if ( queryparam == "multicurl" )
+         which = multicurl;
+       else if ( queryparam == "curl" )
+         which = curl;
+       else
+         WAR << "Unknown mediahandler='" << queryparam << "' in URL; Choosing the default" << std::endl;
+      }
+      // Otherwise choose handler through ENV
+      if ( which == choose ) {
+       auto getenvIs = []( std::string_view var, std::string_view val )->bool {
+         const char * v = ::getenv( var.data() );
+         return v && v == val;
+       };
+
+       if ( getenvIs( "ZYPP_MEDIANETWORK", "1" ) ) {
+         WAR << "network backend manually enabled." << std::endl;
+         which = network;
+       }
+       else if ( getenvIs( "ZYPP_MULTICURL", "0" ) ) {
+         WAR << "multicurl manually disabled." << std::endl;
+         which = curl;
+       }
+       else
+         which = multicurl;
+      }
+      // Finally use the default
+      std::unique_ptr<MediaNetworkCommonHandler> handler;
+      switch ( which ) {
+       case network:
+         handler = std::make_unique<zyppng::MediaNetwork>( url, preferred_attach_point );
+         break;
+
+       default:
+       case multicurl:
+         handler = std::make_unique<MediaMultiCurl>( url, preferred_attach_point );
+         break;
+
+       case curl:
+         handler = std::make_unique<MediaCurl>( url, preferred_attach_point );
+         break;
+      }
+      // Set up the handler
+      for ( const auto & el : custom_headers ) {
+       std::string header { el.first };
+       header += ": ";
+       header += el.second;
+       MIL << "Added custom header -> " << header << std::endl;
+       handler->settings().addHeader( std::move(header) );
+      }
+      _handler = std::move(handler);
+
+    }
+    else if (scheme == "plugin" )
+      _handler = std::make_unique<MediaPlugin> (url,preferred_attach_point);
+    else
+    {
+      ZYPP_THROW(MediaUnsupportedUrlSchemeException(url));
+    }
+
+    // check created handler
+    if ( !_handler ){
+      ERR << "Failed to create media handler" << std::endl;
+      ZYPP_THROW(MediaSystemException(url, "Failed to create media handler"));
+    }
+
+    MIL << "Opened: " << *_handler << std::endl;
+    return _handler;
+  }
+
+}
+
+
diff --git a/zypp/media/MediaHandlerFactory.h b/zypp/media/MediaHandlerFactory.h
new file mode 100644 (file)
index 0000000..e25d8f8
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef MEDIAHANDLERFACTORY_H
+#define MEDIAHANDLERFACTORY_H
+
+#include <zypp/Pathname.h>
+#include <zypp/Url.h>
+#include <memory>
+
+
+namespace zypp::media {
+
+  class MediaHandler;
+
+  class MediaHandlerFactory
+  {
+  public:
+    MediaHandlerFactory();
+    static std::unique_ptr<MediaHandler> createHandler (const Url& o_url, const Pathname & preferred_attach_point);
+  };
+
+}
+
+
+#endif // MEDIAHANDLERFACTORY_H
index f0c97e4..b3c932d 100644 (file)
@@ -155,7 +155,7 @@ namespace zypp
 
       try
       {
-        manager.provideFile(_parentId, _isofile);
+        manager.provideFile(_parentId, OnMediaLocation(_isofile) );
       }
       catch(const MediaException &e1)
       {
@@ -272,9 +272,9 @@ namespace zypp
     }
 
     // ---------------------------------------------------------------
-    void MediaISO::getFile(const Pathname &filename, const ByteCount &expectedFileSize_r) const
+    void MediaISO::getFile( const OnMediaLocation &file ) const
     {
-      MediaHandler::getFile(filename, expectedFileSize_r);
+      MediaHandler::getFile(file);
     }
 
     // ---------------------------------------------------------------
index a05ccd0..3e1505f 100644 (file)
@@ -42,7 +42,7 @@ namespace zypp
 
        virtual void attachTo (bool next = false) override;
         virtual void releaseFrom( const std::string & ejectDev = "" ) override;
-       virtual void getFile( const Pathname & filename, const ByteCount &expectedFileSize_r ) const override;
+       virtual void getFile( const OnMediaLocation & file ) const override;
        virtual void getDir( const Pathname & dirname, bool recurse_r ) const override;
         virtual void getDirInfo( std::list<std::string> & retlist,
                                  const Pathname & dirname, bool dots = true ) const override;
index 9a5ab9f..d83bbe1 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <zypp/media/MediaException.h>
 #include <zypp/media/MediaManager.h>
+#include <zypp/media/MediaHandlerFactory.h>
 #include <zypp/media/MediaHandler.h>
 #include <zypp/media/Mount.h>
 
@@ -36,37 +37,91 @@ namespace zypp
     namespace // anonymous
     { ////////////////////////////////////////////////////////////////
 
+      struct ManagedMedia;
+      std::ostream & operator<<( std::ostream & str, const ManagedMedia & obj );
+
       // -------------------------------------------------------------
       struct ManagedMedia
       {
         ~ManagedMedia()
-        {}
+        {
+          try
+          {
+            close(); // !!! make sure handler gets properly deleted.
+          }
+          catch(...) {}
+        }
 
-        ManagedMedia()
-          : desired (false)
+        ManagedMedia( ManagedMedia &&m )
+          : desired ( m.desired )
+          , verifier( std::move(m.verifier) )
+          , _handler ( std::move(m._handler) )
         {}
 
-        ManagedMedia(const ManagedMedia &m)
-          : desired (m.desired)
-          , handler (m.handler)
-          , verifier(m.verifier)
-        {}
+        static ManagedMedia makeManagedMedia ( const Url &o_url, const Pathname &preferred_attach_point, const MediaVerifierRef &v )
+        {
+          auto handler = MediaHandlerFactory::createHandler( o_url, preferred_attach_point );
+          if ( !handler ) {
+            ERR << "Failed to create media handler" << std::endl;
+            ZYPP_THROW( MediaSystemException(o_url, "Failed to create media handler"));
+          }
+          return ManagedMedia( std::move(handler), v );
+        }
 
-        ManagedMedia(const MediaAccessRef &h, const MediaVerifierRef &v)
-          : desired (false)
-          , handler (h)
-          , verifier(v)
-        {}
+        ManagedMedia &operator= ( ManagedMedia &&other ) = default;
+
+        operator bool () const {
+          return ( _handler ? true : false );
+        }
+
+        inline MediaHandler &handler() {
+          if ( !_handler )
+              ZYPP_THROW(MediaNotOpenException("Accessing ManagedMedia after it was closed"));
+          return *_handler;
+        }
+
+        inline const MediaHandler &handler() const {
+          if ( !_handler )
+            ZYPP_THROW(MediaNotOpenException("Accessing ManagedMedia after it was closed"));
+          return *_handler;
+        }
+
+        std::ostream & dumpOn( std::ostream & str ) const {
+          if ( !_handler )
+            return str << "ManagedMedia( closed )";
+
+          str << _handler->protocol() << "(" << *_handler << ")";
+          return str;
+        }
+
+        inline void close ()
+        {
+          ///////////////////////////////////////////////////////////////////
+          // !!! make shure handler gets properly deleted.
+          // I.e. release attached media before deleting the handler.
+          ///////////////////////////////////////////////////////////////////
+
+          try {
+            handler().release();
+          }
+          catch (const MediaException & excpt_r)
+          {
+            ZYPP_CAUGHT(excpt_r);
+            WAR << "Close: " << *this << " (" << excpt_r << ")" << std::endl;
+            ZYPP_RETHROW(excpt_r);
+          }
+          MIL << "Close: " << *this << " (OK)" << std::endl;
+        }
 
         inline void
         checkAttached(MediaAccessId id)
         {
-          if( !handler->isAttached())
+          if( !handler().isAttached())
           {
             DBG << "checkAttached(" << id << ") not attached" << std::endl;
             desired = false;
             ZYPP_THROW(MediaNotAttachedException(
-              handler->url()
+              handler().url()
             ));
           }
         }
@@ -77,12 +132,13 @@ namespace zypp
 
           if ( !desired )
           {
+            const auto &hdl = handler();
             try {
-              desired = verifier->isDesiredMedia(handler);
+              desired = verifier->isDesiredMedia( handler() );
             } catch ( const zypp::Exception &e ) {
                 ZYPP_CAUGHT( e );
 
-                media::MediaNotDesiredException newEx ( handler->url() );
+                media::MediaNotDesiredException newEx ( hdl.url() );
                 newEx.remember( e );
                 ZYPP_THROW( newEx );
             }
@@ -90,7 +146,7 @@ namespace zypp
             if( !desired )
             {
               DBG << "checkDesired(" << id << "): not desired (report by " << verifier->info() << ")" << std::endl;
-              ZYPP_THROW( MediaNotDesiredException( handler->url() ) );
+              ZYPP_THROW( MediaNotDesiredException( hdl.url() ) );
             }
 
             DBG << "checkDesired(" << id << "): desired (report by " << verifier->info() << ")" << std::endl;
@@ -100,10 +156,22 @@ namespace zypp
         }
 
         bool             desired;
-        MediaAccessRef   handler;
         MediaVerifierRef verifier;
+        Pathname         deltafile;
+
+      private:
+        ManagedMedia( std::unique_ptr<MediaHandler> &&h, const MediaVerifierRef &v)
+          : desired (false)
+          , verifier(v)
+          , _handler ( std::move(h) )
+        {}
+
+        std::unique_ptr<MediaHandler>  _handler;
       };
 
+      std::ostream & operator<<( std::ostream & str, const ManagedMedia & obj ) {
+        return obj.dumpOn( str );
+      }
 
       // -------------------------------------------------------------
       typedef std::map<MediaAccessId, ManagedMedia> ManagedMediaMap;
@@ -155,13 +223,13 @@ namespace zypp
             found = false;
             for(it = mediaMap.begin(); it != mediaMap.end(); /**/)
             {
-              if( it->second.handler->dependsOnParent())
+              if( it->second && it->second.handler().dependsOnParent() )
               {
                 found = true;
                 // let it forget its parent, we will
                 // destroy it later (in clear())...
-                it->second.handler->resetParentId();
-                mediaMap.erase( it++ ); // postfix! Incrementing before erase
+                it->second.handler().resetParentId();
+                it = mediaMap.erase( it ); // postfix! Incrementing before erase
               } else {
                 ++it;
               }
@@ -245,15 +313,13 @@ namespace zypp
     MediaManager::open(const Url &url, const Pathname &preferred_attach_point)
     {
       // create new access handler for it
-      MediaAccessRef handler( new MediaAccess());
       MediaVerifierRef verifier( new NoVerifier());
-      ManagedMedia tmp( handler, verifier);
-
-      tmp.handler->open(url, preferred_attach_point);
+      ManagedMedia tmp = ManagedMedia::makeManagedMedia( url, preferred_attach_point, verifier );
 
       MediaAccessId nextId = m_impl->nextAccessId();
 
-      m_impl->mediaMap[nextId] = tmp;
+      m_impl->mediaMap.insert( std::make_pair( nextId, std::move(tmp) ) );
+      //m_impl->mediaMap[nextId] = std::move(tmp);
 
       DBG << "Opened new media access using id " << nextId
           << " to " << url.asString() << std::endl;
@@ -277,10 +343,10 @@ namespace zypp
       ManagedMediaMap::iterator m(m_impl->mediaMap.begin());
       for( ; m != m_impl->mediaMap.end(); ++m)
       {
-        if( m->second.handler->dependsOnParent(accessId, true))
+        if( m->second.handler().dependsOnParent(accessId, true))
         {
           ZYPP_THROW(MediaIsSharedException(
-            m->second.handler->url().asString()
+            m->second.handler().url().asString()
           ));
         }
       }
@@ -289,7 +355,7 @@ namespace zypp
           << accessId << " requested" << std::endl;
 
       ManagedMedia &ref( m_impl->findMM(accessId));
-      ref.handler->close();
+      ref.close();
 
       m_impl->mediaMap.erase(accessId);
     }
@@ -299,8 +365,7 @@ namespace zypp
     MediaManager::isOpen(MediaAccessId accessId) const
     {
       ManagedMediaMap::iterator it( m_impl->mediaMap.find(accessId));
-      return it != m_impl->mediaMap.end() &&
-             it->second.handler->isOpen();
+      return it != m_impl->mediaMap.end();
     }
 
     // ---------------------------------------------------------------
@@ -309,7 +374,7 @@ namespace zypp
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
 
-      return ref.handler->protocol();
+      return ref.handler().protocol();
     }
 
     // ---------------------------------------------------------------
@@ -318,7 +383,7 @@ namespace zypp
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
 
-      return ref.handler->downloads();
+      return ref.handler().downloads();
     }
 
     // ---------------------------------------------------------------
@@ -327,7 +392,7 @@ namespace zypp
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
 
-      return ref.handler->url();
+      return ref.handler().url();
     }
 
     // ---------------------------------------------------------------
@@ -372,11 +437,12 @@ namespace zypp
     void MediaManager::attach(MediaAccessId accessId)
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
+      auto &hdl = ref.handler();
 
       DBG << "attach(id=" << accessId << ")" << std::endl;
 
       // try first mountable/mounted device
-      ref.handler->attach(false);
+      hdl.attach(false);
       try
       {
         ref.checkDesired(accessId);
@@ -386,22 +452,22 @@ namespace zypp
       {
         ZYPP_CAUGHT(ex);
 
-        if (!ref.handler->hasMoreDevices())
+        if (!hdl.hasMoreDevices())
           ZYPP_RETHROW(ex);
 
-        if (ref.handler->isAttached())
-          ref.handler->release();
+        if (hdl.isAttached())
+          hdl.release();
       }
 
       MIL << "checkDesired(" << accessId << ") of first device failed,"
         " going to try others with attach(true)" << std::endl;
 
-      while (ref.handler->hasMoreDevices())
+      while (hdl.hasMoreDevices())
       {
         try
         {
           // try to attach next device
-          ref.handler->attach(true);
+          hdl.attach(true);
           ref.checkDesired(accessId);
           return;
         }
@@ -409,28 +475,28 @@ namespace zypp
         {
           ZYPP_CAUGHT(ex);
 
-          if (!ref.handler->hasMoreDevices())
+          if (!hdl.hasMoreDevices())
           {
             MIL << "No desired media found after trying all detected devices." << std::endl;
             ZYPP_RETHROW(ex);
           }
 
-          AttachedMedia media(ref.handler->attachedMedia());
+          AttachedMedia media(hdl.attachedMedia());
           DBG << "Skipping " << media.mediaSource->asString() << ": not desired media." << std::endl;
 
-          ref.handler->release();
+          hdl.release();
         }
         catch (const MediaException & ex)
         {
           ZYPP_CAUGHT(ex);
 
-          if (!ref.handler->hasMoreDevices())
+          if (!hdl.hasMoreDevices())
             ZYPP_RETHROW(ex);
 
-          AttachedMedia media(ref.handler->attachedMedia());
+          AttachedMedia media(hdl.attachedMedia());
           DBG << "Skipping " << media.mediaSource->asString() << " because of exception thrown by attach(true)" << std::endl;
 
-          if (ref.handler->isAttached()) ref.handler->release();
+          if (hdl.isAttached()) hdl.release();
         }
       }
     }
@@ -457,14 +523,15 @@ namespace zypp
         ManagedMediaMap::iterator m(m_impl->mediaMap.begin());
         for( ; m != m_impl->mediaMap.end(); ++m)
         {
-          if( m->second.handler->dependsOnParent(accessId, false))
+          auto &hdl = m->second.handler();
+          if( hdl.dependsOnParent(accessId, false))
           {
             try
             {
               DBG << "Forcing release of handler depending on access id "
                   << accessId << std::endl;
               m->second.desired  = false;
-              m->second.handler->release();
+              hdl.release();
             }
             catch(const MediaException &e)
             {
@@ -474,7 +541,7 @@ namespace zypp
         }
       }
       ref.desired  = false;
-      ref.handler->release(ejectDev);
+      ref.handler().release(ejectDev);
     }
 
     // ---------------------------------------------------------------
@@ -486,16 +553,17 @@ namespace zypp
       ManagedMediaMap::iterator m(m_impl->mediaMap.begin());
       for( ; m != m_impl->mediaMap.end(); ++m)
       {
-        if( m->second.handler->dependsOnParent())
+        auto &hdl = m->second.handler();
+        if( hdl.dependsOnParent())
           continue;
 
         try
         {
-          if(m->second.handler->isAttached())
+          if(hdl.isAttached())
           {
             DBG << "Releasing media id " << m->first << std::endl;
             m->second.desired  = false;
-            m->second.handler->release();
+            hdl.release();
           }
           else
           {
@@ -518,7 +586,7 @@ namespace zypp
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
 
-      ref.handler->disconnect();
+      ref.handler().disconnect();
     }
 
     // ---------------------------------------------------------------
@@ -527,7 +595,7 @@ namespace zypp
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
 
-      return ref.handler->isAttached();
+      return ref.handler().isAttached();
     }
 
     // ---------------------------------------------------------------
@@ -535,7 +603,7 @@ namespace zypp
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
 
-      return ref.handler->isSharedMedia();
+      return ref.handler().isSharedMedia();
     }
 
     // ---------------------------------------------------------------
@@ -544,14 +612,14 @@ namespace zypp
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
 
-      if( !ref.handler->isAttached())
+      if( !ref.handler().isAttached())
       {
         ref.desired = false;
       }
       else
       {
         try {
-          ref.desired = ref.verifier->isDesiredMedia(ref.handler);
+          ref.desired = ref.verifier->isDesiredMedia( ref.handler() );
         }
         catch(const zypp::Exception &e) {
           ZYPP_CAUGHT(e);
@@ -577,10 +645,10 @@ namespace zypp
       ManagedMedia &ref( m_impl->findMM(accessId));
 
       bool desired = false;
-      if( ref.handler->isAttached())
+      if( ref.handler().isAttached())
       {
         try {
-          desired = v->isDesiredMedia(ref.handler);
+          desired = v->isDesiredMedia( ref.handler() );
         }
         catch(const zypp::Exception &e) {
           ZYPP_CAUGHT(e);
@@ -608,7 +676,7 @@ namespace zypp
       ManagedMedia &ref( m_impl->findMM(accessId));
 
       Pathname path;
-      path = ref.handler->localRoot();
+      path = ref.handler().localRoot();
       return path;
     }
 
@@ -620,7 +688,7 @@ namespace zypp
       ManagedMedia &ref( m_impl->findMM(accessId));
 
       Pathname path;
-      path = ref.handler->localPath(pathname);
+      path = ref.handler().localPath(pathname);
       return path;
     }
 
@@ -631,9 +699,11 @@ namespace zypp
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
 
-      ref.checkDesired(accessId);
+      auto loc = OnMediaLocation( filename )
+                   .setDownloadSize( expectedFileSize )
+                   .setDeltafile( ref.deltafile );
 
-      ref.handler->provideFile(filename, expectedFileSize);
+      provideFile( accessId, loc );
     }
 
     // ---------------------------------------------------------------
@@ -641,7 +711,21 @@ namespace zypp
     MediaManager::provideFile(MediaAccessId   accessId,
                               const Pathname &filename ) const
     {
-      provideFile( accessId, filename, 0);
+      ManagedMedia &ref( m_impl->findMM(accessId));
+
+      auto loc = OnMediaLocation( filename )
+                   .setDeltafile( ref.deltafile );
+
+      provideFile( accessId, loc );
+    }
+
+    void MediaManager::provideFile( MediaAccessId accessId, const OnMediaLocation &file ) const
+    {
+      ManagedMedia &ref( m_impl->findMM(accessId));
+
+      ref.checkDesired(accessId);
+
+      ref.handler().provideFile( file );
     }
 
     // ---------------------------------------------------------------
@@ -653,7 +737,16 @@ namespace zypp
 
       ref.checkDesired(accessId);
 
-      ref.handler->setDeltafile(filename);
+      ref.deltafile = filename;
+    }
+
+    void MediaManager::precacheFiles(MediaAccessId accessId, const std::vector<OnMediaLocation> &files)
+    {
+      ManagedMedia &ref( m_impl->findMM(accessId));
+
+      ref.checkDesired(accessId);
+
+      ref.handler().precacheFiles( files );
     }
 
     // ---------------------------------------------------------------
@@ -665,7 +758,7 @@ namespace zypp
 
       ref.checkDesired(accessId);
 
-      ref.handler->provideDir(dirname);
+      ref.handler().provideDir(dirname);
     }
 
     // ---------------------------------------------------------------
@@ -677,7 +770,7 @@ namespace zypp
 
       ref.checkDesired(accessId);
 
-      ref.handler->provideDirTree(dirname);
+      ref.handler().provideDirTree(dirname);
     }
 
     // ---------------------------------------------------------------
@@ -689,7 +782,7 @@ namespace zypp
 
       ref.checkAttached(accessId);
 
-      ref.handler->releaseFile(filename);
+      ref.handler().releaseFile(filename);
     }
 
     // ---------------------------------------------------------------
@@ -701,7 +794,7 @@ namespace zypp
 
       ref.checkAttached(accessId);
 
-      ref.handler->releaseDir(dirname);
+      ref.handler().releaseDir(dirname);
     }
 
 
@@ -714,7 +807,7 @@ namespace zypp
 
       ref.checkAttached(accessId);
 
-      ref.handler->releasePath(pathname);
+      ref.handler().releasePath(pathname);
     }
 
     // ---------------------------------------------------------------
@@ -729,7 +822,7 @@ namespace zypp
       // FIXME: ref.checkDesired(accessId); ???
       ref.checkAttached(accessId);
 
-      ref.handler->dirInfo(retlist, dirname, dots);
+      ref.handler().dirInfo(retlist, dirname, dots);
     }
 
     // ---------------------------------------------------------------
@@ -744,7 +837,7 @@ namespace zypp
       // FIXME: ref.checkDesired(accessId); ???
       ref.checkAttached(accessId);
 
-      ref.handler->dirInfo(retlist, dirname, dots);
+      ref.handler().dirInfo(retlist, dirname, dots);
     }
 
     // ---------------------------------------------------------------
@@ -756,7 +849,7 @@ namespace zypp
       // FIXME: ref.checkDesired(accessId); ???
       ref.checkAttached(accessId);
 
-      return ref.handler->doesFileExist(filename);
+      return ref.handler().doesFileExist(filename);
     }
 
     // ---------------------------------------------------------------
@@ -766,7 +859,7 @@ namespace zypp
                                      unsigned int & index) const
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
-      return ref.handler->getDetectedDevices(devices, index);
+      return ref.handler().getDetectedDevices(devices, index);
     }
 
     // ---------------------------------------------------------------
@@ -799,7 +892,7 @@ namespace zypp
       ManagedMediaMap::const_iterator m(m_impl->mediaMap.begin());
       for( ; m != m_impl->mediaMap.end(); ++m)
       {
-        AttachedMedia ret = m->second.handler->attachedMedia();
+        AttachedMedia ret = m->second.handler().attachedMedia();
         if( ret.mediaSource && ret.attachPoint)
         {
           std::string mnt(ret.attachPoint->path.asString());
@@ -860,7 +953,7 @@ namespace zypp
     {
       ManagedMedia &ref( m_impl->findMM(accessId));
 
-      return ref.handler->attachedMedia();
+      return ref.handler().attachedMedia();
     }
 
     // ---------------------------------------------------------------
@@ -873,10 +966,10 @@ namespace zypp
       ManagedMediaMap::const_iterator m(m_impl->mediaMap.begin());
       for( ; m != m_impl->mediaMap.end(); ++m)
       {
-        if( !m->second.handler->isAttached())
+        if( !m->second.handler().isAttached())
           continue;
 
-        AttachedMedia ret = m->second.handler->attachedMedia();
+        AttachedMedia ret = m->second.handler().attachedMedia();
         if( ret.mediaSource && ret.mediaSource->equals( *media))
             return ret;
       }
@@ -893,13 +986,13 @@ namespace zypp
       ManagedMediaMap::iterator m(m_impl->mediaMap.begin());
       for( ; m != m_impl->mediaMap.end(); ++m)
       {
-        if( !m->second.handler->isAttached())
+        if( !m->second.handler().isAttached())
           continue;
 
-        AttachedMedia ret = m->second.handler->attachedMedia();
+        AttachedMedia ret = m->second.handler().attachedMedia();
         if( ret.mediaSource && ret.mediaSource->equals( *media))
         {
-          m->second.handler->release();
+          m->second.handler().release();
           m->second.desired  = false;
         }
       }
index 33cd4dd..bb0d3ed 100644 (file)
 #ifndef ZYPP_MEDIA_MEDIAMANAGER_H
 #define ZYPP_MEDIA_MEDIAMANAGER_H
 
-#include <zypp/media/MediaAccess.h>
-
 #include <zypp/APIConfig.h>
 #include <zypp/base/NonCopyable.h>
 #include <zypp/base/PtrTypes.h>
 #include <zypp/Pathname.h>
+#include <zypp/PathInfo.h>
 #include <zypp/Url.h>
+#include <zypp/OnMediaLocation.h>
+#include <zypp/media/MediaSource.h>
+#include <zypp/media/MediaException.h>
 
 #include <list>
 
 
-//////////////////////////////////////////////////////////////////////
-namespace zypp
-{ ////////////////////////////////////////////////////////////////////
-
-  ////////////////////////////////////////////////////////////////////
-  namespace media
-  { //////////////////////////////////////////////////////////////////
+namespace zypp::media
+{
+  class MediaHandler;
 
+  typedef unsigned int  MediaNr;
 
-    ///////////////////////////////////////////////////////////////////
-    typedef zypp::RW_pointer<MediaAccess> MediaAccessRef;
 
-    // OBSOLETE HERE:
-    typedef MediaAccessId                 MediaId;
-    typedef unsigned int                  MediaNr;
+  ///////////////////////////////////////////////////////////////////
+  // forward declaration
+  struct MountEntry;
+  class MediaManager_Impl;
 
+  ///////////////////////////////////////////////////////////////////
+  //
+  // CLASS NAME : MediaVerifierBase
+  //
+  /**
+   * Interface to implement a media verifier.
+   */
+  class MediaVerifierBase //: private zypp::NonCopyable
+  {
+  public:
+    MediaVerifierBase()
+    {}
 
-    ///////////////////////////////////////////////////////////////////
-    // forward declaration
-    struct MountEntry;
-    class MediaManager_Impl;
+    virtual ~MediaVerifierBase()
+    {}
 
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : MediaVerifierBase
-    //
     /**
-     * Interface to implement a media verifier.
+     * Returns a string with some info about the verifier.
+     * By default, the type info name is returned.
      */
-    class MediaVerifierBase //: private zypp::NonCopyable
-    {
-    public:
-      MediaVerifierBase()
-      {}
-
-      virtual ~MediaVerifierBase()
-      {}
-
-      /**
-       * Returns a string with some info about the verifier.
-       * By default, the type info name is returned.
-       */
-      virtual std::string info() const;
+    virtual std::string info() const;
+
+    /*
+    ** Check if the specified attached media contains
+    ** the desired media (e.g. SLES10 CD1).
+    */
+    virtual bool isDesiredMedia(const MediaHandler &ref) const = 0;
+  };
+
+
+  ///////////////////////////////////////////////////////////////////
+  //
+  // CLASS NAME : NoVerifier
+  //
+  /**
+   * Dummy default media verifier, which is always happy.
+   */
+  class NoVerifier : public MediaVerifierBase
+  {
+  public:
+    NoVerifier(): MediaVerifierBase()
+    {}
+
+    ~NoVerifier() override
+    {}
 
-      /*
-      ** Check if the specified attached media contains
-      ** the desired media (e.g. SLES10 CD1).
-      */
-      virtual bool isDesiredMedia(const MediaAccessRef &ref) const = 0;
-    };
-
-
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : NoVerifier
-    //
     /**
-     * Dummy default media verifier, which is always happy.
+     * Returns the "zypp::media::NoVerifier" string.
      */
-    class NoVerifier : public MediaVerifierBase
-    {
-    public:
-      NoVerifier(): MediaVerifierBase()
-      {}
+    std::string info() const override;
+
+    /*
+    ** Don't check if the specified attached media contains
+    ** the desired media number. Always return true.
+    */
+    bool isDesiredMedia(const MediaHandler &ref) const override
+    { return true; }
+  };
+
+
+  ///////////////////////////////////////////////////////////////////
+  //
+  // CLASS NAME : MediaVerifierRef
+  //
+  /**
+   * A shared reference to the MediaVerifier implementation.
+   */
+  typedef zypp::RW_pointer<MediaVerifierBase> MediaVerifierRef;
+
+
+  ///////////////////////////////////////////////////////////////////
+  //
+  // CLASS NAME : MediaManager
+  //
+  /**
+   * Manages access to the 'physical' media, e.g CDROM drives,
+   * Disk volumes, directory trees, etc, using \ref MediaAccessUrl's.
+   *
+   * \note The MediaManager class is just an envelope around an
+   *       inner singleton like implementation.<br>
+   *       That is, you can create as many managers as you want,
+   *       also temporary in a function call.<br>
+   *       But <b>don't</b> declare static MediaManager instances,
+   *       unless you want to force (mutex) initialization order
+   *       problems!
+   *
+   * \section MediaAccessUrl Media Access Url
+   * The MediaManager uses several media access handlers (backends),
+   * that can be specified by a Media Access URL in its open() method.
+   *
+   * All URLs may contain following query parameters, that are
+   * reserved by the Source classes and unused/ignored by the media
+   * manager:
+   * - <tt>alias</tt>: A source specific media alias string.
+   *
+   * Currently, following access handlers (backends) are implemented:
+   *   - \ref MediaCD_Url
+   *   - \ref MediaDISK_Url
+   * .
+   *   - \ref MediaISO_Url
+   *   - \ref MediaDIR_Url
+   * .
+   *   - \ref MediaNFS_Url
+   *   - \ref MediaCIFS_Url
+   *   - \ref MediaCurl_Url
+   *
+   * \subsection MediaCD_Url MediaCD - CD/DVD drives (cd, dvd)
+   * The access handler for media on CD / DVD drives.
+   *   - Scheme:
+   *     - <b>cd</b>: Requires a drive supporting CD media.
+   *     - <b>dvd</b>: Prefers a drive supporting DVD media.
+   *   - Examples:
+   *     \code
+   *       "cd:/"
+   *       "cd:/?devices=/dev/hda,/dev/hdb"
+   *       "cd:/subdir?devices=/dev/hda,/dev/hdb"
+   *
+   *       "dvd:/"
+   *       "dvd:/?devices=/dev/hda,/dev/hdb"
+   *       "dvd:/subdir?devices=/dev/hda,/dev/hdb"
+   *     \endcode
+   *     Note: You can use either "dvd:/" (just path, no authority)
+   *           or "dvd:///" (path and empty authority).
+   *   - Query parameters:
+   *     - <tt>devices</tt>:
+   *       Optional parameter, containing a comma separated list of
+   *       block device names to use, e.g.: "/dev/sr0,/dev/sr1".
+   *       <br>
+   *       The device names will be verified. If one of the provided
+   *       devices is not usable (not a block device, or does not
+   *       support required media type), an exception is thrown.
+   *       <br>
+   *       If the devices parameter is not provided (or empty), available
+   *       CD/DVD drives will be auto-detected. The preferred device is
+   *       the one denoted by "/dev/dvd" ("dvd" scheme only) or "/dev/cdrom".
+   *   - Authority:
+   *     A non-empty authority URL component (e.g. containing a host
+   *     name) is not allowed.
+   *   - Path name:
+   *     Mandatory URL component, that specifies a subdirectory on the
+   *     CD/DVD, where the desired files are located.
+   *
+   * \subsection MediaDISK_Url MediaDISK - HD disk volumes (hd)
+   * The access handler for media on a disk volume (partition).
+   *   - Scheme:
+   *     - <b>hd</b>
+   *   - Examples:
+   *     \code
+   *       "hd:/?device=/dev/hda1"
+   *       "hd:/subdir?device=/dev/sda1"
+   *       "hd:/subdir?device=/dev/sda1&filesystem=reiserfs"
+   *     \endcode
+   *     Note: You can use either "hd:/" (just path, no authority)
+   *     or "hd:///" (path and empty authority).
+   *   - Query parameters:
+   *     - <tt>device</tt>:
+   *       Mandatory parameter specifying the name of the block device of
+   *       the partition to mount.
+   *     - <tt>filesystem</tt>:
+   *       The name of the filesystem. Defaults to "auto".
+   *   - Authority:
+   *     A non-empty authority URL component is not allowed.
+   *   - Path name:
+   *     Mandatory URL component, that specifies a subdirectory on the disk
+   *     partition, where the desired files are located.
+   *
+   * \subsection MediaDIR_Url MediaDIR - Local directory tree (dir, file)
+   * The access handler to media stored in a local directory tree.
+   *   - Scheme:
+   *     - <b>dir</b>
+   *     - <b>file</b>
+   *   - Examples:
+   *     \code
+   *       "dir:/directory/name"
+   *       "file:/directory/name"
+   *     \endcode
+   *   - Query parameters:
+   *     none
+   *   - Authority:
+   *     A non-empty authority URL component (e.g. containing
+   *     a host name) is not allowed.
+   *   - Path name:
+   *     Mandatory URL component, that specifies a directory, where
+   *     the desired files are located.
+   *
+   * \subsection MediaISO_Url MediaISO - Loopback ISO images (iso)
+   * The access handler for media in a ISO image (loopback mount).
+   *   - Scheme:
+   *     - <b>iso</b>
+   *   - Examples:
+   *     \code
+   *       "iso:/?iso=/path/to/CD1.iso"
+   *       "iso:/?iso=CD1.iso&url=dir:/path/to"
+   *
+   *       "iso:/?iso=CD1.iso&url=nfs://server/path/to/media"
+   *       "iso:/?iso=CD1.iso&url=hd:/?device=/dev/hda"
+   *
+   *        "iso:/subdir?iso=DVD1.iso&url=nfs://nfs-server/directory&mnt=/nfs/attach/point&filesystem=udf"
+   *     \endcode
+   *   - Query parameters:
+   *     - <tt>iso</tt>:
+   *       Mandatory parameter specifying the name of the iso file.<br>
+   *       If the url parameter is missed, the iso parameter has to contain
+   *       an absolute iso file name.
+   *     - <tt>url</tt>:
+   *       Optional parameter specifying the URL to the directory containing
+   *       the iso file.<br>
+   *       The supported URL schemes are: <i><b>hd</b>, <b>dir</b>,
+   *       <b>file</b>, <b>nfs</b>, <b>nfs4</b>, <b>smb</b>, <b>cifs</b>.</i>
+   *     - <tt>mnt</tt>:
+   *       Optional parameter specifying the prefered attach point for the
+   *       source media url.
+   *     - <tt>filesystem</tt>:
+   *       Optional name of the filesystem used in the iso file. Defaults
+   *       to "auto".
+   *   - Authority:
+   *     A non-empty authority URL component is not allowed.
+   *   - Path name:
+   *     Mandatory URL component, that specifies a subdirectory inside of
+   *     the iso file, where the desired files are located.
+   *
+   * \subsection MediaNFS_Url MediaNFS  - NFS directory tree (nfs)
+   * The access handler for media on NFS exported directory tree.
+   *   - Scheme:
+   *     - <b>nfs</b>
+   *     - <b>nfs</b>
+   *   - Examples:
+   *     \code
+   *        "nfs://nfs-server/exported/path"
+   *        "nfs://nfs-server/exported/path?mountoptions=ro"
+   *        "nfs://nfs-server/exported/path&type=nfs4"
+   *        "nfs4://nfs-server/exported/path"
+   *     \endcode
+   *   - Query parameters:
+   *     - <tt>mountoptions</tt>:
+   *       The mount options separated by comma ','.
+   *       Default is the "ro" option.
+   *     - <tt>type=nfs4</tt>:
+   *       Whether to mount as nfs4. This is the default for scheme nfs4.
+    *   - Authority:
+   *     The authority component has to provide a hostname.
+   *     Username, password and port are currently ignored.
+   *   - Path name:
+   *     Mandatory URL component, that specifies the exported
+   *     (sub-)directory on the NFS server, where the desired
+   *     files are located.
+   *
+   * \subsection MediaCIFS_Url MediaCIFS - CIFS/SMB directory tree (cifs, smb)
+   * The access handler for media in a CIFS/SMB shared directory tree.
+   *   - Scheme:
+   *     - <b>cifs</b>
+   *     - <b>smb</b>
+   *   - Examples:
+   *     \code
+   *       "cifs://servername/share/path/on/the/share"
+   *       "cifs://username:passwd@servername/share/path/on/the/share?mountoptions=ro"
+   *       "cifs://username:passwd@servername/share/path/on/the/share?mountoptions=noguest"
+   *       "smb://servername/share/path/on/the/share"
+   *       "smb://username:passwd@servername/share/path/on/the/share?mountoptions=ro"
+   *     \endcode
+   *     Note: There is no difference between cifs and smb scheme
+   *     (any more). In both cases the 'cifs' filesystem is used.
+   *   - Query parameters:
+   *     - <tt>mountoptions</tt>:
+   *       The mount options separated by a comma ','. Default are the
+   *       "ro" and "guest" options. Specify "noguest" to turn off
+   *       "guest". This is necessary if Samba is configured to reject
+   *       guest connections.
+   *     - <tt>workgroup</tt> or <tt>domain</tt>:
+   *       The name of the workgroup.
+   *     - <tt>username</tt>:
+   *       Alternative username to username in URL authority.
+   *     - <tt>password</tt>:
+   *       Alternative password to password in URL authority.
+   *     - <tt>user</tt>:
+   *       Alternative username (cifs specific variant)
+   *     - <tt>pass</tt>:
+   *       Alternative password (cifs specific variant)
+   *   - Authority:
+   *     The authority component has to provide a hostname. Optionally
+   *     also a username and password.
+   *   - Path name:
+   *     Mandatory URL component, that specifies the share name with
+   *     optional subdirectory, where the desired files are located.
+   *
+   * \subsection MediaCurl_Url MediaCurl - FTP/HTTP directory tree (ftp, tftp, http, https)
+   * The access handler to media directory tree on a ftp/http server.
+   *   - Scheme:
+   *     - <b>ftp</b>
+   *     - <b>tftp</b>
+   *     - <b>http</b>
+   *     - <b>https</b>
+   *   - Examples:
+   *     \code
+   *       "ftp://server/relative/path/to/media/dir"
+   *       "ftp://server/%2fabsolute/path/to/media/dir"
+   *
+   *       "ftp://user:pass@server/path/to/media/dir"
+   *       "ftp://user:pass@server/%2f/home/user/path/to/media/dir"
+   *
+   *       "http://server/path/on/server"
+   *       "http://user:pass@server/path"
+   *       "https://user:pass@server/path?proxy=foo&proxyuser=me&proxypass=pw"
+   *     \endcode
+   *     Note: The "ftp" url scheme supports absolute and relative
+   *     paths to the default ftp server directory
+   *     (<a href="http://rfc.net/rfc1738.html">RFC1738, Section 3.2.2</a>).<br>
+   *     To use an absolute path, you have to prepend the path with an
+   *     additional slash, what results in a "/%2f" combination
+   *     (second "/" encoded to "%2f") at the begin of the URL path.
+   *     <br>
+   *     This is important, especially in user authenticated ftp,
+   *     where the users home is usually the default directory of the
+   *     server (except when the server chroots into the users home
+   *     directory).
+   *     <br>
+   *     For example, if the user "user" has a home directory
+   *     "/home/user", you can use either an URL with a relative path
+   *     to the home directory "ftp://user:pass@server/path/to/media"
+   *     or the absolute path
+   *     "ftp://user:pass@server/%2fhome/user/path/to/media" -- both
+   *     URLs points to the same directory on the server.
+   *   - Query parameters:
+   *     - <tt>cookies</tt>:
+   *       Turn off using cookies by setting it to "0" (or false, no, off).
+   *     - <tt>proxy</tt>:
+   *       A proxy hostname or hostname and port separated by ':'.
+   *       Setting the hostname to '_none_' explicitly disables the use of a
+   *       proxy even if configured in /etc/sysconfig/proxy or the environment.
+   *     - <tt>proxyport</tt>:
+   *       Alternative way to provide the proxy port.
+   *     - <tt>proxyuser</tt>:
+   *       The proxy username.
+   *     - <tt>proxypass</tt>:
+   *       The proxy password.
+   *     - <tt>ssl_capath</tt>:
+   *       The absolute CA directory to use, default is /etc/ssl/certs.
+   *     - <tt>ssl_verify</tt>: Flag to modify the ssl verify behaviour.
+   *       Valid values are: 'yes', 'no' and a comma separated list of
+   *       'host' and 'peer' flags.
+   *       - 'no':
+   *         disables ssl verify
+   *       - 'yes':
+   *         enables ssl verify, this is the default
+   *         and is equivalent to 'host,peer'.
+   *       - 'host': The server is considered the intended one, when the
+   *         'Common Name' field or a 'Subject Alternate Name' field in
+   *         the certificate matches the host name in the URL.
+   *       - 'peer': Verifies whether the certificate provided by the
+   *         server is authentic against the chain of digital signatures
+   *         found in <tt>ssl_capath</tt>.
+   *     - <tt>ssl_clientcert</tt>
+   *       Path to the ssl client certificate for authentication to a repo (CURLOPT_SSLCERT).
+   *     - <tt>ssl_clientkey</tt>
+   *       Path to the ssl client key for authentication to a repo (CURLOPT_SSLKEY).
+   *     - <tt>timeout</tt>:
+   *       Transfer timeout in seconds between 0 and 3600, 0 disables
+   *       the timeout, default timeout is 180 seconds.
+   *     - <tt>auth</tt>: A comma separated list of http authentication
+   *       method names to use: 'basic', 'digest', 'ntlm', 'negotiate',
+   *       'spnego', 'gssnego'.
+   *       Note, that this list depends on the list of methods supported
+   *       by the curl library.
+   *     - <tt>mediahandler</tt>: Set the mediahandler for this url
+   *     Valid values are: 'curl', 'multicurl'
+   *   - Authority:
+   *     The authority component has to provide a hostname. Optionally
+   *     also a username and password. In case of the 'ftp' scheme,
+   *     username and password defaults to 'anonymous' and 'yast2@'.
+   *   - Path name:
+   *     Mandatory URL component, that specifies the path name on the
+   *     server, where the desired files are located.
+   *
+   *   Proxy settings: If no proxy settings are present in tha URLs
+   *   query parameters, the media handler reads the system wide proxy
+   *   settings from the <tt>/etc/sysconfig/proxy</tt> file.
+   *   If a proxy setting was present, but the proxy password not,
+   *   it attempts to read the <tt>proxy-user</tt> variable from the
+   *   <tt>~/.curlrc</tt> (<tt>/root/.curlrc</tt>) file.
+   *   <br>
+   *   If no proxy setting was present, then libzypp does not pass any
+   *   proxy settings to curl, but curl fallbacks to use the content of
+   *   the <tt>http_proxy</tt>, <tt>ftp_proxy</tt>, etc environment
+   *   variables.
+   *
+   * \subsection MediaPlugin_Url MediaPlugin - custom media handler
+   * Media access is delegated to a script located in the libzypp
+   * media plugin directory. The URLs query options are translated
+   * into commandline arguments passed to the script.
+   *   - Scheme:
+   *     - <b>plugin</b>
+   *   - Examples:
+   *     \code
+   *       "plugin:script?loptv=lvalue&v=optv&lopt=&o&=foo"
+   *                      \__________/ \____/ \___/ | \_/
+   *                __________/__    ____/_    _|_  \   \___
+   *              /              \ /       \ /    \ /\ /    \
+   *       script --loptv "lvalue" -v "optv" --lopt -o -- foo
+   *     \endcode
+   *   - Query parameters:
+   *     - The URLs query options are translated into commandline
+   *       arguments passed to the script.
+   *     - \b Note: No option may appear twice, as the <tt>(option,value)</tt>
+   *       pairs are stored in a hash.
+   *     - \b Note: The order in which the query options are passes to the
+   *       script is arbitrary, except for an option with an empty key, which
+   *       is translated into <tt>'-- value'</tt> and passed as final option.
+   *     - <tt>'c[=[value]]'</tt> ist passed as <tt>'-c [value]'</tt>
+   *     - <tt>'word[=[value]]'</tt> ist passed as <tt>'--word [value]'</tt>
+   *     - <tt>'[=value]'</tt> ist passed as last args as <tt>'-- [value]'</tt>
+   *   - \c script<->libzypp communication:
+   *     - \TODO to be documented.
+   */
+  class MediaManager: private zypp::base::NonCopyable
+  {
+  public:
+    /**
+     * Creates a MediaManager envelope instance.
+     *
+     * In the case, that the inner implementation is not already
+     * allocated, and the MediaManager constructor was unable to
+     * allocate it, a std::bad_alloc exception is thrown.
+     *
+     * All further instances increase the use counter only.
+     *
+     * \throws std::bad_alloc
+     */
+    MediaManager();
 
-      ~NoVerifier() override
-      {}
+    /**
+     * Destroys MediaManager envelope instance.
+     * Decreases the use counter of the inner implementation.
+     */
+    ~MediaManager();
 
-      /**
-       * Returns the "zypp::media::NoVerifier" string.
-       */
-      std::string info() const override;
+    /**
+     * Opens the media access for specified with the url.
+     *
+     * If the \p preferred_attach_point parameter does not
+     * point to a usable attach point directory, the media
+     * manager automatically creates a temporary attach
+     * point in a default directory. This default directory
+     * can be changed using setAttachPrefix() function.
+     *
+     * Remember to close() each id you've opened and not
+     * need any more. It is like a new and delete!
+     *
+     * \param  url The \ref MediaAccessUrl.
+     * \param  preferred_attach_point The preferred, already
+     *         existing directory, where the media should be
+     *         attached.
+     * \return a new media access id.
+     * \throws std::bad_alloc
+     * \throws MediaException
+     */
+    MediaAccessId
+    open(const Url &url, const Pathname & preferred_attach_point = "");
 
-      /*
-      ** Don't check if the specified attached media contains
-      ** the desired media number. Always return true.
-      */
-      bool isDesiredMedia(const MediaAccessRef &) const override
-      { return true; }
-    };
+    /**
+     * Close the media access with specified id.
+     * \param accessId The media access id to close.
+     */
+    void
+    close(MediaAccessId accessId);
 
+    /**
+     * Query if the media access is open / exists.
+     *
+     * \param accessId The media access id to query.
+     * \return true, if access id is known and open.
+     */
+    bool
+    isOpen(MediaAccessId accessId) const;
 
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : MediaVerifierRef
-    //
     /**
-     * A shared reference to the MediaVerifier implementation.
+     * Query the protocol name used by the media access
+     * handler. Similar to url().getScheme().
+     *
+     * \param accessId The media access id to query.
+     * \return The protocol name used by the media access
+     *         handler, otherwise 'unknown'.
+     * \throws MediaNotOpenException for invalid access id.
      */
-    typedef zypp::RW_pointer<MediaVerifierBase> MediaVerifierRef;
+    std::string
+    protocol(MediaAccessId accessId) const;
 
+    /**
+     * Hint if files are downloaded or not.
+     * \param accessId The media access id to query.
+     * \return True, if provideFile downloads files.
+     */
+    bool
+    downloads(MediaAccessId accessId) const;
 
-    ///////////////////////////////////////////////////////////////////
-    //
-    // CLASS NAME : MediaManager
-    //
     /**
-     * Manages access to the 'physical' media, e.g CDROM drives,
-     * Disk volumes, directory trees, etc, using \ref MediaAccessUrl's.
-     *
-     * \note The MediaManager class is just an envelope around an
-     *       inner singleton like implementation.<br>
-     *       That is, you can create as many managers as you want,
-     *       also temporary in a function call.<br>
-     *       But <b>don't</b> declare static MediaManager instances,
-     *       unless you want to force (mutex) initialization order
-     *       problems!
+     * Returns the \ref MediaAccessUrl of the media access id.
      *
-     * \section MediaAccessUrl Media Access Url
-     * The MediaManager uses several media access handlers (backends),
-     * that can be specified by a Media Access URL in its open() method.
-     *
-     * All URLs may contain following query parameters, that are
-     * reserved by the Source classes and unused/ignored by the media
-     * manager:
-     * - <tt>alias</tt>: A source specific media alias string.
+     * \param accessId The media access id to query.
+     * \return The \ref MediaAccessUrl used by the media access id.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    Url
+    url(MediaAccessId accessId) const;
+
+  public:
+    /**
+     * Add verifier implementation for the specified media id.
+     * By default, the NoVerifier is used.
      *
-     * Currently, following access handlers (backends) are implemented:
-     *   - \ref MediaCD_Url
-     *   - \ref MediaDISK_Url
-     * .
-     *   - \ref MediaISO_Url
-     *   - \ref MediaDIR_Url
-     * .
-     *   - \ref MediaNFS_Url
-     *   - \ref MediaCIFS_Url
-     *   - \ref MediaCurl_Url
+     * \param accessId A media access id.
+     * \param verifier The new verifier.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    void
+    addVerifier(MediaAccessId accessId,
+                const MediaVerifierRef &verifier);
+
+    /**
+     * Remove verifier for specified media id.
+     * It resets the verifier to NoVerifier.
      *
-     * \subsection MediaCD_Url MediaCD - CD/DVD drives (cd, dvd)
-     * The access handler for media on CD / DVD drives.
-     *   - Scheme:
-     *     - <b>cd</b>: Requires a drive supporting CD media.
-     *     - <b>dvd</b>: Prefers a drive supporting DVD media.
-     *   - Examples:
-     *     \code
-     *       "cd:/"
-     *       "cd:/?devices=/dev/hda,/dev/hdb"
-     *       "cd:/subdir?devices=/dev/hda,/dev/hdb"
+     * \param accessId A media access id.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    void
+    delVerifier(MediaAccessId accessId);
+
+  public:
+    /**
+     * Set or resets the directory name, where the media manager
+     * handlers create their temporary attach points (see open()
+     * function).
+     * It has effect to newly created temporary attach points only.
      *
-     *       "dvd:/"
-     *       "dvd:/?devices=/dev/hda,/dev/hdb"
-     *       "dvd:/subdir?devices=/dev/hda,/dev/hdb"
-     *     \endcode
-     *     Note: You can use either "dvd:/" (just path, no authority)
-     *           or "dvd:///" (path and empty authority).
-     *   - Query parameters:
-     *     - <tt>devices</tt>:
-     *       Optional parameter, containing a comma separated list of
-     *       block device names to use, e.g.: "/dev/sr0,/dev/sr1".
-     *       <br>
-     *       The device names will be verified. If one of the provided
-     *       devices is not usable (not a block device, or does not
-     *       support required media type), an exception is thrown.
-     *       <br>
-     *       If the devices parameter is not provided (or empty), available
-     *       CD/DVD drives will be auto-detected. The preferred device is
-     *       the one denoted by "/dev/dvd" ("dvd" scheme only) or "/dev/cdrom".
-     *   - Authority:
-     *     A non-empty authority URL component (e.g. containing a host
-     *     name) is not allowed.
-     *   - Path name:
-     *     Mandatory URL component, that specifies a subdirectory on the
-     *     CD/DVD, where the desired files are located.
+     * \param attach_prefix The new prefix for temporary attach
+     *        points, or empty pathname to reset to defaults.
+     * \return True on success, false if the \p attach_prefix
+     *         parameters contains a path name, that does not
+     *         point to a writable directory.
+     */
+    bool
+    setAttachPrefix(const Pathname &attach_prefix);
+
+    /**
+     * Attach the media using the concrete handler (checks all devices).
      *
-     * \subsection MediaDISK_Url MediaDISK - HD disk volumes (hd)
-     * The access handler for media on a disk volume (partition).
-     *   - Scheme:
-     *     - <b>hd</b>
-     *   - Examples:
-     *     \code
-     *       "hd:/?device=/dev/hda1"
-     *       "hd:/subdir?device=/dev/sda1"
-     *       "hd:/subdir?device=/dev/sda1&filesystem=reiserfs"
-     *     \endcode
-     *     Note: You can use either "hd:/" (just path, no authority)
-     *     or "hd:///" (path and empty authority).
-     *   - Query parameters:
-     *     - <tt>device</tt>:
-     *       Mandatory parameter specifying the name of the block device of
-     *       the partition to mount.
-     *     - <tt>filesystem</tt>:
-     *       The name of the filesystem. Defaults to "auto".
-     *   - Authority:
-     *     A non-empty authority URL component is not allowed.
-     *   - Path name:
-     *     Mandatory URL component, that specifies a subdirectory on the disk
-     *     partition, where the desired files are located.
+     * Remember to release() or close() each id you've attached
+     * and not need any more. Attach is like an open of a file!
      *
-     * \subsection MediaDIR_Url MediaDIR - Local directory tree (dir, file)
-     * The access handler to media stored in a local directory tree.
-     *   - Scheme:
-     *     - <b>dir</b>
-     *     - <b>file</b>
-     *   - Examples:
-     *     \code
-     *       "dir:/directory/name"
-     *       "file:/directory/name"
-     *     \endcode
-     *   - Query parameters:
-     *     none
-     *   - Authority:
-     *     A non-empty authority URL component (e.g. containing
-     *     a host name) is not allowed.
-     *   - Path name:
-     *     Mandatory URL component, that specifies a directory, where
-     *     the desired files are located.
+     * \param accessId A media access id.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    void
+    attach(MediaAccessId accessId);
+
+    /**
+     * Release the attached media and optionally eject.
      *
-     * \subsection MediaISO_Url MediaISO - Loopback ISO images (iso)
-     * The access handler for media in a ISO image (loopback mount).
-     *   - Scheme:
-     *     - <b>iso</b>
-     *   - Examples:
-     *     \code
-     *       "iso:/?iso=/path/to/CD1.iso"
-     *       "iso:/?iso=CD1.iso&url=dir:/path/to"
+     * If the \p ejectDev parameter is not empty all other access
+     * id's are released and the specified drive (CD/DVD drive) is
+     * ejected.
      *
-     *       "iso:/?iso=CD1.iso&url=nfs://server/path/to/media"
-     *       "iso:/?iso=CD1.iso&url=hd:/?device=/dev/hda"
+     * \param accessId A media access id.
+     * \param ejectDev Device to eject. None if empty.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    void
+    release(MediaAccessId accessId, const std::string & ejectDev = "");
+
+    /**
+     * Release all attached media.
+     */
+    void
+    releaseAll();
+
+    /**
+     * Disconnect a remote media.
      *
-     *        "iso:/subdir?iso=DVD1.iso&url=nfs://nfs-server/directory&mnt=/nfs/attach/point&filesystem=udf"
-     *     \endcode
-     *   - Query parameters:
-     *     - <tt>iso</tt>:
-     *       Mandatory parameter specifying the name of the iso file.<br>
-     *       If the url parameter is missed, the iso parameter has to contain
-     *       an absolute iso file name.
-     *     - <tt>url</tt>:
-     *       Optional parameter specifying the URL to the directory containing
-     *       the iso file.<br>
-     *       The supported URL schemes are: <i><b>hd</b>, <b>dir</b>,
-     *       <b>file</b>, <b>nfs</b>, <b>nfs4</b>, <b>smb</b>, <b>cifs</b>.</i>
-     *     - <tt>mnt</tt>:
-     *       Optional parameter specifying the prefered attach point for the
-     *       source media url.
-     *     - <tt>filesystem</tt>:
-     *       Optional name of the filesystem used in the iso file. Defaults
-     *       to "auto".
-     *   - Authority:
-     *     A non-empty authority URL component is not allowed.
-     *   - Path name:
-     *     Mandatory URL component, that specifies a subdirectory inside of
-     *     the iso file, where the desired files are located.
+     * This is useful for media which e.g. holds open a connection
+     * to a server like FTP. After calling disconnect() the media
+     * object (attach point) is still valid and files are present.
      *
-     * \subsection MediaNFS_Url MediaNFS  - NFS directory tree (nfs)
-     * The access handler for media on NFS exported directory tree.
-     *   - Scheme:
-     *     - <b>nfs</b>
-     *     - <b>nfs</b>
-     *   - Examples:
-     *     \code
-     *        "nfs://nfs-server/exported/path"
-     *        "nfs://nfs-server/exported/path?mountoptions=ro"
-     *        "nfs://nfs-server/exported/path&type=nfs4"
-     *        "nfs4://nfs-server/exported/path"
-     *     \endcode
-     *   - Query parameters:
-     *     - <tt>mountoptions</tt>:
-     *       The mount options separated by comma ','.
-     *       Default is the "ro" option.
-     *     - <tt>type=nfs4</tt>:
-     *       Whether to mount as nfs4. This is the default for scheme nfs4.
-      *   - Authority:
-     *     The authority component has to provide a hostname.
-     *     Username, password and port are currently ignored.
-     *   - Path name:
-     *     Mandatory URL component, that specifies the exported
-     *     (sub-)directory on the NFS server, where the desired
-     *     files are located.
+     * But after calling disconnect() it's not possible to call
+     * fetch more data using the provideFile() or provideDir()
+     * functions anymore.
      *
-     * \subsection MediaCIFS_Url MediaCIFS - CIFS/SMB directory tree (cifs, smb)
-     * The access handler for media in a CIFS/SMB shared directory tree.
-     *   - Scheme:
-     *     - <b>cifs</b>
-     *     - <b>smb</b>
-     *   - Examples:
-     *     \code
-     *       "cifs://servername/share/path/on/the/share"
-     *       "cifs://username:passwd@servername/share/path/on/the/share?mountoptions=ro"
-     *       "cifs://username:passwd@servername/share/path/on/the/share?mountoptions=noguest"
-     *       "smb://servername/share/path/on/the/share"
-     *       "smb://username:passwd@servername/share/path/on/the/share?mountoptions=ro"
-     *     \endcode
-     *     Note: There is no difference between cifs and smb scheme
-     *     (any more). In both cases the 'cifs' filesystem is used.
-     *   - Query parameters:
-     *     - <tt>mountoptions</tt>:
-     *       The mount options separated by a comma ','. Default are the
-     *       "ro" and "guest" options. Specify "noguest" to turn off
-     *       "guest". This is necessary if Samba is configured to reject
-     *       guest connections.
-     *     - <tt>workgroup</tt> or <tt>domain</tt>:
-     *       The name of the workgroup.
-     *     - <tt>username</tt>:
-     *       Alternative username to username in URL authority.
-     *     - <tt>password</tt>:
-     *       Alternative password to password in URL authority.
-     *     - <tt>user</tt>:
-     *       Alternative username (cifs specific variant)
-     *     - <tt>pass</tt>:
-     *       Alternative password (cifs specific variant)
-     *   - Authority:
-     *     The authority component has to provide a hostname. Optionally
-     *     also a username and password.
-     *   - Path name:
-     *     Mandatory URL component, that specifies the share name with
-     *     optional subdirectory, where the desired files are located.
+     * \param accessId A media access id.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    void
+    disconnect(MediaAccessId accessId);
+
+    /**
+     * Check if media is attached or not.
      *
-     * \subsection MediaCurl_Url MediaCurl - FTP/HTTP directory tree (ftp, tftp, http, https)
-     * The access handler to media directory tree on a ftp/http server.
-     *   - Scheme:
-     *     - <b>ftp</b>
-     *     - <b>tftp</b>
-     *     - <b>http</b>
-     *     - <b>https</b>
-     *   - Examples:
-     *     \code
-     *       "ftp://server/relative/path/to/media/dir"
-     *       "ftp://server/%2fabsolute/path/to/media/dir"
+     * \param accessId A media access id.
+     * \return True if media is attached.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    bool
+    isAttached(MediaAccessId accessId) const;
+
+    /**
+     * Returns information if media is on a shared
+     * physical device or not.
      *
-     *       "ftp://user:pass@server/path/to/media/dir"
-     *       "ftp://user:pass@server/%2f/home/user/path/to/media/dir"
+     * \param accessId A media access id.
+     * \return True if it is shared, false if not.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    bool
+    isSharedMedia(MediaAccessId accessId) const;
+
+    /**
+     * Ask the registered verifier if the attached
+     * media is the desired one or not.
      *
-     *       "http://server/path/on/server"
-     *       "http://user:pass@server/path"
-     *       "https://user:pass@server/path?proxy=foo&proxyuser=me&proxypass=pw"
-     *     \endcode
-     *     Note: The "ftp" url scheme supports absolute and relative
-     *     paths to the default ftp server directory
-     *     (<a href="http://rfc.net/rfc1738.html">RFC1738, Section 3.2.2</a>).<br>
-     *     To use an absolute path, you have to prepend the path with an
-     *     additional slash, what results in a "/%2f" combination
-     *     (second "/" encoded to "%2f") at the begin of the URL path.
-     *     <br>
-     *     This is important, especially in user authenticated ftp,
-     *     where the users home is usually the default directory of the
-     *     server (except when the server chroots into the users home
-     *     directory).
-     *     <br>
-     *     For example, if the user "user" has a home directory
-     *     "/home/user", you can use either an URL with a relative path
-     *     to the home directory "ftp://user:pass@server/path/to/media"
-     *     or the absolute path
-     *     "ftp://user:pass@server/%2fhome/user/path/to/media" -- both
-     *     URLs points to the same directory on the server.
-     *   - Query parameters:
-     *     - <tt>cookies</tt>:
-     *       Turn off using cookies by setting it to "0" (or false, no, off).
-     *     - <tt>proxy</tt>:
-     *       A proxy hostname or hostname and port separated by ':'.
-     *       Setting the hostname to '_none_' explicitly disables the use of a
-     *       proxy even if configured in /etc/sysconfig/proxy or the environment.
-     *     - <tt>proxyport</tt>:
-     *       Alternative way to provide the proxy port.
-     *     - <tt>proxyuser</tt>:
-     *       The proxy username.
-     *     - <tt>proxypass</tt>:
-     *       The proxy password.
-     *     - <tt>ssl_capath</tt>:
-     *       The absolute CA directory to use, default is /etc/ssl/certs.
-     *     - <tt>ssl_verify</tt>: Flag to modify the ssl verify behaviour.
-     *       Valid values are: 'yes', 'no' and a comma separated list of
-     *       'host' and 'peer' flags.
-     *       - 'no':
-     *         disables ssl verify
-     *       - 'yes':
-     *         enables ssl verify, this is the default
-     *         and is equivalent to 'host,peer'.
-     *       - 'host': The server is considered the intended one, when the
-     *         'Common Name' field or a 'Subject Alternate Name' field in
-     *         the certificate matches the host name in the URL.
-     *       - 'peer': Verifies whether the certificate provided by the
-     *         server is authentic against the chain of digital signatures
-     *         found in <tt>ssl_capath</tt>.
-     *     - <tt>ssl_clientcert</tt>
-     *       Path to the ssl client certificate for authentication to a repo (CURLOPT_SSLCERT).
-     *     - <tt>ssl_clientkey</tt>
-     *       Path to the ssl client key for authentication to a repo (CURLOPT_SSLKEY).
-     *     - <tt>timeout</tt>:
-     *       Transfer timeout in seconds between 0 and 3600, 0 disables
-     *       the timeout, default timeout is 180 seconds.
-     *     - <tt>auth</tt>: A comma separated list of http authentication
-     *       method names to use: 'basic', 'digest', 'ntlm', 'negotiate',
-     *       'spnego', 'gssnego'.
-     *       Note, that this list depends on the list of methods supported
-     *       by the curl library.
-     *     - <tt>mediahandler</tt>: Set the mediahandler for this url
-     *     Valid values are: 'curl', 'multicurl'
-     *   - Authority:
-     *     The authority component has to provide a hostname. Optionally
-     *     also a username and password. In case of the 'ftp' scheme,
-     *     username and password defaults to 'anonymous' and 'yast2@'.
-     *   - Path name:
-     *     Mandatory URL component, that specifies the path name on the
-     *     server, where the desired files are located.
+     * \param accessId A media access id.
+     * \return True if media is attached and desired
+     *         according to the actual verifier.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    bool
+    isDesiredMedia(MediaAccessId accessId) const;
+
+    /**
+     * Ask the specified verifier if the attached
+     * media is the desired one or not.
      *
-     *   Proxy settings: If no proxy settings are present in tha URLs
-     *   query parameters, the media handler reads the system wide proxy
-     *   settings from the <tt>/etc/sysconfig/proxy</tt> file.
-     *   If a proxy setting was present, but the proxy password not,
-     *   it attempts to read the <tt>proxy-user</tt> variable from the
-     *   <tt>~/.curlrc</tt> (<tt>/root/.curlrc</tt>) file.
-     *   <br>
-     *   If no proxy setting was present, then libzypp does not pass any
-     *   proxy settings to curl, but curl fallbacks to use the content of
-     *   the <tt>http_proxy</tt>, <tt>ftp_proxy</tt>, etc environment
-     *   variables.
+     * \param accessId A media access id.
+     * \param verifier A verifier to use.
+     * \return True if media is attached and desired
+     *         according to the specified verifier.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    bool
+    isDesiredMedia(MediaAccessId           accessId,
+                   const MediaVerifierRef &verifier) const;
+
+    /**
+     * Simple check, based on media's URL scheme, telling whether the
+     * it is possible to physically change the media inside its drive, like
+     * CDs or DVDs. Useful to decide whether to request media change from
+     * user or not.
      *
-     * \subsection MediaPlugin_Url MediaPlugin - custom media handler
-     * Media access is delegated to a script located in the libzypp
-     * media plugin directory. The URLs query options are translated
-     * into commandline arguments passed to the script.
-     *   - Scheme:
-     *     - <b>plugin</b>
-     *   - Examples:
-     *     \code
-     *       "plugin:script?loptv=lvalue&v=optv&lopt=&o&=foo"
-     *                      \__________/ \____/ \___/ | \_/
-     *                __________/__    ____/_    _|_  \   \___
-     *              /              \ /       \ /    \ /\ /    \
-     *       script --loptv "lvalue" -v "optv" --lopt -o -- foo
-     *     \endcode
-     *   - Query parameters:
-     *     - The URLs query options are translated into commandline
-     *       arguments passed to the script.
-     *     - \b Note: No option may appear twice, as the <tt>(option,value)</tt>
-     *       pairs are stored in a hash.
-     *     - \b Note: The order in which the query options are passes to the
-     *       script is arbitrary, except for an option with an empty key, which
-     *       is translated into <tt>'-- value'</tt> and passed as final option.
-     *     - <tt>'c[=[value]]'</tt> ist passed as <tt>'-c [value]'</tt>
-     *     - <tt>'word[=[value]]'</tt> ist passed as <tt>'--word [value]'</tt>
-     *     - <tt>'[=value]'</tt> ist passed as last args as <tt>'-- [value]'</tt>
-     *   - \c script<->libzypp communication:
-     *     - \TODO to be documented.
-     */
-    class MediaManager: private zypp::base::NonCopyable
-    {
-    public:
-      /**
-       * Creates a MediaManager envelope instance.
-       *
-       * In the case, that the inner implementation is not already
-       * allocated, and the MediaManager constructor was unable to
-       * allocate it, a std::bad_alloc exception is thrown.
-       *
-       * All further instances increase the use counter only.
-       *
-       * \throws std::bad_alloc
-       */
-      MediaManager();
+     * \param accessId The media access id.
+     * \return <tt>false</tt> if the media is not changeable,
+     *         <tt>true</tt> otherwise.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    bool
+    isChangeable(MediaAccessId accessId);
 
-      /**
-       * Destroys MediaManager envelope instance.
-       * Decreases the use counter of the inner implementation.
-       */
-      ~MediaManager();
+    /**
+     * Return the local directory that corresponds to medias url,
+     * no matter if media isAttached or not. Files requested will
+     * be available at 'localRoot() + filename' or even better
+     * 'localPath( filename )'
+     *
+     * \param accessId A media access id.
+     * \returns The directory name pointing to the media root
+     *          in local filesystem or an empty pathname if the
+     *          media is not attached.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    Pathname
+    localRoot(MediaAccessId accessId) const;
 
-      /**
-       * Opens the media access for specified with the url.
-       *
-       * If the \p preferred_attach_point parameter does not
-       * point to a usable attach point directory, the media
-       * manager automatically creates a temporary attach
-       * point in a default directory. This default directory
-       * can be changed using setAttachPrefix() function.
-       *
-       * Remember to close() each id you've opened and not
-       * need any more. It is like a new and delete!
-       *
-       * \param  url The \ref MediaAccessUrl.
-       * \param  preferred_attach_point The preferred, already
-       *         existing directory, where the media should be
-       *         attached.
-       * \return a new media access id.
-       * \throws std::bad_alloc
-       * \throws MediaException
-       */
-      MediaAccessId
-      open(const Url &url, const Pathname & preferred_attach_point = "");
+    /**
+     * Shortcut for 'localRoot() + pathname', but returns an empty
+     * pathname if media is not attached.
+     * Files provided will be available at 'localPath(filename)'.
+     *
+     * \param accessId A media access id.
+     * \param pathname A path name relative to the localRoot().
+     * \returns The directory name in local filesystem pointing
+     *          to the desired relative pathname on the media
+     *          or an empty pathname if the media is not attached.
+     * \throws MediaNotOpenException for invalid access id.
+     */
+    Pathname
+    localPath(MediaAccessId accessId, const Pathname & pathname) const;
 
-      /**
-       * Close the media access with specified id.
-       * \param accessId The media access id to close.
-       */
-      void
-      close(MediaAccessId accessId);
+  public:
 
-      /**
-       * Query if the media access is open / exists.
-       *
-       * \param accessId The media access id to query.
-       * \return true, if access id is known and open.
-       */
-      bool
-      isOpen(MediaAccessId accessId) const;
+    /**
+     * \deprecated Deprecated function, please use the provideFile version that
+     * takes a \ref OnMediaLocation argument
+     */
+    ZYPP_DEPRECATED void
+    provideFile(MediaAccessId accessId,
+                const Pathname &filename,
+                const ByteCount &expectedFileSize) const;
 
-      /**
-       * Query the protocol name used by the media access
-       * handler. Similar to url().getScheme().
-       *
-       * \param accessId The media access id to query.
-       * \return The protocol name used by the media access
-       *         handler, otherwise 'unknown'.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      std::string
-      protocol(MediaAccessId accessId) const;
+    /**
+     * \deprecated Deprecated function, please use the provideFile version that
+     * takes a \ref OnMediaLocation argument
+     */
+    ZYPP_DEPRECATED void
+    provideFile(MediaAccessId   accessId,
+                const Pathname &filename ) const;
 
-      /**
-       * Hint if files are downloaded or not.
-       * \param accessId The media access id to query.
-       * \return True, if provideFile downloads files.
-       */
-      bool
-      downloads(MediaAccessId accessId) const;
 
-      /**
-       * Returns the \ref MediaAccessUrl of the media access id.
-       *
-       * \param accessId The media access id to query.
-       * \return The \ref MediaAccessUrl used by the media access id.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      Url
-      url(MediaAccessId accessId) const;
+    /**
+     * Provide provide file denoted by relative path below of the
+     * 'attach point' of the specified media and the path prefix
+     * on the media.
+     *
+     * \param accessId  The media access id to use.
+     * \param file The \ref OnMediaLocation specifiying the file to download
+     *
+     * \throws MediaNotOpenException in case of invalid access id.
+     * \throws MediaNotAttachedException in case, that the media is not attached.
+     * \throws MediaNotDesiredException in case, that the media verification failed.
+     * \throws MediaNotAFileException in case, that the requested filename is not a file.
+     * \throws MediaFileNotFoundException in case, that the requested filenamedoes not exists.
+     * \throws MediaWriteException in case, that the file can't be copied from from remote source.
+     * \throws MediaSystemException in case a system operation fails.
+     * \throws MediaException derived exception, depending on the url (handler).
+     */
+    void
+    provideFile(MediaAccessId accessId,
+      const OnMediaLocation &file ) const;
 
-    public:
-      /**
-       * Add verifier implementation for the specified media id.
-       * By default, the NoVerifier is used.
-       *
-       * \param accessId A media access id.
-       * \param verifier The new verifier.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      void
-      addVerifier(MediaAccessId accessId,
-                  const MediaVerifierRef &verifier);
+    /**
+     * FIXME: see MediaAccess class.
+     */
+    void
+    provideDir(MediaAccessId   accessId,
+               const Pathname &dirname) const;
 
-      /**
-       * Remove verifier for specified media id.
-       * It resets the verifier to NoVerifier.
-       *
-       * \param accessId A media access id.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      void
-      delVerifier(MediaAccessId accessId);
-
-    public:
-      /**
-       * Set or resets the directory name, where the media manager
-       * handlers create their temporary attach points (see open()
-       * function).
-       * It has effect to newly created temporary attach points only.
-       *
-       * \param attach_prefix The new prefix for temporary attach
-       *        points, or empty pathname to reset to defaults.
-       * \return True on success, false if the \p attach_prefix
-       *         parameters contains a path name, that does not
-       *         point to a writable directory.
-       */
-      bool
-      setAttachPrefix(const Pathname &attach_prefix);
+    /**
+     * FIXME: see MediaAccess class.
+     */
+    void
+    provideDirTree(MediaAccessId  accessId,
+                   const Pathname &dirname) const;
 
-      /**
-       * Attach the media using the concrete handler (checks all devices).
-       *
-       * Remember to release() or close() each id you've attached
-       * and not need any more. Attach is like an open of a file!
-       *
-       * \param accessId A media access id.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      void
-      attach(MediaAccessId accessId);
+    /**
+     * FIXME: see MediaAccess class.
+     */
+    void
+    releaseFile(MediaAccessId   accessId,
+                const Pathname &filename) const;
 
-      /**
-       * Release the attached media and optionally eject.
-       *
-       * If the \p ejectDev parameter is not empty all other access
-       * id's are released and the specified drive (CD/DVD drive) is
-       * ejected.
-       *
-       * \param accessId A media access id.
-       * \param ejectDev Device to eject. None if empty.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      void
-      release(MediaAccessId accessId, const std::string & ejectDev = "");
+    /**
+     * FIXME: see MediaAccess class.
+     */
+    void
+    releaseDir(MediaAccessId   accessId,
+               const Pathname &dirname) const;
 
-      /**
-       * Release all attached media.
-       */
-      void
-      releaseAll();
+    /**
+     * FIXME: see MediaAccess class.
+     */
+    void
+    releasePath(MediaAccessId   accessId,
+                const Pathname &pathname) const;
 
-      /**
-       * Disconnect a remote media.
-       *
-       * This is useful for media which e.g. holds open a connection
-       * to a server like FTP. After calling disconnect() the media
-       * object (attach point) is still valid and files are present.
-       *
-       * But after calling disconnect() it's not possible to call
-       * fetch more data using the provideFile() or provideDir()
-       * functions anymore.
-       *
-       * \param accessId A media access id.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      void
-      disconnect(MediaAccessId accessId);
+    /**
+     * FIXME: see MediaAccess class.
+     */
+    void
+    dirInfo(MediaAccessId           accessId,
+            std::list<std::string> &retlist,
+            const Pathname         &dirname,
+            bool                    dots = true) const;
 
-      /**
-       * Check if media is attached or not.
-       *
-       * \param accessId A media access id.
-       * \return True if media is attached.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      bool
-      isAttached(MediaAccessId accessId) const;
+    /**
+     * FIXME: see MediaAccess class.
+     */
+    void
+    dirInfo(MediaAccessId           accessId,
+            filesystem::DirContent &retlist,
+            const Pathname         &dirname,
+            bool                   dots = true) const;
 
-      /**
-       * Returns information if media is on a shared
-       * physical device or not.
-       *
-       * \param accessId A media access id.
-       * \return True if it is shared, false if not.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      bool
-      isSharedMedia(MediaAccessId accessId) const;
+    /**
+     * FIXME: see MediaAccess class.
+     */
+    bool doesFileExist(MediaAccessId  accessId,
+                       const Pathname & filename ) const;
 
-      /**
-       * Ask the registered verifier if the attached
-       * media is the desired one or not.
-       *
-       * \param accessId A media access id.
-       * \return True if media is attached and desired
-       *         according to the actual verifier.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      bool
-      isDesiredMedia(MediaAccessId accessId) const;
+    /**
+     * Fill in a vector of detected ejectable devices and the index of the
+     * currently attached device within the vector. The contents of the vector
+     * are the device names (/dev/cdrom and such).
+     *
+     * \param accessId Medium id.
+     * \param devices  vector to load with the device names
+     * \param index    index of the currently used device in the devices vector
+     */
+    void
+    getDetectedDevices(MediaAccessId accessId,
+                       std::vector<std::string> & devices,
+                       unsigned int & index) const;
 
-      /**
-       * Ask the specified verifier if the attached
-       * media is the desired one or not.
-       *
-       * \param accessId A media access id.
-       * \param verifier A verifier to use.
-       * \return True if media is attached and desired
-       *         according to the specified verifier.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      bool
-      isDesiredMedia(MediaAccessId           accessId,
-                     const MediaVerifierRef &verifier) const;
-
-      /**
-       * Simple check, based on media's URL scheme, telling whether the
-       * it is possible to physically change the media inside its drive, like
-       * CDs or DVDs. Useful to decide whether to request media change from
-       * user or not.
-       *
-       * \param accessId The media access id.
-       * \return <tt>false</tt> if the media is not changeable,
-       *         <tt>true</tt> otherwise.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      bool
-      isChangeable(MediaAccessId accessId);
-
-      /**
-       * Return the local directory that corresponds to medias url,
-       * no matter if media isAttached or not. Files requested will
-       * be available at 'localRoot() + filename' or even better
-       * 'localPath( filename )'
-       *
-       * \param accessId A media access id.
-       * \returns The directory name pointing to the media root
-       *          in local filesystem or an empty pathname if the
-       *          media is not attached.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      Pathname
-      localRoot(MediaAccessId accessId) const;
+    ZYPP_DEPRECATED void
+    setDeltafile(MediaAccessId   accessId,
+                const Pathname &filename ) const;
 
-      /**
-       * Shortcut for 'localRoot() + pathname', but returns an empty
-       * pathname if media is not attached.
-       * Files provided will be available at 'localPath(filename)'.
-       *
-       * \param accessId A media access id.
-       * \param pathname A path name relative to the localRoot().
-       * \returns The directory name in local filesystem pointing
-       *          to the desired relative pathname on the media
-       *          or an empty pathname if the media is not attached.
-       * \throws MediaNotOpenException for invalid access id.
-       */
-      Pathname
-      localPath(MediaAccessId accessId, const Pathname & pathname) const;
-
-    public:
-      /**
-       * Provide provide file denoted by relative path below of the
-       * 'attach point' of the specified media and the path prefix
-       * on the media.
-       *
-       * \param accessId  The media access id to use.
-       * \param filename  The filename to provide, relative to localRoot().
-       * \param expectedFileSize The expected filesize, download will stop if it is exceeded
+    /**
+       * Tries to fetch the given files and precaches them. Those files
+       * need to be queried using provideFile and can be read from the cache directly.
+       * The implementation is not allowed to block but needs to use seperate means to
+       * download the files concurrently.
+       * A backend can choose to completely ignore this functionaly, the default implementation
+       * does nothing.
        *
-       * \throws MediaNotOpenException in case of invalid access id.
-       * \throws MediaNotAttachedException in case, that the media is not attached.
-       * \throws MediaNotDesiredException in case, that the media verification failed.
-       * \throws MediaNotAFileException in case, that the requested filename is not a file.
-       * \throws MediaFileNotFoundException in case, that the requested filenamedoes not exists.
-       * \throws MediaWriteException in case, that the file can't be copied from from remote source.
-       * \throws MediaSystemException in case a system operation fails.
-       * \throws MediaException derived exception, depending on the url (handler).
-       */
-
-      void
-      provideFile(MediaAccessId accessId,
-                  const Pathname &filename,
-                  const ByteCount &expectedFileSize) const;
-
-      void
-      provideFile(MediaAccessId   accessId,
-                  const Pathname &filename ) const;
-
-      /**
-       * FIXME: see MediaAccess class.
-       */
-      void
-      provideDir(MediaAccessId   accessId,
-                 const Pathname &dirname) const;
-
-      /**
-       * FIXME: see MediaAccess class.
-       */
-      void
-      provideDirTree(MediaAccessId  accessId,
-                     const Pathname &dirname) const;
-
-      /**
-       * FIXME: see MediaAccess class.
-       */
-      void
-      releaseFile(MediaAccessId   accessId,
-                  const Pathname &filename) const;
-
-      /**
-       * FIXME: see MediaAccess class.
+       * \param accessId Medium id.
+       * \param files List of files that should be precached
        */
-      void
-      releaseDir(MediaAccessId   accessId,
-                 const Pathname &dirname) const;
+    void precacheFiles( MediaAccessId   accessId,
+                       const std::vector<OnMediaLocation> &files);
 
-      /**
-       * FIXME: see MediaAccess class.
-       */
-      void
-      releasePath(MediaAccessId   accessId,
-                  const Pathname &pathname) const;
+  public:
+    /**
+     * Get the modification time of the /etc/mtab file.
+     * \return Modification time of the /etc/mtab file.
+     */
+    static time_t
+    getMountTableMTime();
 
-      /**
-       * FIXME: see MediaAccess class.
-       */
-      void
-      dirInfo(MediaAccessId           accessId,
-              std::list<std::string> &retlist,
-              const Pathname         &dirname,
-              bool                    dots = true) const;
-
-      /**
-       * FIXME: see MediaAccess class.
-       */
-      void
-      dirInfo(MediaAccessId           accessId,
-              filesystem::DirContent &retlist,
-              const Pathname         &dirname,
-              bool                   dots = true) const;
-
-      /**
-       * FIXME: see MediaAccess class.
-       */
-      bool doesFileExist(MediaAccessId  accessId,
-                         const Pathname & filename ) const;
+    /**
+     * Get current mount entries from /etc/mtab file.
+     * \return Current mount entries from /etc/mtab file.
+     */
+    static std::vector<MountEntry>
+    getMountEntries();
 
-      /**
-       * Fill in a vector of detected ejectable devices and the index of the
-       * currently attached device within the vector. The contents of the vector
-       * are the device names (/dev/cdrom and such).
-       *
-       * \param accessId Medium id.
-       * \param devices  vector to load with the device names
-       * \param index    index of the currently used device in the devices vector
-       */
-      void
-      getDetectedDevices(MediaAccessId accessId,
-                         std::vector<std::string> & devices,
-                         unsigned int & index) const;
-
-      void
-      setDeltafile(MediaAccessId   accessId,
-                  const Pathname &filename ) const;
-
-    public:
-      /**
-       * Get the modification time of the /etc/mtab file.
-       * \return Modification time of the /etc/mtab file.
-       */
-      static time_t
-      getMountTableMTime();
+    /**
+     * Check if the specified \p path is useable as
+     * attach point.
+     *
+     * \param path The attach point to check.
+     * \param mtab Whether to check against the mtab, too.
+     * \return True, if it is a directory and there are
+     *         no another attach points bellow of it.
+     */
+    bool
+    isUseableAttachPoint(const Pathname &path,
+                         bool            mtab=true) const;
 
-      /**
-       * Get current mount entries from /etc/mtab file.
-       * \return Current mount entries from /etc/mtab file.
-       */
-      static std::vector<MountEntry>
-      getMountEntries();
+  private:
+    friend class MediaHandler;
 
-      /**
-       * Check if the specified \p path is useable as
-       * attach point.
-       *
-       * \param path The attach point to check.
-       * \param mtab Whether to check against the mtab, too.
-       * \return True, if it is a directory and there are
-       *         no another attach points bellow of it.
-       */
-      bool
-      isUseableAttachPoint(const Pathname &path,
-                           bool            mtab=true) const;
-
-    private:
-      friend class MediaHandler;
-
-      /**
-       * \internal
-       * Return the attached media reference of the specified
-       * media access id. Used to resolve nested attachments
-       * as used in the MediaISO (iso-loop) handler.
-       * Causes temporary creation of a shared attachment
-       * (increases reference counters on attachedMedia).
-       * \param media A media access id.
-       */
-      AttachedMedia
-      getAttachedMedia(MediaAccessId &accessId) const;
-
-      /**
-       * \internal
-       * Called by media handler in while attach() to retrieve
-       * attached media reference matching the specified media
-       * source reference.
-       * Causes temporary creation of a shared attachment
-       * (increases reference counters on attachedMedia).
-       * \param media The media source reference to search for.
-       */
-      AttachedMedia
-      findAttachedMedia(const MediaSourceRef &media) const;
-
-      /**
-       * \internal
-       * Called by media handler in case of relase(eject=true)
-       * to release all access id's using the specified media.
-       * Causes temporary creation of a shared attachment
-       * (increases reference counters on attachedMedia).
-       * \param media The media source reference to release.
-       */
-      void
-      forceReleaseShared(const MediaSourceRef &media);
+    /**
+     * \internal
+     * Return the attached media reference of the specified
+     * media access id. Used to resolve nested attachments
+     * as used in the MediaISO (iso-loop) handler.
+     * Causes temporary creation of a shared attachment
+     * (increases reference counters on attachedMedia).
+     * \param media A media access id.
+     */
+    AttachedMedia
+    getAttachedMedia(MediaAccessId &accessId) const;
 
-    private:
-      /**
-       * Static reference to the implementation (singleton).
-       */
-      static zypp::RW_pointer<MediaManager_Impl> m_impl;
-    };
+    /**
+     * \internal
+     * Called by media handler in while attach() to retrieve
+     * attached media reference matching the specified media
+     * source reference.
+     * Causes temporary creation of a shared attachment
+     * (increases reference counters on attachedMedia).
+     * \param media The media source reference to search for.
+     */
+    AttachedMedia
+    findAttachedMedia(const MediaSourceRef &media) const;
 
+    /**
+     * \internal
+     * Called by media handler in case of relase(eject=true)
+     * to release all access id's using the specified media.
+     * Causes temporary creation of a shared attachment
+     * (increases reference counters on attachedMedia).
+     * \param media The media source reference to release.
+     */
+    void
+    forceReleaseShared(const MediaSourceRef &media);
 
-    //////////////////////////////////////////////////////////////////
-  } // namespace media
-  ////////////////////////////////////////////////////////////////////
+  private:
+    /**
+     * Static reference to the implementation (singleton).
+     */
+    static zypp::RW_pointer<MediaManager_Impl> m_impl;
+  };
 
   ////////////////////////////////////////////////////////////////////
-} // namespace zypp
+} // namespace zypp::media
 //////////////////////////////////////////////////////////////////////
 
 #endif // ZYPP_MEDIA_MEDIAMANAGER_H
index dd2d23e..e1b13db 100644 (file)
@@ -1296,13 +1296,13 @@ int MediaMultiCurl::progressCallback( void *clientp, double dltotal, double dlno
   return MediaCurl::progressCallback(clientp, dltotal, dlnow, ultotal, ulnow);
 }
 
-void MediaMultiCurl::doGetFileCopy( const Pathname & filename , const Pathname & target, callback::SendReport<DownloadProgressReport> & report, const ByteCount &expectedFileSize_r, RequestOptions options ) const
+void MediaMultiCurl::doGetFileCopy( const OnMediaLocation &srcFile , const Pathname & target, callback::SendReport<DownloadProgressReport> & report, RequestOptions options ) const
 {
   Pathname dest = target.absolutename();
   if( assert_dir( dest.dirname() ) )
   {
     DBG << "assert_dir " << dest.dirname() << " failed" << endl;
-    ZYPP_THROW( MediaSystemException(getFileUrl(filename), "System error on " + dest.dirname().asString()) );
+    ZYPP_THROW( MediaSystemException(getFileUrl(srcFile.filename()), "System error on " + dest.dirname().asString()) );
   }
 
   ManagedFile destNew { target.extend( ".new.zypp.XXXXXX" ) };
@@ -1312,7 +1312,7 @@ void MediaMultiCurl::doGetFileCopy( const Pathname & filename , const Pathname &
     if( ! buf )
     {
       ERR << "out of memory for temp file name" << endl;
-      ZYPP_THROW(MediaSystemException(getFileUrl(filename), "out of memory for temp file name"));
+      ZYPP_THROW(MediaSystemException(getFileUrl(srcFile.filename()), "out of memory for temp file name"));
     }
 
     AutoFD tmp_fd { ::mkostemp( buf, O_CLOEXEC ) };
@@ -1353,7 +1353,7 @@ void MediaMultiCurl::doGetFileCopy( const Pathname & filename , const Pathname &
   curl_easy_setopt(_curl, CURLOPT_PRIVATE, (*file) );  // important to pass the FILE* explicitly (passing through varargs)
   try
     {
-      MediaCurl::doGetFileCopyFile(filename, dest, file, report, expectedFileSize_r, options);
+      MediaCurl::doGetFileCopyFile( srcFile, dest, file, report, options );
     }
   catch (Exception &ex)
     {
@@ -1418,7 +1418,7 @@ void MediaMultiCurl::doGetFileCopy( const Pathname & filename , const Pathname &
            * gihub issue libzipp:#277 Multicurl backend breaks with MirrorCache and Metalink with unknown filesize.
            * Fall back to a normal download if we have no knowledge about the filesize we want to download.
            */
-          if ( !bl.haveFilesize() && expectedFileSize_r == 0 ) {
+          if ( !bl.haveFilesize() && ! srcFile.downloadSize() ) {
             XXX << "No filesize in metalink file and no expected filesize, aborting multicurl." << std::endl;
             ZYPP_THROW( MediaException("Multicurl requires filesize but none was provided.") );
           }
@@ -1441,7 +1441,7 @@ void MediaMultiCurl::doGetFileCopy( const Pathname & filename , const Pathname &
              XXX << bl << endl;
              filesystem::unlink(failedFile);
            }
-         Pathname df = deltafile();
+         Pathname df = srcFile.deltafile();
          if (!df.empty())
            {
              XXX << "reusing blocks from file " << df << endl;
@@ -1450,7 +1450,7 @@ void MediaMultiCurl::doGetFileCopy( const Pathname & filename , const Pathname &
            }
          try
            {
-             multifetch(filename, file, &urls, &report, &bl, expectedFileSize_r);
+             multifetch(srcFile.filename(), file, &urls, &report, &bl, srcFile.downloadSize());
            }
          catch (MediaCurlException &ex)
            {
@@ -1477,7 +1477,7 @@ void MediaMultiCurl::doGetFileCopy( const Pathname & filename , const Pathname &
          file = fopen((*destNew).c_str(), "w+e");
          if (!file)
            ZYPP_THROW(MediaWriteException(destNew));
-         MediaCurl::doGetFileCopyFile(filename, dest, file, report, expectedFileSize_r, options | OPTION_NO_REPORT_START);
+         MediaCurl::doGetFileCopyFile(srcFile, dest, file, report, options | OPTION_NO_REPORT_START);
        }
     }
 
index a87d389..1c158ad 100644 (file)
@@ -45,7 +45,7 @@ public:
   MediaMultiCurl(const Url &url_r, const Pathname & attach_point_hint_r);
   ~MediaMultiCurl() override;
 
-  virtual void doGetFileCopy( const Pathname & srcFilename, const Pathname & targetFilename, callback::SendReport<DownloadProgressReport> & _report, const ByteCount &expectedFileSize_r, RequestOptions options = OPTION_NONE ) const override;
+  virtual void doGetFileCopy( const OnMediaLocation & srcFile, const Pathname & targetFilename, callback::SendReport<DownloadProgressReport> & _report, RequestOptions options = OPTION_NONE ) const override;
 
   void multifetch(const Pathname &filename, FILE *fp, std::vector<Url> *urllist, callback::SendReport<DownloadProgressReport> *report = 0, MediaBlockList *blklist = 0, off_t filesize = off_t(-1)) const;
   /** \overload translating ByteCount(0) into off_t(-1)
index fa6720c..117d60c 100644 (file)
@@ -206,9 +206,9 @@ namespace zypp {
     //
     // DESCRIPTION : Asserted that media is attached.
     //
-    void MediaNFS::getFile (const Pathname & filename, const ByteCount &expectedFileSize_r) const
+    void MediaNFS::getFile (const OnMediaLocation &file ) const
     {
-      MediaHandler::getFile( filename, expectedFileSize_r );
+      MediaHandler::getFile( file );
     }
 
     ///////////////////////////////////////////////////////////////////
index 781d773..6b704ea 100644 (file)
@@ -40,7 +40,7 @@ namespace zypp {
        virtual void attachTo (bool next = false) override;
 
         virtual void releaseFrom( const std::string & ejectDev ) override;
-       virtual void getFile( const Pathname & filename, const ByteCount &expectedFileSize_r ) const override;
+       virtual void getFile( const OnMediaLocation & file ) const override;
        virtual void getDir( const Pathname & dirname, bool recurse_r ) const override;
         virtual void getDirInfo( std::list<std::string> & retlist,
                                  const Pathname & dirname, bool dots = true ) const override;
diff --git a/zypp/media/MediaNetworkCommonHandler.h b/zypp/media/MediaNetworkCommonHandler.h
new file mode 100644 (file)
index 0000000..810aded
--- /dev/null
@@ -0,0 +1,52 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/media/MediaNetworkCommonHandler.h
+ */
+#ifndef ZYPP_MEDIA_MEDIANETWORKCOMMONHANDLER_H
+#define ZYPP_MEDIA_MEDIANETWORKCOMMONHANDLER_H
+
+#include <zypp/media/MediaHandler.h>
+#include <zypp/media/TransferSettings.h>
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{
+  ///////////////////////////////////////////////////////////////////
+  namespace media
+  {
+    ///////////////////////////////////////////////////////////////////
+    /// \class MediaNetworkCommonHandler
+    /// \brief Common baseclass for MediaCurl and MediaNetwork
+    ///
+    /// Access to commonly used stuff like \ref TransferSettings mainly
+    //  to avoid duplicated code.
+    ///////////////////////////////////////////////////////////////////
+    class MediaNetworkCommonHandler : public MediaHandler
+    {
+    public:
+      MediaNetworkCommonHandler( const Url &      url_r,
+                                const Pathname & attach_point_r,
+                                const Pathname & urlpath_below_attachpoint_r,
+                                const bool       does_download_r )
+      : MediaHandler( url_r, attach_point_r, urlpath_below_attachpoint_r, does_download_r )
+      {}
+
+    public:
+      TransferSettings & settings()
+      { return _settings; }
+
+    protected:
+      mutable TransferSettings _settings;
+    };
+
+  } // namespace media
+  ///////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_MEDIA_MEDIANETWORKCOMMONHANDLER_H
index 493d47f..48ba094 100644 (file)
@@ -39,7 +39,7 @@ namespace zypp
     void MediaPlugin::releaseFrom( const std::string & ejectDev_r )
     {}
 
-    void MediaPlugin::getFile(const Pathname & filename_r , const ByteCount & expectedFileSize_r) const
+    void MediaPlugin::getFile( const OnMediaLocation &file ) const
     {}
 
     void MediaPlugin::getDir( const Pathname & dirname_r, bool recurse_r ) const
index e0ad0fc..22c130c 100644 (file)
@@ -36,7 +36,7 @@ namespace zypp
       protected:
        virtual void attachTo( bool next_r = false ) override;
        virtual void releaseFrom( const std::string & ejectDev_r ) override;
-       virtual void getFile( const Pathname & filename_r, const ByteCount &expectedFileSize_r ) const override;
+       virtual void getFile( const OnMediaLocation & file ) const override;
        virtual void getDir( const Pathname & dirname_r, bool recurse_r ) const override;
        virtual void getDirInfo( std::list<std::string> & retlist_r, const Pathname & dirname_r, bool dots_r = true ) const override;
        virtual void getDirInfo( filesystem::DirContent & retlist_r, const Pathname & dirname_r, bool dots_r = true ) const override;
index 0c62d96..a03a84c 100644 (file)
@@ -26,7 +26,7 @@ namespace zypp {
 
 
 AuthData::AuthData(const Url & url)
-  : _url(url)
+      : _url(url), _lastChange(0)
 {
   _username = url.getUsername();
   _password = url.getPassword();
@@ -38,6 +38,16 @@ bool AuthData::valid() const
   return username().size() && password().size();
 }
 
+time_t AuthData::lastDatabaseUpdate() const
+{
+  return _lastChange;
+}
+
+void AuthData::setLastDatabaseUpdate( time_t time )
+{
+  _lastChange = time;
+}
+
 std::ostream & AuthData::dumpOn( std::ostream & str ) const
 {
   if (_url.isValid())
index f1a338d..c15ab92 100644 (file)
@@ -36,7 +36,7 @@ public:
   AuthData(const Url & url);
 
   AuthData(const std::string & username, const std::string & password)
-    : _username(username), _password(password)
+    : _username(username), _password(password), _lastChange(0)
   {}
 
   virtual ~AuthData() {};
@@ -56,6 +56,13 @@ public:
   std::string username() const { return _username; }
   std::string password() const { return _password; }
 
+  /*!
+   * Returns the timestamp of the last change to the database this
+   * credential is stored in, or 0 if its not known.
+   */
+  time_t lastDatabaseUpdate () const;
+  void setLastDatabaseUpdate ( time_t time );
+
   virtual std::ostream & dumpOn( std::ostream & str ) const;
 
   virtual std::ostream & dumpAsIniOn( std::ostream & str ) const;
@@ -64,6 +71,7 @@ private:
   Url _url;
   std::string _username;
   std::string _password;
+  time_t _lastChange; //< timestamp of the last change to the database this credential is stored in
 };
 
 typedef shared_ptr<AuthData> AuthData_Ptr;
index 539b2a9..162a833 100644 (file)
 
 #include <zypp/media/MetaLinkParser.h>
 #include <zypp/base/Logger.h>
+#include <zypp/ByteArray.h>
+#include <zypp/AutoDispose.h>
 
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
+#include <stack>
 #include <vector>
 #include <algorithm>
-#include <iostream>
-#include <fstream>
 
 #include <libxml2/libxml/SAX2.h>
 
 using namespace zypp::base;
 
-namespace zypp {
-  namespace media {
-
-enum state {
-  STATE_START,
-  STATE_METALINK,
-  STATE_FILES,
-  STATE_FILE,
-  STATE_M4FILE,
-  STATE_SIZE,
-  STATE_M4SIZE,
-  STATE_VERIFICATION,
-  STATE_HASH,
-  STATE_M4HASH,
-  STATE_PIECES,
-  STATE_M4PIECES,
-  STATE_PHASH,
-  STATE_M4PHASH,
-  STATE_RESOURCES,
-  STATE_URL,
-  STATE_M4URL,
-  NUMSTATES
-};
-
-struct stateswitch {
-  enum state from;
-  std::string ename;
-  enum state to;
-  int docontent;
-};
-
-static struct stateswitch stateswitches[] = {
-  { STATE_START,        "metalink",     STATE_METALINK, 0 },
-  { STATE_METALINK,     "files",        STATE_FILES, 0 },
-  { STATE_METALINK,     "file",         STATE_M4FILE, 0 },
-  { STATE_FILES,        "file",         STATE_FILE, 0 },
-  { STATE_FILE,         "size",         STATE_SIZE, 1 },
-  { STATE_FILE,         "verification", STATE_VERIFICATION, 0 },
-  { STATE_FILE,         "resources",    STATE_RESOURCES, 0 },
-  { STATE_VERIFICATION, "hash",         STATE_HASH, 1 },
-  { STATE_VERIFICATION, "pieces",       STATE_PIECES, 0 },
-  { STATE_PIECES,       "hash",         STATE_PHASH, 1 },
-  { STATE_RESOURCES,    "url",          STATE_URL, 1 },
-  { STATE_M4FILE,       "size",         STATE_M4SIZE, 1 },
-  { STATE_M4FILE,       "hash",         STATE_M4HASH, 1},
-  { STATE_M4FILE,       "url",          STATE_M4URL, 1},
-  { STATE_M4FILE,       "pieces",       STATE_M4PIECES, 0},
-  { STATE_M4PIECES,     "hash",         STATE_M4PHASH, 1 },
-  { NUMSTATES }
-};
-
-struct ml_url {
-  ml_url()
-    : priority( 0 )
-  {}
-  int priority;
-  std::string url;
-};
+namespace zypp::media {
+  enum ParserState {
+    STATE_START,
+    STATE_METALINK,
+    STATE_FILES,
+    STATE_FILE,
+    STATE_M4FILE,
+    STATE_SIZE,
+    STATE_M4SIZE,
+    STATE_VERIFICATION,
+    STATE_HASH,
+    STATE_M4HASH,
+    STATE_PIECES,
+    STATE_M4PIECES,
+    STATE_PHASH,
+    STATE_M4PHASH,
+    STATE_RESOURCES,
+    STATE_URL,
+    STATE_M4URL,
+    NUMSTATES
+  };
+
+  struct transition {
+    std::string elementName; //< Name of the element for the transition to trigger
+    ParserState transitionTo; //< The state we go into when the element name in \a elementName is encountered
+    int docontent;   //< Store the content of the element in the \a content member
+  };
+
+  /*!
+   * Returns a map of all state transitions that are supported.
+   * Key of the map is the current state, the value is a list of all supported transitions
+   * of the the current state.
+   */
+  const std::unordered_map<ParserState, std::vector<transition> > & transitions () {
+    static std::unordered_map<ParserState, std::vector<transition> > map {
+      { STATE_START, {
+          { "metalink", STATE_METALINK, 0},
+          }
+        },
+      { STATE_METALINK, {
+          { "files", STATE_FILES, 0 },
+          { "file", STATE_M4FILE, 0 },
+          }
+        },
+      { STATE_FILES, {
+          { "file", STATE_FILE, 0},
+          }
+        },
+      { STATE_FILE, {
+          { "size",         STATE_SIZE, 1 },
+          { "verification", STATE_VERIFICATION, 0 },
+          { "resources",    STATE_RESOURCES, 0 },
+          }
+        },
+      { STATE_VERIFICATION, {
+          { "hash",         STATE_HASH, 1 },
+          { "pieces",       STATE_PIECES, 0 },
+          }
+        },
+      { STATE_PIECES, {
+          { "hash",         STATE_PHASH, 1 },
+          }
+        },
+      { STATE_RESOURCES, {
+          { "url",          STATE_URL, 1 },
+          }
+        },
+      { STATE_M4FILE, {
+          { "size",         STATE_M4SIZE, 1 },
+          { "hash",         STATE_M4HASH, 1},
+          { "url",          STATE_M4URL, 1},
+          { "pieces",       STATE_M4PIECES, 0},
+          }
+        },
+      { STATE_M4PIECES, {
+          { "hash",         STATE_M4PHASH, 1 },
+          }
+        },
+      };
+
+    return map;
+  }
 
 static void XMLCALL startElement(void *userData, const xmlChar *name, const xmlChar **atts);
 static void XMLCALL endElement(void *userData, const xmlChar *name);
@@ -93,34 +113,17 @@ static void XMLCALL characterData(void *userData, const xmlChar *s, int len);
 struct ml_parsedata : private zypp::base::NonCopyable {
   ml_parsedata()
     : parser( nullptr )
-    , depth( 0 )
     , state( STATE_START )
+    , depth( 0 )
     , statedepth( 0 )
-    , content( reinterpret_cast<char *>(malloc(256)) )
-    , lcontent( 0 )
-    , acontent( 256 )
     , docontent( 0 )
-    , called( 0 )
     , gotfile( 0 )
     , size( -1 )
-    , nurls( 0 )
     , blksize( 0 )
-    , npiece( 0 )
     , piecel( 0 )
-    , nsha1( 0 )
-    , nzsync( 0 )
     , chksuml( 0 )
   {
-    struct stateswitch *sw;
-    int i;
-    memset( swtab, 0, sizeof(swtab) );
-    memset( sbtab, 0, sizeof(sbtab) );
-    for (i = 0, sw = stateswitches; sw->from != NUMSTATES; i++, sw++)
-    {
-      if (!swtab[sw->from])
-       swtab[sw->from] = sw;
-      sbtab[sw->to] = sw->from;
-    }
+    content.reserve( 256 );
 
     xmlSAXHandler sax;
     memset(&sax, 0, sizeof(sax));
@@ -129,54 +132,65 @@ struct ml_parsedata : private zypp::base::NonCopyable {
     sax.characters = characterData;
 
     //internally creates a copy of xmlSaxHandler, so having it as local variable is save
-    parser = xmlCreatePushParserCtxt(&sax, this, NULL, 0, NULL);
+    parser = AutoDispose<xmlParserCtxtPtr>( xmlCreatePushParserCtxt(&sax, this, NULL, 0, NULL), xmlFreeParserCtxt );
   }
 
-  ~ml_parsedata()
-  {
-    if (parser) {
-      xmlFreeParserCtxt(parser);
-      parser = nullptr;
-    }
-    free(content);
+  void doTransition ( const transition &t ) {
+    parentStates.push( state );
+    state = t.transitionTo;
+    docontent = t.docontent;
+    statedepth = depth;
+    content.clear();
   }
 
-  xmlParserCtxtPtr parser;
-  int depth;
-  enum state state;
+  void popState () {
+    state = parentStates.top();
+    statedepth--;
+    parentStates.pop();
+
+  }
+
+  AutoDispose<xmlParserCtxtPtr> parser;
+
+  ParserState state;  //< current state as defined in \ref stateswitch
+  std::stack<ParserState> parentStates;
+
+  int depth;         //< current element depth of traversing the document elements
+
+  /*!
+   * Current element depts expected by the current state,
+   * if depth != statedepth we ignore all elements and just increase and decrease depth until they match again.
+   * This is basically a helper variable that allows us to ignore elements we do not care about
+   */
   int statedepth;
-  char *content;
-  int lcontent;
-  int acontent;
-  int docontent;
-  struct stateswitch *swtab[NUMSTATES];
-  enum state sbtab[NUMSTATES];
-
-  int called;
+
+  std::string content; //< content of the current element
+  int docontent;     //< should the content of the current elem be parsed
+
   int gotfile;
   off_t size;
-  std::vector<struct ml_url> urls;
-  int nurls;
+  std::vector<MetalinkMirror> urls;
   size_t blksize;
 
-  std::vector<unsigned char> piece;
-  int npiece;
+  std::vector<UByteArray> piece;
   int piecel;
 
-  std::vector<unsigned char> sha1;
-  int nsha1;
-  std::vector<unsigned char> zsync;
-  int nzsync;
+  std::vector<UByteArray> sha1;
+  std::vector<UByteArray> zsync;
 
-  std::vector<unsigned char> chksum;
+  UByteArray chksum;
   int chksuml;
 };
 
+/**
+ * Look up a xml attribute in the passed array \a atts.
+ * Returns a pointer to the value of the attribute if one is found, otherwise nullptr.
+ */
 static const char *
 find_attr(const char *txt, const xmlChar **atts)
 {
   if(!atts) {
-    return 0;
+    return nullptr;
   }
 
   for (; *atts; atts += 2)
@@ -184,51 +198,64 @@ find_attr(const char *txt, const xmlChar **atts)
       if (!strcmp(reinterpret_cast<const char*>(*atts), txt))
         return reinterpret_cast<const char*>(atts[1]);
     }
-  return 0;
+  return nullptr;
 }
 
 static void XMLCALL
 startElement(void *userData, const xmlChar *name, const xmlChar **atts)
 {
   struct ml_parsedata *pd = reinterpret_cast<struct ml_parsedata *>(userData);
-  struct stateswitch *sw;
-  if (pd->depth != pd->statedepth)
-    {
-      pd->depth++;
-      return;
-    }
+
+  // if the current element depth does not match the expected depth for the current state we
+  // ignore the element and just increase the depth
+  if (pd->depth != pd->statedepth) {
+    pd->depth++;
+    return;
+  }
   pd->depth++;
-  if (!pd->swtab[pd->state])
+
+  const auto &trMap = transitions();
+  const auto currStateTrs = trMap.find( pd->state );
+  if ( currStateTrs == trMap.end() )
     return;
-  for (sw = pd->swtab[pd->state]; sw->from == pd->state; sw++)  /* find name in statetable */
-    if (sw->ename == reinterpret_cast<const char *>(name))
-      break;
-  if (sw->from != pd->state)
+
+  // check if the current element name is part of our transitions
+  auto foundTr = std::find_if( currStateTrs->second.begin(), currStateTrs->second.end(), [name]( const auto &tr ){
+    return tr.elementName == reinterpret_cast<const char *>(name);
+  });
+
+  if ( foundTr == currStateTrs->second.end() ) {
+    // we found no possible transition, ignore
     return;
-  if ((sw->to == STATE_FILE || sw->to == STATE_M4FILE) && pd->gotfile++)
+  }
+
+  if ( ( foundTr->transitionTo == STATE_FILE || foundTr->transitionTo == STATE_M4FILE )  && pd->gotfile++)
     return;    /* ignore all but the first file */
-  //printf("start depth %d name %s\n", pd->depth, name);
-  pd->state = sw->to;
-  pd->docontent = sw->docontent;
-  pd->statedepth = pd->depth;
-  pd->lcontent = 0;
-  *pd->content = 0;
+
+  // advance the state machine and prepare variables for the new state
+  pd->doTransition( *foundTr );
+
   switch(pd->state)
     {
     case STATE_URL:
     case STATE_M4URL:
       {
-       const char *priority = find_attr("priority", atts);
-       const char *preference = find_attr("preference", atts);
+       const char *priority       = find_attr("priority", atts);
+       const char *preference     = find_attr("preference", atts);
+        const char *maxconnections = find_attr("maxconnections", atts);
        int prio;
-        pd->urls.push_back(ml_url());
+        auto &mirr = pd->urls.emplace_back();
         if (priority)
-         prio = atoi(priority);
+         prio = str::strtonum<int>(priority);
        else if (preference)
-         prio = 101 - atoi(preference);
+          prio = 101 - str::strtonum<int>(preference);
        else
          prio = 999999;
-       pd->urls.back().priority = prio;
+        mirr.priority = prio;
+
+        if ( maxconnections )
+          mirr.maxConnections = str::strtonum<int>( maxconnections );
+
        break;
       }
     case STATE_PIECES:
@@ -240,19 +267,16 @@ startElement(void *userData, const xmlChar *name, const xmlChar **atts)
 
        if (!type || !length)
          {
-           pd->state = pd->sbtab[pd->state];
-           pd->statedepth--;
+            pd->popState();
            break;
          }
-       blksize = strtoul(length, 0, 10);
+       blksize = str::strtonum<unsigned long>(length);
        if (!blksize || (pd->blksize && pd->blksize != blksize))
          {
-           pd->state = pd->sbtab[pd->state];
-           pd->statedepth--;
+           pd->popState();
            break;
          }
        pd->blksize = blksize;
-       pd->npiece = 0;
         pd->piece.clear();
        if (!strcmp(type, "sha1") || !strcmp(type, "sha-1"))
          pd->piecel = 20;
@@ -260,8 +284,7 @@ startElement(void *userData, const xmlChar *name, const xmlChar **atts)
          pd->piecel = 4;
        else
          {
-           pd->state = pd->sbtab[pd->state];
-           pd->statedepth--;
+           pd->popState();
            break;
          }
        break;
@@ -278,8 +301,7 @@ startElement(void *userData, const xmlChar *name, const xmlChar **atts)
          pd->chksuml = 32;
        else
          {
-           pd->state = pd->sbtab[pd->state];
-           pd->statedepth--;
+           pd->popState();
            pd->docontent = 0;
          }
        break;
@@ -288,10 +310,9 @@ startElement(void *userData, const xmlChar *name, const xmlChar **atts)
     case STATE_M4PHASH:
       {
        const char *piece = find_attr("piece", atts);
-       if (pd->state == STATE_PHASH && (!piece || atoi(piece) != pd->npiece))
+        if ( pd->state == STATE_PHASH && (!piece || str::strtonum<uint>(piece) != pd->piece.size()) )
          {
-           pd->state = pd->sbtab[pd->state];
-           pd->statedepth--;
+           pd->popState();
          }
         break;
       }
@@ -300,98 +321,71 @@ startElement(void *userData, const xmlChar *name, const xmlChar **atts)
     }
 }
 
-static int
-hexstr2bytes(unsigned char *buf, const char *str, int buflen)
+UByteArray hexstr2bytes( std::string str )
 {
-  int i;
-  for (i = 0; i < buflen; i++)
-    {
-#define c2h(c) (((c)>='0' && (c)<='9') ? ((c)-'0')              \
-                : ((c)>='a' && (c)<='f') ? ((c)-('a'-10))       \
-                : ((c)>='A' && (c)<='F') ? ((c)-('A'-10))       \
-                : -1)
-      int v = c2h(*str);
-      str++;
-      if (v < 0)
-        return 0;
-      buf[i] = v;
-      v = c2h(*str);
-      str++;
-      if (v < 0)
-        return 0;
-      buf[i] = (buf[i] << 4) | v;
-#undef c2h
-    }
-  return buflen;
+  return Digest::hexStringToUByteArray( str );
 }
 
 static void XMLCALL
-endElement(void *userData, const xmlChar *name)
+endElement(void *userData, const xmlChar *)
 {
   struct ml_parsedata *pd = reinterpret_cast<struct ml_parsedata *>(userData);
-  // printf("end depth %d-%d name %s\n", pd->depth, pd->statedepth, name);
+  //printf("end depth %d-%d name %s\n", pd->depth, pd->statedepth, name);
   if (pd->depth != pd->statedepth)
     {
       pd->depth--;
       return;
     }
-  pd->depth--;
-  pd->statedepth--;
   switch (pd->state)
     {
     case STATE_SIZE:
     case STATE_M4SIZE:
-      pd->size = (off_t)strtoull(pd->content, 0, 10);
+      pd->size = (off_t)str::strtonum<off_t>(pd->content); //strtoull(pd->content, 0, 10);
       break;
     case STATE_HASH:
     case STATE_M4HASH:
       pd->chksum.clear();
-      pd->chksum.resize(pd->chksuml, 0);
-      if (strlen(pd->content) != size_t(pd->chksuml) * 2 || !hexstr2bytes(&pd->chksum[0], pd->content, pd->chksuml))
+      pd->chksum = hexstr2bytes( pd->content );
+      if ( pd->content.length() != size_t(pd->chksuml) * 2 || !pd->chksum.size() )
        {
          pd->chksum.clear();
           pd->chksuml = 0;
        }
       break;
     case STATE_PHASH:
-    case STATE_M4PHASH:
-      if (strlen(pd->content) != size_t(pd->piecel) * 2)
+    case STATE_M4PHASH: {
+      if ( pd->content.length() != size_t(pd->piecel) * 2 )
        break;
-      pd->piece.resize(pd->piecel * (pd->npiece + 1), 0);
-      if (!hexstr2bytes(&pd->piece[pd->piecel * pd->npiece], pd->content, pd->piecel))
-       {
-         pd->piece.resize(pd->piecel * pd->npiece, 0);
-         break;
-       }
-      pd->npiece++;
+      UByteArray pieceHash = hexstr2bytes( pd->content );
+      if ( !pieceHash.size() )
+        pieceHash.resize( pd->piecel, 0 );
+      pd->piece.push_back( pieceHash );
       break;
+    }
     case STATE_PIECES:
     case STATE_M4PIECES:
       if (pd->piecel == 4)
-       {
-         pd->zsync = pd->piece;
-         pd->nzsync = pd->npiece;
-       }
+       pd->zsync = pd->piece;
       else
-       {
-         pd->sha1 = pd->piece;
-         pd->nsha1 = pd->npiece;
-       }
-      pd->piecel = pd->npiece = 0;
+        pd->sha1 = pd->piece;
+
+      pd->piecel = 0;
       pd->piece.clear();
       break;
     case STATE_URL:
     case STATE_M4URL:
-      if (*pd->content)
-       {
-         pd->urls[pd->nurls].url = std::string(pd->content);
-         pd->nurls++;
-       }
+      if ( pd->content.length() )
+        pd->urls.back().url =   std::string(pd->content);
+      else
+        // without a actual URL the mirror is useless
+        pd->urls.pop_back();
       break;
     default:
       break;
     }
-  pd->state = pd->sbtab[pd->state];
+
+  pd->depth--;
+  pd->popState();
   pd->docontent = 0;
 }
 
@@ -399,21 +393,12 @@ static void XMLCALL
 characterData(void *userData, const xmlChar *s, int len)
 {
   struct ml_parsedata *pd = reinterpret_cast<struct ml_parsedata *>(userData);
-  int l;
-  char *c;
   if (!pd->docontent)
     return;
-  l = pd->lcontent + len + 1;
-  if (l > pd->acontent)
-    {
-      pd->content = reinterpret_cast<char *>(realloc(pd->content, l + 256));
-      pd->acontent = l + 256;
-    }
-  c = pd->content + pd->lcontent;
-  pd->lcontent += len;
-  while (len-- > 0)
-    *c++ = *s++;
-  *c = 0;
+
+  if ( pd->content.length() + len + 1 > pd->content.capacity() )
+    pd->content.reserve( pd->content.capacity() + 256 );
+  pd->content.append( s, s+len );
 }
 
 
@@ -457,46 +442,46 @@ MetaLinkParser::parseBytes(const char *buf, size_t len)
   }
 }
 
-static bool urlcmp(const ml_url &a, const ml_url &b)
-{
-  return a.priority < b.priority;
-}
-
 void
 MetaLinkParser::parseEnd()
 {
   if (xmlParseChunk(pd->parser, NULL, 0, 1)) {
     ZYPP_THROW(Exception("Parse Error"));
   }
-  if (pd->nurls)
-    stable_sort(pd->urls.begin(), pd->urls.end(), urlcmp);
+  if (pd->urls.size() ) {
+    stable_sort(pd->urls.begin(), pd->urls.end(), []( const auto &a, const auto &b ){
+      return a.priority < b.priority;
+    });
+  }
 }
 
 std::vector<Url>
-MetaLinkParser::getUrls()
+MetaLinkParser::getUrls() const
 {
   std::vector<Url> urls;
-  int i;
-  for (i = 0; i < pd->nurls; ++i)
-    urls.push_back(Url(pd->urls[i].url));
+  for ( const auto &mirr : pd->urls )
+    urls.push_back( mirr.url );
   return urls;
 }
 
-MediaBlockList
-MetaLinkParser::getBlockList()
+const std::vector<MetalinkMirror> &MetaLinkParser::getMirrors() const
+{
+  return pd->urls;
+}
+
+MediaBlockList MetaLinkParser::getBlockList() const
 {
-  size_t i;
   MediaBlockList bl(pd->size);
   if (pd->chksuml == 20)
-    bl.setFileChecksum("SHA1", pd->chksuml, &pd->chksum[0]);
+    bl.setFileChecksum("SHA1", pd->chksuml, pd->chksum.data() );
   else if (pd->chksuml == 32)
-    bl.setFileChecksum("SHA256", pd->chksuml, &pd->chksum[0]);
+    bl.setFileChecksum("SHA256", pd->chksuml, pd->chksum.data());
   if (pd->size != off_t(-1) && pd->blksize)
     {
       size_t nb = (pd->size + pd->blksize - 1) / pd->blksize;
       off_t off = 0;
       size_t size = pd->blksize;
-      for (i = 0; i < nb; i++)
+      for ( size_t i = 0; i < nb; i++ )
        {
          if (i == nb - 1)
            {
@@ -505,12 +490,12 @@ MetaLinkParser::getBlockList()
                size = pd->blksize;
            }
           size_t blkno = bl.addBlock(off, size);
-          if (int(i) < pd->nsha1)
+          if ( i < pd->sha1.size())
            {
-             bl.setChecksum(blkno, "SHA1", 20, &pd->sha1[20 * i]);
-             if (int(i) < pd->nzsync)
+             bl.setChecksum(blkno, "SHA1", 20, pd->sha1[i].data());
+              if ( i < pd->zsync.size())
                {
-                 unsigned char *p = &pd->zsync[4 * i];
+                 unsigned char *p = pd->zsync[i].data();
                  bl.setRsum(blkno, 4, p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24, pd->blksize);
                }
            }
@@ -520,6 +505,14 @@ MetaLinkParser::getBlockList()
   return bl;
 }
 
-  } // namespace media
-} // namespace zypp
+const std::vector<UByteArray> &MetaLinkParser::getZsyncBlockHashes() const
+{
+  return pd->zsync;
+}
+
+const std::vector<UByteArray> &MetaLinkParser::getSHA1BlockHashes() const
+{
+  return pd->sha1;
+}
 
+} // namespace zypp::media
index 78ebcff..1c0ab04 100644 (file)
 #include <zypp/base/InputStream.h>
 #include <zypp/media/MediaBlockList.h>
 #include <zypp/Url.h>
+#include <zypp/ByteArray.h>
 
-namespace zypp {
-  namespace media {
+namespace zypp::media {
 
 struct ml_parsedata;
 
+struct MetalinkMirror {
+  int priority = 0;
+  int maxConnections = -1; //< How many connections can be opened to that mirror, -1 means no limit was defined.
+  Url url;
+};
+
 class MetaLinkParser : private zypp::base::NonCopyable {
 public:
   MetaLinkParser();
@@ -56,17 +62,27 @@ public:
   /**
    * return the download urls from the parsed metalink data
    **/
-  std::vector<Url> getUrls();
+  std::vector<Url> getUrls() const;
+
+  /**
+   * return the mirrors from the parsed metalink data
+   */
+  const std::vector<MetalinkMirror> &getMirrors() const;
+
   /**
    * return the block list from the parsed metalink data
    **/
-  MediaBlockList getBlockList();
+  MediaBlockList getBlockList() const;
+
+  const std::vector<UByteArray> &getZsyncBlockHashes() const;
+  const std::vector<UByteArray> &getSHA1BlockHashes() const;
 
 private:
   struct ml_parsedata *pd;
 };
 
-  } // namespace media
-} // namespace zypp
+UByteArray hexstr2bytes( std::string str );
+
+} // namespace zypp::media
 
 #endif // ZYPP_MEDIA_METALINKPARSER_H
index 5247b55..edf457b 100644 (file)
@@ -10,6 +10,8 @@
 #include <zypp/media/TransferSettings.h>
 #include <zypp/ZConfig.h>
 
+#include <zypp-proto/transfersettings.pb.h>
+
 using std::endl;
 
 #define CURL_BINARY "/usr/bin/curl"
@@ -21,19 +23,19 @@ namespace zypp
     class TransferSettings::Impl
     {
     public:
-      Impl()
-      : _useproxy(false)
-      , _timeout( ZConfig::instance().download_transfer_timeout() )
-      , _connect_timeout( 60 )
-      , _maxConcurrentConnections(ZConfig::instance().download_max_concurrent_connections())
-      , _minDownloadSpeed(ZConfig::instance().download_min_download_speed())
-      , _maxDownloadSpeed(ZConfig::instance().download_max_download_speed())
-      , _maxSilentTries(ZConfig::instance().download_max_silent_tries())
-      , _verify_host(false)
-      , _verify_peer(false)
-      , _ca_path("/etc/ssl/certs")
-      , _head_requests_allowed(true)
-      {}
+      Impl() {
+        _settingsObj.set_useproxy( false );
+        _settingsObj.set_timeout( ZConfig::instance().download_transfer_timeout() );
+        _settingsObj.set_connect_timeout( 60 );
+        _settingsObj.set_maxconcurrentconnections( ZConfig::instance().download_max_concurrent_connections() );
+        _settingsObj.set_mindownloadspeed(ZConfig::instance().download_min_download_speed());
+        _settingsObj.set_maxdownloadspeed(ZConfig::instance().download_max_download_speed());
+        _settingsObj.set_maxsilenttries(ZConfig::instance().download_max_silent_tries() );
+        _settingsObj.set_verify_host(false);
+        _settingsObj.set_verify_peer(false);
+        _settingsObj.set_ca_path("/etc/ssl/certs");
+        _settingsObj.set_head_requests_allowed(true);
+      }
 
       virtual ~Impl()
       {}
@@ -53,70 +55,54 @@ namespace zypp
 
     public:
       std::vector<std::string> _headers;
-      std::string _useragent;
-      std::string _username;
-      std::string _password;
-      bool _useproxy;
-      std::string _proxy;
-      std::string _proxy_username;
-      std::string _proxy_password;
-      std::string _authtype;
-      long _timeout;
-      long _connect_timeout;
-      Url _url;
-      Pathname _targetdir;
-
-      long _maxConcurrentConnections;
-      long _minDownloadSpeed;
-      long _maxDownloadSpeed;
-      long _maxSilentTries;
-
-      bool _verify_host;
-      bool _verify_peer;
-      Pathname _ca_path;
-      Pathname _client_cert_path;
-      Pathname _client_key_path;
-
-      // workarounds
-      bool _head_requests_allowed;
+      zypp::proto::TransferSettings _settingsObj;
     };
 
     TransferSettings::TransferSettings()
     : _impl(new TransferSettings::Impl())
     {}
 
+    TransferSettings::TransferSettings( const proto::TransferSettings &settings )
+      : _impl(new TransferSettings::Impl())
+    {
+      _impl->_settingsObj = settings;
+    }
+
     void TransferSettings::reset()
     { _impl.reset(new TransferSettings::Impl()); }
 
 
     void TransferSettings::addHeader( std::string && val_r )
-    { if ( ! val_r.empty() ) _impl->_headers.push_back( std::move(val_r) ); }
-
-    TransferSettings::Headers::const_iterator TransferSettings::headersBegin() const
-    { return _impl->_headers.begin(); }
-
-    TransferSettings::Headers::const_iterator TransferSettings::headersEnd() const
-    { return _impl->_headers.end(); }
+    { if ( ! val_r.empty() ) *_impl->_settingsObj.add_header() = std::move(val_r); }
 
+    TransferSettings::Headers TransferSettings::headers() const
+    {
+      //@TODO check if we could use a vector of std::string_view here
+      auto vec = Headers();
+      for ( const auto &head : _impl->_settingsObj.header() ) {
+        vec.push_back( head );
+      }
+      return vec;
+    }
 
     void TransferSettings::setUserAgentString( std::string && val_r )
-    { _impl->_useragent = std::move(val_r); }
+    { _impl->_settingsObj.set_useragent( std::move(val_r) ); }
 
     std::string TransferSettings::userAgentString() const
-    { return _impl->_useragent; }
+    { return _impl->_settingsObj.useragent(); }
 
 
     void TransferSettings::setUsername( std::string && val_r )
-    { _impl->_username = std::move(val_r); }
+    { _impl->_settingsObj.set_username( std::move(val_r) ); }
 
     std::string TransferSettings::username() const
-    { return _impl->_username; }
+    { return _impl->_settingsObj.username(); }
 
     void TransferSettings::setPassword( std::string && val_r )
-    { _impl->_password = std::move(val_r); }
+    { _impl->_settingsObj.set_password( std::move(val_r) ); }
 
     std::string TransferSettings::password() const
-    { return _impl->_password; }
+    { return _impl->_settingsObj.password(); }
 
     std::string TransferSettings::userPassword() const
     {
@@ -135,30 +121,30 @@ namespace zypp
 
 
     void TransferSettings::setProxyEnabled( bool enabled )
-    { _impl->_useproxy = enabled; }
+    { _impl->_settingsObj.set_useproxy( enabled ); }
 
     bool TransferSettings::proxyEnabled() const
-    { return _impl->_useproxy; }
+    { return _impl->_settingsObj.useproxy(); }
 
 
     void TransferSettings::setProxy( std::string && val_r )
-    { _impl->_proxy = std::move(val_r); }
+    { _impl->_settingsObj.set_proxy( std::move(val_r) ); }
 
     std::string TransferSettings::proxy() const
-    { return _impl->_proxy; }
+    { return _impl->_settingsObj.proxy(); }
 
 
     void TransferSettings::setProxyUsername( std::string && val_r )
-    { _impl->_proxy_username = std::move(val_r); }
+    { _impl->_settingsObj.set_proxy_username( std::move(val_r) ); }
 
     std::string TransferSettings::proxyUsername() const
-    { return _impl->_proxy_username; }
+    { return _impl->_settingsObj.proxy_username(); }
 
     void TransferSettings::setProxyPassword( std::string && val_r )
-    { _impl->_proxy_password = std::move(val_r); }
+    { _impl->_settingsObj.set_proxy_password( std::move(val_r) ); }
 
     std::string TransferSettings::proxyPassword() const
-    { return _impl->_proxy_password; }
+    { return _impl->_settingsObj.proxy_password(); }
 
     std::string TransferSettings::proxyUserPassword() const
     {
@@ -171,94 +157,103 @@ namespace zypp
 
 
     void TransferSettings::setTimeout( long t )
-    { _impl->_timeout = t; }
+    { _impl->_settingsObj.set_timeout(t); }
 
     long TransferSettings::timeout() const
-    { return _impl->_timeout; }
+    { return _impl->_settingsObj.timeout(); }
 
 
     void TransferSettings::setConnectTimeout( long t )
-    { _impl->_connect_timeout = t; }
+    { _impl->_settingsObj.set_connect_timeout(t); }
 
     long TransferSettings::connectTimeout() const
-    { return _impl->_connect_timeout; }
+    { return _impl->_settingsObj.connect_timeout(); }
 
 
     void TransferSettings::setMaxConcurrentConnections( long v )
-    { _impl->_maxConcurrentConnections = v; }
+    { _impl->_settingsObj.set_maxconcurrentconnections(v); }
 
     long TransferSettings::maxConcurrentConnections() const
-    { return _impl->_maxConcurrentConnections; }
+    { return _impl->_settingsObj.maxconcurrentconnections(); }
 
 
     void TransferSettings::setMinDownloadSpeed( long v )
-    { _impl->_minDownloadSpeed = v; }
+    { _impl->_settingsObj.set_mindownloadspeed(v); }
 
     long TransferSettings::minDownloadSpeed() const
-    { return _impl->_minDownloadSpeed; }
+    { return _impl->_settingsObj.mindownloadspeed(); }
 
 
     void TransferSettings::setMaxDownloadSpeed( long v )
-    { _impl->_maxDownloadSpeed = v; }
+    { _impl->_settingsObj.set_maxdownloadspeed(v); }
 
     long TransferSettings::maxDownloadSpeed() const
-    { return _impl->_maxDownloadSpeed; }
+    { return _impl->_settingsObj.maxdownloadspeed(); }
 
 
     void TransferSettings::setMaxSilentTries( long v )
-    { _impl->_maxSilentTries = v; }
+    { _impl->_settingsObj.set_maxsilenttries(v); }
 
     long TransferSettings::maxSilentTries() const
-    { return _impl->_maxSilentTries; }
+    { return _impl->_settingsObj.maxsilenttries(); }
 
 
     void TransferSettings::setVerifyHostEnabled( bool enabled )
-    { _impl->_verify_host = enabled; }
+    { _impl->_settingsObj.set_verify_host(enabled); }
 
     bool TransferSettings::verifyHostEnabled() const
-    { return _impl->_verify_host; }
+    { return _impl->_settingsObj.verify_host(); }
 
 
     void TransferSettings::setVerifyPeerEnabled( bool enabled )
-    { _impl->_verify_peer = enabled; }
+    { _impl->_settingsObj.set_verify_peer(enabled); }
 
     bool TransferSettings::verifyPeerEnabled() const
-    { return _impl->_verify_peer; }
+    { return _impl->_settingsObj.verify_peer(); }
 
 
     void TransferSettings::setClientCertificatePath( Pathname && val_r )
-    { _impl->_client_cert_path = std::move(val_r); }
+    { _impl->_settingsObj.set_client_cert_path( val_r.asString() ); }
 
     Pathname TransferSettings::clientCertificatePath() const
-    { return _impl->_client_cert_path; }
+    { return _impl->_settingsObj.client_cert_path(); }
 
 
     void TransferSettings::setClientKeyPath( Pathname && val_r )
-    { _impl->_client_key_path = std::move(val_r); }
+    { _impl->_settingsObj.set_client_key_path( val_r.asString() ); }
 
     Pathname TransferSettings::clientKeyPath() const
-    { return _impl->_client_key_path; }
+    { return _impl->_settingsObj.client_key_path(); }
+
+    proto::TransferSettings &TransferSettings::protoData()
+    {
+      return _impl->_settingsObj;
+    }
 
+    const proto::TransferSettings &TransferSettings::protoData() const
+    {
+      return _impl->_settingsObj;
+    }
 
     void TransferSettings::setCertificateAuthoritiesPath( Pathname && val_r )
-    { _impl->_ca_path = std::move(val_r); }
+    { _impl->_settingsObj.set_ca_path(val_r.asString()); }
 
     Pathname TransferSettings::certificateAuthoritiesPath() const
-    { return _impl->_ca_path; }
+    { return _impl->_settingsObj.ca_path(); }
 
 
     void TransferSettings::setAuthType( std::string && val_r )
-    { _impl->_authtype = std::move(val_r); }
+    { _impl->_settingsObj.set_authtype( std::move(val_r) ); }
 
     std::string TransferSettings::authType() const
-    { return _impl->_authtype; }
+    { return _impl->_settingsObj.authtype(); }
 
 
     void TransferSettings::setHeadRequestsAllowed( bool allowed )
-    { _impl->_head_requests_allowed = allowed; }
+    { _impl->_settingsObj.set_head_requests_allowed(allowed); }
 
     bool TransferSettings::headRequestsAllowed() const
-    { return _impl->_head_requests_allowed; }
+    { return _impl->_settingsObj.head_requests_allowed(); }
 
   } // namespace media
 } // namespace zypp
index 7217ebf..a618d8a 100644 (file)
@@ -9,6 +9,10 @@
 #include <zypp/Pathname.h>
 #include <zypp/Url.h>
 
+namespace zypp::proto {
+  class TransferSettings;
+}
+
 namespace zypp
 {
   namespace media
@@ -23,6 +27,8 @@ namespace zypp
       /** Constructs a transfer program cmd line access. */
       TransferSettings();
 
+      TransferSettings( const zypp::proto::TransferSettings &settings );
+
       typedef std::vector<std::string> Headers;
 
       /** reset the settings to the defaults */
@@ -32,12 +38,8 @@ namespace zypp
       /** add a header, on the form "Foo: Bar" */
       void addHeader( std::string && val_r );
 
-      /** begin iterators to additional headers */
-      Headers::const_iterator headersBegin() const;
-
-      /** end iterators to additional headers */
-      Headers::const_iterator headersEnd() const;
-
+      /** returns a list of all added headers */
+      Headers headers() const;
 
       /** sets the user agent ie: "Mozilla v3" */
       void setUserAgentString( std::string && val_r );
@@ -185,6 +187,9 @@ namespace zypp
       /** SSL client key file */
       Pathname clientKeyPath() const;
 
+      const zypp::proto::TransferSettings &protoData() const;
+      zypp::proto::TransferSettings &protoData();
+
     protected:
       class Impl;
       RWCOW_pointer<Impl> _impl;
index 63473f1..583b4ca 100644 (file)
@@ -300,7 +300,7 @@ namespace yamltest::detail {
           if ( !parseSingleJob( data, n.children(), err) )
             return false;
         } else {
-          ERR << "Ignoring field " << key << " with unsupported type." << std::endl;
+          ERR << "Ignoring field " << key << " with unsupported type:" << data.Type() << std::endl;
         }
       }
     }
index ab49eb0..76079ef 100644 (file)
@@ -1,61 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/** \file zypp/parser/xml/XmlEscape.h
- *
-*/
-#ifndef ZYPP_PARSER_XML_XMLESCAPE_H
-#define ZYPP_PARSER_XML_XMLESCAPE_H
-
-#include <sstream>
-#include <string>
-#include <zypp/APIConfig.h>
-
-///////////////////////////////////////////////////////////////////
-namespace zypp
-{
-  ///////////////////////////////////////////////////////////////////
-  namespace xml
-  {
-    ///////////////////////////////////////////////////////////////////
-    namespace detail
-    {
-      struct EscapedString
-      {
-       EscapedString( const std::string & in_r ) : _in( in_r ) {}
-       std::ostream & dumpOn( std::ostream & str ) const;
-       std::string asString() const
-       { std::ostringstream str; dumpOn( str ); return str.str(); }
-       operator std::string() const
-       { return asString(); }
-      private:
-       const std::string & _in;
-      };
-
-      /** \relates EscapedString Stream output */
-      inline std::ostream & operator<<( std::ostream & str, const EscapedString & obj )
-      { return obj.dumpOn( str ); }
-
-    } // detail
-    ///////////////////////////////////////////////////////////////////
-
-    /** Escape xml special charaters (<tt>& -> &amp;</tt>; from IoBind library).
-     * The \ref detail::EscapedString can be dumped to an ostream and implicitly
-     * converts into a std::string.
-     */
-    inline detail::EscapedString escape( const std::string & in_r )
-    { return detail::EscapedString( in_r ); }
-
-    /** Unescape xml special charaters (<tt>&amp; -> &</tt>; from IoBind library) */
-    ZYPP_API std::string unescape( const std::string & in_r );
-
-  } // namespace xml
-  /////////////////////////////////////////////////////////////////
-} // namespace zypp
-///////////////////////////////////////////////////////////////////
-#endif // ZYPP_PARSER_XML_XMLESCAPE_H
+#include <zypp-core/parser/xml/XmlEscape.h>
diff --git a/zypp/proto/CMakeLists.txt b/zypp/proto/CMakeLists.txt
new file mode 100644 (file)
index 0000000..a54acc0
--- /dev/null
@@ -0,0 +1,2 @@
+SET( zypp_PROTOBUF_SOURCES
+)
index 572e009..8d41d24 100644 (file)
@@ -144,9 +144,12 @@ void Downloader::defaultDownloadMasterIndex( MediaSetAccess & media_r, const Pat
   Pathname keypath = masterIndex_r.extend( ".key" );
 
   // always download them, even if repoGpgCheck is disabled
+
+  //enable precache for next start() call
+  setMediaSetAccess( media_r );
   enqueue( OnMediaLocation( sigpath, 1 ).setOptional( true ).setDownloadSize( ByteCount( 20, ByteCount::MB ) ) );
   enqueue( OnMediaLocation( keypath, 1 ).setOptional( true ).setDownloadSize( ByteCount( 20, ByteCount::MB ) ) );
-  start( destdir_r, media_r );
+  start( destdir_r );
   reset();
 
   FileChecker checker; // set to sigchecker if appropriate, else Null.
index 881f9d0..323597e 100644 (file)
@@ -11,6 +11,7 @@
 #include <zypp/base/Logger.h>
 #include <zypp/base/Gettext.h>
 #include <zypp/repo/SUSEMediaVerifier.h>
+#include <zypp/media/MediaHandler.h>
 
 using std::endl;
 
@@ -148,7 +149,7 @@ namespace zypp
     { return _pimpl->mediaNr(); }
 
 
-    bool SUSEMediaVerifier::isDesiredMedia( const media::MediaAccessRef & ref ) const
+    bool SUSEMediaVerifier::isDesiredMedia( const media::MediaHandler & ref ) const
     {
       bool ret = true; // optimistic return unless we definitely now it does not match
 
@@ -158,14 +159,14 @@ namespace zypp
 
       // bsc#1180851: If there is just one not-volatile medium in the set
       // tolerate a missing (vanished) media identifier and let the URL rule.
-      bool relaxed = smvData._totalMedia == 1 && ! Url::schemeIsVolatile( ref->protocol() );
+      bool relaxed = smvData._totalMedia == 1 && ! Url::schemeIsVolatile( ref.protocol() );
       SEC << smvData << endl;
-      SEC << ref->protocol() << " " <<  Url::schemeIsVolatile( ref->protocol() ) << endl;
+      SEC << ref.protocol() << " " <<  Url::schemeIsVolatile( ref.protocol() ) << endl;
 
       Pathname mediaFile { _pimpl->mediaFilePath() };
       try {
-       ref->provideFile( mediaFile, 0 );
-       mediaFile = ref->localPath( mediaFile );
+       ref.provideFile( OnMediaLocation(mediaFile) );
+       mediaFile = ref.localPath( mediaFile );
       }
       catch ( media::MediaFileNotFoundException & excpt_r )
       {
index 3f6f8ad..3c6e3b5 100644 (file)
@@ -13,7 +13,7 @@
 #include <iosfwd>
 
 #include <zypp/media/MediaManager.h>
-#include <zypp/media/MediaAccess.h>
+#include <zypp/media/MediaHandler.h>
 #include <zypp/base/PtrTypes.h>
 
 namespace zypp
@@ -69,7 +69,7 @@ namespace zypp
        * we nevertheless assume the media is valid. File downloads will fail if
        * this was not true.
        */
-      bool isDesiredMedia( const media::MediaAccessRef & ref_r ) const override;
+      bool isDesiredMedia( const media::MediaHandler & ref_r ) const override;
 
     public:
       class Impl;                 ///< Implementation class.
index 35b44a9..68c5ee7 100644 (file)
@@ -38,7 +38,7 @@ namespace zypp
        media::MediaManager mediamanager;
        media::MediaAccessId mid = mediamanager.open( serviceUrl );
        mediamanager.attach( mid );
-       mediamanager.provideFile( mid, "repo/repoindex.xml" );
+        mediamanager.provideFile( mid, OnMediaLocation("repo/repoindex.xml") );
        Pathname path = mediamanager.localPath(mid, "repo/repoindex.xml" );
        try {
          parser::RepoindexFileReader reader(path, callback);
index b566c1c..c1757a2 100644 (file)
@@ -155,9 +155,10 @@ void Downloader::download( MediaSetAccess &media,
       }
     }
     MIL << "adding job " << it->first << endl;
-    OnMediaLocation location( repoInfo().path() + descr_dir + it->first, 1 );
-    location.setChecksum( it->second );
-    enqueueDigested(location, FileChecker(), search_deltafile(_delta_dir + descr_dir, it->first));
+    auto location = std::move( OnMediaLocation( repoInfo().path() + descr_dir + it->first, 1 )
+                                 .setChecksum( it->second )
+                                 .setDeltafile( search_deltafile(_delta_dir + descr_dir, it->first) ));
+    enqueueDigested( location, FileChecker() );
   }
 
   // check whether to download more package translations:
@@ -170,9 +171,10 @@ void Downloader::download( MediaSetAccess &media,
        {
          auto mit( it->second );
          MIL << "adding job " << mit->first << endl;
-         OnMediaLocation location( repoInfo().path() + descr_dir + mit->first, 1 );
-         location.setChecksum( mit->second );
-         enqueueDigested(location, FileChecker(), search_deltafile(_delta_dir + descr_dir, mit->first));
+          auto location = std::move( OnMediaLocation( repoInfo().path() + descr_dir + mit->first, 1 )
+                                       .setChecksum( mit->second )
+                                       .setDeltafile( search_deltafile(_delta_dir + descr_dir, mit->first) ));
+         enqueueDigested(location, FileChecker());
          break;
        }
       }
@@ -191,9 +193,10 @@ void Downloader::download( MediaSetAccess &media,
       continue;
 
     MIL << "adding job " << it->first << endl;
-    OnMediaLocation location( repoInfo().path() + it->first, 1 );
-    location.setChecksum( it->second );
-    enqueueDigested(location, FileChecker(), search_deltafile(_delta_dir, it->first));
+    auto location = std::move( OnMediaLocation ( repoInfo().path() + it->first, 1 )
+                                 .setChecksum( it->second )
+                                 .setDeltafile( search_deltafile( _delta_dir, it->first ) ));
+    enqueueDigested(location, FileChecker() );
   }
 
   for_( it, _repoindex->signingKeys.begin(),_repoindex->signingKeys.end() )
index 688e414..c0a31df 100644 (file)
@@ -139,7 +139,7 @@ namespace yum
       {
        const OnMediaLocation & loc { el.second };
        const OnMediaLocation & loc_with_path { loc_with_path_prefix( loc, _downloader.repoInfo().path() ) };
-       _downloader.enqueueDigested( loc_with_path, FileChecker(), search_deltafile( deltaDir()/"repodata", loc.filename() ) );
+        _downloader.enqueueDigested( OnMediaLocation(loc_with_path).setDeltafile( search_deltafile( deltaDir()/"repodata", loc.filename() ) ), FileChecker() );
       }
     }
 
@@ -186,13 +186,16 @@ namespace yum
     Pathname masterIndex { repoInfo().path() / "/repodata/repomd.xml" };
     defaultDownloadMasterIndex( media_r, destDir_r, masterIndex );
 
+    //enable precache
+    setMediaSetAccess( media_r );
+
     // setup parser
     Impl pimpl( *this, media_r, destDir_r );
     RepomdFileReader( destDir_r / masterIndex, std::ref(pimpl) );
     pimpl.finalize();
 
     // ready, go!
-    start( destDir_r, media_r );
+    start( destDir_r );
   }
 
   RepoStatus Downloader::status( MediaSetAccess & media_r )
index 4a45b63..df24844 100644 (file)
@@ -708,8 +708,7 @@ SATResolver::solverInit(const PoolItemList & weakItems)
       queue_push( &(_jobQueue), sat::Solvable::retractedToken.id() );
       queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
       queue_push( &(_jobQueue), sat::Solvable::ptfMasterToken.id() );
-      queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
-      queue_push( &(_jobQueue), sat::Solvable::ptfPackageToken.id() );
+      // bsc#1186503: ptfPackageToken should not be blacklisted
     }
 
     // Ad rules for changed requestedLocales
@@ -1489,7 +1488,17 @@ SATResolver::problems ()
                                {
                                     IdString s_vendor( s.vendor() );
                                     IdString sd_vendor( sd.vendor() );
-                                   std::string description = str::Format(_("install %1% (with vendor change)\n  %2%  -->  %3%") ) % sd.asString() % ( s_vendor ? s_vendor.c_str() : " (no vendor) " ) % ( sd_vendor ? sd_vendor.c_str() : " (no vendor) " );
+                                   std::string description;
+                                   if ( s == sd )
+                                     description = str::Format(_("install %1% (with vendor change)\n  %2%  -->  %3%") )
+                                     % sd.asString()
+                                     % ( s_vendor ? s_vendor.c_str() : " (no vendor) " )
+                                     % ( sd_vendor ? sd_vendor.c_str() : " (no vendor) " );
+                                   else
+                                     description = str::Format(_("install %1% from vendor %2%\n  replacing %3% from vendor %4%") )
+                                     % sd.asString()  % ( sd_vendor ? sd_vendor.c_str() : " (no vendor) " )
+                                     % s.asString() % ( s_vendor ? s_vendor.c_str() : " (no vendor) " );
+
                                    MIL << description << endl;
                                    problemSolution->addDescription (description);
                                    gotone = 1;
index 313b300..4c35f17 100644 (file)
 #include <zypp/sat/SolvableSpec.h>
 #include <zypp/sat/Transaction.h>
 
+#include <zypp-core/base/String.h>
+#include <zypp-core/base/StringV.h>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/io/AsyncDataSource>
+#include <zypp-core/zyppng/io/Process>
+#include <zypp-core/base/IOTools.h>
+#include <zypp-core/zyppng/rpc/rpc.h>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-proto/commit.pb.h>
+#include <zypp-proto/envelope.pb.h>
+#include <zypp-core/zyppng/rpc/zerocopystreams.h>
+
+#include <zypp/target/rpm/RpmException.h>
+
 #include <zypp/PluginExecutor.h>
 
+// include the error codes from zypp-rpm
+#include "tools/zypp-rpm/errorcodes.h"
+
+#include <optional>
+
 using std::endl;
 
 ///////////////////////////////////////////////////////////////////
@@ -1254,8 +1274,12 @@ namespace zypp
       if ( policy_r.downloadMode() == DownloadDefault ) {
         if ( root() == "/" )
           policy_r.downloadMode(DownloadInHeaps);
-        else
-          policy_r.downloadMode(DownloadAsNeeded);
+        else {
+          if ( policy_r.singleTransModeEnabled() )
+            policy_r.downloadMode(DownloadInAdvance);
+          else
+            policy_r.downloadMode(DownloadAsNeeded);
+        }
       }
       // DownloadOnly implies dry-run.
       else if ( policy_r.downloadMode() == DownloadOnly )
@@ -1380,15 +1404,18 @@ namespace zypp
       ///////////////////////////////////////////////////////////////////
       // Remove/install packages.
       ///////////////////////////////////////////////////////////////////
+
+      bool singleTransMode = policy_r.singleTransModeEnabled();
+
       DBG << "commit log file is set to: " << HistoryLog::fname() << endl;
-      if ( ! policy_r.dryRun() || policy_r.downloadMode() == DownloadOnly )
+      if ( ! policy_r.dryRun() || policy_r.downloadMode() == DownloadOnly || singleTransMode )
       {
        // Prepare the package cache. Pass all items requiring download.
         CommitPackageCache packageCache;
        packageCache.setCommitList( steps.begin(), steps.end() );
 
         bool miss = false;
-        if ( policy_r.downloadMode() != DownloadAsNeeded )
+        if ( policy_r.downloadMode() != DownloadAsNeeded || singleTransMode )
         {
           // Preload the cache. Until now this means pre-loading all packages.
           // Once DownloadInHeaps is fully implemented, this will change and
@@ -1454,21 +1481,26 @@ namespace zypp
         }
         else
        {
-         if ( ! policy_r.dryRun() )
-         {
-           // if cache is preloaded, check for file conflicts
-           commitFindFileConflicts( policy_r, result );
-           commit( policy_r, packageCache, result );
-         }
-         else
-         {
-           DBG << "dryRun/downloadOnly: Not installing/deleting anything." << endl;
-           if ( explicitDryRun ) {
-             // if cache is preloaded, check for file conflicts
-             commitFindFileConflicts( policy_r, result );
-           }
-         }
-       }
+          // single trans mode does a test install via rpm
+          if ( policy_r.singleTransModeEnabled() ) {
+            commitInSingleTransaction( policy_r, packageCache, result );
+          } else {
+            if ( ! policy_r.dryRun() )
+            {
+              // if cache is preloaded, check for file conflicts
+              commitFindFileConflicts( policy_r, result );
+              commit( policy_r, packageCache, result );
+            }
+            else
+            {
+              DBG << "dryRun/downloadOnly: Not installing/deleting anything." << endl;
+              if ( explicitDryRun ) {
+                // if cache is preloaded, check for file conflicts
+                commitFindFileConflicts( policy_r, result );
+              }
+            }
+          }
+        }
       }
       else
       {
@@ -1818,6 +1850,872 @@ namespace zypp
       }
     }
 
+    const callback::UserData::ContentType rpm::InstallResolvableReportSA::contentRpmout( "zypp-rpm","installpkgsa" );
+    const callback::UserData::ContentType rpm::RemoveResolvableReportSA::contentRpmout( "zypp-rpm","removepkgsa" );
+    const callback::UserData::ContentType rpm::CommitScriptReportSA::contentRpmout( "zypp-rpm","scriptsa" );
+    const callback::UserData::ContentType rpm::TransactionReportSA::contentRpmout( "zypp-rpm","transactionsa" );
+    const callback::UserData::ContentType rpm::CleanupPackageReportSA::contentRpmout( "zypp-rpm","cleanupkgsa" );
+
+    void TargetImpl::commitInSingleTransaction(const ZYppCommitPolicy &policy_r, CommitPackageCache &packageCache_r, ZYppCommitResult &result_r)
+    {
+      namespace zpt = zypp::proto::target;
+      // steps: this is our todo-list
+      ZYppCommitResult::TransactionStepList & steps( result_r.rTransactionStepList() );
+      MIL << "TargetImpl::commit(<list>" << policy_r << ")" << steps.size() << endl;
+
+      HistoryLog().stampCommand();
+
+      // Send notification once upon calling rpm
+      NotifyAttemptToModify attemptToModify( result_r );
+
+      // let zypper know we executed in one big transaction so in case of failures it can show extended error informations
+      result_r.setSingleTransactionMode( true );
+
+      // bsc#1181328: Some systemd tools require /proc to be mounted
+      AssertProcMounted assertProcMounted( _root );
+
+      rpm::RpmInstFlags flags( policy_r.rpmInstFlags() );
+
+      zpt::Commit commit;
+      commit.set_flags( flags );
+      commit.set_ignorearch( !ZConfig::instance().systemArchitecture().compatibleWith( ZConfig::instance().defaultSystemArchitecture() ) );
+      commit.set_arch( ZConfig::instance().systemArchitecture().asString() );
+      commit.set_dbpath( rpm().dbPath().asString() );
+      commit.set_root( rpm().root().asString() );
+
+      bool abort = false;
+      std::vector<ManagedFile> locFiles;
+
+      // fill the transaction
+      for( int stepId = 0; (ZYppCommitResult::TransactionStepList::size_type)stepId < steps.size() && !abort ; stepId++ ) {
+        auto &step = steps[stepId];
+        PoolItem citem( step );
+        if ( step.stepType() == sat::Transaction::TRANSACTION_IGNORE ) {
+          if ( citem->isKind<Package>() )
+          {
+            // for packages this means being obsoleted (by rpm)
+            // thius no additional action is needed.
+            step.stepStage( sat::Transaction::STEP_DONE );
+            continue;
+          }
+        }
+
+        if ( citem->isKind<Package>() ) {
+          Package::constPtr p = citem->asKind<Package>();
+          if ( citem.status().isToBeInstalled() )
+          {
+            try {
+              locFiles.push_back( packageCache_r.get( citem ) );
+
+              zpt::TransactionStep tStep;
+              tStep.set_stepid( stepId );
+              tStep.mutable_install()->set_pathname( locFiles.back()->asString() );
+              tStep.mutable_install()->set_multiversion( p->multiversionInstall() );
+
+              *commit.mutable_steps()->Add( ) = std::move(tStep);
+            }
+            catch ( const AbortRequestException &e )
+            {
+              WAR << "commit aborted by the user" << endl;
+              abort = true;
+              step.stepStage( sat::Transaction::STEP_ERROR );
+              break;
+            }
+            catch ( const SkipRequestException &e )
+            {
+              ZYPP_CAUGHT( e );
+              WAR << "Skipping package " << p << " in commit" << endl;
+              step.stepStage( sat::Transaction::STEP_ERROR );
+              continue;
+            }
+            catch ( const Exception &e )
+            {
+              // bnc #395704: missing catch causes abort.
+              // TODO see if packageCache fails to handle errors correctly.
+              ZYPP_CAUGHT( e );
+              INT << "Unexpected Error: Skipping package " << p << " in commit" << endl;
+              step.stepStage( sat::Transaction::STEP_ERROR );
+              continue;
+            }
+          } else {
+
+            zpt::TransactionStep tStep;
+            tStep.set_stepid( stepId );
+            tStep.mutable_remove()->set_name( p->name() );
+            tStep.mutable_remove()->set_version( p->edition().version() );
+            tStep.mutable_remove()->set_release( p->edition().release() );
+            tStep.mutable_remove()->set_arch( p->arch().asString() );
+
+            *commit.mutable_steps()->Add() = std::move(tStep);
+
+          }
+        } else if ( citem->isKind<SrcPackage>() && citem.status().isToBeInstalled() ) {
+          // SrcPackage is install-only
+          SrcPackage::constPtr p = citem->asKind<SrcPackage>();
+
+          try {
+            // provide on local disk
+            locFiles.push_back( provideSrcPackage( p ) );
+
+            zpt::TransactionStep tStep;
+            tStep.set_stepid( stepId );
+            tStep.mutable_install()->set_pathname( locFiles.back()->asString() );
+            tStep.mutable_install()->set_multiversion( false );
+            *commit.mutable_steps()->Add() = std::move(tStep);
+
+          }  catch ( const Exception &e ) {
+            ZYPP_CAUGHT( e );
+            INT << "Unexpected Error: Skipping package " << p << " in commit" << endl;
+            step.stepStage( sat::Transaction::STEP_ERROR );
+            continue;
+          }
+        }
+      }
+
+      std::vector<sat::Solvable> successfullyInstalledPackages;
+
+      if ( commit.steps_size() ) {
+
+        // create the event loop early
+        auto loop = zyppng::EventLoop::create();
+
+        attemptToModify();
+
+
+        // transaction related variables:
+        //
+        // the index of the step in the transaction list that we currenty execute.
+        // this can be -1
+        int currentStepId = -1;
+
+        // sync flag, every time zypp-rpm finishes executing a step it writes a tag into
+        // the script fd, once we receive it we set this flag to true and ignore all output
+        // that is written to the pipe ( aside from buffering it ) until we finalize the current report
+        // and start a new one
+        bool gotEndOfScript = false;
+
+        // the possible reports we emit during the transaction
+        std::unique_ptr<callback::SendReport <rpm::TransactionReportSA>>        transactionreport;
+        std::unique_ptr<callback::SendReport <rpm::InstallResolvableReportSA>>  installreport;
+        std::unique_ptr<callback::SendReport <rpm::RemoveResolvableReportSA>>   uninstallreport;
+        std::unique_ptr<callback::SendReport <rpm::CommitScriptReportSA>>       scriptreport;
+        std::unique_ptr<callback::SendReport <rpm::CleanupPackageReportSA>>     cleanupreport;
+
+        // this will be set if we receive a transaction error description
+        std::optional<zpt::TransactionError> transactionError;
+
+        // infos about the currently executed script, empty if no script is currently executed
+        std::string currentScriptType;
+        std::string currentScriptPackage;
+
+        // buffer to collect rpm output per report, this will be written to the log once the
+        // report ends
+        std::string rpmmsg;
+
+        // maximum number of lines that we are buffering in rpmmsg
+        constexpr auto MAXRPMMESSAGELINES = 10000;
+
+        // current number of lines in the rpmmsg line buffer. This is capped to MAXRPMMESSAGELINES
+        unsigned    lineno = 0;
+
+        // the sources to communicate with zypp-rpm, we will associate pipes with them further down below
+        auto msgSource = zyppng::AsyncDataSource::create();
+        auto scriptSource = zyppng::AsyncDataSource::create();
+
+
+        // helper function that sends RPM output to the currently active report, writing a warning to the log
+        // if there is none
+        const auto &sendRpmLineToReport = [&]( std::string line ){
+
+          const auto &sendLogRep = [&]( auto &report, const auto &cType ){
+            callback::UserData cmdout(cType);
+            if ( currentStepId >= 0 )
+              cmdout.set( "solvable", steps.at(currentStepId).satSolvable() );
+            cmdout.set( "line", line );
+            report->report(cmdout);
+          };
+
+          if ( installreport ) {
+            sendLogRep( (*installreport), rpm::InstallResolvableReportSA::contentRpmout );
+          } else if ( uninstallreport ) {
+            sendLogRep( (*uninstallreport), rpm::RemoveResolvableReportSA::contentRpmout );
+          } else if ( scriptreport ) {
+            sendLogRep( (*scriptreport), rpm::CommitScriptReportSA::contentRpmout );
+          } else if ( transactionreport ) {
+            sendLogRep( (*transactionreport), rpm::TransactionReportSA::contentRpmout );
+          } else if ( cleanupreport ) {
+            sendLogRep( (*cleanupreport), rpm::CleanupPackageReportSA::contentRpmout );
+          } else {
+            WAR << "Got rpm output without active report " << line << std::endl;
+          }
+
+          // remember rpm output
+          if ( lineno >= MAXRPMMESSAGELINES ) {
+            if ( line.find( " scriptlet failed, " ) == std::string::npos )     // always log %script errors
+              return;
+          }
+          rpmmsg += line;
+          if ( line.back() != '\n' )
+            line += '\n';
+        };
+
+
+        // callback and helper function to process data that is received on the script FD
+        const auto &processDataFromScriptFd = [&](){
+
+          while ( scriptSource->canReadLine() ) {
+
+            if ( gotEndOfScript )
+              return;
+
+            std::string l = scriptSource->readLine().asString();
+            if( str::endsWith( l, endOfScriptTag ) ) {
+              DBG << "Received end of script tag" << std::endl;
+              gotEndOfScript = true;
+              l = l.substr( 0, l.size() - endOfScriptTag.size() );
+              if ( l.size() == 0 )
+                return;
+            }
+
+            sendRpmLineToReport( l );
+          }
+        };
+        scriptSource->sigReadyRead().connect( processDataFromScriptFd );
+
+        // helper function that just waits until the end of script tag was received on the scriptSource
+        const auto &waitForScriptEnd = [&]() {
+
+          // nothing to wait for
+          if ( gotEndOfScript )
+            return;
+
+          // we process all available data
+          processDataFromScriptFd();
+
+          // end of script is always sent by zypp-rpm, we need to wait for it to keep order
+          while ( scriptSource->canRead() && !gotEndOfScript ) {
+            // readyRead will trigger processDataFromScriptFd so no need to call it again
+            // we still got nothing, lets wait for more
+            scriptSource->waitForReadyRead( 100 );
+          }
+        };
+
+        const auto &aboutToStartNewReport = [&](){
+
+          if ( transactionreport || installreport || uninstallreport || scriptreport || cleanupreport ) {
+            ERR << "There is still a running report, this is a bug" << std::endl;
+            assert(false);
+          }
+
+          DBG << "Starting new report, setting gotEndOfScript to false" << std::endl;
+          gotEndOfScript = false;
+        };
+
+        const auto &writeRpmMsgToHistory = [&](){
+          if ( rpmmsg.size() == 0 )
+            return;
+
+          if ( lineno >= MAXRPMMESSAGELINES )
+            rpmmsg += "[truncated]\n";
+
+          std::ostringstream sstr;
+          sstr << "rpm output:" << endl << rpmmsg << endl;
+          HistoryLog().comment(sstr.str());
+        };
+
+        // helper function that closes the current report and cleans up the ressources
+        const auto &finalizeCurrentReport = [&]() {
+          sat::Transaction::Step *step = nullptr;
+          Resolvable::constPtr resObj;
+          if ( currentStepId >= 0 ) {
+            step = &steps.at(currentStepId);
+            resObj = makeResObject( step->satSolvable() );
+          }
+
+          if ( installreport ) {
+            waitForScriptEnd();
+            if ( step->stepStage() == sat::Transaction::STEP_ERROR ) {
+
+              HistoryLog().comment(
+                str::form("%s install failed", step->ident().c_str()),
+                true /*timestamp*/);
+
+              writeRpmMsgToHistory();
+
+              ( *installreport)->finish( resObj, rpm::InstallResolvableReportSA::INVALID );
+            } else {
+              ( *installreport)->progress( 100, resObj );
+              ( *installreport)->finish( resObj, rpm::InstallResolvableReportSA::NO_ERROR );
+
+              successfullyInstalledPackages.push_back( step->satSolvable() );
+
+              PoolItem citem( *step );
+              if ( !( flags & rpm::RPMINST_TEST ) ) {
+                // @TODO are we really doing this just for install?
+                if ( citem.isNeedreboot() ) {
+                  auto rebootNeededFile = root() / "/run/reboot-needed";
+                  if ( filesystem::assert_file( rebootNeededFile ) == EEXIST)
+                    filesystem::touch( rebootNeededFile );
+                }
+                citem.status().resetTransact( ResStatus::USER );
+                HistoryLog().install(citem);
+              }
+
+              HistoryLog().comment(
+                str::form("%s installed ok", step->ident().c_str()),
+                true /*timestamp*/);
+
+              writeRpmMsgToHistory();
+            }
+          }
+          if ( uninstallreport ) {
+            waitForScriptEnd();
+            if ( step->stepStage() == sat::Transaction::STEP_ERROR ) {
+
+              HistoryLog().comment(
+                str::form("%s uninstall failed", step->ident().c_str()),
+                true /*timestamp*/);
+
+              writeRpmMsgToHistory();
+
+              ( *uninstallreport)->finish( resObj, rpm::RemoveResolvableReportSA::INVALID );
+            } else {
+              ( *uninstallreport)->progress( 100, resObj );
+              ( *uninstallreport)->finish( resObj, rpm::RemoveResolvableReportSA::NO_ERROR );
+
+              PoolItem citem( *step );
+              HistoryLog().remove(citem);
+
+              HistoryLog().comment(
+                str::form("%s removed ok", step->ident().c_str()),
+                true /*timestamp*/);
+
+              writeRpmMsgToHistory();
+            }
+          }
+          if ( scriptreport ) {
+            waitForScriptEnd();
+            ( *scriptreport)->progress( 100, resObj );
+            ( *scriptreport)->finish( resObj, rpm::CommitScriptReportSA::NO_ERROR );
+          }
+          if ( transactionreport ) {
+            waitForScriptEnd();
+            ( *transactionreport)->progress( 100 );
+            ( *transactionreport)->finish( rpm::TransactionReportSA::NO_ERROR );
+          }
+          if ( cleanupreport ) {
+            waitForScriptEnd();
+            ( *cleanupreport)->progress( 100 );
+            ( *cleanupreport)->finish( rpm::CleanupPackageReportSA::NO_ERROR );
+          }
+          DBG << "Report finalized" << std::endl;
+          currentStepId = -1;
+          lineno = 0;
+          rpmmsg.clear();
+          currentScriptType.clear();
+          currentScriptPackage.clear();
+          installreport.reset();
+          uninstallreport.reset();
+          scriptreport.reset();
+          transactionreport.reset();
+          cleanupreport.reset();
+        };
+
+        // This sets up the process and pushes the required transactions steps to it
+        // careful when changing code here, zypp-rpm relies on the exact order data is transferred:
+        //
+        // 1) Size of the commit message , sizeof(zyppng::rpc::HeaderSizeType)
+        // 2) The Commit Proto message, directly serialized to the FD, without Envelope
+        // 3) 2 writeable FDs that are set up by the parent Process when forking. The first FD is to be used for message sending, the second one for script output
+
+        constexpr std::string_view zyppRpmBinary(ZYPP_RPM_BINARY);
+
+        const char *argv[] = {
+          //"gdbserver",
+          //"localhost:10001",
+          zyppRpmBinary.data(),
+          nullptr
+        };
+        auto prog = zyppng::Process::create();
+
+        // we set up a pipe to communicate with the process, its too dangerous to use stdout since librpm
+        // might print to it.
+        auto messagePipe = zyppng::Pipe::create();
+        if ( !messagePipe )
+          ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to create message pipe" ) );
+
+        // open a pipe that we are going to use to receive script output, this is a librpm feature, there is no other
+        // way than a FD to redirect that output
+        auto scriptPipe = zyppng::Pipe::create();
+        if ( !scriptPipe )
+          ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to create scriptfd" ) );
+
+        prog->addFd( messagePipe->writeFd );
+        prog->addFd( scriptPipe->writeFd );
+
+        // set up the AsyncDataSource to read script output
+        if ( !scriptSource->open( scriptPipe->readFd ) )
+          ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to open scriptFD to subprocess" ) );
+
+        prog->sigStarted().connect( [&](){
+
+          // close the ends of the pipes we do not care about
+          messagePipe->unrefWrite();
+          scriptPipe->unrefWrite();
+
+          // read the stdout and forward it to our log
+          prog->stdoutDevice()->connectFunc( &zyppng::IODevice::sigReadyRead, [&](){
+            while( prog->stdoutDevice()->canReadLine() ) {
+              MIL << "zypp-rpm stdout: " << prog->stdoutDevice()->readLine().asStringView() << std::endl;
+            }
+          });
+
+          // read the stderr and forward it to our log
+          prog->stderrDevice()->connectFunc( &zyppng::IODevice::sigReadyRead, [&](){
+            while( prog->stderrDevice()->canReadLine() ) {
+              MIL << "zypp-rpm stderr: " << prog->stderrDevice()->readLine().asStringView() << std::endl;
+            }
+          });
+
+          {
+            // write the commit message in blocking mode
+            const auto outFd = prog->stdinFd();
+            OnScopeExit unblock([&](){
+              io::setFDBlocking( outFd, false );
+            });
+            io::setFDBlocking( outFd );
+
+            // first we push the commit information to the process, starting with the byte size
+            zyppng::rpc::HeaderSizeType msgSize = commit.ByteSizeLong();
+            const auto written = zyppng::eintrSafeCall( ::write, outFd, &msgSize, sizeof(zyppng::rpc::HeaderSizeType) );
+            if ( written != sizeof(zyppng::rpc::HeaderSizeType) ) {
+              prog->stop( SIGKILL );
+              ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to write commit size to subprocess" ) );
+            }
+
+            zyppng::FileOutputStream fo ( outFd );
+            if ( !commit.SerializeToZeroCopyStream( &fo ) ) {
+              prog->stop( SIGKILL );
+              ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to write commit to subprocess" ) );
+            }
+            fo.Flush();
+          }
+
+        });
+
+        // this is the source for control messages from zypp-rpm , we will get structured data information
+        // in form of protobuf messages
+        if ( !msgSource->open( messagePipe->readFd ) )
+          ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to open read stream to subprocess" ) );
+
+        size_t pendingMessageSize = 0;
+        const auto &processMessages = [&] ( ) {
+
+          // lambda function that parses the passed message type and checks if the stepId is a valid offset
+          // in the steps list.
+          const auto &parseMsgWithStepId = [&steps]( const auto &m, auto &p ){
+            if ( !p.ParseFromString( m.value() ) ) {
+              ERR << "Failed to parse " << m.messagetypename() << " message from zypp-rpm." << std::endl;
+              return false;
+            }
+
+            auto id = p.stepid();
+            if ( id < 0 || id >= steps.size() ) {
+              ERR << "Received invalid stepId: " << id << " in " << m.messagetypename() << " message from zypp-rpm, ignoring." << std::endl;
+              return false;
+            }
+            return true;
+          };
+
+          while ( msgSource->bytesAvailable() ) {
+
+            if ( pendingMessageSize == 0 ) {
+              if ( msgSource->bytesAvailable() >= sizeof( zyppng::rpc::HeaderSizeType ) ) {
+                msgSource->read( reinterpret_cast<char *>( &pendingMessageSize ),  sizeof( zyppng::rpc::HeaderSizeType ) );
+              }
+            }
+
+            if ( msgSource->bytesAvailable() < pendingMessageSize ) {
+              return;
+            }
+
+            auto bytes = msgSource->read( pendingMessageSize );
+            pendingMessageSize = 0;
+
+            zypp::proto::Envelope m;
+            if (! m.ParseFromArray( bytes.data(), bytes.size() ) ) {
+              // if we get a misformed message we can not simply kill zypp-rpm since it might be executing the transaction, all we can do is
+              // continue ( this should normally not happen , but code needs to handle it ).
+              ERR << "Received misformed message from zypp-rpm, ignoring" << std::endl;
+              return;
+            }
+
+            // due to librpm behaviour we need to make sense of the order of messages we receive
+            // because we first get a PackageFinished BEFORE getting a PackageError, same applies to
+            // Script related messages. What we do is remember the current step we are in and only close
+            // the step when we get the start of the next one
+            const auto &mName = m.messagetypename();
+            if (  mName == "zypp.proto.target.RpmLog" )  {
+
+              zpt::RpmLog p;
+              if ( !p.ParseFromString( m.value() ) ) {
+                ERR << "Failed to parse " << m.messagetypename() << " message from zypp-rpm." << std::endl;
+                continue;
+              }
+
+              sendRpmLineToReport( p.line() );
+
+
+            } else if (  mName == "zypp.proto.target.PackageBegin" )  {
+              finalizeCurrentReport();
+
+              zpt::PackageBegin p;
+              if ( !parseMsgWithStepId( m, p ) )
+                continue;
+
+              aboutToStartNewReport();
+
+              auto & step = steps.at( p.stepid() );
+              currentStepId = p.stepid();
+              if ( step.stepType() == sat::Transaction::TRANSACTION_ERASE ) {
+                uninstallreport = std::make_unique< callback::SendReport <rpm::RemoveResolvableReportSA> > ();
+                ( *uninstallreport )->start( makeResObject( step.satSolvable() ) );
+              } else {
+                installreport = std::make_unique< callback::SendReport <rpm::InstallResolvableReportSA> > ();
+                ( *installreport )->start( makeResObject( step.satSolvable() ) );
+              }
+
+            } else if (  mName == "zypp.proto.target.PackageFinished" )  {
+              zpt::PackageFinished p;
+              if ( !parseMsgWithStepId( m, p ) )
+                continue;
+
+              if ( p.stepid() < 0 || p.stepid() > steps.size() )
+                continue;
+
+              // here we only set the step stage to done, we however need to wait for the next start in order to send
+              // the finished report since there might be a error pending to be reported
+              steps[ p.stepid() ].stepStage( sat::Transaction::STEP_DONE );
+
+            } else if (  mName == "zypp.proto.target.PackageProgress" )  {
+              zpt::PackageProgress p;
+              if ( !parseMsgWithStepId( m, p ) )
+                continue;
+
+              if ( uninstallreport )
+                (*uninstallreport)->progress( p.amount(), makeResObject( steps.at( p.stepid() ) ));
+              else if ( installreport )
+                (*installreport)->progress( p.amount(), makeResObject( steps.at( p.stepid() ) ));
+              else
+                ERR << "Received a " << mName << " message but there is no corresponding report running." << std::endl;
+
+            } else if (  mName == "zypp.proto.target.PackageError" )  {
+              zpt::PackageError p;
+              if ( !parseMsgWithStepId( m, p ) )
+                continue;
+
+              if ( p.stepid() >= 0 && p.stepid() < steps.size() )
+                steps[ p.stepid() ].stepStage( sat::Transaction::STEP_ERROR );
+
+              finalizeCurrentReport();
+
+            } else if (  mName == "zypp.proto.target.ScriptBegin" )  {
+              finalizeCurrentReport();
+
+              zpt::ScriptBegin p;
+              if ( !p.ParseFromString( m.value() ) ) {
+                ERR << "Failed to parse " << m.messagetypename() << " message from zypp-rpm." << std::endl;
+                continue;
+              }
+
+              aboutToStartNewReport();
+
+              Resolvable::constPtr resPtr;
+              const auto stepId = p.stepid();
+              if ( stepId >= 0 && stepId < steps.size() ) {
+                resPtr = makeResObject( steps.at(stepId).satSolvable() );
+              }
+
+              currentStepId = p.stepid();
+              scriptreport = std::make_unique< callback::SendReport <rpm::CommitScriptReportSA> > ();
+              currentScriptType = p.scripttype();
+              currentScriptPackage = p.scriptpackage();
+              (*scriptreport)->start( p.scripttype(), p.scriptpackage(), resPtr );
+
+            } else if (  mName == "zypp.proto.target.ScriptFinished" )  {
+
+              // we just read the message, we do not act on it because a ScriptError is reported after ScriptFinished
+              MIL << "Received" << mName << " from zypp-rpm" << std::endl;
+
+            } else if (  mName == "zypp.proto.target.ScriptError" )  {
+
+              zpt::ScriptError p;
+              if ( !p.ParseFromString( m.value() ) ) {
+                ERR << "Failed to parse " << m.messagetypename() << " message from zypp-rpm." << std::endl;
+                continue;
+              }
+
+              Resolvable::constPtr resPtr;
+              const auto stepId = p.stepid();
+              if ( stepId >= 0 && stepId < steps.size() ) {
+                resPtr = makeResObject( steps.at(stepId).satSolvable() );
+
+                if ( p.fatal() ) {
+                  steps.at( stepId ).stepStage( sat::Transaction::STEP_ERROR );
+                }
+
+              }
+
+              HistoryLog().comment(
+                str::form("Failed to execute %s script for %s ", currentScriptType.c_str(), currentScriptPackage.size() ? currentScriptPackage.c_str() : "unknown" ),
+                true /*timestamp*/);
+
+              writeRpmMsgToHistory();
+
+              if ( !scriptreport ) {
+                ERR << "Received a ScriptError message, but there is no running report. " << std::endl;
+                continue;
+              }
+
+              // before killing the report we need to wait for the script end tag
+              waitForScriptEnd();
+              (*scriptreport)->finish( makeResObject( steps[stepId].satSolvable() ), p.fatal() ? rpm::CommitScriptReportSA::CRITICAL : rpm::CommitScriptReportSA::WARN );
+
+              // manually reset the current report since we already sent the finish(), rest will be reset by the new start
+              scriptreport.reset();
+              currentStepId = -1;
+
+            } else if (  mName == "zypp.proto.target.CleanupBegin" ) {
+              finalizeCurrentReport();
+
+              zpt::CleanupBegin beg;
+              if ( !beg.ParseFromString( m.value() ) ) {
+                ERR << "Failed to parse " << m.messagetypename() << " message from zypp-rpm." << std::endl;
+                continue;
+              }
+
+              aboutToStartNewReport();
+              cleanupreport = std::make_unique< callback::SendReport <rpm::CleanupPackageReportSA> > ();
+              (*cleanupreport)->start( beg.nvra() );
+            } else if (  mName == "zypp.proto.target.CleanupFinished" )  {
+
+              finalizeCurrentReport();
+
+            } else if (  mName == "zypp.proto.target.CleanupProgress" )  {
+              zpt::CleanupProgress prog;
+              if ( !prog.ParseFromString( m.value() ) ) {
+                ERR << "Failed to parse " << m.messagetypename() << " message from zypp-rpm." << std::endl;
+                continue;
+              }
+
+              if ( !cleanupreport ) {
+                ERR << "Received a CleanupProgress message, but there is no running report. " << std::endl;
+                continue;
+              }
+
+              (*cleanupreport)->progress( prog.amount() );
+
+            } else if (  mName == "zypp.proto.target.TransBegin" ) {
+              finalizeCurrentReport();
+
+              zpt::TransBegin beg;
+              if ( !beg.ParseFromString( m.value() ) ) {
+                ERR << "Failed to parse " << m.messagetypename() << " message from zypp-rpm." << std::endl;
+                continue;
+              }
+
+              aboutToStartNewReport();
+              transactionreport = std::make_unique< callback::SendReport <rpm::TransactionReportSA> > ();
+              (*transactionreport)->start( beg.name() );
+            } else if (  mName == "zypp.proto.target.TransFinished" )  {
+
+              finalizeCurrentReport();
+
+            } else if (  mName == "zypp.proto.target.TransProgress" )  {
+              zpt::TransProgress prog;
+              if ( !prog.ParseFromString( m.value() ) ) {
+                ERR << "Failed to parse " << m.messagetypename() << " message from zypp-rpm." << std::endl;
+                continue;
+              }
+
+              if ( !transactionreport ) {
+                ERR << "Received a TransactionProgress message, but there is no running report. " << std::endl;
+                continue;
+              }
+
+              (*transactionreport)->progress( prog.amount() );
+            } else if ( mName == "zypp.proto.target.TransactionError" ) {
+
+              zpt::TransactionError error;
+              if ( !error.ParseFromString( m.value() ) ) {
+                ERR << "Failed to parse " << m.messagetypename() << " message from zypp-rpm." << std::endl;
+                continue;
+              }
+
+              // this value is checked later
+              transactionError = std::move(error);
+
+            } else {
+              ERR << "Received unexpected message from zypp-rpm: "<< m.messagetypename() << ", ignoring" << std::endl;
+              return;
+            }
+
+          }
+        };
+        msgSource->connectFunc( &zyppng::AsyncDataSource::sigReadyRead, processMessages );
+
+        // track the childs lifetime
+        int zyppRpmExitCode = -1;
+        prog->connectFunc( &zyppng::Process::sigFinished, [&]( int code ){
+          zyppRpmExitCode = code;
+          loop->quit();
+        });
+
+        if ( !prog->start( argv ) ) {
+          HistoryLog().comment( "Commit was aborted, failed to run zypp-rpm" );
+          ZYPP_THROW( target::rpm::RpmSubprocessException( prog->execError() ) );
+        }
+
+        loop->run();
+
+        // make sure to read ALL available messages
+        processMessages();
+
+        // we will not receive a new start message , so we need to manually finalize the last report
+        finalizeCurrentReport();
+
+        // make sure to read all data from the log source
+        bool readMsgs = false;
+        while( prog->stderrDevice()->canReadLine() ) {
+          readMsgs = true;
+          MIL << "zypp-rpm: " << prog->stderrDevice()->readLine().asStringView();
+        }
+        while( prog->stdoutDevice()->canReadLine() ) {
+          readMsgs = true;
+          MIL << "zypp-rpm: " << prog->stdoutDevice()->readLine().asStringView();
+        }
+
+        while ( scriptSource->canReadLine() ) {
+          readMsgs = true;
+          MIL << "rpm-script-fd: " << scriptSource->readLine().asStringView();
+        }
+        if ( scriptSource->bytesAvailable() > 0 ) {
+          readMsgs = true;
+          MIL << "rpm-script-fd: " << scriptSource->readAll().asStringView();
+        }
+        if ( readMsgs )
+          MIL << std::endl;
+
+        switch ( zyppRpmExitCode ) {
+          // we need to look at the summary, handle finishedwitherrors like no error here
+          case zypprpm::NoError:
+          case zypprpm::RpmFinishedWithError:
+            break;
+          case zypprpm::RpmFinishedWithTransactionError: {
+            // here zypp-rpm sent us a error description
+            if ( transactionError ) {
+
+              std::ostringstream sstr;
+              sstr << _("Executing the transaction failed because of the following problems:") << "\n";
+              for ( const auto & err : transactionError->problems() ) {
+                sstr << "    " << err.message() << "\n";
+              }
+              sstr << std::endl;
+              ZYPP_THROW( rpm::RpmTransactionFailedException( sstr.str() ) );
+
+            } else {
+              ZYPP_THROW( rpm::RpmTransactionFailedException("RPM failed with a unexpected error, check the logs for more informations.") );
+            }
+            break;
+          }
+          case zypprpm::FailedToOpenDb:
+            ZYPP_THROW( rpm::RpmDbOpenException( rpm().root(), rpm().dbPath() ) );
+            break;
+          case zypprpm::WrongHeaderSize:
+          case zypprpm::WrongMessageFormat:
+            ZYPP_THROW( rpm::RpmSubprocessException("Failed to communicate with zypp-rpm, this is most likely a bug. Consider to fall back to legacy transaction strategy.") );
+            break;
+          case zypprpm::RpmInitFailed:
+            ZYPP_THROW( rpm::RpmInitException( rpm().root(), rpm().dbPath() ) );
+            break;
+          case zypprpm::FailedToReadPackage:
+            ZYPP_THROW( rpm::RpmSubprocessException("zypp-rpm was unable to read a package, check the logs for more informations.") );
+            break;
+          case zypprpm::FailedToAddStepToTransaction:
+            ZYPP_THROW( rpm::RpmSubprocessException("zypp-rpm failed to build the transaction, check the logs for more informations.") );
+            break;
+        }
+
+        for( int stepId = 0; (ZYppCommitResult::TransactionStepList::size_type)stepId < steps.size() && !abort ; stepId++ ) {
+          auto &step = steps[stepId];
+          PoolItem citem( step );
+
+          if ( step.stepStage() == sat::Transaction::STEP_TODO ) {
+            // other resolvables (non-Package) that are not handled by zypp-rpm
+            if ( !citem->isKind<Package>() && !policy_r.dryRun() ) {
+              // Status is changed as the buddy package buddy
+              // gets installed/deleted. Handle non-buddies only.
+              if ( ! citem.buddy() && citem->isKind<Product>() ) {
+                Product::constPtr p = citem->asKind<Product>();
+
+                if ( citem.status().isToBeInstalled() ) {
+                  ERR << "Can't install orphan product without release-package! " << citem << endl;
+                } else {
+                  // Deleting the corresponding product entry is all we con do.
+                  // So the product will no longer be visible as installed.
+                  std::string referenceFilename( p->referenceFilename() );
+
+                  if ( referenceFilename.empty() ) {
+                    ERR << "Can't remove orphan product without 'referenceFilename'! " << citem << endl;
+                  } else {
+                    Pathname referencePath { Pathname("/etc/products.d") / referenceFilename };        // no root prefix for rpmdb lookup!
+
+                    if ( ! rpm().hasFile( referencePath.asString() ) ) {
+                      // If it's not owned by a package, we can delete it.
+                      referencePath = Pathname::assertprefix( _root, referencePath );  // now add a root prefix
+                      if ( filesystem::unlink( referencePath ) != 0 )
+                        ERR << "Delete orphan product failed: " << referencePath << endl;
+                    } else {
+                      WAR << "Won't remove orphan product: '/etc/products.d/" << referenceFilename << "' is owned by a package." << endl;
+                    }
+                  }
+                }
+                citem.status().resetTransact( ResStatus::USER );
+                step.stepStage( sat::Transaction::STEP_DONE );
+              }
+            }
+          }
+        }
+      }
+
+      // Check presence of update scripts/messages. If aborting,
+      // at least log omitted scripts.
+      if ( ! successfullyInstalledPackages.empty() )
+      {
+        if ( ! RunUpdateScripts( _root, ZConfig::instance().update_scriptsPath(),
+               successfullyInstalledPackages, abort ) )
+        {
+          WAR << "Commit aborted by the user" << endl;
+          abort = true;
+        }
+        // send messages after scripts in case some script generates output,
+        // that should be kept in t %ghost message file.
+        RunUpdateMessages( _root, ZConfig::instance().update_messagesPath(),
+          successfullyInstalledPackages,
+          result_r );
+      }
+
+      // jsc#SLE-5116: Log patch status changes to history
+      // NOTE: Should be the last action as it may need to reload
+      // the Target in case of an incomplete transaction.
+      logPatchStatusChanges( result_r.transaction(), *this );
+
+      if ( abort ) {
+        HistoryLog().comment( "Commit was aborted." );
+        ZYPP_THROW( TargetAbortedException( ) );
+      }
+    }
+
     ///////////////////////////////////////////////////////////////////
 
     rpm::RpmDb & TargetImpl::rpm()
index 7cb085e..5cadeff 100644 (file)
@@ -22,7 +22,6 @@
 #include <zypp/ZYppCommit.h>
 
 #include <zypp/Pathname.h>
-#include <zypp/media/MediaAccess.h>
 #include <zypp/Target.h>
 #include <zypp/target/rpm/RpmDb.h>
 #include <zypp/target/TargetException.h>
@@ -212,6 +211,12 @@ namespace zypp
                   CommitPackageCache & packageCache_r,
                   ZYppCommitResult & result_r );
 
+      /** Commit ordered changes (internal helper) */
+      void commitInSingleTransaction( const ZYppCommitPolicy & policy_r,
+        CommitPackageCache & packageCache_r,
+        ZYppCommitResult & result_r );
+
+
       /** Commit helper checking for file conflicts after download. */
       void commitFindFileConflicts( const ZYppCommitPolicy & policy_r, ZYppCommitResult & result_r );
     protected:
index d1ff771..9fb3b60 100644 (file)
@@ -342,6 +342,28 @@ int BinHeader::int_val( tag tag_r ) const
   return 0;
 }
 
+ByteArray BinHeader::blob_val( tag tag_r ) const
+{
+  if ( !empty() )
+  {
+    HeaderEntryGetter headerget( _h, tag_r );
+
+    if ( headerget.val() )
+    {
+      switch ( headerget.type() )
+      {
+        case RPM_NULL_TYPE:
+          return {};
+        case RPM_BIN_TYPE:
+          return ByteArray( reinterpret_cast<char *>( headerget.val() ), headerget.cnt() );
+        default:
+          INT << "RPM_TAG MISSMATCH: RPM_BIN_TYPE " << tag_r << " got type " << headerget.type() << endl;
+      }
+    }
+  }
+  return {};
+}
+
 ///////////////////////////////////////////////////////////////////
 //
 //
@@ -382,6 +404,11 @@ std::string BinHeader::format(const char *fmt) const
   return std::string(form);
 }
 
+Header BinHeader::get() const
+{
+  return _h;
+}
+
 ///////////////////////////////////////////////////////////////////
 //
 //
index b3cccd2..a62885f 100644 (file)
@@ -26,6 +26,7 @@ extern "C"
 #include <zypp/base/NonCopyable.h>
 #include <zypp/base/PtrTypes.h>
 #include <zypp/target/rpm/librpm.h>
+#include <zypp-core/ByteArray.h>
 
 namespace zypp
 {
@@ -87,9 +88,13 @@ public:
 
   int int_val( tag tag_r ) const;
 
+  ByteArray blob_val ( tag tag_r ) const;
+
   std::string string_val( tag tag_r ) const;
   std::string format ( const char * fmt) const;
 
+  Header get() const;
+
 public:
 
   std::list<std::string> stringList_val( tag tag_r ) const;
index 660fc4d..fa76a6e 100644 (file)
@@ -29,6 +29,7 @@ extern "C"
 #include <vector>
 #include <algorithm>
 
+#include <zypp-core/base/StringV.h>
 #include <zypp/base/Logger.h>
 #include <zypp/base/String.h>
 #include <zypp/base/Gettext.h>
@@ -49,6 +50,7 @@ extern "C"
 #include <zypp/target/rpm/RpmException.h>
 #include <zypp/TmpPath.h>
 #include <zypp/KeyRing.h>
+#include <zypp/KeyManager.h>
 #include <zypp/ZYppFactory.h>
 #include <zypp/ZConfig.h>
 #include <zypp/base/IOTools.h>
@@ -1109,42 +1111,30 @@ namespace
 {
   struct RpmlogCapture : public std::string
   {
-    RpmlogCapture()
-    { rpmlog()._cap = this; }
+    RpmlogCapture() : _cap(this)
+    {
+      rpmlogSetCallback( rpmLogCB, this );
+      _oldMask = rpmlogSetMask( RPMLOG_UPTO( RPMLOG_PRI(RPMLOG_INFO) ) );
+    }
 
     ~RpmlogCapture()
-    { rpmlog()._cap = nullptr; }
-
-  private:
-    struct Rpmlog
     {
-      Rpmlog()
-      : _cap( nullptr )
-      {
-       rpmlogSetCallback( rpmLogCB, this );
-       rpmSetVerbosity( RPMLOG_INFO );
-       _f = ::fopen( "/dev/null","w");
-       rpmlogSetFile( _f );
-      }
-
-      ~Rpmlog()
-      { if ( _f ) ::fclose( _f ); }
-
-      static int rpmLogCB( rpmlogRec rec_r, rpmlogCallbackData data_r )
-      { return reinterpret_cast<Rpmlog*>(data_r)->rpmLog( rec_r ); }
+      rpmlogSetCallback( nullptr, nullptr );
+      rpmlogSetMask( _oldMask );
+    }
 
-      int rpmLog( rpmlogRec rec_r )
-      {
-       if ( _cap ) (*_cap) += rpmlogRecMessage( rec_r );
-       return RPMLOG_DEFAULT;
-      }
+    static int rpmLogCB( rpmlogRec rec_r, rpmlogCallbackData data_r )
+    { return reinterpret_cast<RpmlogCapture*>(data_r)->rpmLog( rec_r ); }
 
-      FILE * _f;
-      std::string * _cap;
-    };
+    int rpmLog( rpmlogRec rec_r )
+    {
+      if ( _cap ) (*_cap) += rpmlogRecMessage( rec_r );
+      return 0;
+    }
 
-    static Rpmlog & rpmlog()
-    { static Rpmlog _rpmlog; return _rpmlog; }
+  private:
+    std::string * _cap;
+    int _oldMask = 0;
   };
 
   RpmDb::CheckPackageResult doCheckPackageSig( const Pathname & path_r,                        // rpm file to check
@@ -1173,7 +1163,7 @@ namespace
 
     rpmQVKArguments_s qva;
     memset( &qva, 0, sizeof(rpmQVKArguments_s) );
-#ifdef HAVE_NO_RPMTSSETVFYFLAGS
+#ifndef HAVE_RPM_VERIFY_TRANSACTION_STEP
     // Legacy: In rpm >= 4.15 qva_flags symbols don't exist
     // and qva_flags is not used in signature checking at all.
     qva.qva_flags = (VERIFY_DIGEST|VERIFY_SIGNATURE);
@@ -1194,14 +1184,14 @@ namespace
     //     V3 RSA/SHA256 Signature, key ID 3dbdc284: OK
     //     MD5 digest: OK (fd5259fe677a406951dcb2e9d08c4dcc)
     //
-    // TODO: try to get SIG info from the header rather than parsing the output
     std::vector<std::string> lines;
     str::split( vresult, std::back_inserter(lines), "\n" );
     unsigned count[7] = { 0, 0, 0, 0, 0, 0, 0 };
 
     for ( unsigned i = 1; i < lines.size(); ++i )
     {
-      std::string & line( lines[i] );
+      std::string &line( lines[i] );
+
       RpmDb::CheckPackageResult lineres = RpmDb::CHK_ERROR;
       if ( line.find( ": OK" ) != std::string::npos )
       {
@@ -1250,6 +1240,59 @@ namespace
 
     if ( ret != RpmDb::CHK_OK )
     {
+
+      bool didReadHeader = false;
+      std::unordered_map< std::string, std::string> fprs;
+
+      // we replace the data only if the key IDs are actually only 8 bytes
+      str::regex rxexpr( "key ID ([a-fA-F0-9]{8}):" );
+      for ( auto &detail : detail_r ) {
+        auto &line = detail.second;
+        str::smatch what;
+        if ( str::regex_match( line, what, rxexpr ) ) {
+
+          if ( !didReadHeader ) {
+            didReadHeader = true;
+
+            // Get signature info from the package header, RPM always prints only the 8 byte ID
+            auto header = RpmHeader::readPackage( path_r, RpmHeader::NOVERIFY );
+            if ( header ) {
+              auto keyMgr = zypp::KeyManagerCtx::createForOpenPGP();
+              const auto &addFprs = [&]( auto tag ){
+                const auto &list1 = keyMgr.readSignatureFingerprints( header->blob_val( tag ) );
+                for ( const auto &id : list1 ) {
+                  if ( id.size() <= 8 )
+                    continue;
+
+                  const auto &lowerId = str::toLower( id );
+                  fprs.insert( std::make_pair( lowerId.substr( lowerId.size() - 8 ), lowerId ) );
+                }
+              };
+
+              addFprs( RPMTAG_SIGGPG );
+              addFprs( RPMTAG_SIGPGP );
+              addFprs( RPMTAG_RSAHEADER );
+              addFprs( RPMTAG_DSAHEADER );
+
+            } else {
+              ERR << "Failed to read package signatures." << std::endl;
+            }
+          }
+
+          // if we have no keys we can substiture we can leave the loop right away
+          if ( !fprs.size() )
+            break;
+
+          {
+            // replace the short key ID with the long ones parsed from the header
+            const auto &keyId = str::toLower( what[1] );
+            if ( const auto &i = fprs.find( keyId ); i != fprs.end() ) {
+              str::replaceAll( line, keyId, i->second );
+            }
+          }
+        }
+      }
+
       WAR << path_r << " (" << requireGPGSig_r << " -> " << ret << ")" << endl;
       WAR << vresult;
     }
@@ -1332,7 +1375,6 @@ RpmDb::queryChangedFiles(FileList & fileList, const std::string& packageName)
 }
 
 
-
 /****************************************************************/
 /* private member-functions                                    */
 /****************************************************************/
@@ -1605,7 +1647,6 @@ void RpmDb::doInstallPackage( const Pathname & filename, RpmInstFlags flags, cal
 
   MIL << "RpmDb::installPackage(" << filename << "," << flags << ")" << endl;
 
-
   // backup
   if ( _packagebackups )
   {
index 3a44f96..7668d72 100644 (file)
@@ -75,6 +75,11 @@ std::ostream & RpmNullDatabaseException::dumpOn( std::ostream & str) const
   return str << "NULL rpmV4 database passed as argument!";
 }
 
+std::ostream &RpmTransactionFailedException::dumpOn(std::ostream &str) const
+{
+  return str << _errmsg;
+}
+
 /////////////////////////////////////////////////////////////////
 } // namespace rpm
 } // namespace target
index a60e6e9..e975b86 100644 (file)
@@ -239,6 +239,21 @@ protected:
 private:
 };
 
+class RpmTransactionFailedException : public RpmException
+{
+public:
+  RpmTransactionFailedException(const std::string & errmsg_r)
+    : RpmException()
+    , _errmsg(errmsg_r)
+  {}
+  virtual ~RpmTransactionFailedException() throw()
+    {};
+protected:
+  virtual std::ostream & dumpOn( std::ostream & str ) const;
+private:
+  std::string _errmsg;
+};
+
 
 
 /////////////////////////////////////////////////////////////////
index a7c39d2..4cf83c8 100644 (file)
@@ -36,18 +36,20 @@ namespace zypp
        */
       enum RpmInstFlag
       {
-        RPMINST_NONE       = 0x0000,
-        RPMINST_EXCLUDEDOCS= 0x0001,
-        RPMINST_NOSCRIPTS  = 0x0002,
-        RPMINST_FORCE      = 0x0004,
-        RPMINST_NODEPS     = 0x0008,
-        RPMINST_IGNORESIZE = 0x0010,
-        RPMINST_JUSTDB     = 0x0020,
-        RPMINST_NODIGEST   = 0x0040,
-        RPMINST_NOSIGNATURE= 0x0080,
-        RPMINST_NOUPGRADE  = 0x0100,
-        RPMINST_TEST      = 0x0200,
-       RPMINST_NOPOSTTRANS= 0x0400
+        RPMINST_NONE          = 0x0000,
+        RPMINST_EXCLUDEDOCS   = 0x0001,
+        RPMINST_NOSCRIPTS     = 0x0002,
+        RPMINST_FORCE         = 0x0004,
+        RPMINST_NODEPS        = 0x0008,
+        RPMINST_IGNORESIZE    = 0x0010,
+        RPMINST_JUSTDB        = 0x0020,
+        RPMINST_NODIGEST      = 0x0040,
+        RPMINST_NOSIGNATURE   = 0x0080,
+        RPMINST_NOUPGRADE     = 0x0100,
+        RPMINST_TEST          = 0x0200,
+       RPMINST_NOPOSTTRANS   = 0x0400,
+        RPMINST_ALLOWDOWNGRADE= 0x0800,
+        RPMINST_REPLACEFILES  = 0x1000
       };
 
       /** \relates RpmInstFlag Type-safe way of storing OR-combinations. */
index e5b5c73..c21996e 100644 (file)
@@ -11,6 +11,8 @@
 */
 #include "librpm.h"
 
+#include <zypp/AutoDispose.h>
+
 ////////////////////////////////////////////////////////////////////
 // unameToUid and gnameToGid are shamelessly stolen from rpm-4.4.
 // (rpmio/ugid.c) Those functions were dropped in RPM_4_7
@@ -208,11 +210,26 @@ RpmHeader::~RpmHeader()
 RpmHeader::constPtr RpmHeader::readPackage( const Pathname & path_r,
                                             VERIFICATION verification_r )
 {
+
+  librpmDb::globalInit();
+  zypp::AutoDispose<rpmts> ts ( ::rpmtsCreate(), ::rpmtsFree );
+  unsigned vsflag = RPMVSF_DEFAULT;
+  if ( verification_r & NODIGEST )
+    vsflag |= _RPMVSF_NODIGESTS;
+  if ( verification_r & NOSIGNATURE )
+    vsflag |= _RPMVSF_NOSIGNATURES;
+  ::rpmtsSetVSFlags( ts, rpmVSFlags(vsflag) );
+
+  return readPackage( ts, path_r ).first;
+}
+
+std::pair<RpmHeader::Ptr, int> RpmHeader::readPackage( rpmts ts_r, const zypp::filesystem::Pathname &path_r )
+{
   PathInfo file( path_r );
   if ( ! file.isFile() )
   {
     ERR << "Not a file: " << file << endl;
-    return (RpmHeader*)0;
+    return std::make_pair( RpmHeader::Ptr(), -1 );
   }
 
   FD_t fd = ::Fopen( file.asString().c_str(), "r.ufdio" );
@@ -221,36 +238,24 @@ RpmHeader::constPtr RpmHeader::readPackage( const Pathname & path_r,
     ERR << "Can't open file for reading: " << file << " (" << ::Fstrerror(fd) << ")" << endl;
     if ( fd )
       ::Fclose( fd );
-    return (RpmHeader*)0;
+    return std::make_pair( RpmHeader::Ptr(), -1 );
   }
 
-  librpmDb::globalInit();
-  rpmts ts = ::rpmtsCreate();
-  unsigned vsflag = RPMVSF_DEFAULT;
-  if ( verification_r & NODIGEST )
-    vsflag |= _RPMVSF_NODIGESTS;
-  if ( verification_r & NOSIGNATURE )
-    vsflag |= _RPMVSF_NOSIGNATURES;
-  ::rpmtsSetVSFlags( ts, rpmVSFlags(vsflag) );
-
   Header nh = 0;
-  int res = ::rpmReadPackageFile( ts, fd, path_r.asString().c_str(), &nh );
-
-  ts = rpmtsFree(ts);
-
+  int res = ::rpmReadPackageFile( ts_r, fd, path_r.asString().c_str(), &nh );
   ::Fclose( fd );
 
   if ( ! nh )
   {
     WAR << "Error reading header from " << path_r << " error(" << res << ")" << endl;
-    return (RpmHeader*)0;
+    return std::make_pair( RpmHeader::Ptr(), res );
   }
 
-  RpmHeader::constPtr h( new RpmHeader( nh ) );
+  RpmHeader::Ptr h( new RpmHeader( nh ) );
   headerFree( nh ); // clear the reference set in ReadPackageFile
 
   MIL << h << " from " << path_r << endl;
-  return h;
+  return std::make_pair( h, res );
 }
 
 ///////////////////////////////////////////////////////////////////
index cfa35f9..7620eef 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <iosfwd>
 #include <list>
+#include <utility>
 
 #include <zypp/target/rpm/BinHeader.h>
 
@@ -201,6 +202,12 @@ public:
    **/
   static RpmHeader::constPtr readPackage( const Pathname & path,
                                           VERIFICATION verification = VERIFY );
+
+  /**
+   * Get an accessible packages data from disk using a existing transaction.
+   * Returns a std::pair container the header and resultcode from reading it
+   **/
+  static std::pair<RpmHeader::Ptr, int> readPackage( rpmts ts_r, const Pathname & path_r );
 };
 
 ///////////////////////////////////////////////////////////////////
index b08ce97..5616e43 100644 (file)
@@ -18,7 +18,6 @@
 #include <zypp/base/NonCopyable.h>
 #include <zypp/base/PtrTypes.h>
 #include <zypp/PathInfo.h>
-#include <zypp/Package.h>
 #include <zypp/target/rpm/RpmHeader.h>
 #include <zypp/target/rpm/RpmException.h>
 
index 9c96678..c27d26f 100644 (file)
@@ -1,1103 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/**
- * \file zypp/url/UrlBase.h
- */
-#ifndef   ZYPP_URL_URLBASE_H
-#define   ZYPP_URL_URLBASE_H
-
-#include <zypp/url/UrlUtils.h>
-#include <zypp/base/PtrTypes.h>
-
-
-//////////////////////////////////////////////////////////////////////
-namespace zypp
-{ ////////////////////////////////////////////////////////////////////
-
-  ////////////////////////////////////////////////////////////////////
-  namespace url
-  { //////////////////////////////////////////////////////////////////
-
-
-    // ---------------------------------------------------------------
-    /**
-     * Url::asString() view options.
-     *
-     * A instance of this class represents a bit-wise combination
-     * of view option constants.
-     *
-     * It provides ViewOption::operator+() and ViewOption::operator-()
-     * to modify a view option combination and a ViewOption::has()
-     * method, to check if a specified option is enabled or not.
-     */
-    struct ViewOption
-    {
-      /** @{ */
-      /**
-       * Option to include scheme name in the URL string.
-       *
-       * Disabling this option causes, that the URL string
-       * contains the path, query and fragment components
-       * only, for example just "/foo/bar.txt".
-       *
-       * This option is \b enabled by default.
-       */
-      static const ViewOption WITH_SCHEME;
-      /**
-       * Option to include username in the URL string.
-       *
-       * This option depends on a enabled WITH_SCHEME and
-       * WITH_HOST options and is \b enabled by default.
-       */
-      static const ViewOption WITH_USERNAME;
-      /**
-       * Option to include password in the URL string.
-       *
-       * This option depends on a enabled WITH_SCHEME,
-       * WITH_HOST and WITH_USERNAME options and is
-       * \b disabled by default, causing to hide the
-       * password in the URL authority.
-       */
-      static const ViewOption WITH_PASSWORD;
-      /**
-       * Option to include hostname in the URL string.
-       *
-       * This option depends on a enabled WITH_SCHEME
-       * option and is \b enabled by default.
-       */
-      static const ViewOption WITH_HOST;
-      /**
-       * Option to include port number in the URL string.
-       *
-       * This option depends on a enabled WITH_SCHEME and
-       * WITH_HOST options and is \b enabled by default.
-       */
-      static const ViewOption WITH_PORT;
-      /**
-       * Option to include path name in the URL string.
-       *
-       * This option is \b enabled by default.
-       */
-      static const ViewOption WITH_PATH_NAME;
-      /**
-       * Option to include path parameters in the URL string.
-       *
-       * This option depends on a enabled WITH_PATH_NAME
-       * option and is \b disabled by default, causing to
-       * hide the path parameters.
-       */
-      static const ViewOption WITH_PATH_PARAMS;
-      /**
-       * Option to include query string in the URL string.
-       *
-       * This option is \b enabled by default.
-       */
-      static const ViewOption WITH_QUERY_STR;
-      /**
-       * Option to include fragment string in the URL string.
-       *
-       * This option is \b enabled by default.
-       */
-      static const ViewOption WITH_FRAGMENT;
-      /** @} */
-
-      /** @{ */
-      /**
-       * Explicitely include the URL authority separator "//".
-       *
-       * It causes, that the URL string includes an empty URL
-       * authority, for example:
-       * "file:///foo.txt" instead of just "file:/foo.txt".
-       *
-       * This option depends on a enabled WITH_SCHEME view
-       * option and is enabled by default.
-       */
-      static const ViewOption EMPTY_AUTHORITY;
-      /**
-       * Explicitely include the "/" path character.
-       *
-       * It causes, that a "/" is added to the Url if the path
-       * name is empty, for example:
-       *
-       * "http://localhost/" instead of just "http://localhost".
-       *
-       * This option depends on a enabled WITH_PATH_NAME view
-       * option and is enabled by default.
-       */
-      static const ViewOption EMPTY_PATH_NAME;
-      /**
-       * Explicitely include the path parameters separator ";".
-       *
-       * It causes, that the URL allways contains the ";" path
-       * parameters separator.
-       *
-       * This option depends on a enabled EMPTY_PATH_NAME view
-       * option and is disabled by default.
-       */
-      static const ViewOption EMPTY_PATH_PARAMS;
-      /**
-       * Explicitely include the query string separator "?".
-       *
-       * It causes, that if the query string is requested using
-       * the WITH_QUERY_STR option, the URL allways contains the
-       * "?" query string separator, even if the query string is
-       * empty.
-       * This option depends on a enabled WITH_QUERY_STR view
-       * option and is disabled by default.
-       */
-      static const ViewOption EMPTY_QUERY_STR;
-      /**
-       * Explicitely include the fragment string separator "#".
-       *
-       * It causes, that if the fragment string is requested using
-       * the WITH_FRAGMENT option, the URL allways contains the "#"
-       * fragment string separator, even if the fragment string is
-       * empty. 
-       * This option depends on a enabled WITH_FRAGMENT view
-       * option and is disabled by default.
-       */
-      static const ViewOption EMPTY_FRAGMENT;
-      /** @} */
-
-      /** @{ */
-      /**
-       * Default combination of view options.
-       *
-       * By default, following view options are enabled:
-       *   WITH_SCHEME,    WITH_USERNAME,    WITH_HOST,
-       *   WITH_PORT,      WITH_PATH_NAME,   WITH_QUERY_STR,
-       *   WITH_FRAGMENT,  EMPTY_AUTHORITY,  EMPTY_PATH_NAME.
-       */
-      static const ViewOption DEFAULTS;
-      /** @} */
-
-
-      /**
-       * Create instance with default combination of view options.
-       */
-      ViewOption();
-
-
-      /**
-       * Adds \p l and \p r to a new option combination.
-       *
-       * @return The new option combination.
-       */
-      friend inline ViewOption
-      operator + (const ViewOption &l, const ViewOption &r)
-      {
-        return ViewOption(l.opt |  r.opt);
-      }
-
-      /**
-       * Substract \p r from \p l to a new option combination.
-       *
-       * @return The new option combination.
-       */
-      friend inline ViewOption
-      operator - (const ViewOption &l, const ViewOption &r)
-      {
-        return ViewOption(l.opt & ~r.opt);
-      }
-
-      /**
-       * Assign specified option combination \p o to the current object.
-       *
-       * \param o   The option or option combination to make a copy of.
-       * \return A reference to this option combination.
-       */
-      inline ViewOption &
-      operator = (const ViewOption &o)
-      {
-        opt = o.opt; return *this;
-      }
-
-      /**
-       * Check if specified option \p o is set in the current object.
-       * \param o    A view option constant.
-       * \return True, if specified option \p o is
-       *               set/enabled in the instance.
-       */
-      inline bool
-      has(const ViewOption &o) const
-      {
-        return o.opt & opt;
-      }
-
-      static const ViewOption hotfix1050625;
-    private:
-      ViewOption(int option);
-      int opt;
-    };
-
-
-    // ---------------------------------------------------------------
-    /**
-     * ViewOptions is just an alias for ViewOption.
-     */
-    typedef ViewOption                           ViewOptions;
-
-
-    // ---------------------------------------------------------------
-    /**
-     * Vector of URL scheme names.
-     */
-    typedef std::vector<std::string>             UrlSchemes;
-
-
-    // ---------------------------------------------------------------
-    /**
-     * Forward declaration of internal UrlBase data.
-     */
-    class UrlBaseData;
-
-
-    // ---------------------------------------------------------------
-    /**
-     * \brief Generic Url base class.
-     *
-     * The UrlBase class implements default behaviour for URL
-     * manipulations and a base for implementation of scheme-
-     * specialized URLs for the Url class.
-     *
-     */
-    class UrlBase
-    {
-    public:
-
-      virtual
-      ~UrlBase();
-
-      UrlBase();
-
-      /**
-       * Create a new Url object as copy of the given one.
-       * \param url The Url object to make a copy of.
-       */
-      UrlBase(const UrlBase &url);
-
-      /**
-       * \brief Construct new object and initializes it with
-       *        specified URL components.
-       *
-       * \param scheme    The scheme name.
-       * \param authority The encoded authority component data.
-       * \param pathdata  The encoded path component data.
-       * \param querystr  The encoded query string component.
-       * \param fragment  The encoded fragment string component.
-       * \throws UrlNotAllowedException if one of the components
-       *         is not allowed for the scheme.
-       * \throws UrlBadComponentException if one of the components
-       *         contains an invalid character.
-       */
-      UrlBase(const std::string &scheme,
-              const std::string &authority,
-              const std::string &pathdata,
-              const std::string &querystr,
-              const std::string &fragment);
-
-
-      // -----------------
-      /**
-       * \brief Clears all data in the object.
-       */
-      virtual void
-      clear();
-
-      /**
-       * Returns pointer to a copy of the current object.
-       *
-       * Should be reimplemented by all derived object using
-       * the copy constructor of the derived class, e.g.:
-       * \code
-       *   return new MyUrlDerivedFromUrlBase(*this);
-       * \endcode
-       *
-       * \return A pointer to a copy of the current object.
-       */
-      virtual UrlBase *
-      clone() const;
-
-      /**
-       * \brief Initializes current object with new URL components.
-       *
-       * \param scheme    The scheme name.
-       * \param authority The encoded authority component data.
-       * \param pathdata  The encoded path component data.
-       * \param querystr  The encoded query string component.
-       * \param fragment  The encoded fragment string component.
-       * \throws UrlNotAllowedException if one of the components
-       *         is not allowed in the scheme.
-       * \throws UrlBadComponentException if one of the components
-       *         contains an invalid character.
-       */
-      virtual void
-      init(const std::string &scheme,
-           const std::string &authority,
-           const std::string &pathdata,
-           const std::string &querystr,
-           const std::string &fragment);
-
-
-      // -----------------
-      /**
-       * \brief Returns scheme names known by this object.
-       *
-       * This method is used in the isValidScheme() method and
-       * is intended to be reimplemented by derived classes to
-       * return the scheme names it implements (is restricted
-       * or compatible to).
-       *
-       * For example, if your derived class implements special
-       * features of LDAP URLs, this method may return "ldap"
-       * and "ldaps" scheme names.
-       *
-       * The UrlBase class returns an empty vector, that signals
-       * that it is useable with all URLs.
-       *
-       * \return A vector with scheme names known by this object.
-       */
-      virtual UrlSchemes
-      getKnownSchemes() const;
-
-      /**
-       * \brief Returns if scheme name is known to this object.
-       * \return True, if scheme name is known to this object.
-       */
-      virtual bool
-      isKnownScheme(const std::string &scheme) const;
-
-
-      /**
-       * \brief Verifies specified scheme name.
-       *
-       * Verifies the generic syntax of the specified \p scheme name
-       * and if it is contained in the current object's list of known
-       * schemes (see getKnownSchemes()) if the list is not empty (as
-       * in the UrlBase class).
-       *
-       * \param  scheme The scheme name to verify.
-       * \return True, if generic scheme name syntax is valid and
-       *         the scheme name is known to the current object.
-       */
-      virtual bool
-      isValidScheme(const std::string &scheme) const;
-
-      /**
-       * \brief Verifies the Url.
-       *
-       * Verifies if the current object contains a non-empty scheme
-       * name. Additional semantical URL checks may be performed by
-       * derived UrlBase-objects.
-       *
-       * \return True, if the Url seems to be valid.
-       */
-      virtual bool
-      isValid() const;
-
-
-      // -----------------
-      /**
-       * Returns a default string representation of the Url object.
-       *
-       * By default, a password in the URL will be hidden.
-       *
-       * \return A default string representation of the Url object.
-       */
-      virtual std::string
-      asString() const;
-
-      /**
-       * Returns a string representation of the Url object.
-       *
-       * To include a password in the resulting Url string, use:
-       * \code
-       *    url.asString(url.getViewOptions() +
-       *                 url::ViewOptions::WITH_PASSWORD);
-       * \endcode
-       *
-       * \param opts  A combination of view options.
-       * \return A string representation of the Url object. 
-       */
-      virtual std::string
-      asString(const zypp::url::ViewOptions &opts) const;
-
-
-      // -----------------
-      /**
-       * Returns the scheme name of the URL.
-       * \return Scheme name of the current Url object.
-       */
-      virtual std::string
-      getScheme() const;
-
-
-      // -----------------
-      /**
-       * Returns the encoded authority component of the URL.
-       *
-       * The returned authority string does not contain the leading
-       * "//" separator characters, but just its "user:pass@host:port"
-       * content only.
-       *
-       * \return The encoded authority component string.
-       */
-      virtual std::string
-      getAuthority() const;
-
-      /**
-       * Returns the username from the URL authority.
-       * \param eflag Flag if the usename should be percent-decoded or not.
-       * \return The username sub-component from the URL authority.
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual std::string
-      getUsername(EEncoding eflag) const;
-
-      /**
-       * Returns the password from the URL authority.
-       * \param eflag Flag if the password should be percent-decoded or not.
-       * \return The password sub-component from the URL authority.
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual std::string
-      getPassword(EEncoding eflag) const;
-
-      /**
-       * Returns the hostname or IP from the URL authority.
-       *
-       * In case the Url contains an IPv6 number, it is be surrounded
-       * by "[" and "]" characters, for example "[::1]" for an IPv6
-       * localhost address.
-       *
-       * \param eflag Flag if the host should be percent-decoded or not.
-       * \return The host sub-component from the URL authority.
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual std::string
-      getHost(EEncoding eflag) const;
-
-      /**
-       * Returns the port number from the URL authority.
-       * \return The port sub-component from the URL authority.
-       */
-      virtual std::string
-      getPort() const;
-
-
-      // -----------------
-      /**
-       * Returns the encoded path component of the URL.
-       *
-       * The path data contains the path name, optionally
-       * followed by path parameters separated with a ";"
-       * character, for example "/foo/bar;version=1.1".
-       *
-       * \return The encoded path component of the URL.
-       */
-      virtual std::string
-      getPathData() const;
-
-      /**
-       * Returns the path name from the URL.
-       * \param eflag Flag if the path should be decoded or not.
-       * \return The path name sub-component without path parameters
-       *         from path data component of the URL.
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual std::string
-      getPathName(EEncoding eflag) const;
-
-      /**
-       * Returns the encoded path parameters from the URL.
-       * \return The encoded path parameters from the URL.
-       */
-      virtual std::string
-      getPathParams() const;
-
-      /**
-       * Returns a vector with encoded path parameter substrings.
-       *
-       * The default path parameter separator is the \c ',' character.
-       * A schema specific object may overide the default separators.
-       *
-       * For example, the path parameters string "foo=1,bar=2" is splited
-       * by default into a vector containing the substrings "foo=1" and
-       * "bar=2".
-       *
-       * \return The encoded path parameters vector.
-       */
-      virtual zypp::url::ParamVec
-      getPathParamsVec() const;
-
-      /**
-       * Returns a string map with path parameter keys and values.
-       *
-       * The default path parameter separator is the \c ',' character,
-       * the default key/value separator for the path parameters is
-       * the \c '=' character.
-       * A schema specific object may overide the default separators.
-       *
-       * For example, the path parameters string "foo=1,bar=2" is splited
-       * into a map containing "foo" = "1" and "bar" = "2" by default.
-       *
-       * \param eflag Flag if the path parameter keys and values should
-       *               be decoded or not.
-       * \return The path parameters key and values as a string map.
-       * \throws UrlNotSupportedException if parameter parsing
-       *         is not supported for a URL (scheme).
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual zypp::url::ParamMap
-      getPathParamsMap(EEncoding eflag) const;
-
-      /**
-       * Return the value for the specified path parameter.
-       *
-       * For example, if the path parameters string is "foo=1,bar=2"
-       * the method will return the substring "1" for the param key
-       * "foo" and "2" for the param key "bar".
-       *
-       * \param param The path parameter key.
-       * \param eflag Flag if the path parameter keys and values should
-       *              be decoded or not.
-       * \return The value for the path parameter key or empty string.
-       * \throws UrlNotSupportedException if parameter parsing
-       *         is not supported for a URL (scheme).
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual std::string
-      getPathParam(const std::string &param, EEncoding eflag) const;
-
-
-      // -----------------
-      /**
-       * Returns the encoded query string component of the URL.
-       *
-       * The query string is returned without first "?" (separator)
-       * character. Further "?" characters as in e.g. LDAP URLs
-       * remains in the returned string.
-       *
-       * \return The encoded query string component of the URL.
-       */
-      virtual std::string
-      getQueryString() const;
-
-      /** \overload Returns the safe query string (passwds stripped) unless WITH_PASSWORD is set. */
-      virtual std::string
-      getQueryString( const ViewOptions & viewopts_r ) const;
-
-      /**
-       * Returns a vector with query string parameter substrings.
-       *
-       * The default query string parameter separator is the \c '&'
-       * character.
-       * A schema specific object may overide the default separators.
-       *
-       * For example, the query string "foo=1&bar=2" is splited by
-       * default into a vector containing the substrings "foo=1" and
-       * "bar=2".
-       *
-       * \return The query string splited into a vector of substrings.
-       */
-      virtual zypp::url::ParamVec
-      getQueryStringVec() const;
-
-      /**
-       * Returns a string map with query parameter and their values.
-       *
-       * The default query string parameter separator is the \c ','
-       * character, the default key/value separator the \c '=' character.
-       * A schema specific object may overide the default separators.
-       *
-       * For example, the query string "foo=1&bar=2" is splited by
-       * default into a map containing "foo" = "1" and "bar" = "2".
-       *
-       * \param eflag Flag if the query string keys and values should
-       *               be decoded or not.
-       * \return The query string as a key/value string map.
-       * \throws UrlNotSupportedException if parameter parsing
-       *         is not supported for a URL (scheme).
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual zypp::url::ParamMap
-      getQueryStringMap(EEncoding eflag) const;
-
-      /**
-       * Return the value for the specified query parameter.
-       *
-       * For example, if the query string is "foo=1,bar=2" the method
-       * will return the substring "1" for the param key "foo" and
-       * "2" for the param key "bar".
-       *
-       * \param param The query parameter key.
-       * \param eflag Flag if the query parameter keys and values should
-       *              be decoded or not.
-       * \return The value for the query parameter key or empty string.
-       * \throws UrlNotSupportedException if parameter parsing
-       *         is not supported for a URL (scheme).
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual std::string
-      getQueryParam(const std::string &param, EEncoding eflag) const;
-
-
-      // -----------------
-      /**
-       * Returns the encoded fragment component of the URL.
-       * \param eflag Flag if the fragment should be percent-decoded or not.
-       * \return The encoded fragment component of the URL.
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual std::string
-      getFragment(EEncoding eflag) const;
-
-
-      // -----------------
-      /**
-       * \brief Set the scheme name in the URL.
-       * \param scheme The new scheme name.
-       * \throws UrlBadComponentException if the \p scheme
-       *         contains an invalid character or is empty.
-       */
-      virtual void
-      setScheme(const std::string &scheme);
-
-
-      // -----------------
-      /**
-       * \brief Set the authority component in the URL.
-       *
-       * The \p authority string shoud not contain any leading
-       * "//" separator characters (just "user:pass@host:port").
-       *
-       * \param authority The authority component string.
-       * \throws UrlNotAllowedException if the \p authority
-       *         has to be empty in for the current scheme.
-       * \throws UrlBadComponentException if the \p authority
-       *         contains an invalid character.
-       * \throws UrlParsingException if \p authority parsing fails.
-       */
-      virtual void
-      setAuthority(const std::string &authority);
-
-      /**
-       * \brief Set the username in the URL authority.
-       * \param user  The new username.
-       * \param eflag If the \p username is encoded or not.
-       * \throws UrlNotAllowedException if the \p user
-       *         has to be empty in for the current scheme.
-       * \throws UrlBadComponentException if the \p user
-       *         contains an invalid character.
-       */
-      virtual void
-      setUsername(const std::string &user,
-                  EEncoding         eflag);
-
-      /**
-       * \brief Set the password in the URL authority.
-       * \param pass  The new password.
-       * \param eflag If the \p password is encoded or not.
-       * \throws UrlNotAllowedException if the \p pass
-       *         has to be empty in for the current scheme.
-       * \throws UrlBadComponentException if the \p pass
-       *         contains an invalid character.
-       */
-      virtual void
-      setPassword(const std::string &pass,
-                  EEncoding         eflag);
-
-      /**
-       * \brief Set the hostname or IP in the URL authority.
-       *
-       * The \p host parameter may contain a hostname, an IPv4 address
-       * in dotted-decimal form or an IPv6 address literal encapsulated
-       * within square brackets (RFC3513, Sect. 2.2).
-       *
-       * A hostname may contain national alphanumeric UTF8 characters
-       * (letters other than ASCII a-zA-Z), that will be encoded.
-       * This function allows to specify both, a encoded or decoded
-       * hostname.
-       *
-       * Other IP literals in "[v ... ]" square bracket format are not
-       * supported by the implementation in UrlBase class.
-       *
-       * \param host The new hostname or IP address.
-       * \throws UrlNotAllowedException if the \p host
-       *         has to be empty in for the current scheme.
-       * \throws UrlBadComponentException if the \p host is invalid.
-       */
-      virtual void
-      setHost(const std::string &host);
-
-      /**
-       * \brief Set the port number in the URL authority.
-       * \param port The new port number.
-       * \throws UrlNotAllowedException if the \p port
-       *         has to be empty in for the current scheme.
-       * \throws UrlBadComponentException if the \p port is invalid.
-       */
-      virtual void
-      setPort(const std::string &port);
-
-
-      // -----------------
-      /**
-       * \brief Set the path data component in the URL.
-       *
-       * By default, the \p pathdata string may include path
-       * parameters separated by the ";" separator character.
-       *
-       * \param pathdata The encoded path data component string.
-       * \throws UrlBadComponentException if the \p pathdata
-       *         contains an invalid character.
-       */
-      virtual void
-      setPathData(const std::string &pathdata);
-
-      /**
-       * \brief Set the path name.
-       * \param path  The new path name.
-       * \param eflag If the \p path name is encoded or not.
-       * \throws UrlBadComponentException if the \p path name
-       *         contains an invalid character.
-       */
-      virtual void
-      setPathName(const std::string &path,
-                  EEncoding         eflag);
-
-      /**
-       * \brief Set the path parameters.
-       * \param params The new encoded path parameter string.
-       * \throws UrlBadComponentException if the path \p params
-       *         contains an invalid character.
-       */
-      virtual void
-      setPathParams(const std::string &params);
-
-      /**
-       * \brief Set the path parameters.
-       * \param pvec The vector with encoded path parameters.
-       * \throws UrlBadComponentException if the \p pvec
-       *         contains an invalid character.
-       */
-      virtual void
-      setPathParamsVec(const zypp::url::ParamVec &pvec);
-
-      /**
-       * \brief Set the path parameters.
-       * \param pmap The map with decoded path parameters.
-       * \throws UrlNotSupportedException if parameter parsing
-       *         is not supported for a URL (scheme).
-       */
-      virtual void
-      setPathParamsMap(const zypp::url::ParamMap &pmap);
-
-      /**
-       * \brief Set or add value for the specified path parameter.
-       * \param param The decoded path parameter name.
-       * \param value The decoded path parameter value.
-       * \throws UrlNotSupportedException if parameter parsing
-       *         is not supported for a URL (scheme).
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual void
-      setPathParam(const std::string &param, const std::string &value);
-
-
-      // -----------------
-      /**
-       * \brief Set the query string in the URL.
-       *
-       * The \p querystr string parameter is supposed
-       * to not to contain the "?" URL query separator
-       * character (use just a "foo=bar&x=22" instead
-       * of "?foo=bar&x=22").
-       *
-       * \param querystr The new encoded query string.
-       * \throws UrlBadComponentException if the \p querystr
-       *         contains an invalid character.
-       */
-      virtual void
-      setQueryString(const std::string &querystr);
-
-      /**
-       * \brief Set the query parameters.
-       * \param qvec The vector with encoded query parameters.
-       * \throws UrlBadComponentException if the \p qvec
-       *         contains an invalid character.
-       */
-      virtual void
-      setQueryStringVec(const zypp::url::ParamVec &qvec);
-
-      /**
-       * \brief Set the query parameters.
-       * \param qmap The map with decoded query parameters.
-       * \throws UrlNotSupportedException if parameter parsing
-       *         is not supported for a URL (scheme).
-       */
-      virtual void
-      setQueryStringMap(const zypp::url::ParamMap &qmap);
-
-      /**
-       * \brief Set or add value for the specified query parameter.
-       * \param param The decoded query parameter name.
-       * \param value The decoded query parameter value.
-       * \throws UrlNotSupportedException if parameter parsing
-       *         is not supported for a URL (scheme).
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual void
-      setQueryParam(const std::string &param, const std::string &value);
-
-      /**
-       * \brief remove the specified query parameter.
-       * \param param The decoded query parameter name.
-       * \throws UrlNotSupportedException if parameter parsing
-       *         is not supported for a URL (scheme).
-       * \throws UrlDecodingException if the decoded result string
-       *         would contain a '\\0' character.
-       */
-      virtual void
-      delQueryParam(const std::string &param);
-
-
-      // -----------------
-      /**
-       * \brief Set the fragment string in the URL.
-       * \param fragment The new fragment string.
-       * \param eflag If the \p fragment is encoded or not.
-       * \throws UrlBadComponentException if the \p querystr
-       *         contains an invalid character.
-       */
-      virtual void
-      setFragment(const std::string &fragment,
-                  EEncoding         eflag);
-
-
-      // -----------------
-      /**
-       * Configures behaviour of the instance.
-       *
-       * This method is called in UrlBase constructors before
-       * any URL components are applied.
-       * Derived classes may reimplement this method to change
-       * the behaviour of the object.
-       * Use the config() methods to query and change them.
-       *
-       * The UrlBase class uses following config variables:
-       *
-       * - Common path parameter separators:
-       *   - \a \c sep_pathparams   \c ";"
-       *     Separator used to split path parameters from path name.
-       *     Setting it to empty string disables splitting of path
-       *     name and path parameters. Set also rx_pathparams to an
-       *     empty string.
-       *   - \a \c psep_pathparam   \c ","
-       *     Separator between path parameters.
-       *   - \a \c vsep_pathparam   \c "="
-       *     Separator between key and value of a path parameter.
-       *   .
-       * .
-       *
-       * - Common query string separators:
-       *   - \a \c psep_querystr    \c "&"
-       *     Separator between query string parameters.
-       *   - \a \c vsep_querystr    \c "="
-       *     Separator between key and value of a query parameter.
-       *   .
-       * .
-       *
-       * - Characters in URL components, that are safe without
-       *   URL percent-encoding (see zypp::url::encode()).
-       *   - \a safe_username
-       *   - \a safe_password
-       *   - \a safe_hostname
-       *   - \a safe_pathname
-       *   - \a safe_pathparams
-       *   - \a safe_querystr
-       *   - \a safe_fragment
-       *   .
-       * .
-       *
-       * - Regular expressions used to verify encoded URL
-       *   components and their sub-components:
-       *   - \a rx_username
-       *   - \a rx_password
-       *   - \a rx_pathname
-       *   - \a rx_pathparams
-       *   - \a rx_querystr
-       *   - \a rx_fragment
-       *   .
-       * .
-       */
-      virtual void
-      configure();
-
-
-      /**
-       * Get the value of a UrlBase configuration variable.
-       *
-       * See configure() method for names an purpose of the
-       * configuration variables used in UrlBase class.
-       *
-       * \param opt The name of the configuration variable.
-       * \return The value of the specified variable
-       *         or empty string.
-       */
-      std::string
-      config(const std::string &opt) const;
-
-      /**
-       * Set the value of a UrlBase configuration variable.
-       *
-       * See configure() method for names an purpose of the
-       * configuration variables used in UrlBase class.
-       *
-       * \param opt The name of the configuration variable.
-       * \param val The new value for the configuration variable.
-       */
-      void
-      config(const std::string &opt, const std::string &val);
-
-
-      /**
-       * Return the view options of the current object.
-       *
-       * This method is used to query the view options
-       * used by the asString() method.
-       *
-       * \return The current view option combination.
-       */
-      ViewOptions
-      getViewOptions() const;
-
-      /**
-       * Change the view options of the current object.
-       *
-       * This method is used to change the view options
-       * used by the asString() method.
-       *
-       * \param vopts New view options combination.
-       */
-      void
-      setViewOptions(const ViewOptions &vopts);
-
-      std::string asString1050625() const;
-    protected:
-      /**
-       * Utility method to cleanup an encoded path name.
-       *
-       * By default, this method makes sure, that the first slash
-       * in the path is not encoded, and that the second slash
-       * before the first path segment, is encoded (to "%2F").
-       * It modifies the path in the url, for example:
-       *   "ftp://host//aaa//bbb" to "ftp://host/%2Faaa//bbb"
-       * or as encoded path only also "%2f/name" to "/%2fname".
-       *
-       * This operation is required to fulfill the path-absolute
-       * rule of RFC3986, if there is no authority. It avoids the
-       * missinterpretation of the path as an authority separator.
-       *
-       * It is not required if there is an authority ("//" behind
-       * the "scheme:"), that is in the path-abempty rule, but it
-       * is used e.g. in ftp url's defined by RFC1738.
-       * 
-       * We apply this operation in both cases (for all paths),
-       * but if \p authority is true, the encoding of the second
-       * slash depends on the schema configuration (for ftp only).
-       *
-       * \param path      The encoded path name to cleanup.
-       * \param authority Whether the url contains authority or not.
-       * \return A modified encoded path.
-       */
-      virtual std::string
-      cleanupPathName(const std::string &path, bool authority) const;
-
-      /**
-       * Utility method to cleanup an encoded path name.
-       *
-       * This variant of the method checks if the host component
-       * in the url is empty or not to differentiate if there is
-       * an authority.
-       *
-       * \param path      The encoded path name to cleanup.
-       * \return A modified encoded path.
-       */
-      virtual std::string
-      cleanupPathName(const std::string &path) const;
-
-      /**
-       * \brief Verifies specified host or IP.
-       *
-       * It verifies, if the specified \p host parameter contains
-       * a hostname, an IPv4 address in dotted-decimal form or an
-       * IPv6 address literal encapsulated within square brackets
-       * (RFC3513, Sect. 2.2).
-       *
-       * A hostname in the \p host parameter, may contain national
-       * alphanumeric UTF8 characters (letters other than ASCII
-       * a-zA-Z) and allows to specify both, a encoded or decoded
-       * hostname.
-       *
-       * This function does not perform any hostname lookups and
-       * supports only IPv6 addresses in "[ ... ]" notation. The
-       * "[v ... ]" square bracket format is not supported by
-       * this implementation.
-       *
-       * \param  host  The host name or IP to verify.
-       * \return True, if host seems to be valid.
-       */
-      virtual bool
-      isValidHost(const std::string &host) const;
-
-      /**
-       * \brief Verifies specified port number.
-       *
-       * \param  port  The port number to verify.
-       * \return True, if port number is valid.
-       */
-      virtual bool
-      isValidPort(const std::string &port) const;
-
-    private:
-      UrlBaseData *m_data;
-    };
-
-
-    // ---------------------------------------------------------------
-    /**
-     * \brief Copy-On-Write Url reference.
-     */
-    typedef RWCOW_pointer<UrlBase>          UrlRef;
-
-
-    //////////////////////////////////////////////////////////////////
-  } // namespace url
-  ////////////////////////////////////////////////////////////////////
-
-  ////////////////////////////////////////////////////////////////////
-} // namespace zypp
-//////////////////////////////////////////////////////////////////////
-
-#endif /* ZYPP_URL_URLBASE_H */
-/*
-** vim: set ts=2 sts=2 sw=2 ai et:
-*/
+#include <zypp-core/url/UrlBase.h>
index 08f6704..6204fd4 100644 (file)
@@ -1,150 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/**
- * \file zypp/url/UrlException.h
- */
-#ifndef   ZYPP_URL_URLEXCEPTION_H
-#define   ZYPP_URL_URLEXCEPTION_H
-
-#include <zypp/base/Exception.h>
-
-
-//////////////////////////////////////////////////////////////////////
-namespace zypp
-{ ////////////////////////////////////////////////////////////////////
-
-  ////////////////////////////////////////////////////////////////////
-  namespace url
-  { //////////////////////////////////////////////////////////////////
-
-
-    // ---------------------------------------------------------------
-    /**
-     * Base class for all URL exceptions.
-     */
-    class UrlException: public zypp::Exception
-    {
-    public:
-      UrlException()
-        : zypp::Exception("Url exception")
-      {}
-
-      UrlException(const std::string &msg)
-        : zypp::Exception(msg)
-      {}
-
-      virtual ~UrlException() throw() {};
-    };
-
-    // ---------------------------------------------------------------
-    /**
-     * Thrown if the encoded string contains a NUL byte (%00).
-     */
-    class UrlDecodingException: public UrlException
-    {
-    public:
-      UrlDecodingException()
-        : UrlException("Url NUL decoding exception")
-      {}
-
-      UrlDecodingException(const std::string &msg)
-        : UrlException(msg)
-      {}
-
-      virtual ~UrlDecodingException() throw() {};
-    };
-
-    // ---------------------------------------------------------------
-    /**
-     * Thrown if the url or a component can't be parsed at all.
-     */
-    class UrlParsingException: public UrlException
-    {
-    public:
-      UrlParsingException()
-        : UrlException("Url parsing failure exception")
-      {}
-
-      UrlParsingException(const std::string &msg)
-        : UrlException(msg)
-      {}
-
-      virtual ~UrlParsingException() throw() {};
-    };
-
-    // ---------------------------------------------------------------
-    /**
-     * Thrown if a url component is invalid.
-     */
-    class UrlBadComponentException: public UrlException
-    {
-    public:
-      UrlBadComponentException()
-        : UrlException("Url bad component exception")
-      {}
-
-      UrlBadComponentException(const std::string &msg)
-        : UrlException(msg)
-      {}
-
-      virtual ~UrlBadComponentException() throw() {};
-    };
-
-
-    // ---------------------------------------------------------------
-    /**
-     * Thrown if scheme does not allow a component.
-     */
-    class UrlNotAllowedException: public UrlException
-    {
-    public:
-      UrlNotAllowedException()
-        : UrlException("Url not allowed component exception")
-      {}
-
-      UrlNotAllowedException(const std::string &msg)
-        : UrlException(msg)
-      {}
-
-      virtual ~UrlNotAllowedException() throw() {};
-    };
-
-
-    // ---------------------------------------------------------------
-    /**
-     * Thrown if a feature e.g. parsing of a component
-     * is not supported for the url/scheme.
-     */
-    class UrlNotSupportedException: public UrlException
-    {
-    public:
-      UrlNotSupportedException()
-        : UrlException("Url parsing unsupported exception")
-      {}
-
-      UrlNotSupportedException(const std::string &msg)
-        : UrlException(msg)
-      {}
-
-      virtual ~UrlNotSupportedException() throw() {};
-    };
-
-
-    //////////////////////////////////////////////////////////////////
-  } // namespace url
-  ////////////////////////////////////////////////////////////////////
-
-  ////////////////////////////////////////////////////////////////////
-} // namespace zypp
-//////////////////////////////////////////////////////////////////////
-
-#endif /* ZYPP_URL_URLEXCEPTION_H */
-/*
-** vim: set ts=2 sts=2 sw=2 ai et:
-*/
+#include <zypp-core/url/UrlException.h>
index 54ce7fa..e869c25 100644 (file)
@@ -1,261 +1 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\---------------------------------------------------------------------*/
-/**
- * \file zypp/url/UrlUtils.h
- */
-#ifndef   ZYPP_URL_URLUTILS_H
-#define   ZYPP_URL_URLUTILS_H
-
-#include <zypp/url/UrlException.h>
-
-#include <string>
-#include <vector>
-#include <map>
-
-/** Characters that are safe for URL without percent-encoding. */
-#define URL_SAFE_CHARS ":/?#[]@!$&'(){}*+,;="
-
-//////////////////////////////////////////////////////////////////////
-namespace zypp
-{ ////////////////////////////////////////////////////////////////////
-
-  ////////////////////////////////////////////////////////////////////
-  /** Url details namespace. */
-  namespace url
-  { //////////////////////////////////////////////////////////////////
-
-
-    // ---------------------------------------------------------------
-    /** A parameter vector container.
-     * A string vector containing splited PathParam- or Query-String.
-     * Each string in the vector is allways URL percent encoded and
-     * usually contains a "key=value" pair.
-     */
-    typedef std::vector < std::string >             ParamVec;
-
-
-    /** A parameter map container.
-     * A map containing key and value pairs parsed from a PathParam-
-     * or Query-String.
-     */
-    typedef std::map < std::string, std::string >   ParamMap;
-
-
-    /** Encoding flags.
-     */
-    typedef enum {
-        E_ENCODED, //!< Flag to request encoded string(s).
-        E_DECODED  //!< Flag to request decoded string(s).
-    } EEncoding;
-
-
-    // ---------------------------------------------------------------
-    /** Encodes a string using URL percent encoding.
-     *
-     * By default, all characters except of "a-zA-Z0-9_.-" will be encoded.
-     * Additional characters from the set ":/?#[]@!$&'()*+,;=", that are
-     * safe for a URL compoent without encoding, can be specified in the
-     * \p safe argument.
-     *
-     * If the \p eflag parameter is set to E_ENCODED, then already encoded
-     * substrings will be detected and not encoded a second time.
-     *
-     * The following function call will encode the "@" character as "%40",
-     * but skip encoding of the "%" character, because the \p eflag is set
-     * to E_ENCODED and "%ba" is detected as a valid encoded character.
-     * \code
-     *   zypp::url::encode("foo%bar@localhost", "", E_ENCODED);
-     * \endcode
-     * With \p eflag set to E_DECODED, the "%" character would be encoded
-     * as well. The complete encoded string would be "foo%25bar%40localhost".
-     *
-     * \param str      A string to encode (binary data).
-     * \param safe     Characters safe to skip in encoding,
-     *                 e.g. "/" for path names.
-     * \param eflag    If to detect and skip already encoded substrings.
-     * \return A percent encoded string.
-     */
-    std::string
-    encode(const std::string &str, const std::string &safe = "",
-                                   EEncoding         eflag = E_DECODED);
-
-
-    // ---------------------------------------------------------------
-    /** Decodes a URL percent encoded string.
-     * Replaces all occurences of \c "%<hex><hex>" in the \p str string
-     * with the character encoded using the two hexadecimal digits that
-     * follows the "%" character.
-     *
-     * For example, the encoded string "%40%3F%3D%26%25" will be decoded
-     * to "@?=&%".
-     *
-     * \param str      A string to decode.
-     * \param allowNUL A flag, if \c "%00" (encoded \c '\\0')
-     *                 is allowed or not.
-     * \return A decoded strig (may contain binary data).
-     * \throws UrlDecodingException if \p allowNUL is false and
-     *         a encoded NUL byte (\c "%00") was found in \p str.
-     */
-    std::string
-    decode(const std::string &str, bool allowNUL = false);
-
-
-    // ---------------------------------------------------------------
-    /** Encode one character.
-     *
-     * Encode the specified character \p c into its \c "%<hex><hex>"
-     * representation.
-     *
-     * \param c        A character to encode.
-     * \return A percent encoded representation of the character,
-     *         e.g. %20 for a ' ' (space).
-     */
-    std::string
-    encode_octet(const unsigned char c);
-
-
-    // ---------------------------------------------------------------
-    /** Decode one character.
-     *
-     * Decode the \p hex parameter pointing to (at least) two hexadecimal
-     * digits into its character value and return it.
-     *
-     * Example:
-     * \code
-     *   char *str = "%40";
-     *   char *pct = strchr(str, '%');
-     *   int   chr = pct ? decode_octet(pct+1) : -1;
-     *      // chr is set to the '@' ASCII character now.
-     * \endcode
-     *
-     * \param hex     Pointer to two hex characters representing
-     *                the character value in percent-encoded strings.
-     * \return The value (0-255) encoded in the \p hex characters or -1
-     *         if \p hex does not point to two hexadecimal characters.
-     */
-    int
-    decode_octet(const char *hex);
-
-
-    // ---------------------------------------------------------------
-    /** Split into a parameter vector.
-     *
-     * Splits a parameter string \p pstr into substrings using \p psep
-     * as separator and appends the resulting substrings to \p pvec.
-     *
-     * Usual parameter separators are \c '&' for Query- and \c ',' for
-     * PathParam-Strings.
-     *
-     * \param pvec    Reference to a result parameter vector.
-     * \param pstr    Reference to the PathParam- or Query-String to split.
-     * \param psep    Parameter separator character to split at.
-     * \throws UrlNotSupportedException if \p psep separator is empty.
-     */
-    void
-    split(ParamVec          &pvec,
-          const std::string &pstr,
-          const std::string &psep);
-
-
-    // ---------------------------------------------------------------
-    /** Split into a parameter map.
-     *
-     * Splits a parameter string \p pstr into substrings using \p psep as
-     * separator and then, each substring into key and value pair using
-     * \p vsep as separator between parameter key and value and adds them
-     * to the parameter map \p pmap.
-     *
-     * If a parameter substring doesn't contain any value separator \p vsep,
-     * the substring is used as a parameter key and value is set to an empty
-     * string.
-     *
-     * Usual parameter separators are \c '&' for Query- and \c ',' for
-     * PathParam-Strings. A usual parameter-value separator is \c '=' for
-     * both, Query- and PathParam-Strings.
-     *
-     * If the encoding flag \p eflag is set to \p E_DECODED, then the key
-     * and values are dedcoded before they are stored in the map.
-     *
-     * \param pmap    Reference to a result parameter map.
-     * \param pstr    Reference to the PathParam- or Query-String to split.
-     * \param psep    Separator character to split key-value pairs.
-     * \param vsep    Separator character to split key and value.
-     * \param eflag   Flag if the key and value strings should be URL percent
-     *                decoded before they're stored in the map.
-     * \throws UrlNotSupportedException if \p psep or \p vsep separator
-     *         is empty.
-     */
-    void
-    split(ParamMap          &pmap,
-          const std::string &pstr,
-          const std::string &psep,
-          const std::string &vsep,
-          EEncoding         eflag = E_ENCODED);
-
-
-    // ---------------------------------------------------------------
-    /** Join parameter vector to a string.
-     *
-     * Creates a string containing all substrings from the \p pvec separated
-     * by \p psep separator character. The substrings in \p pvec should be
-     * already URL percent encoded and should't contain \p psep characters.
-     *
-     * Usual parameter separators are \c '&' for Query- and \c ',' for
-     * PathParam-Strings.
-     *
-     * \param pvec    Reference to encoded parameter vector.
-     * \param psep    Parameter separator character to use.
-     * \return A parameter string.
-     */
-    std::string
-    join(const ParamVec     &pvec,
-         const std::string  &psep);
-
-
-    // ---------------------------------------------------------------
-    /** Join parameter map to a string.
-     *
-     * Creates a string containing all parameter key-value pairs from the
-     * parameter map \p pmap, that will be joined using the \p psep character
-     * and the parameter key is separated from the parameter value using the
-     * \p vsep character. Both, key and value will be automatically encoded.
-     *
-     * Usual parameter separators are \c '&' for Query- and \c ',' for
-     * PathParam-Strings. A usual parameter-value separator is \c '=' for
-     * both, Query- and PathParam-Strings.
-     *
-     * See encode() function from details about the \p safe characters.
-     *
-     * \param pmap    Reference to a parameter map.
-     * \param psep    Separator character to use between key-value pairs.
-     * \param vsep    Separator character to use between keys and values.
-     * \param safe    List of characters to accept without encoding.
-     * \return A URL percent-encoded parameter string.
-     * \throws UrlNotSupportedException if \p psep or \p vsep separator
-     *         is empty.
-     */
-    std::string
-    join(const ParamMap     &pmap,
-         const std::string  &psep,
-         const std::string  &vsep,
-         const std::string  &safe);
-
-
-    //////////////////////////////////////////////////////////////////
-  } // namespace url
-  ////////////////////////////////////////////////////////////////////
-
-  ////////////////////////////////////////////////////////////////////
-} // namespace zypp
-//////////////////////////////////////////////////////////////////////
-
-#endif /* ZYPP_URL_URLUTILS_H */
-/*
-** vim: set ts=2 sts=2 sw=2 ai et:
-*/
+#include <zypp-core/url/UrlUtils.h>
index ecdad9e..209f2e9 100644 (file)
@@ -1,76 +1,85 @@
-SET( zyppng_base_SRCS
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/abstracteventsource.cc
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/base.cc
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/eventdispatcher_glib.cc
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/timer.cc
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/socketnotifier.cc
-)
-
-SET( zyppng_base_HEADERS
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/AbstractEventSource
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/abstracteventsource.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/Base
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/base.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/EventDispatcher
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/eventdispatcher.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/signals.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/SocketNotifier
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/socketnotifier.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/Timer
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/timer.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/zyppglobal.h
+SET( zyppng_media_SRCS
+  media/medianetwork.cc
+  media/medianetworkserver.cc
+  media/network/downloader.cc
+  media/network/downloadspec.cc
+  media/network/mirrorcontrol.cc
+  media/network/networkrequestdispatcher.cc
+  media/network/networkrequesterror.cc
+  media/network/request.cc
 )
 
-SET( zyppng_base_private_HEADERS
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/private/abstracteventsource_p.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/private/base_p.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/base/private/eventdispatcher_glib_p.h
+SET( zyppng_media_HEADERS
+  media/MediaNetwork
+  media/medianetwork.h
+  media/network/AuthData
+  media/network/authdata.h
+  media/network/downloader.h
+  media/network/downloadspec.h
+  media/network/networkrequestdispatcher.h
+  media/network/networkrequesterror.h
+  media/network/request.h
+  media/network/transfersettings.h
+  media/network/TransferSettings
 )
 
-
-SET( zyppng_core_HEADERS
-  ${CMAKE_CURRENT_SOURCE_DIR}/core/url.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/core/Url
-  ${CMAKE_CURRENT_SOURCE_DIR}/core/idstring.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/core/IdString
+SET( zyppng_media_private_HEADERS
+  media/private/medianetworkserver_p.h
+  media/network/private/downloader_p.h
+  media/network/private/mediadebug_p.h
+  media/network/private/mirrorcontrol_p.h
+  media/network/private/networkrequestdispatcher_p.h
+  media/network/private/networkrequesterror_p.h
+  media/network/private/request_p.h
+  media/network/private/downloaderstates/base_p.h
+  media/network/private/downloaderstates/basicdownloader_p.h
+  media/network/private/downloaderstates/detectmeta_p.h
+  media/network/private/downloaderstates/final_p.h
+  media/network/private/downloaderstates/initial_p.h
+  media/network/private/downloaderstates/metalinkinfo_p.h
+  media/network/private/downloaderstates/metalink_p.h
+  media/network/private/downloaderstates/mirrorhandling_p.h
+  media/network/private/downloaderstates/normal_p.h
+  media/network/private/downloaderstates/preparemulti_p.h
+  media/network/private/downloaderstates/rangedownloader_p.h
+  media/network/private/downloaderstates/zck_p.h
 )
 
-SET( zyppng_media_SRCS
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/downloader.cc
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/networkrequestdispatcher.cc
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/networkrequesterror.cc
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/request.cc
+SET( zyppng_media_private_SOURCES
+  media/network/private/downloaderstates/basicdownloader_p.cc
+  media/network/private/downloaderstates/detectmeta_p.cc
+  media/network/private/downloaderstates/final_p.cc
+  media/network/private/downloaderstates/initial_p.cc
+  media/network/private/downloaderstates/metalinkinfo_p.cc
+  media/network/private/downloaderstates/metalink_p.cc
+  media/network/private/downloaderstates/mirrorhandling_p.cc
+  media/network/private/downloaderstates/normal_p.cc
+  media/network/private/downloaderstates/preparemulti_p.cc
+  media/network/private/downloaderstates/rangedownloader_p.cc
+  media/network/private/downloaderstates/zck_p.cc
 )
 
-SET( zyppng_media_HEADERS
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/AuthData
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/authdata.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/downloader.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/networkrequestdispatcher.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/networkrequesterror.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/request.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/transfersettings.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/TransferSettings
+SET( zyppng_appcode_HEADERS
+  Context
+  context.h
 )
 
-SET( zyppng_media_private_HEADERS
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/private/downloader_p.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/private/networkrequestdispatcher_p.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/private/networkrequesterror_p.h
-  ${CMAKE_CURRENT_SOURCE_DIR}/media/network/private/request_p.h
+SET( zyppng_appcode_SRCS
+  context.cc
 )
 
 SET ( zyppng_HEADERS
-  ${zyppng_base_HEADERS}
-  ${zyppng_base_private_HEADERS}
-  ${zyppng_core_HEADERS}
+  ${zyppng_appcode_HEADERS}
   ${zyppng_media_HEADERS}
   ${zyppng_media_private_HEADERS}
-  PARENT_SCOPE
 )
 
 SET ( zyppng_SRCS
-  ${zyppng_base_SRCS}
+  ${zyppng_appcode_SRCS}
   ${zyppng_media_SRCS}
-  PARENT_SCOPE
+  ${zyppng_media_private_SOURCES}
 )
+
+ADD_LIBRARY( zyppng-objlib OBJECT ${zyppng_SRCS} ${zyppng_HEADERS} )
+#we include generated headers, so we need to wait for zypp-protobuf to be ready
+add_dependencies( zyppng-objlib zypp-protobuf )
diff --git a/zypp/zyppng/Context b/zypp/zyppng/Context
new file mode 100644 (file)
index 0000000..7e33fb6
--- /dev/null
@@ -0,0 +1 @@
+#include "context.h"
diff --git a/zypp/zyppng/base/base.h b/zypp/zyppng/base/base.h
deleted file mode 100644 (file)
index 00daa6c..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\----------------------------------------------------------------------/
-*
-* This file contains private API, this might break at any time between releases.
-* You have been warned!
-*
-*/
-#ifndef ZYPP_NG_BASE_BASE_H_INCLUDED
-#define ZYPP_NG_BASE_BASE_H_INCLUDED
-
-#include <zypp/zyppng/base/zyppglobal.h>
-#include <zypp/zyppng/base/signals.h>
-#include <memory>
-#include <unordered_set>
-#include <vector>
-
-namespace zyppng {
-
-  class BasePrivate;
-
-  /*!
-   * The Base class is used as a common base class for objects that emit signals,
-   * it also supports a parent/child relationship where the parent object tracks keeps
-   * a reference for all its children.
-   */
-  class LIBZYPP_NG_EXPORT Base : public sigc::trackable, public std::enable_shared_from_this<Base>
-  {
-    NON_COPYABLE(Base);
-    ZYPP_DECLARE_PRIVATE(Base)
-  public:
-
-    using Ptr = std::shared_ptr<Base>;
-    using WeakPtr = std::weak_ptr<Base>;
-
-    Base ();
-    virtual ~Base();
-
-    /*!
-     * Returns the parent object if there is one, otherwise
-     * returns a zero WeakPtr
-     */
-    WeakPtr parent() const;
-
-    /*!
-     * Adds a new object to the child list, the object
-     * will keep a reference for its entire lifetime or until the object is removed
-     */
-    void addChild ( Base::Ptr child );
-
-    /*!
-     * Removes a child object from the internal child list
-     */
-    void removeChild (Ptr child );
-
-    /*!
-     * Returns all child objects of this object
-     */
-    const std::unordered_set<Ptr> &children() const;
-
-    /*!
-     * Returns all children that can be casted to type T
-     */
-    template<typename T>
-    std::vector< std::weak_ptr<T> > findChildren () const {
-      std::vector< std::weak_ptr<T> > result;
-      for ( Ptr p : children() ) {
-        std::shared_ptr<T> casted = std::dynamic_pointer_cast<T>(p);
-        if ( casted )
-          result.push_back( std::weak_ptr<T>(casted) );
-      }
-      return result;
-    }
-
-    template<typename T>
-    inline std::shared_ptr<T> shared_this () const {
-      return std::static_pointer_cast<T>( shared_from_this() );
-    }
-
-    template<typename T>
-    inline std::shared_ptr<T> shared_this () {
-      return std::static_pointer_cast<T>( shared_from_this() );
-    }
-
-    template<typename T>
-    inline std::weak_ptr<T> weak_this () const {
-      return std::static_pointer_cast<T>( weak_from_this().lock() );
-    }
-
-    template<typename T>
-    inline std::weak_ptr<T> weak_this () {
-      return std::static_pointer_cast<T>( weak_from_this().lock() );
-    }
-
-  protected:
-    Base ( BasePrivate &dd );
-    std::unique_ptr<BasePrivate> d_ptr;
-  };
-
-} // namespace zyppng
-
-#endif // ZYPP_NG_CORE_BASE_H_INCLUDED
diff --git a/zypp/zyppng/base/signals.h b/zypp/zyppng/base/signals.h
deleted file mode 100644 (file)
index 9360a3a..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*---------------------------------------------------------------------\
-|                          ____ _   __ __ ___                          |
-|                         |__  / \ / / . \ . \                         |
-|                           / / \ V /|  _/  _/                         |
-|                          / /__ | | | | | |                           |
-|                         /_____||_| |_| |_|                           |
-|                                                                      |
-\----------------------------------------------------------------------/
-*
-* This file contains private API, this might break at any time between releases.
-* You have been warned!
-*
-*/
-#ifndef ZYPP_NG_BASE_SIGNALS_H_INCLUDED
-#define ZYPP_NG_BASE_SIGNALS_H_INCLUDED
-
-#include <sigc++/trackable.h>
-#include <sigc++/signal.h>
-#include <sigc++/connection.h>
-
-namespace zyppng {
-
-using sigc::signal;
-using sigc::connection;
-using sigc::trackable;
-
-template <class R, class... T>
-class SignalProxy;
-
-/**
-     * Hides the signals emit function from external code.
-     *
-     * \note based on Glibmms SignalProxy code
-     */
-template <class R, class... T>
-class SignalProxy<R(T...)>
-{
-public:
-  using SlotType = sigc::slot<R(T...)>;
-  using SignalType = sigc::signal<R(T...)>;
-
-  SignalProxy ( SignalType &sig ) : _sig ( sig ) {}
-
-  /** Connects a signal handler to a signal.
-         *
-         * For instance, connect(sigc::mem_fun(*this, &TheClass::on_something));
-         *
-         * @param slot The signal handler, usually created with sigc::mem_fun() or sigc::ptr_fun().
-         * @return A sigc::connection.
-         */
-  connection connect( const SlotType& slot )
-  {
-    return _sig.connect( slot );
-  }
-
-  /** Connects a signal handler to a signal.
-         * @see connect(const SlotType& slot).
-         */
-  connection connect( SlotType&& slot )
-  {
-    return _sig.connect( std::move( slot ) );
-  }
-
-private:
-  SignalType &_sig;
-};
-
-
-}
-
-#endif // ZYPP_NG_CORE_SIGNALS_H_INCLUDED
diff --git a/zypp/zyppng/base/zyppglobal.h b/zypp/zyppng/base/zyppglobal.h
deleted file mode 100644 (file)
index fadbe9f..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef ZYPP_NG_BASE_ZYPPGLOBAL_H_INCLUDED
-#define ZYPP_NG_BASE_ZYPPGLOBAL_H_INCLUDED
-
-#include <zypp/base/Easy.h>
-
-#ifndef EXPORT_EXPERIMENTAL_API
-#define LIBZYPP_NG_EXPORT
-#define LIBZYPP_NG_NO_EXPORT
-#else
-#include <zypp-ng_export.h>
-#endif
-
-/*
- * \note those macros are inspired by the Qt framework
- */
-
-template <typename T> inline T *zyppGetPtrHelper(T *ptr) { return ptr; }
-template <typename Ptr> inline auto zyppGetPtrHelper(const Ptr &ptr) -> decltype(ptr.operator->()) { return ptr.operator->(); }
-template <typename Ptr> inline auto zyppGetPtrHelper(Ptr &ptr) -> decltype(ptr.operator->()) { return ptr.operator->(); }
-
-#define ZYPP_DECLARE_PRIVATE(Class) \
-    inline Class##Private* d_func() \
-    { return reinterpret_cast<Class##Private *>(zyppGetPtrHelper(d_ptr)); } \
-    inline const Class##Private* d_func() const \
-    { return reinterpret_cast<const Class##Private *>(zyppGetPtrHelper(d_ptr)); } \
-    friend class Class##Private;
-
-#define ZYPP_FWD_DECLARE_PRIVATE(Class) \
-    Class##Private* d_func();\
-    const Class##Private* d_func() const; \
-    friend class Class##Private;
-
-#define ZYPP_IMPL_PRIVATE(Class) \
-    Class##Private* Class::d_func() \
-    { return reinterpret_cast<Class##Private *>(zyppGetPtrHelper(d_ptr)); } \
-    const Class##Private* Class::d_func() const \
-    { return reinterpret_cast<const Class##Private *>(zyppGetPtrHelper(d_ptr)); }
-
-#define ZYPP_DECLARE_PUBLIC(Class)                                    \
-    inline Class* z_func() { return static_cast<Class *>(z_ptr); } \
-    inline const Class* z_func() const { return static_cast<const Class *>(z_ptr); } \
-    friend class Class;
-
-#define Z_D() auto const d = d_func()
-#define Z_Z() auto const z = z_func()
-
-#endif
diff --git a/zypp/zyppng/context.cc b/zypp/zyppng/context.cc
new file mode 100644 (file)
index 0000000..123d8e7
--- /dev/null
@@ -0,0 +1,23 @@
+#include "context.h"
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp/zyppng/media/network/private/mirrorcontrol_p.h>
+
+namespace zyppng {
+
+  Context::Context()
+  {
+    _zyppEventLoop = EventLoop::create();
+    _mirrorControl = MirrorControl::create();
+  }
+
+  std::shared_ptr<EventLoop> Context::evLoop() const
+  {
+    return _zyppEventLoop;
+  }
+
+  std::shared_ptr<MirrorControl> Context::mirrorControl()
+  {
+    return _mirrorControl;
+  }
+
+}
diff --git a/zypp/zyppng/context.h b/zypp/zyppng/context.h
new file mode 100644 (file)
index 0000000..a3c6e94
--- /dev/null
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#ifndef ZYPP_NG_CORE_CONTEXT_H_INCLUDED
+#define ZYPP_NG_CORE_CONTEXT_H_INCLUDED
+
+#include <memory>
+
+namespace zyppng {
+
+  class EventLoop;
+  class MirrorControl;
+
+  class Context {
+
+  public:
+
+    using Ptr = std::shared_ptr<Context>;
+
+    Context();
+    std::shared_ptr<EventLoop> evLoop () const;
+    std::shared_ptr<MirrorControl> mirrorControl ();
+
+  private:
+    std::shared_ptr<EventLoop> _zyppEventLoop;
+    std::shared_ptr<MirrorControl> _mirrorControl;
+
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/MediaNetwork b/zypp/zyppng/media/MediaNetwork
new file mode 100644 (file)
index 0000000..69ec57c
--- /dev/null
@@ -0,0 +1 @@
+#include "medianetwork.h"
diff --git a/zypp/zyppng/media/medianetwork.cc b/zypp/zyppng/media/medianetwork.cc
new file mode 100644 (file)
index 0000000..7ef2f2d
--- /dev/null
@@ -0,0 +1,986 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#include "medianetwork.h"
+#include "private/medianetworkserver_p.h"
+
+#include <zypp/media/MediaException.h>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/AutoDisconnect>
+#include <zypp-core/zyppng/io/SockAddr>
+#include <zypp/zyppng/media/network/downloadspec.h>
+
+#include <zypp/zyppng/media/network/networkrequestdispatcher.h>
+#include <zypp/zyppng/media/network/networkrequesterror.h>
+#include <zypp/zyppng/media/network/AuthData>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/AbstractEventSource>
+#include <zypp-core/zyppng/rpc/rpc.h>
+
+#include <zypp/media/CurlHelper.h>
+#include <zypp/media/MediaUserAuth.h>
+#include <zypp/media/MediaException.h>
+#include <zypp/media/CredentialManager.h>
+#include <zypp/ZConfig.h>
+#include <zypp/ZYppCallbacks.h>
+#include <zypp/base/String.h>
+#include <zypp/base/Gettext.h>
+#include <zypp/ZYppFactory.h>
+
+#include <zypp/ZYppCallbacks.h>
+
+#undef ZYPP_BASE_LOGGER_LOGGROUP
+#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::MediaNetwork"
+
+namespace zyppng {
+
+  using HeaderSizeType = zyppng::rpc::HeaderSizeType;
+
+  struct MediaNetwork::ProgressData
+  {
+    ProgressData( const zyppng::Url & _url = zyppng::Url(),
+      zypp::callback::SendReport<zypp::media::DownloadProgressReport> *_report = nullptr )
+      : url( _url )
+      , report( _report )
+    {}
+
+    zypp::Url  url;
+    zypp::callback::SendReport<zypp::media::DownloadProgressReport> *report;
+
+    time_t _timeStart  = 0;    ///< Start total stats
+    time_t _timeLast   = 0;    ///< Start last period(~1sec)
+
+    double _dnlTotal   = 0.0;  ///< Bytes to download or 0 if unknown
+    double _dnlLast    = 0.0;  ///< Bytes downloaded at period start
+    double _dnlNow     = 0.0;  ///< Bytes downloaded now
+
+    int    _dnlPercent= 0;     ///< Percent completed or 0 if _dnlTotal is unknown
+
+    double _drateTotal= 0.0;   ///< Download rate so far
+    double _drateLast  = 0.0;  ///< Download rate in last period
+
+    void updateStats( double dltotal = 0.0, double dlnow = 0.0 )
+    {
+      time_t now = time(0);
+
+      // If called without args (0.0), recompute based on the last values seen
+      if ( dltotal && dltotal != _dnlTotal )
+        _dnlTotal = dltotal;
+
+      if ( dlnow && dlnow != _dnlNow )
+      {
+        _dnlNow = dlnow;
+      }
+      else if ( !_dnlNow && !_dnlTotal )
+      {
+        // Start time counting as soon as first data arrives.
+        // Skip the connection / redirection time at begin.
+        return;
+      }
+
+      // init or reset if time jumps back
+      if ( !_timeStart || _timeStart > now )
+        _timeStart = _timeLast = now;
+
+      // percentage:
+      if ( _dnlTotal )
+        _dnlPercent = int(_dnlNow * 100 / _dnlTotal);
+
+      // download rates:
+      _drateTotal = _dnlNow / std::max( int(now - _timeStart), 1 );
+
+      if ( _timeLast < now )
+      {
+        _drateLast = (_dnlNow - _dnlLast) / int(now - _timeLast);
+        // start new period
+        _timeLast  = now;
+        _dnlLast   = _dnlNow;
+      }
+      else if ( _timeStart == _timeLast )
+        _drateLast = _drateTotal;
+    }
+
+    void reportProgress( bool &cancel ) const
+    {
+      if ( report && !(*report)->progress( _dnlPercent, url, _drateTotal, _drateLast ) )
+        cancel = true; // user requested abort
+    }
+  };
+
+
+  struct MediaNetwork::Request {
+
+    Request ( DownloadSpec &&spec, const zypp::Pathname &path, RequestId id ) : _targetFile(path) {
+      _targetFile.autoCleanup( true );
+      _proto.set_requestid( id );
+
+      // download to temporary path instead of the real one
+      spec.setTargetPath( _targetFile.path().asString() );
+      *_proto.mutable_spec() = std::move( spec.protoData() );
+    }
+
+    void ref   () {
+      _requestCount++;
+    }
+
+    int unref () {
+      _requestCount--;
+      return _requestCount;
+    }
+
+    void startReporting ( ProgressData &tracker ) {
+      _report = &tracker;
+    }
+
+    void stopReporting  () {
+      _report = nullptr;
+    }
+
+    void setProgress ( double dltotal, double dlnow, bool &cancel ) {
+      if ( _report ) {
+        _report->updateStats( dltotal, dlnow );
+        _report->reportProgress( cancel );
+      }
+    }
+
+    void reset () {
+      _result.reset();
+    }
+
+    const std::optional<zypp::proto::DownloadFin> &result () const {
+      return _result;
+    }
+
+    void setResult ( zypp::proto::DownloadFin &&res ) {
+      _result = std::move(res);
+    }
+
+    zypp::proto::Request &proto () {
+      return _proto;
+    }
+
+    const zypp::proto::Request &proto () const {
+      return _proto;
+    }
+
+  private:
+    zypp::proto::Request _proto;
+    std::optional<zypp::proto::DownloadFin> _result;
+    zypp::filesystem::TmpFile _targetFile;
+    ProgressData *_report = nullptr;
+    int _requestCount = 1;
+  };
+
+
+  /*!
+ * This object helps us to simulate sync behaviour over async code. We can block waiting
+ * for a specific message or response while still handling intermediate message that represent
+ * status updates from concurrently running requests.
+ *
+ * The DispatchContext needs to be released after finishing the operation that was requested from
+ * the sync entry points are done. It will tear down the event loop and release the socket fd so we
+ * can reuse it at a later point again.
+ */
+  struct MediaNetwork::DispatchContext {
+
+    DispatchContext( MediaNetwork &p ) : parent(&p), ev( zyppng::EventLoop::create() ){
+      if ( parent->_socket ) {
+        MIL_MEDIA << "Reusing open connection" << std::endl;
+        sock = zyppng::Socket::fromSocket( *parent->_socket, zyppng::Socket::ConnectedState );
+      } else {
+        MIL_MEDIA << "Connecting to backend" << std::endl;
+        sock = zyppng::Socket::create(  AF_UNIX, SOCK_STREAM, 0 );
+        parent->_readBuffer.clear();
+
+        while ( true ) {
+          sock->connect( std::make_shared<zyppng::UnixSockAddr>( MediaNetworkThread::instance().sockPath(), true ) );
+          if ( !sock->waitForConnected() ) {
+            if ( sock->lastError() == Socket::ConnectionRefused )
+              continue;
+            sock.reset();
+          } else {
+            parent->_socket = sock->nativeSocket();
+            MIL_MEDIA << "Connected" << std::endl;
+          }
+          break;
+        }
+
+      }
+    }
+    ~DispatchContext() {
+      // if the socket was disconnected we can not keep the fd around anymore
+      if ( !sock || sock->state() == Socket::ClosedState ) {
+        parent->_socket.reset();
+
+        // if the socket is destroyed the read buffer won't make sense anymore
+        parent->_readBuffer.clear();
+      } else {
+        // make sure no data is lost before we release the socket descriptor
+        if ( sock->bytesAvailable() )
+          parent->_readBuffer.append( sock->readAll() );
+        sock->waitForAllBytesWritten();
+        sock->releaseSocket();
+      }
+    }
+
+    /*!
+   * Send a messagee to the server side, it will be enclosed in a Envelope
+   * and immediately sent out.
+   */
+    template <typename T>
+    bool sendEnvelope ( const T &m ) {
+      zypp::proto::Envelope env;
+
+      env.set_messagetypename( m.GetTypeName() );
+      m.SerializeToString( env.mutable_value() );
+
+      //DBG << "Preparing to send messagE: " << env.messagetypename() << " " << env.value().size() << std::endl;
+
+      const auto &str = env.SerializeAsString();
+      HeaderSizeType msgSize = str.length();
+      sock->write( (char *)(&msgSize), sizeof( HeaderSizeType ) );
+      sock->write( str.data(), str.size() );
+      return true;
+    }
+
+    /*!
+   * Executes the EventLoop until a zypp.proto.Status message was received. The
+   * Status is returned to the caller. The \a handleOtherMsg callback works just like
+   * in \ref waitFor.
+   */
+    template <typename T>
+    zypp::proto::Status waitForStatus ( const RequestId reqId, T &&handleOtherMsg ) {
+      zypp::proto::Status res;
+      dispatchUntil( [ &reqId, &res, otherMsgCB = std::forward<T>(handleOtherMsg), this ]( const zypp::proto::Envelope &env ){
+        if ( env.messagetypename() == "zypp.proto.Status" ) {
+          zypp::proto::Status s;
+          s.ParseFromString( env.value() );
+
+          // we received a out of band response, there is only ONE active request to the
+          // server allowed at any time
+          if ( s.requestid() != reqId ) {
+            ERR_MEDIA << "Out of band status for a request that was not active" << std::endl;
+            ZYPP_THROW( zypp::media::MediaException( "Out of band status for a request that was not active" ) );
+          }
+          res = std::move(s);
+          return true;
+        }
+        // not the message we wanted, process it otherwise
+        otherMsgCB( *this, env );
+        return false;
+      });
+      return res;
+    }
+
+    /*!
+   * Executes the EventLoop until a Message of type T was received, the
+   * received message is returned to the caller.
+   * The \a handleOtherMsg callback is invoked for all messages that are received
+   * but are of a different type than the one requested.
+   */
+    template <typename T, typename Callback>
+    T waitFor ( const RequestId reqId, Callback &&handleOtherMsg ) {
+      T res;
+      dispatchUntil( [ &reqId, &res, otherMsgCB = std::forward<Callback>(handleOtherMsg), this ]( const zypp::proto::Envelope &env ){
+        if ( env.messagetypename() == T::default_instance().GetTypeName() ) {
+          T s;
+          s.ParseFromString( env.value() );
+          if ( s.requestid() == reqId ) {
+            res = std::move(s);
+            return true;
+          }
+        }
+        // not the message we wanted, process it otherwise
+        otherMsgCB( *this, env );
+        return false;
+      });
+      return res;
+    }
+
+    /*!
+   * This function executes the EventLoop and keep it running until the predicate
+   * returns true. All messages that are received are passed into the predicate,
+   * allowing us to implement eventhandling outside of actual async code.
+   */
+    template <typename Predicate>
+    void dispatchUntil( Predicate &&predicate ) const
+    {
+      if ( !ev || !sock )
+        return;
+
+      std::optional<int32_t> pendingMessageSize;
+      std::exception_ptr excp;
+
+      bool stopRequested = false;
+
+      auto &readBuf = parent->_readBuffer;
+
+      const auto &readMessages = [ &, pred = std::forward<Predicate>(predicate), this ]( ){
+
+        // read all data from socket into internal buffer
+        readBuf.append( sock->readAll() );
+
+        try {
+          while ( readBuf.size() ) {
+            if ( !pendingMessageSize ) {
+              // if we cannot read the message size wait some more
+              if ( readBuf.size() < sizeof( HeaderSizeType ) )
+                return;
+
+              HeaderSizeType msgSize;
+              readBuf.read( reinterpret_cast<char *>( &msgSize ), sizeof( decltype (msgSize) ) );
+              pendingMessageSize = msgSize;
+            }
+
+            // wait for the full message size to be available
+            if ( readBuf.size() < static_cast<size_t>( *pendingMessageSize ) )
+              return;
+
+            ByteArray message ( *pendingMessageSize, '\0' );
+            readBuf.read( message.data(), *pendingMessageSize );
+            pendingMessageSize.reset();
+
+            zypp::proto::Envelope m;
+            if (! m.ParseFromArray( message.data(), message.size() ) ) {
+              //abort, we can not recover from this. Bytes might be mixed up on the socket
+              ZYPP_THROW( zypp::media::MediaException("MediaNetwork backend connection broken.") );
+            }
+
+            //MIL << "Dispatching message " << m.DebugString() << std::endl;
+
+            if ( pred(m) ) {
+              stopRequested = true;
+              ev->quit();
+              return;
+            }
+          }
+        }  catch ( ... ) {
+          // we cannot let the exception travel through the event loop, instead we remember it for later
+          stopRequested = true;
+          excp = std::current_exception();
+          sock->abort();
+          ev->quit();
+        }
+      };
+
+      auto rrConn = AutoDisconnect( sock->connectFunc( &zyppng::Socket::sigReadyRead, readMessages ) );
+
+      auto disConn = AutoDisconnect ( sock->connectFunc( &zyppng::Socket::sigDisconnected, [&excp, this](){
+        try {
+          ZYPP_THROW( zypp::media::MediaException("MediaNetwork backend disconnected.") );
+        } catch ( ... ) {
+          // we cannot let the exception travel through the event loop, instead we remember it for later
+          excp = std::current_exception();
+          ev->quit();
+        }
+      }) );
+
+      readMessages(); // read all pending messages
+      if ( !stopRequested )
+        ev->run();
+
+      if ( excp )
+        std::rethrow_exception( excp );
+
+      // if we reach this part, we can not have pending message data
+      if ( pendingMessageSize ) ERR << "This is a bug, message was partially read and event loop closed" << std::endl;
+      assert( !pendingMessageSize );
+    }
+
+    MediaNetwork *parent;
+    zyppng::EventLoop::Ptr ev;
+    zyppng::Socket::Ptr sock;
+  };
+
+  MediaNetwork::MediaNetwork( const Url & url_r, const zypp::Pathname & attach_point_hint_r )
+  : MediaNetworkCommonHandler( url_r, attach_point_hint_r,
+                              "/", // urlpath at attachpoint
+                              true ) // does_download
+  {
+    _workingDir.autoCleanup( true );
+
+    MIL << "MediaNetwork::MediaNetwork(" << url_r << ", " << attach_point_hint_r << ")" << std::endl;
+
+    if( !attachPoint().empty()){
+      zypp::PathInfo ainfo(attachPoint());
+      zypp::Pathname apath(attachPoint() + "XXXXXX");
+      char    *atemp = ::strdup( apath.asString().c_str());
+      char    *atest = NULL;
+      if( !ainfo.isDir() || !ainfo.userMayRWX() ||
+           atemp == NULL || (atest=::mkdtemp(atemp)) == NULL) {
+        WAR << "attach point " << ainfo.path()
+            << " is not useable for " << url_r.getScheme() << std::endl;
+        setAttachPoint("", true);
+      }
+      else if( atest != NULL)
+        ::rmdir(atest);
+
+      if( atemp != NULL)
+        ::free(atemp);
+    }
+  }
+
+  MediaNetwork::~MediaNetwork() {
+    DBG << "Releasing MediaNetwork with tmpdir: " << _workingDir.path().asString() << std::endl;
+    try { release(); } catch(...) {}
+
+    if ( _socket ) {
+      DBG_MEDIA << "Explicitely calling socket cleanup, this should've happened during release()" << std::endl;
+      zyppng::eintrSafeCall( ::close, *_socket );
+      _socket.reset();
+    }
+  }
+
+  std::unique_ptr<MediaNetwork::DispatchContext> MediaNetwork::ensureConnected() const
+  {
+    auto ctx = std::make_unique<DispatchContext>( *const_cast<MediaNetwork *>(this) );
+    if ( !ctx->sock )
+      ZYPP_THROW( zypp::media::MediaException("Failed to connect to backend") );
+    return ctx;
+  }
+
+  void MediaNetwork::disconnectFrom()
+  {
+    if ( _socket ) {
+      zyppng::eintrSafeCall( ::close, *_socket );
+      _socket.reset();
+    }
+
+    _readBuffer.clear();
+    _requests.clear();
+    _nextRequestId = 0;
+
+    MediaHandler::disconnectFrom();
+  }
+
+  void MediaNetwork::attachTo(bool next)
+  {
+    if ( next )
+      ZYPP_THROW( zypp::media::MediaNotSupportedException(_url) );
+
+    if ( !_url.isValid() )
+      ZYPP_THROW( zypp::media::MediaBadUrlException(_url) );
+
+    if( !NetworkRequestDispatcher::supportsProtocol( _url ) ) {
+      std::string msg("Unsupported protocol '");
+      msg += _url.getScheme();
+      msg += "'";
+      ZYPP_THROW( zypp::media::MediaBadUrlException(_url, msg) );
+    }
+
+    if( !isUseableAttachPoint( attachPoint() ) )
+    {
+      setAttachPoint( createAttachPoint(), true );
+    }
+
+    disconnectFrom();
+
+    // FIXME: need a derived class to propelly compare url's
+    zypp::media::MediaSourceRef media( new zypp::media::MediaSource(_url.getScheme(), _url.asString()) );
+    setMediaSource(media);
+  }
+
+  void MediaNetwork::releaseFrom(const std::string &)
+  {
+    disconnect();
+  }
+
+  Url MediaNetwork::getFileUrl( const zypp::Pathname & filename_r ) const
+  {
+    // Simply extend the URLs pathname. An 'absolute' URL path
+    // is achieved by encoding the leading '/' in an URL path:
+    //   URL: ftp://user@server                -> ~user
+    //   URL: ftp://user@server/               -> ~user
+    //   URL: ftp://user@server//              -> ~user
+    //   URL: ftp://user@server/%2F    -> /
+    //                         ^- this '/' is just a separator
+    Url newurl( _url );
+    newurl.setPathName( ( zypp::Pathname("./"+_url.getPathName()) / filename_r ).asString().substr(1) );
+    return newurl;
+  }
+
+  void MediaNetwork::handleRequestResult(const Request &req, const zypp::filesystem::Pathname &filename ) const
+  {
+    if ( !req.result() ) {
+      ZYPP_THROW( zypp::media::MediaCurlException( req.proto().spec().url(), "Request did not return a result" , "" ) );
+    }
+
+    if ( !req.result()->has_error() )
+      return;
+
+    const auto &err = req.result()->error();
+    if ( err.error() != NetworkRequestError::NoError ) {
+      Url reqUrl = err.extra_info().at("requestUrl");
+      switch ( err.error() )
+      {
+        case NetworkRequestError::Unauthorized: {
+          std::string hint = err.extra_info().at("authHint");
+          ZYPP_THROW( zypp::media::MediaUnauthorizedException(
+            reqUrl, err.errordesc(), err.nativeerror(), hint
+            ));
+          break;
+        }
+        case NetworkRequestError::TemporaryProblem:
+          ZYPP_THROW( zypp::media::MediaTemporaryProblemException(reqUrl) );
+          break;
+        case NetworkRequestError::Timeout:
+          ZYPP_THROW( zypp::media::MediaTimeoutException(reqUrl) );
+          break;
+        case NetworkRequestError::Forbidden:
+          ZYPP_THROW( zypp::media::MediaForbiddenException(reqUrl, err.errordesc()));
+          break;
+        case NetworkRequestError::NotFound:
+          ZYPP_THROW( zypp::media::MediaFileNotFoundException( reqUrl, filename ) );
+          break;
+        default:
+          break;
+      }
+      ZYPP_THROW( zypp::media::MediaCurlException( reqUrl, err.errordesc(), err.nativeerror() ) );
+    }
+    ZYPP_THROW( zypp::media::MediaCurlException( req.proto().spec().url(), err.errordesc() , "" ) );
+  }
+
+  bool MediaNetwork::retry( DispatchContext &ctx, Request &req ) const
+  {
+    const auto &res = req.result();
+    if ( !res || !res->has_error() )
+      return false;
+
+    const auto &resErr = res->error();
+    if ( resErr.error() != NetworkRequestError::AuthFailed && resErr.error() != NetworkRequestError::Unauthorized )
+      return false;
+
+    const std::string &availAuth =  resErr.extra_info().count("authHint") ? resErr.extra_info().at("authHint") : "";
+
+    zypp::callback::SendReport<zypp::media::AuthenticationReport> auth_report;
+
+    zypp::media::CredentialManager cm( zypp::media::CredManagerOptions( zypp::ZConfig::instance().repoManagerRoot()) );
+    auto authDataPtr = cm.getCred( _url );
+
+    NetworkAuthData_Ptr curlcred( new NetworkAuthData() );
+    curlcred->setUrl( _url );
+
+    // preset the username if present in current url
+    if ( !_url.getUsername().empty() )
+      curlcred->setUsername(_url.getUsername());
+    // if CM has found some credentials, preset the username from there
+    else if ( authDataPtr )
+      curlcred->setUsername( authDataPtr->username() );
+
+    // set available authentication types
+    // might be needed in prompt
+    curlcred->setAuthType( availAuth );
+
+    std::string prompt_msg = zypp::str::Format( _("Authentication required for '%s'") ) % _url.asString();
+
+    // the auth data that was used in the request is older than whats in the Credential manager,
+    // so instead of asking the user for creds we first try to use the new ones
+    if ( res->last_auth_timestamp() > 0 && res->last_auth_timestamp() < authDataPtr->lastDatabaseUpdate() ) {
+      _settings.setUsername( authDataPtr->username() );
+      _settings.setPassword( authDataPtr->password() );
+      retryRequest( ctx, req );
+      return true;
+    } else {
+
+      // ask user
+      if ( auth_report->prompt( _url, prompt_msg, *curlcred ) ) {
+        DBG << "callback answer: retry" << std::endl
+            << "CurlAuthData: " << *curlcred << std::endl;
+
+        if ( curlcred->valid() ) {
+
+          _settings.setUsername( curlcred->username() );
+          _settings.setPassword( curlcred->password() );
+
+          // set available authentication types from the exception
+          if ( curlcred->authType() == CURLAUTH_NONE )
+            curlcred->setAuthType( availAuth );
+
+          // set auth type (seems this must be set _after_ setting the userpwd)
+          if ( curlcred->authType() != CURLAUTH_NONE) {
+            // FIXME: only overwrite if not empty?
+            _settings.setAuthType( curlcred->authTypeAsString() );
+          }
+
+          cm.addCred( *curlcred );
+          cm.save();
+
+          // we need to restart all already failed requests so we do not double ask
+          // for credentials
+          for ( auto &r : _requests ) {
+            if ( &r == &req )
+              continue;
+            if ( !r.result() || !r.result()->has_error() )
+              continue;
+            const auto rErr = r.result()->error();
+            if ( rErr.error() != NetworkRequestError::AuthFailed && rErr.error() != NetworkRequestError::Unauthorized ) {
+              retryRequest( ctx, r );
+            }
+          }
+
+          retryRequest( ctx, req );
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  void MediaNetwork::handleStreamMessage( DispatchContext &ctx, const zypp::proto::Envelope &e ) const
+  {
+    RequestId dlId = -1;
+    bool cancel = false;
+
+    const auto &mName = e.messagetypename();
+    if ( mName == "zypp.proto.DownloadStart" ) {
+      zypp::proto::DownloadStart st;
+      st.ParseFromString( e.value() );
+
+      auto r = findRequest( st.requestid() );
+      if ( !r )
+        return;
+
+      MIL << "Received the download started event for file "<< zypp::Url( r->proto().spec().url() ) <<" from server." << std::endl;
+      dlId = st.requestid();
+      r->setProgress( 0.0, 0.0, cancel );
+
+    } else if ( mName == "zypp.proto.DownloadProgress" ) {
+      zypp::proto::DownloadProgress prog;
+      prog.ParseFromString( e.value() );
+
+      auto r = findRequest( prog.requestid() );
+      if ( !r )
+        return;
+
+      //MIL << "Received progress for download: " << zypp::Url( r->url() ) << std::endl;
+      dlId = prog.requestid();
+      r->setProgress( prog.total(), prog.now(), cancel );
+
+    } else if ( mName == "zypp.proto.DownloadFin" ) {
+      zypp::proto::DownloadFin fin;
+      fin.ParseFromString( e.value() );
+
+      auto r = findRequest( fin.requestid() );
+      if ( !r )
+        return;
+
+      MIL << "Received FIN for download: " << zypp::Url( r->proto().spec().url() ) << std::endl;
+      r->setResult( std::move(fin) );
+    } else {
+      // error , unknown message
+      WAR << "Received unexpected message... ignoring" << std::endl;
+    }
+
+    if ( dlId >= 0 && cancel ) {
+      zypp::proto::CancelDownload cl;
+      cl.set_requestid( dlId );
+      ctx.sendEnvelope( cl );
+      ctx.sock->waitForAllBytesWritten();
+    }
+  }
+
+  MediaNetwork::Request MediaNetwork::makeRequest ( const zypp::OnMediaLocation &loc ) const
+  {
+    DBG << loc.filename().asString() << std::endl;
+
+    if(!_url.isValid())
+      ZYPP_THROW(zypp::media::MediaBadUrlException(_url));
+
+    if(_url.getHost().empty())
+      ZYPP_THROW(zypp::media::MediaBadUrlEmptyHostException(_url));
+
+    Url url( getFileUrl(loc.filename()) );
+
+    DownloadSpec spec( url, loc.filename(), loc.downloadSize() );
+    spec.setTransferSettings( _settings )
+      .setHeaderSize( loc.headerSize() )
+      .setHeaderChecksum( loc.headerChecksum() )
+      .setDeltaFile( loc.deltafile() );
+
+    // we are downloading the file into a temporary location first
+    Request fileReq( std::move(spec), _workingDir, ++_nextRequestId );
+    fileReq.proto().set_streamprogress( false );
+    return fileReq;
+  }
+
+  void MediaNetwork::trackRequest ( DispatchContext &ctx, Request &req ) const
+  {
+    zypp::proto::DownloadFin result;
+
+    bool retry = true;
+    while ( retry ) {
+
+      retry = false; // try to stop after this iteration
+
+      if ( !req.result() ) {
+        result = ctx.waitFor<zypp::proto::DownloadFin>( req.proto().requestid(), std::bind( &MediaNetwork::handleStreamMessage, this, std::placeholders::_1, std::placeholders::_2 ) );
+        req.setResult( std::move(result) );
+      }
+
+      retry = this->retry( ctx, req );
+    }
+  }
+
+
+
+  void MediaNetwork::retryRequest ( DispatchContext &ctx, MediaNetwork::Request &req ) const
+  {
+    req.reset();
+    // update request with new settings
+    *req.proto().mutable_spec()->mutable_settings() = _settings.protoData();
+    ctx.sendEnvelope( req.proto() );
+    const auto &s = ctx.waitForStatus( req.proto().requestid(), std::bind( &MediaNetwork::handleStreamMessage, this, std::placeholders::_1, std::placeholders::_2 ) );
+    if ( s.code() != zypp::proto::Status::Ok ) {
+      ZYPP_THROW( zypp::media::MediaException( s.reason() ) );
+    }
+  }
+
+  MediaNetwork::Request *MediaNetwork::findRequest( const Url url ) const
+  {
+    const auto &i = std::find_if( _requests.begin(), _requests.end(), [ &url ]( const auto &r ) {
+      return ( url == zyppng::Url( r.proto().spec().url() ) );
+    });
+    if ( i == _requests.end() )
+      return nullptr;
+    return &(*i);
+  }
+
+  MediaNetwork::Request *MediaNetwork::findRequest(const RequestId id ) const
+  {
+    const auto &i = std::find_if( _requests.begin(), _requests.end(), [ &id ]( const auto &r ) {
+      return ( id == r.proto().requestid() );
+    });
+    if ( i == _requests.end() )
+      return nullptr;
+    return &(*i);
+  }
+
+  bool MediaNetwork::getDoesFileExist( const zypp::filesystem::Pathname &filename ) const
+  {
+
+    auto ctx = ensureConnected();
+
+    // here we always send a new request without even considering probably already existing ones
+    auto req = makeRequest( filename );
+    req.proto().mutable_spec()->set_checkexistanceonly( true );
+    req.proto().set_prioritize( true );
+
+
+    ctx->sendEnvelope( req.proto() );
+    const auto &s = ctx->waitForStatus( req.proto().requestid(), std::bind( &MediaNetwork::handleStreamMessage, this, std::placeholders::_1, std::placeholders::_2 ) );
+    if ( s.code() != zypp::proto::Status::Ok ) {
+      ZYPP_THROW( zypp::media::MediaException( s.reason() ) );
+    }
+
+    try
+    {
+      trackRequest( *ctx, req );
+
+      //this will throw if the file does not exist
+      handleRequestResult( req, filename );
+    } catch ( const zypp::media::MediaFileNotFoundException &e ) {
+      return false;
+    } catch ( const zypp::media::MediaException &e ) {
+      // some error, we are not sure about file existence, rethrw
+      ZYPP_RETHROW(e);
+    }
+
+    return true;
+  }
+
+
+  void MediaNetwork::getFile( const zypp::OnMediaLocation &file ) const
+  {
+    const auto &filename = file.filename();
+    auto ctx = ensureConnected();
+
+    const auto url = getFileUrl( filename );
+    auto downloadReq = findRequest( url );
+
+    zypp::callback::SendReport<zypp::media::DownloadProgressReport> report;
+    ProgressData data( url, &report );
+
+    report->start( url, filename );
+
+    if ( !downloadReq ) {
+      auto newReq = makeRequest( file );
+
+      newReq.proto().set_streamprogress( true );
+      newReq.proto().set_prioritize( true );
+
+      ctx->sendEnvelope( newReq.proto() );
+
+      const auto &s = ctx->waitForStatus( newReq.proto().requestid(), std::bind( &MediaNetwork::handleStreamMessage, this, std::placeholders::_1, std::placeholders::_2 ) );
+      if ( s.code() != zypp::proto::Status::Ok && s.code() ) {
+        ZYPP_THROW( zypp::media::MediaException( s.reason() ) );
+      }
+
+      _requests.push_back( newReq );
+      downloadReq = &_requests.back();
+
+    } else {
+      // if the download is not yet finished we request to track it
+      if ( !downloadReq->result() ) {
+
+        zypp::proto::SubscribeProgress sub;
+        sub.set_requestid( downloadReq->proto().requestid() );
+        sub.set_prioritize( true );
+        ctx->sendEnvelope( sub );
+
+        const auto &s = ctx->waitForStatus( sub.requestid(), std::bind( &MediaNetwork::handleStreamMessage, this, std::placeholders::_1, std::placeholders::_2 ) );
+
+        // status could be unknown ID if the request was already in finished state and the message was stuck in our socket!
+        if ( s.code() != zypp::proto::Status::Ok && s.code() != zypp::proto::Status::UnknownId ) {
+          ZYPP_THROW( zypp::media::MediaException( s.reason() ) );
+        }
+      }
+    }
+
+    downloadReq->startReporting( data );
+    zypp::OnScopeExit cleanup( [&](){ downloadReq->stopReporting(); });
+
+    try {
+      trackRequest( *ctx, *downloadReq );
+
+      //this will throw if the file does not exist
+      handleRequestResult( *downloadReq, filename );
+    } catch ( zypp::media::MediaUnauthorizedException & ex_r ) {
+      report->finish(url, zypp::media::DownloadProgressReport::ACCESS_DENIED, ex_r.asUserHistory());
+      ZYPP_RETHROW(ex_r);
+    }
+    // unexpected exception
+    catch ( zypp::media::MediaException & excpt_r )
+    {
+      zypp::media::DownloadProgressReport::Error reason = zypp::media::DownloadProgressReport::ERROR;
+      if( typeid(excpt_r) == typeid( zypp::media::MediaFileNotFoundException )  ||
+           typeid(excpt_r) == typeid( zypp::media::MediaNotAFileException ) )
+      {
+        reason = zypp::media::DownloadProgressReport::NOT_FOUND;
+      }
+      report->finish(url, reason, excpt_r.asUserHistory());
+      ZYPP_RETHROW(excpt_r);
+    }
+
+    // seems we were successful
+    const auto &targetPath = localPath(filename).absolutename();
+
+    const auto errCode = zypp::filesystem::assert_dir( targetPath.dirname() );
+    if( errCode ) {
+      std::string err = zypp::str::Str() << "assert_dir " << targetPath.dirname() << " failed";
+      DBG << err << std::endl;
+      ZYPP_THROW( zypp::media::MediaCurlException( url, err, "" ) );
+    }
+
+    if( zypp::filesystem::hardlinkCopy( downloadReq->proto().spec().targetpath(), targetPath ) != 0 ) {
+      std::string err = zypp::str::Str() << "Failed to hardlinkCopy the requested file <<" << downloadReq->proto().spec().targetpath() << " to the targetPath " << targetPath;
+      DBG << err << std::endl;
+      ZYPP_THROW( zypp::media::MediaCurlException( url, err, "" ) );
+    }
+
+    if (::chmod( targetPath.c_str(), zypp::filesystem::applyUmaskTo( 0644 ))) {
+      ERR << "Failed to chmod file " << targetPath << std::endl;
+    }
+
+    // check if the file was required the same number of times it was requested
+    if ( downloadReq->unref() <= 0 ) {
+      _requests.remove_if( [ & ]( const auto &r ){
+        return ( r.proto().requestid() == downloadReq->proto().requestid() );
+      });
+    }
+
+    report->finish(url, zypp::media::DownloadProgressReport::NO_ERROR, "");
+  }
+
+  void MediaNetwork::getDir(const zypp::filesystem::Pathname &dirname, bool recurse_r) const
+  {
+    //we could make this download concurrently, but its not used anywhere in the code, so why bother
+    zypp::filesystem::DirContent content;
+    getDirInfo( content, dirname, /*dots*/false );
+
+    for ( zypp::filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it ) {
+      zypp::Pathname filename = dirname + it->name;
+      int res = 0;
+
+      switch ( it->type ) {
+        case zypp::filesystem::FT_NOT_AVAIL: // old directory.yast contains no typeinfo at all
+        case zypp::filesystem::FT_FILE:
+          getFile( zypp::OnMediaLocation( filename ) );
+          break;
+        case zypp::filesystem::FT_DIR: // newer directory.yast contain at least directory info
+          if ( recurse_r ) {
+            getDir( filename, recurse_r );
+          } else {
+            res = assert_dir( localPath( filename ) );
+            if ( res ) {
+              WAR << "Ignore error (" << res <<  ") on creating local directory '" << localPath( filename ) << "'" << std::endl;
+            }
+          }
+          break;
+        default:
+          // don't provide devices, sockets, etc.
+          break;
+      }
+    }
+  }
+
+  void MediaNetwork::precacheFiles(const std::vector<zypp::OnMediaLocation> &files)
+  {
+    zypp::proto::Prefetch req;
+    req.set_requestid( ++_nextRequestId );
+
+    std::vector<Request> sentRequests;
+
+    for ( const auto &file : files ) {
+      const auto url = getFileUrl( file.filename() );
+      auto existingReq = findRequest( url );
+      if ( existingReq )
+        existingReq->ref();
+      else {
+        Request fileReq = makeRequest( file );
+        fileReq.proto().set_streamprogress( false );
+        *req.mutable_requests()->Add() = fileReq.proto();
+        sentRequests.push_back( fileReq );
+      }
+    }
+
+    if ( req.requests().size() ) {
+
+      auto ctx = ensureConnected();
+      ctx->sendEnvelope( req );
+
+      const auto &status = ctx->waitForStatus( req.requestid(), std::bind( &MediaNetwork::handleStreamMessage, this, std::placeholders::_1, std::placeholders::_2 ) );
+      if ( status.code() == zypp::proto::Status::Ok ) {
+        MIL_MEDIA << "Request was acknowledged by server, downloads should start soon" << std::endl;
+        _requests.insert( _requests.end(), std::move_iterator(sentRequests.begin()), std::move_iterator(sentRequests.end()) );
+        return;
+      }
+
+      MIL << "Request failed " << status.reason() << std::endl;
+      ZYPP_THROW( zypp::media::MediaException( status.reason() ) );
+    }
+  }
+
+  void MediaNetwork::getDirInfo(std::list<std::string> &retlist, const zypp::filesystem::Pathname &dirname, bool dots) const
+  {
+    getDirectoryYast( retlist, dirname, dots );
+  }
+
+  void MediaNetwork::getDirInfo(zypp::filesystem::DirContent &retlist, const zypp::filesystem::Pathname &dirname, bool dots) const
+  {
+    getDirectoryYast( retlist, dirname, dots );
+  }
+
+  bool MediaNetwork::checkAttachPoint(const zypp::Pathname &apoint) const
+  {
+    return MediaHandler::checkAttachPoint( apoint, true, true);
+  }
+
+
+}
diff --git a/zypp/zyppng/media/medianetwork.h b/zypp/zyppng/media/medianetwork.h
new file mode 100644 (file)
index 0000000..1c7ca61
--- /dev/null
@@ -0,0 +1,94 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPPNG_MEDIA_MEDIANETWORK_H_INCLUDED
+#define ZYPPNG_MEDIA_MEDIANETWORK_H_INCLUDED
+
+#include <zypp/media/MediaNetworkCommonHandler.h>
+#include <zypp-core/zyppng/core/Url>
+#include <zypp/zyppng/media/network/AuthData>
+#include <zypp-proto/envelope.pb.h>
+#include <zypp-proto/messages.pb.h>
+#include <zypp-core/zyppng/io/private/iobuffer_p.h>
+#include <zypp/TmpPath.h>
+#include <optional>
+#include <variant>
+
+namespace zyppng {
+
+class Download;
+class Downloader;
+class Socket;
+class EventDispatcher;
+
+using RequestId = uint32_t;
+
+class MediaNetwork : public zypp::media::MediaNetworkCommonHandler
+{
+public:
+  MediaNetwork(const Url &url_r, const zypp::Pathname &attach_point_hint_r);
+  virtual ~MediaNetwork() override;
+
+  // MediaHandler interface
+protected:
+  void attachTo(bool next) override;
+  void releaseFrom(const std::string &ejectDev) override;
+  void getFile ( const zypp::OnMediaLocation &file ) const override;
+  void getDir(const zypp::filesystem::Pathname &dirname, bool recurse_r) const override;
+  void getDirInfo(std::list<std::string> &retlist, const zypp::filesystem::Pathname &dirname, bool dots) const override;
+  void getDirInfo(zypp::filesystem::DirContent &retlist, const zypp::filesystem::Pathname &dirname, bool dots) const override;
+  bool getDoesFileExist(const zypp::filesystem::Pathname &filename) const override;
+  bool checkAttachPoint(const zypp::Pathname &apoint) const override;
+
+
+  Url getFileUrl(const zypp::Pathname &filename_r) const;
+
+private:
+  struct ProgressData;
+  struct DispatchContext;
+  struct Request;
+
+  std::unique_ptr<DispatchContext> ensureConnected () const;
+  bool retry ( DispatchContext &ctx, Request &req ) const;
+  void retryRequest ( DispatchContext &ctx, Request &req ) const;
+  void handleStreamMessage ( DispatchContext &ctx, const zypp::proto::Envelope &e ) const;
+  void handleRequestResult ( const Request &req , const zypp::filesystem::Pathname &filename ) const;
+
+  Request makeRequest ( const zypp::OnMediaLocation &loc ) const;
+  void trackRequest ( DispatchContext &ctx, Request &req ) const ;
+
+  Request *findRequest ( const zyppng::Url url ) const;
+  Request *findRequest ( const RequestId id ) const;
+
+
+private:
+  zypp::filesystem::TmpDir   _workingDir;
+  mutable RequestId          _nextRequestId = 0;
+  mutable std::list<Request> _requests;
+  mutable std::optional<int> _socket;
+  mutable IOBuffer           _readBuffer;
+
+  // MediaHandler interface
+protected:
+  void disconnectFrom() override;
+
+  // MediaHandler interface
+public:
+  void precacheFiles(const std::vector<zypp::OnMediaLocation> &files) override;
+};
+
+}
+
+
+
+#endif
diff --git a/zypp/zyppng/media/medianetworkserver.cc b/zypp/zyppng/media/medianetworkserver.cc
new file mode 100644 (file)
index 0000000..daadda0
--- /dev/null
@@ -0,0 +1,464 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#include "private/medianetworkserver_p.h"
+#include <zypp/zyppng/media/network/downloader.h>
+#include <zypp/zyppng/media/network/downloadspec.h>
+#include <zypp/zyppng/media/network/private/mirrorcontrol_p.h>
+#include <zypp-core/zyppng/base/private/threaddata_p.h>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <zypp-core/zyppng/base/EventLoop>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/SocketNotifier>
+#include <zypp-core/zyppng/rpc/rpc.h>
+
+#include <zypp/media/TransferSettings.h>
+#include <zypp/PathInfo.h>
+
+#include <zypp-proto/envelope.pb.h>
+#include <zypp-proto/messages.pb.h>
+
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+
+#include <algorithm>
+#include <csignal>
+
+#undef ZYPP_BASE_LOGGER_LOGGROUP
+#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::MediaNetworkServer"
+
+namespace zyppng {
+
+  using HeaderSizeType = zyppng::rpc::HeaderSizeType;
+
+  MediaNetworkServer::MediaNetworkServer( )
+    : _downloadManager( std::make_shared<Downloader>( MirrorControl::create() ) )
+  {
+  }
+
+  void MediaNetworkServer::listen( const std::string &sockPath )
+  {
+    if ( _serverSocket )
+      return;
+
+    _serverSocket = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 );
+
+    // bind to a abstract unix domain socket address, which means we do not need to care about cleaning it up
+    _serverSocket->bind( std::make_shared<zyppng::UnixSockAddr>( sockPath, true ) );
+    _serverSocket->Base::connect( &zyppng::Socket::sigIncomingConnection, *this, &MediaNetworkServer::onIncomingConnection );
+    _serverSocket->listen();
+
+    MIL << "MediaNetworkServer started to listen for connections " << std::endl;
+  }
+
+  std::shared_ptr<Downloader> MediaNetworkServer::downloader()
+  {
+    return _downloadManager;
+  }
+
+  void MediaNetworkServer::onIncomingConnection()
+  {
+    auto sock = _serverSocket->accept();
+    if ( !sock )
+      return;
+
+    MIL << "MediaNetworkServer received new connection " << sock.get() << std::endl;
+
+    auto client = std::make_shared<MediaNetworkConn>( *this, std::move(sock) );
+    client->connectFunc( &MediaNetworkConn::sigDisconnected, [ this, wp = std::weak_ptr(client) ](){
+      auto p = wp.lock();
+      if (!p) {
+        MIL_MEDIA << "MediaNetworkServer client disconnected but the pointer was already deleted" << std::endl;
+        return;
+      }
+
+      MIL << "MediaNetworkServer client disconnected " << p.get() << std::endl;
+
+      _clients.erase(
+        std::remove_if( _clients.begin(), _clients.end(), [ &p ]( auto listElem ){
+          return p.get() == listElem.get();
+        }
+      ));
+    }, *this);
+
+    _clients.push_back( client );
+  }
+
+  struct MediaNetworkConn::Request {
+    Request ( ) { }
+    ~Request() {
+      clearConnections();
+    }
+
+    void clearConnections () {
+      std::for_each( trackingConns.begin(), trackingConns.end(), []( auto &conn){ conn.disconnect(); } );
+      trackingConns.clear();
+    }
+
+    zypp::proto::Request request;
+    std::shared_ptr<zyppng::Download> dl;
+    std::vector<sigc::connection> trackingConns;
+  };
+
+
+  MediaNetworkConn::MediaNetworkConn( MediaNetworkServer &server, std::shared_ptr<Socket> &&socket ) : _server(server), _connection ( std::move( socket ) )
+  {
+    MIL_MEDIA << "Initializing Connection object " << std::endl;
+    _connection->Base::connect( &Socket::sigReadyRead, *this, &MediaNetworkConn::onReadyRead );
+    _connection->Base::connect( &Socket::sigDisconnected, *this, &MediaNetworkConn::onDisconnected );
+    _connection->Base::connect( &Socket::sigError, *this, &MediaNetworkConn::onError );
+
+    //make sure we read possibly available data
+    onReadyRead();
+  }
+
+  MediaNetworkConn::~MediaNetworkConn()
+  {
+    MIL_MEDIA << "Closing connection " << std::endl;
+    while( _requests.size() ) {
+      auto req = _requests.front();
+      // make sure we do not receive signals while shutting down
+      // this would break due to weak_from_this
+      req->clearConnections();
+      req->dl->cancel();
+
+      // still make sure we actually send all signals about finished downloads.
+      trackedDlFinished( *req );
+    }
+    MIL_MEDIA << "Closing connection done!" << std::endl;
+  }
+
+  SignalProxy<void ()> MediaNetworkConn::sigDisconnected()
+  {
+    return _disconnected;
+  }
+
+  void MediaNetworkConn::onDisconnected()
+  {
+    MIL_MEDIA << "Socket was closed, requesting cleanup." << std::endl;
+    _disconnected.emit();
+  }
+
+  void MediaNetworkConn::onReadyRead()
+  {
+    const auto &sendStatus = [this]( RequestId id, auto code, const auto &reason) {
+      zypp::proto::Status status;
+      status.set_requestid( id );
+      status.set_code( code );
+      status.set_reason( reason );
+      sendMessage( status );
+    };
+
+    const auto &makeNewRequest = [this] ( zypp::proto::Request &&req ){
+      auto newRequest = std::make_shared<Request>( );
+      newRequest->request = std::move( req );
+      newRequest->dl = _server.downloader()->downloadFile( newRequest->request.spec() );
+      newRequest->dl->start();
+
+      if ( newRequest->request.prioritize() )
+        newRequest->dl->prioritize();
+
+      trackRequest( *newRequest );
+
+      _requests.push_back( std::move(newRequest) );
+      return _requests.back();
+    };
+
+    // read until buffers are empty
+    while ( _connection->bytesAvailable() ) {
+
+      // MIL << "Server has bytes" << std::endl;
+
+      if ( !_pendingMessageSize ) {
+        // if we cannot read the message size wait some more
+        if ( _connection->bytesAvailable() < sizeof( HeaderSizeType ) )
+          return;
+
+        HeaderSizeType msgSize;
+        _connection->read( reinterpret_cast<char *>( &msgSize ), sizeof( decltype (msgSize) ) );
+        _pendingMessageSize = msgSize;
+      }
+
+      // wait for the full message size to be available
+      if ( _connection->bytesAvailable() < static_cast<size_t>( *_pendingMessageSize ) )
+        return;
+
+      ByteArray message = _connection->read( *_pendingMessageSize );
+      _pendingMessageSize.reset();
+
+      zypp::proto::Envelope m;
+      if (! m.ParseFromArray( message.data(), message.size() ) ) {
+        //send error and close, we can not recover from this. Bytes might be mixed up on the socket
+        sendStatus( -1, zypp::proto::Status::InvalidMessage, "This message is misformed." );
+        _connection->close();
+        return;
+      }
+
+      //DBG << "Server recv: " << m.messagetypename() << " " << m.value().size() << std::endl;
+
+      const auto &mName = m.messagetypename();
+      if (  mName == "zypp.proto.Request" )  {
+
+        zypp::proto::Request prefetchReq;
+        if (! prefetchReq.ParseFromString( m.value() ) ) {
+          sendStatus( -1, zypp::proto::Status::MalformedRequest, "Unable to deserialize the request." );
+          continue;
+        }
+        const auto &r = makeNewRequest( std::move(prefetchReq) );
+        sendStatus( r->request.requestid(), zypp::proto::Status::Ok, "OK" );
+
+      } else if ( mName == "zypp.proto.Prefetch" )  {
+
+        zypp::proto::Prefetch prefetchReq;
+        if (! prefetchReq.ParseFromString( m.value() ) ) {
+          sendStatus( -1, zypp::proto::Status::MalformedRequest, "Unable to deserialize the request." );
+          continue;
+        }
+
+        for ( auto &file : *prefetchReq.mutable_requests() ) {
+          makeNewRequest( std::move(file) );
+        }
+        sendStatus( prefetchReq.requestid(), zypp::proto::Status::Ok, "OK" );
+
+      } else if ( mName == "zypp.proto.CancelDownload" )  {
+        zypp::proto::CancelDownload cancel;
+        if (! cancel.ParseFromString( m.value() ) ) {
+          sendStatus( -1, zypp::proto::Status::MalformedRequest, "Unable to deserialize the request." );
+          continue;
+        }
+
+        for ( auto &req : _requests ) {
+          if ( req->request.requestid() == cancel.requestid() ) {
+            auto lock = req;
+            lock->dl->cancel();
+            break;
+          }
+        }
+        sendStatus( cancel.requestid(), zypp::proto::Status::Ok, "OK" );
+
+      } else if ( mName == "zypp.proto.NewAuthDataAvailable" )  {
+        zypp::proto::NewAuthDataAvailable data;
+        if (! data.ParseFromString( m.value() ) ) {
+          sendStatus( -1, zypp::proto::Status::MalformedRequest, "Unable to deserialize the request." );
+          continue;
+        }
+
+        MIL_MEDIA << "Got new Auth data, restarting failed requests" << std::endl;
+
+        // we got new auth data in the CredentialManager, lets restart all our requests that are currently
+        // in failed auth state.
+        for ( auto &req : _requests ) {
+          if ( req->dl->state() == Download::Finished && req->dl->hasError()
+               && ( req->dl->lastRequestError().type() == NetworkRequestError::AuthFailed || req->dl->lastRequestError().type() == NetworkRequestError::Unauthorized ) ) {
+            MIL_MEDIA << "Found request waiting for Auth, restarting " << req->dl->spec().url() << std::endl;
+            req->dl->spec().settings().protoData() = data.settings();
+            req->dl->start();
+          }
+        }
+        sendStatus( data.requestid(), zypp::proto::Status::Ok, "OK" );
+
+      } else if ( mName == "zypp.proto.SubscribeProgress" )  {
+        zypp::proto::SubscribeProgress sub;
+        if (! sub.ParseFromString( m.value() ) ) {
+          sendStatus( -1, zypp::proto::Status::MalformedRequest, "Unable to deserialize the request." );
+          continue;
+        }
+
+        bool found = false;
+        for ( auto &req : _requests ) {
+          if ( req->request.requestid() == sub.requestid() ) {
+            req->request.set_streamprogress( true );
+            if ( sub.prioritize() )
+              req->dl->prioritize();
+            sendStatus( sub.requestid(), zypp::proto::Status::Ok, "OK" );
+            found = true;
+            break;
+          }
+        }
+
+        if ( !found )
+          sendStatus( sub.requestid(), zypp::proto::Status::UnknownId, "Could not find the request ID in running requests" );
+
+      } else if ( mName == "zypp.proto.UnSubscribeProgress" )  {
+        zypp::proto::UnSubscribeProgress unSub;
+        if (! unSub.ParseFromString( m.value() ) ) {
+          sendStatus( -1, zypp::proto::Status::MalformedRequest, "Unable to deserialize the request." );
+          return;
+        }
+
+        bool found = false;
+        for ( auto &req : _requests ) {
+          if ( req->request.requestid() == unSub.requestid() ) {
+            req->request.set_streamprogress( false );
+            found = true;
+            sendStatus( unSub.requestid(), zypp::proto::Status::Ok, "OK" );
+            break;
+          }
+        }
+        if ( !found )
+          sendStatus( unSub.requestid(), zypp::proto::Status::UnknownId, "Could not find the request ID in running requests" );
+
+      } else {
+        sendStatus( -1, zypp::proto::Status::UnknownRequest, "This request type is not known." );
+      }
+    }
+  }
+
+  void MediaNetworkConn::onError( Socket::SocketError err )
+  {
+    MIL << "Socket received error: " << err << std::endl;
+    _connection->disconnect();
+  }
+
+  void MediaNetworkConn::trackRequest( Request &r )
+  {
+    r.trackingConns = {
+      r.dl->connectFunc( &Download::sigStarted, [ this, &r ]( auto & ) {
+        this->signalRequestStarted( r );
+      }, *this),
+
+      r.dl->connectFunc( &Download::sigAlive, [ this, &r ]( auto &, off_t now ) {
+
+          if ( !r.request.streamprogress() )
+            return;
+
+          zypp::proto::DownloadProgress prog;
+          prog.set_requestid( r.request.requestid() );
+          prog.set_url( r.request.spec().url() );
+          prog.set_now( now );
+          this->sendMessage( prog );
+        }, *this ),
+
+      r.dl->connectFunc( &Download::sigProgress, [ this, &r ]( auto &, off_t total, off_t now ) {
+
+        if ( !r.request.streamprogress() ) {
+          return;
+        }
+
+        zypp::proto::DownloadProgress prog;
+        prog.set_requestid( r.request.requestid() );
+        prog.set_url( r.request.spec().url() );
+        prog.set_now( now );
+        prog.set_total( total );
+        this->sendMessage( prog );
+      }, *this ),
+      r.dl->connectFunc( &Download::sigFinished, [ this, &r ]( auto & ) {
+        this->trackedDlFinished( r );
+      }, *this )
+    };
+  }
+
+  void MediaNetworkConn::signalRequestStarted(Request &r)
+  {
+    zypp::proto::DownloadStart start;
+    start.set_requestid( r.request.requestid() );
+    start.set_url( r.request.spec().url() );
+    this->sendMessage( start );
+  }
+
+  void MediaNetworkConn::trackedDlFinished( MediaNetworkConn::Request &r )
+  {
+    MIL << "Download finished by MediaNetworkServer: " << r.request.spec().url() << std::endl;
+
+    zypp::proto::DownloadFin fin;
+    fin.set_requestid( r.request.requestid() );
+    if ( r.dl->lastAuthTimestamp() > 0 )
+      fin.set_last_auth_timestamp( r.dl->lastAuthTimestamp() );
+    r.clearConnections();
+
+    std::string err;
+    if ( !r.dl->hasError() ) {
+      fin.clear_error();
+    } else {
+      const auto &lerr = r.dl->lastRequestError();
+      fin.mutable_error()->set_error( lerr.type() );
+      fin.mutable_error()->set_errordesc( err );
+      fin.mutable_error()->set_nativeerror( lerr.nativeErrorString() );
+
+      // this is rather ugly, we need to convert the extra infos to string
+      // we will only handle the ones the client actually cares about
+      fin.mutable_error()->mutable_extra_info()->insert( { "requestUrl", lerr.extraInfoValue("requestUrl", r.dl->spec().url()).asString() } );
+      if ( lerr.type() == NetworkRequestError::Unauthorized )
+        fin.mutable_error()->mutable_extra_info()->insert( { "authHint", lerr.extraInfoValue("authHint", std::string()) } );
+    }
+
+    this->sendMessage( fin );
+
+    MIL_MEDIA << "Download was finished, releasing all ressources." << std::endl;
+    _requests.erase (
+      std::remove_if( _requests.begin(), _requests.end(), [ &r ]( const auto &reqInList ){
+        return reqInList.get() == &r;
+      }
+    ));
+    return;
+    // ATTENTION, r will be dangling from here on out
+  }
+
+  template< typename T >
+  void MediaNetworkConn::
+  sendMessage( T &m )
+  {
+    zypp::proto::Envelope env;
+    env.set_messagetypename( m.GetTypeName() );
+    m.SerializeToString( env.mutable_value() );
+
+    //DBG << "Sending message\n" << env.DebugString() << std::endl;
+
+    std::string data = env.SerializeAsString();
+    const HeaderSizeType size = data.size();
+
+    _connection->write( reinterpret_cast<const char *>( &size ), sizeof(decltype(size)) );
+    _connection->write( data.data(), size );
+  }
+
+  MediaNetworkThread::MediaNetworkThread()
+  {
+    MIL_MEDIA << "Initializing MediaNetworkThread" << std::endl;
+    //start up thread
+    _t = std::thread( [this](){ threadMain(); });
+  }
+
+  void MediaNetworkThread::threadMain()
+  {
+    // force the kernel to pick another thread to handle those signals
+    zyppng::blockSignalsForCurrentThread( { SIGTERM, SIGINT, SIGPIPE, } );
+
+    zyppng::ThreadData::current().setName("Zypp-MediaNetwork");
+
+    auto dispatch = zyppng::EventLoop::create();
+
+    auto server = std::make_shared<MediaNetworkServer>();
+    server->listen( sockPath() );
+
+    // we are using a pipe to wake up from the event loop, the SocketNotifier will throw a signal every
+    // time there is data available
+    auto sNotify = _shutdownSignal.makeNotifier( false );
+    sNotify->connectFunc( &zyppng::SocketNotifier::sigActivated, [&dispatch]( const zyppng::SocketNotifier &, int ) {
+      dispatch->quit();
+    });
+    sNotify->setEnabled( true );
+
+    MIL_MEDIA << "Starting event loop " << std::endl;
+
+    dispatch->run();
+
+    MIL_MEDIA << "Thread exit " << std::endl;
+  }
+
+  MediaNetworkThread::~MediaNetworkThread()
+  {
+    _shutdownSignal.notify();
+    _t.join();
+  }
+
+  MediaNetworkThread &MediaNetworkThread::instance()
+  {
+    static MediaNetworkThread t;
+    return t;
+  }
+
+}
index d85a551..565d55b 100644 (file)
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
 #include <zypp/zyppng/media/network/private/downloader_p.h>
-#include <zypp/zyppng/media/network/private/request_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
 #include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
 #include <zypp/zyppng/media/network/networkrequestdispatcher.h>
-#include <zypp/zyppng/media/network/request.h>
-#include <zypp/zyppng/base/Timer>
-#include <zypp/zyppng/base/EventDispatcher>
-#include <zypp/Pathname.h>
 #include <zypp/media/TransferSettings.h>
-#include <zypp/media/MetaLinkParser.h>
-#include <zypp/ByteCount.h>
-#include <zypp/base/String.h>
-#include <zypp/PathInfo.h>
 #include <zypp/media/CurlHelper.h>
+#include <zypp/media/MediaException.h>
+#include <zypp/base/String.h>
 #include <zypp/media/CredentialManager.h>
 #include <zypp/ZConfig.h>
-#include <zypp/base/Logger.h>
-
-#include <queue>
-#include <fcntl.h>
-#include <iostream>
-#include <fstream>
-
-#define BLKSIZE                131072
-
-namespace  {
-  bool looks_like_metalink_data( const std::vector<char> &data )
-  {
-    if ( data.empty() )
-      return false;
-
-    const char *p = data.data();
-    while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
-      p++;
-
-    if (!strncasecmp(p, "<?xml", 5))
-    {
-      while (*p && *p != '>')
-        p++;
-      if (*p == '>')
-        p++;
-      while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
-        p++;
-    }
-    bool ret = !strncasecmp( p, "<metalink", 9 ) ? true : false;
-    return ret;
-  }
-
-  bool looks_like_metalink_file( const zypp::Pathname &file )
-  {
-    std::unique_ptr<FILE, decltype(&fclose)> fd( fopen( file.c_str(), "r" ), &fclose );
-    if ( !fd )
-      return false;
-    return looks_like_metalink_data( zyppng::peek_data_fd( fd.get(), 0, 256 ) );
-  }
-}
 
 namespace zyppng {
 
-  DownloadPrivate::DownloadPrivate(Downloader &parent, std::shared_ptr<NetworkRequestDispatcher> requestDispatcher, Url &&file, zypp::filesystem::Pathname &&targetPath, zypp::ByteCount &&expectedFileSize )
-    : _requestDispatcher ( requestDispatcher )
-    , _url( std::move(file) )
-    , _targetPath( std::move(targetPath) )
-    , _expectedFileSize( std::move(expectedFileSize) )
+  DownloadPrivateBase::DownloadPrivateBase(Downloader &parent, std::shared_ptr<NetworkRequestDispatcher> requestDispatcher, std::shared_ptr<MirrorControl> mirrors, DownloadSpec &&spec, Download &p)
+    : BasePrivate(p)
+    , _requestDispatcher ( std::move(requestDispatcher) )
+    , _mirrorControl( std::move(mirrors) )
+    , _spec( std::move(spec) )
     , _parent( &parent )
-  { }
+  {}
 
-  void DownloadPrivate::Request::connectSignals(DownloadPrivate &dl)
-  {
-    _sigStartedConn  = sigStarted().connect ( sigc::mem_fun( dl, &DownloadPrivate::onRequestStarted) );
-    _sigProgressConn = sigProgress().connect( sigc::mem_fun( dl, &DownloadPrivate::onRequestProgress) );
-    _sigFinishedConn = sigFinished().connect( sigc::mem_fun( dl, &DownloadPrivate::onRequestFinished) );
-  }
-
-  void DownloadPrivate::Request::disconnectSignals()
-  {
-    _sigStartedConn.disconnect();
-    _sigProgressConn.disconnect();
-    _sigFinishedConn.disconnect();
-  }
+  DownloadPrivateBase::~DownloadPrivateBase()
+  { }
 
-  void DownloadPrivate::start()
+  bool DownloadPrivateBase::handleRequestAuthError( std::shared_ptr<Request> req, const zyppng::NetworkRequestError &err )
   {
-    if ( _state == Download::Initializing ||
-         _state == Download::Running ||
-         _state == Download::RunningMulti )
-      return;
-
-    //reset state variables
-    _isMultiDownload = false;
-    _downloadedMultiByteCount = 0;
-    _multiPartMirrors.clear();
-    _blockList    = zypp::media::MediaBlockList ();
-    _blockIter    = 0;
-    _errorString  = std::string();
-    _requestError = NetworkRequestError();
-
-    setState( Download::Initializing );
-
-    _requestError = safeFillSettingsFromURL( _url , _transferSettings );
-    if ( _requestError.type() != NetworkRequestError::NoError ) {
-      setFailed( "Failed to read settings from URL " );
-      return;
-    }
-
-    std::shared_ptr<Request> initialRequest = std::make_shared<Request>( internal::clearQueryString(_url), _targetPath );
+    //Handle the auth errors explicitely, we need to give the user a way to put in new credentials
+    //if we get valid new credentials we can retry the request
+    bool retry = false;
+    if ( err.type() == NetworkRequestError::Unauthorized || err.type() == NetworkRequestError::AuthFailed ) {
 
-    initialRequest->_originalUrl = _url;
-    initialRequest->transferSettings() = _transferSettings;
-
-    if ( _isMultiPartEnabled ) {
-      if ( !_checkExistsOnly )
-        initialRequest->transferSettings().addHeader("Accept: */*, application/metalink+xml, application/metalink4+xml");
-      else
-        WAR << "Ignoring enabled multi part option for check only download of : " << internal::clearQueryString(_url) << std::endl;
-    }
+      MIL << "Authentication failed for " << req->url() << " trying to recover." << std::endl;
 
-    if ( _checkExistsOnly )
-      initialRequest->setOptions( initialRequest->options() | NetworkRequest::HeadRequest );
+      zypp::media::CredentialManager cm( zypp::media::CredManagerOptions( zypp::ZConfig::instance().repoManagerRoot()) );
+      auto authDataPtr = cm.getCred( req->url() );
 
-    addNewRequest( initialRequest );
-  }
+      // get stored credentials
+      NetworkAuthData_Ptr cmcred( authDataPtr ? new NetworkAuthData( *authDataPtr ) : new NetworkAuthData() );
+      TransferSettings &ts = req->transferSettings();
 
-  void DownloadPrivate::setState(Download::State newState)
-  {
-    if ( _state == newState )
-      return;
-    _state = newState;
-    _sigStateChanged.emit( *z_func(), newState );
-  }
-
-  void DownloadPrivate::onRequestStarted( NetworkRequest & )
-  {
-    if ( _state == Download::Initializing )
-      _sigStarted.emit( *z_func() );
-  }
-
-  void DownloadPrivate::onRequestProgress( NetworkRequest &req, off_t dltotal, off_t dlnow, off_t , off_t  )
-  {
-    //we are not sure yet if we are downloading a Metalink, for now just send alive messages
-    if ( _state == Download::Initializing ) {
-      if ( !_isMultiPartEnabled ) {
-        setState( Download::Running );
+      // We got credentials from store, _triedCredFromStore makes sure we just try the auth from store once
+      // if its timestamp does not change between 2 retries
+      if ( cmcred && ( !req->_triedCredFromStore || req->_authTimestamp < cmcred->lastDatabaseUpdate() ) ) {
+        MIL << "got stored credentials:" << std::endl << *cmcred << std::endl;
+        ts.setUsername( cmcred->username() );
+        ts.setPassword( cmcred->password() );
+        retry = true;
+        req->_triedCredFromStore = true;
+        _lastTriedAuthTime = req->_authTimestamp = cmcred->lastDatabaseUpdate();
       } else {
-        if ( !_isMultiDownload ) {
-          std::string cType = req.contentType();
-          if ( cType.find("application/metalink+xml") == 0 || cType.find("application/metalink4+xml") == 0 )
-            _isMultiDownload = true;
-        }
 
-        if ( !_isMultiDownload && dlnow < 256 ) {
-          // can't tell yet, ...
-          return _sigAlive.emit( *z_func(), dlnow );
-        }
+        //we did not get credentials from the store, emit a signal that allows
+        //setting new auth data
 
-        if ( !_isMultiDownload )
-        {
-          _isMultiDownload = looks_like_metalink_data( req.peekData( 0, 256 ) );
-        }
+        NetworkAuthData credFromUser;
+        credFromUser.setUrl( req->url() );
 
-        if ( _isMultiDownload )
-        {
-          // this is a metalink file change the expected filesize
-          if ( zypp::ByteCount( 2, zypp::ByteCount::MB) < static_cast<zypp::ByteCount::SizeType>( dlnow ) ) {
-            _requestDispatcher->cancel( req, NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) );
-            return;
-          }
-          return _sigAlive.emit( *z_func(), dlnow );
-        }
+        //in case we got a auth hint from the server the error object will contain it
+        std::string authHint = err.extraInfoValue("authHint", std::string());
 
-        //if we reach here we have a normal file ( or a multi download with more than 256 byte of comment in the beginning )
-        setState( Download::Running );
-      }
-    }
-
-    if ( _state == Download::Running ) {
-      if ( _expectedFileSize > 0 && _expectedFileSize < dlnow ) {
-        _requestDispatcher->cancel( req, NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) );
-        return;
-      }
-      return _sigProgress.emit( *z_func(), dltotal, dlnow );
+        //preset from store if we found something
+        if ( cmcred && !cmcred->username().empty() )
+          credFromUser.setUsername( cmcred->username() );
 
-    } else if ( _state == Download::RunningMulti ) {
-      off_t dlnowMulti = _downloadedMultiByteCount;
-      for( const auto &req : _runningRequests ) {
-        dlnowMulti += req->downloadedByteCount();
-      }
-      _sigProgress.emit( *z_func(), _blockList.getFilesize(), dlnowMulti );
-    }
-  }
+        _sigAuthRequired.emit( *z_func(), credFromUser, authHint );
+        if ( credFromUser.valid() ) {
+          MIL << "Got user provided credentials" << std::endl;
+          ts.setUsername( credFromUser.username() );
+          ts.setPassword( credFromUser.password() );
 
-  void DownloadPrivate::onRequestFinished( NetworkRequest &req, const zyppng::NetworkRequestError &err )
-  {
+          // set available authentication types from the error
+          if ( credFromUser.authType() == CURLAUTH_NONE )
+            credFromUser.setAuthType( authHint );
 
-    auto it = std::find_if( _runningRequests.begin(), _runningRequests.end(), [ &req ]( const std::shared_ptr<Request> &r ) {
-      return ( r.get() == &req );
-    });
-    if ( it == _runningRequests.end() )
-      return;
-
-    auto reqLocked = *it;
-
-    //remove from running
-    _runningRequests.erase( it );
-
-    if ( err.isError() ) {
-
-      bool retry = false;
-
-      //Handle the auth errors explicitely, we need to give the user a way to put in new credentials
-      //if we get valid new credentials we can retry the request
-      if ( err.type() == NetworkRequestError::Unauthorized || err.type() == NetworkRequestError::AuthFailed ) {
-
-        zypp::media::CredentialManager cm( zypp::media::CredManagerOptions( zypp::ZConfig::instance().repoManagerRoot()) );
-        auto authDataPtr = cm.getCred( req.url() );
-
-        // get stored credentials
-        NetworkAuthData_Ptr cmcred( authDataPtr ? new NetworkAuthData( *authDataPtr ) : new NetworkAuthData() );
-        TransferSettings &ts = req.transferSettings();
-
-        // We got credentials from store, _triedCredFromStore makes sure we just try the auth from store once
-        if ( cmcred && !reqLocked->_triedCredFromStore ) {
-          DBG << "got stored credentials:" << std::endl << *cmcred << std::endl;
-          ts.setUsername( cmcred->username() );
-          ts.setPassword( cmcred->password() );
-          retry = true;
-          reqLocked->_triedCredFromStore = true;
-        } else {
-
-          //we did not get credentials from the store, emit a signal that allows
-          //setting new auth data
-
-          NetworkAuthData credFromUser;
-          credFromUser.setUrl( req.url() );
-
-          //in case we got a auth hint from the server the error object will contain it
-          auto authHintIt = err.extraInfo().find("authHint");
-          std::string authHint;
-
-          if ( authHintIt != err.extraInfo().end() ){
-            try {
-              authHint = boost::any_cast<std::string>( authHintIt->second );
-            } catch ( const boost::bad_any_cast &) { }
+          // set auth type (seems this must be set _after_ setting the userpwd)
+          if ( credFromUser.authType()  != CURLAUTH_NONE ) {
+            // FIXME: only overwrite if not empty?
+            req->transferSettings().setAuthType(credFromUser.authTypeAsString());
           }
 
-          //preset from store if we found something
-          if ( cmcred && !cmcred->username().empty() )
-            credFromUser.setUsername( cmcred->username() );
-
-          _sigAuthRequired.emit( *z_func(), credFromUser, authHint );
-          if ( credFromUser.valid() ) {
-            ts.setUsername( credFromUser.username() );
-            ts.setPassword( credFromUser.password() );
+          cm.addCred( credFromUser );
+          cm.save();
 
-            // set available authentication types from the error
-            if ( credFromUser.authType() == CURLAUTH_NONE )
-              credFromUser.setAuthType( authHint );
-
-            // set auth type (seems this must be set _after_ setting the userpwd)
-            if ( credFromUser.authType()  != CURLAUTH_NONE ) {
-              // FIXME: only overwrite if not empty?
-              req.transferSettings().setAuthType(credFromUser.authTypeAsString());
-            }
-
-            cm.addCred( credFromUser );
-            cm.save();
-
-            retry = true;
-          }
-        }
-      } else if ( _state == Download::RunningMulti ) {
-
-        //if a error happens during a multi download we try to use another mirror to download the failed block
-        DBG << "Request failed " << reqLocked->_myBlock << " " << reqLocked->extendedErrorString() << std::endl;
-        NetworkRequestError dummyErr;
-
-        //try to init a new multi request, if we have leftover mirrors we get a valid one
-        auto newReq = initMultiRequest( reqLocked->_myBlock, dummyErr );
-        if ( newReq ) {
-          newReq->_retryCount = reqLocked->_retryCount + 1;
-          addNewRequest( newReq );
-          return;
-        } else {
-          //no mirrors left but if we still have running requests, there is hope to finish the block
-          if ( !_runningRequests.empty() ) {
-            DBG << "Adding to failed blocklist " << reqLocked->_myBlock <<std::endl;
-            _failedBlocks.push_back( FailedBlock{ reqLocked->_myBlock, reqLocked->_retryCount, err } );
-            return;
-          }
-        }
-      }
-
-      //if rety is true we just enqueue the request again, usually this means authentication was updated
-      if ( retry ) {
-        //make sure this request will run asap
-        reqLocked->setPriority( NetworkRequest::High );
-
-        //this is not a new request, only add to queues but do not connect signals again
-        _runningRequests.push_back( reqLocked );
-        _requestDispatcher->enqueue( reqLocked );
-        return;
-      }
-
-      //we do not have more mirrors left we can try or we do not have a multi download, abort
-      while( _runningRequests.size() ) {
-        auto req = _runningRequests.back();
-        req->disconnectSignals();
-        _runningRequests.pop_back();
-        _requestDispatcher->cancel( *req, err );
-      }
-
-      //not all hope is lost, maybe a normal download can work out?
-      if ( _state == Download::RunningMulti ) {
-        //fall back to normal download
-        DBG << "Falling back to download from initial URL." << std::endl;
-        _isMultiDownload = false;
-        _isMultiPartEnabled = false;
-        setState( Download::Running );
-
-        auto req = std::make_shared<Request>( internal::clearQueryString(_url), _targetPath ) ;
-        req->transferSettings() = _transferSettings;
-        addNewRequest( req );
-        return;
-      }
-
-      _requestError = err;
-      setFailed( "Download failed ");
-      return;
-    }
-
-    if ( _state == Download::Initializing || _state == Download::Running ) {
-      if ( _isMultiPartEnabled && !_isMultiDownload )
-        _isMultiDownload = looks_like_metalink_file( req.targetFilePath() );
-      if ( !_isMultiDownload ) {
-        setFinished();
-        return;
-      }
-
-      DBG << " Upgrading request for URL: "<< req.url() << " to multipart download " << std::endl;
-
-      //we have a metalink download, lets parse it and see what we got
-      _multiPartMirrors.clear();
-
-      try {
-        zypp::media::MetaLinkParser parser;
-        parser.parse( req.targetFilePath() );
-
-        _blockList = parser.getBlockList();
-
-        //migrate some settings from the base url to the mirror
-        std::vector<Url> urllist = parser.getUrls();
-        for (std::vector<Url>::iterator urliter = urllist.begin(); urliter != urllist.end(); ++urliter) {
-          try {
-            std::string scheme = urliter->getScheme();
-            if (scheme == "http" || scheme == "https" || scheme == "ftp" || scheme == "tftp") {
-              if ( !_requestDispatcher->supportsProtocol( *urliter ))
-                continue;
-              _multiPartMirrors.push_back(internal::propagateQueryParams(*urliter, _url));
-            }
-          }
-          catch (...) {  }
-        }
-
-        if ( _multiPartMirrors.empty() )
-          _multiPartMirrors.push_back( _url );
-
-      } catch ( const zypp::Exception &ex ) {
-        setFailed( zypp::str::Format("Failed to parse metalink information.(%1%)" ) % ex.asUserString() );
-        return;
-      }
-
-      if ( _multiPartMirrors.size() == 0 ) {
-        setFailed( zypp::str::Format("Invalid metalink information.( No mirrors in metalink file)" ) );
-        return;
-      }
-
-      if ( !_blockList.haveBlocks() ) {
-
-        //if we have no filesize we can not generate a blocklist, we need to fall back to normal download
-        if ( !_blockList.haveFilesize() ) {
-          DBG << "No blocklist and no filesize, falling back to normal download for URL " << _url << std::endl;
-
-          //fall back to normal download but use a mirror from the mirror list
-          //otherwise we get HTTPS to HTTP redirect errors
-          _isMultiDownload = false;
-          _isMultiPartEnabled = false;
-
-          Url url;
-          TransferSettings set;
-          NetworkRequestError dummyErr;
-          if ( !findNextMirror( url, set, dummyErr ) ) {
-            url = _url;
-            set = _transferSettings;
-          }
+          // potentially setting this after the file has been touched we might miss a change
+          // in a later loop, if another update to the store happens right in the few ms difference
+          // between the actual file write and calling time() here. However this is highly unlikely
+          _lastTriedAuthTime = req->_authTimestamp = time( nullptr ) ;
 
-          auto req = std::make_shared<Request>( internal::clearQueryString(url), _targetPath ) ;
-
-          if ( _blockList.haveFileChecksum() ) {
-            std::shared_ptr<zypp::Digest> fileDigest = std::make_shared<zypp::Digest>();
-            if ( _blockList.createFileDigest( *fileDigest ) ) {
-              req->setDigest( fileDigest );
-              req->setExpectedChecksum( _blockList.getFileChecksum() );
-            }
-          }
-
-          req->transferSettings() = set;
-          addNewRequest( req );
-          return;
-
-        } else {
-          //we generate a blocklist on the fly based on the filesize
-
-          DBG << "Generate blocklist, since there was none in the metalink file." << _url  << std::endl;
-
-          off_t currOff = 0;
-          off_t filesize = _blockList.getFilesize();
-          while ( currOff <  filesize )  {
-
-            size_t blksize = static_cast<size_t>( filesize - currOff );
-            if ( blksize > BLKSIZE)
-              blksize = BLKSIZE;
-
-            _blockList.addBlock( currOff, blksize );
-            currOff += blksize;
-          }
-
-          XXX << "Generated blocklist: " << std::endl << _blockList << std::endl << " End blocklist " << std::endl;
-        }
-      }
-
-      //remove the metalink file
-      zypp::filesystem::unlink( _targetPath );
-
-      if ( !_deltaFilePath.empty() ) {
-        zypp::PathInfo dFileInfo ( _deltaFilePath );
-        if ( dFileInfo.isFile() && dFileInfo.isR() ) {
-          FILE *f = fopen( _targetPath.asString().c_str(), "w+b" );
-          if ( !f ) {
-            setFailed( zypp::str::Format("Failed to open target file.(errno %1%)" ) % errno );
-            return;
-          }
-
-          try {
-            _blockList.reuseBlocks ( f, _deltaFilePath.asString() );
-          } catch ( ... ) { }
-
-          fclose( f );
-        }
-      }
-
-      setState( Download::RunningMulti );
-      _blockIter = 0;
-
-    } else if ( _state == Download::RunningMulti ) {
-      _downloadedMultiByteCount += req.downloadedByteCount();
-
-      DBG << "Request finished " << reqLocked->_myBlock <<std::endl;
-
-      auto restartReqWithBlock = [ this ]( std::shared_ptr<Request> &req, size_t block, int retryCount ) {
-        zypp::media::MediaBlock blk = _blockList.getBlock( block );
-        req->_myBlock = block;
-        req->_retryCount = retryCount;
-        req->setRequestRange( blk.off, static_cast<off_t>( blk.size ) );
-        req->setExpectedChecksum( _blockList.getChecksum( block ) );
-
-        //this is not a new request, only add to queues but do not connect signals again
-        _runningRequests.push_back( req );
-        _requestDispatcher->enqueue( req );
-      };
-
-      //check if we already have enqueued all blocks if not reuse the request
-      if ( _blockIter  < _blockList.numBlocks() ) {
-
-        DBG << "Reusing to download block: " << _blockIter <<std::endl;
-        restartReqWithBlock( reqLocked, _blockIter, 0 );
-        _blockIter++;
-        return;
-
-      } else {
-        //if we have failed blocks, try to download them with this mirror
-        if ( !_failedBlocks.empty() ) {
-
-          FailedBlock blk = std::move( _failedBlocks.front() );
-          _failedBlocks.pop_front();
-
-          DBG << "Reusing to download failed block: " << blk._block <<std::endl;
-
-          restartReqWithBlock( reqLocked, blk._block, blk._retryCount+1 );
-          return;
-        }
-
-        //feed the working URL back into the mirrors in case there are still running requests that might fail
-        _multiPartMirrors.push_front( reqLocked->_originalUrl );
-      }
-    }
-
-    //check if there is still work to do
-    if ( _runningRequests.size() < 10 ) {
-
-      NetworkRequestError lastErr = _requestError;
-
-      //we try to allocate as many requests as possible but stop if we cannot find a valid mirror for one
-      for ( ; _blockIter < _blockList.numBlocks(); _blockIter++ ){
-
-        if ( _runningRequests.size() >= 10 )
-          break;
-
-        std::shared_ptr<Request> req = initMultiRequest( _blockIter, lastErr );
-        if ( !req )
-          break;
-
-        addNewRequest( req );
-      }
-
-      while ( _failedBlocks.size() ) {
-
-        if ( _runningRequests.size() >= 10 )
-          break;
-
-        FailedBlock blk = std::move( _failedBlocks.front() );
-        _failedBlocks.pop_front();
-
-        auto req = initMultiRequest( blk._block, lastErr );
-        if ( !req )
-          break;
-
-        addNewRequest( req );
-      }
-
-      if ( _runningRequests.empty() && lastErr.type()!= NetworkRequestError::NoError )  {
-        //we found no mirrors -> fail
-        _requestError = lastErr;
-        setFailed( "Unable to use mirror" );
-      }
-    }
-
-    if ( _runningRequests.empty() ) {
-
-      if ( _failedBlocks.size() || ( _blockIter < _blockList.numBlocks() )) {
-        setFailed( "Unable to download all blocks." );
-        return;
-      }
-
-      if ( _state == Download::RunningMulti && _blockList.haveFileChecksum() ) {
-        //TODO move this into a external application so we do not need to block on it
-        //need to check file digest
-        zypp::Digest dig;
-        _blockList.createFileDigest( dig );
-
-        std::ifstream istrm( _targetPath.asString(), std::ios::binary);
-        if ( !istrm.is_open() ) {
-          setFailed( "Failed to verify file digest (Could not open target file)." );
-          return;
-        }
-        if ( !dig.update( istrm ) ) {
-          setFailed( "Failed to verify file digest (Could not read target file)." );
-          return;
-        }
-        if ( !_blockList.verifyFileDigest( dig ) ) {
-          setFailed( "Failed to verify file digest (Checksum did not match)." );
-          return;
+          retry = true;
         }
       }
-      //TODO implement digest check for non multi downloads
-      setFinished();
     }
+    return retry;
   }
 
-  void DownloadPrivate::addNewRequest( std::shared_ptr<Request> req )
+#if ENABLE_ZCHUNK_COMPRESSION
+  bool DownloadPrivateBase::hasZckInfo() const
   {
-    auto slot = _sigStarted.slots().front();
-    req->connectSignals( *this );
-    _runningRequests.push_back( req );
-    _requestDispatcher->enqueue( req );
+    if ( zypp::indeterminate(_specHasZckInfo) )
+      _specHasZckInfo = ( _spec.headerSize() > 0 && isZchunkFile( _spec.deltaFile() ) );
+    return bool(_specHasZckInfo);
   }
+#endif
 
-  std::shared_ptr<DownloadPrivate::Request> DownloadPrivate::initMultiRequest( size_t block, NetworkRequestError &err )
+  void DownloadPrivateBase::Request::disconnectSignals()
   {
-    zypp::media::MediaBlock blk = _blockList.getBlock( block );
-
-    Url myUrl;
-    TransferSettings settings;
-    if ( !findNextMirror( myUrl, settings, err ) )
-      return nullptr;
+    _sigStartedConn.disconnect();
+    _sigProgressConn.disconnect();
+    _sigFinishedConn.disconnect();
+  }
 
-    DBG << "Starting block " << block << std::endl;
+  DownloadPrivate::DownloadPrivate(Downloader &parent, std::shared_ptr<NetworkRequestDispatcher> requestDispatcher, std::shared_ptr<MirrorControl> mirrors, DownloadSpec &&spec, Download &p)
+    : DownloadPrivateBase( parent, std::move(requestDispatcher), std::move(mirrors), std::move(spec), p )
+  { }
 
-    std::shared_ptr<Request> req = std::make_shared<Request>( internal::clearQueryString( myUrl ), _targetPath, blk.off, blk.size, NetworkRequest::WriteShared );
-    req->_originalUrl = myUrl;
-    req->_myBlock = block;
-    req->setPriority( NetworkRequest::High );
-    req->transferSettings() = settings;
+  void DownloadPrivate::init()
+  {
+    Base::connectFunc( *this, &DownloadStatemachine<DownloadPrivate>::sigFinished, [this](){
+      DownloadPrivateBase::_sigFinished.emit( *z_func() );
+    } );
 
-    if ( _blockList.haveChecksum( block ) ) {
-      std::shared_ptr<zypp::Digest> dig = std::make_shared<zypp::Digest>();
-      _blockList.createDigest( *dig );
-      req->setDigest( dig );
-      std::vector<unsigned char> checksumVec = _blockList.getChecksum( block );
-      req->setExpectedChecksum( checksumVec );
-      DBG << "Starting block  " << block << " with checksum " << zypp::Digest::digestVectorToString( checksumVec ) << std::endl;
-    } else {
-      DBG << "Block " << block << " has no checksum." << std::endl;
-    }
-    return req;
+    Base::connectFunc( *this, &DownloadStatemachine<DownloadPrivate>::sigStateChanged, [this]( const auto state ){
+      DownloadPrivateBase::_sigStateChanged.emit( *z_func(), state );
+    } );
   }
 
-  bool DownloadPrivate::findNextMirror( Url &url, TransferSettings &set, NetworkRequestError &err )
+  void DownloadPrivate::start()
   {
-    Url myUrl;
-    bool foundMirror = false;
-    TransferSettings settings;
-    while ( _multiPartMirrors.size() ) {
-      myUrl = _multiPartMirrors.front();
-      _multiPartMirrors.pop_front();
-
-      settings = _transferSettings;
-      //if this is a different host than the initial request, we reset username/password
-      if ( myUrl.getHost() != _url.getHost() ) {
-        settings.setUsername( std::string() );
-        settings.setPassword( std::string() );
-        settings.setAuthType( std::string() );
-      }
+    auto cState = currentState();
+    if ( !cState )
+      DownloadStatemachine<DownloadPrivate>::start();
 
-      err = safeFillSettingsFromURL( myUrl, settings );
-      if ( err.type() != NetworkRequestError::NoError ) {
-        continue;
-      }
-
-      foundMirror = true;
-      break;
+    cState = currentState();
+    if ( *cState != Download::InitialState && *cState != Download::Finished ) {
+      // the state machine has advaned already, we can only restart it in a finished state
+        return;
     }
 
-    if ( !foundMirror )
-      return false;
+    //reset state variables
+    _emittedSigStart = false;
+    _specHasZckInfo  = zypp::indeterminate;
 
-    url = myUrl;
-    set = settings;
-    return true;
-  }
+    // restart the statemachine
+    if ( cState == Download::Finished )
+      DownloadStatemachine<DownloadPrivate>::start();
 
-  void DownloadPrivate::setFailed(std::string &&reason)
-  {
-    _errorString = reason;
-    //zypp::filesystem::unlink( _targetPath );
-    setFinished( false );
+    //jumpstart the process
+    state<InitialState>()->initiate();
   }
 
-  void DownloadPrivate::setFinished(bool success)
-  {
-    setState( success ? Download::Success : Download::Failed );
-    _sigFinished.emit( *z_func() );
-  }
 
-  NetworkRequestError DownloadPrivate::safeFillSettingsFromURL( const Url &url, TransferSettings &set)
+  NetworkRequestError DownloadPrivateBase::safeFillSettingsFromURL( const Url &url, TransferSettings &set)
   {
     auto buildExtraInfo = [this, &url](){
       std::map<std::string, boost::any> extraInfo;
       extraInfo.insert( {"requestUrl", url } );
-      extraInfo.insert( {"filepath", _targetPath } );
+      extraInfo.insert( {"filepath", _spec.targetPath() } );
       return extraInfo;
     };
 
     NetworkRequestError res;
     try {
-      internal::fillSettingsFromUrl( url, set );
-      if ( _transferSettings.proxy().empty() )
-        internal::fillSettingsSystemProxy( url, set );
+      ::internal::fillSettingsFromUrl( url, set );
+      if ( _spec.settings().proxy().empty() )
+        ::internal::fillSettingsSystemProxy( url, set );
 
       /* Fixes bsc#1174011 "auth=basic ignored in some cases"
        * We should proactively add the password to the request if basic auth is configured
@@ -695,43 +201,47 @@ namespace zyppng {
     return res;
   }
 
-  Download::Download(zyppng::DownloadPrivate &&prv)
-  : Base( prv )
+  Download::Download(zyppng::Downloader &parent, std::shared_ptr<zyppng::NetworkRequestDispatcher> requestDispatcher, std::shared_ptr<zyppng::MirrorControl> mirrors, zyppng::DownloadSpec &&spec)
+    : Base( *new DownloadPrivate( parent, std::move(requestDispatcher), std::move(mirrors), std::move(spec), *this )  )
   { }
 
-  Url Download::url() const
-  {
-    return d_func()->_url;
-  }
+  ZYPP_IMPL_PRIVATE(Download)
 
-  zypp::filesystem::Pathname Download::targetPath() const
+  Download::~Download()
   {
-    return d_func()->_targetPath;
+    if ( state() != InitialState && state() != Finished )
+      cancel();
   }
 
   Download::State Download::state() const
   {
-    return d_func()->_state;
+    const auto &s = d_func()->currentState();
+    if ( !s )
+      return Download::InitialState;
+    return *s;
   }
 
   NetworkRequestError Download::lastRequestError() const
   {
-    return d_func()->_requestError;
+    if ( state() == Finished ) {
+      return d_func()->state<FinishedState>()->_error;
+    }
+    return NetworkRequestError();
   }
 
-  std::string Download::errorString() const
+  bool Download::hasError() const
   {
-    Z_D();
-    if (! d->_requestError.isError() ) {
-      return d->_errorString;
-    }
-
-    return ( zypp::str::Format("%1%(%2% %3%)") % d->_errorString % d->_requestError.toString() % d->_requestError.nativeErrorString() );
+    return lastRequestError().isError();
   }
 
-  TransferSettings &Download::settings()
+  std::string Download::errorString() const
   {
-    return d_func()->_transferSettings;
+    const auto &lReq = lastRequestError();
+    if (! lReq.isError() ) {
+      return {};
+    }
+
+    return ( zypp::str::Format("%1%(%2%)") % lReq.toString() % lReq.nativeErrorString() );
   }
 
   void Download::start()
@@ -739,24 +249,47 @@ namespace zyppng {
     d_func()->start();
   }
 
-  void Download::setMultiPartHandlingEnabled( bool enable )
+  void Download::prioritize()
   {
-    d_func()->_isMultiPartEnabled = enable;
+    Z_D();
+
+    if ( !d->_requestDispatcher )
+      return;
+
+    d->_defaultSubRequestPriority = NetworkRequest::Critical;
+
+    // we only reschedule requests when we are in a state that downloads in blocks
+    d->visitState( []( auto &s ){
+      using T = std::decay_t<decltype (s)>;
+      if constexpr ( std::is_same_v<T, DlMetalinkState>
+#if ENABLE_ZCHUNK_COMPRESSION
+          || std::is_same_v<T, DLZckState>
+#endif
+      ) {
+        s.reschedule();
+      }
+    });
   }
 
-  void Download::setCheckExistsOnly(bool set)
+  void Download::cancel()
   {
     Z_D();
-    if ( d->_checkExistsOnly != set ) {
-      d_func()->_checkExistsOnly = set;
-      if ( set == true )
-        d_func()->_isMultiPartEnabled = false;
-    }
+    d->forceState ( std::make_unique<FinishedState>( NetworkRequestErrorPrivate::customError( NetworkRequestError::Cancelled, "Download was cancelled explicitely" ), *d_func() ) );
+  }
+
+  DownloadSpec &Download::spec()
+  {
+    return d_func()->_spec;
   }
 
-  void Download::setDeltaFile( const zypp::filesystem::Pathname &file )
+  const DownloadSpec &Download::spec() const
   {
-    d_func()->_deltaFilePath = file;
+    return d_func()->_spec;
+  }
+
+  uint64_t Download::lastAuthTimestamp() const
+  {
+    return d_func()->_lastTriedAuthTime;
   }
 
   zyppng::NetworkRequestDispatcher &Download::dispatcher() const
@@ -771,7 +304,7 @@ namespace zyppng {
 
   SignalProxy<void (Download &req, Download::State state)> Download::sigStateChanged()
   {
-    return d_func()->_sigStateChanged;
+    return d_func()->DownloadPrivateBase::_sigStateChanged;
   }
 
   SignalProxy<void (zyppng::Download &req, off_t dlnow)> zyppng::Download::sigAlive()
@@ -786,7 +319,7 @@ namespace zyppng {
 
   SignalProxy<void (Download &req)> Download::sigFinished()
   {
-    return d_func()->_sigFinished;
+    return d_func()->DownloadPrivateBase::_sigFinished;
   }
 
   SignalProxy<void (zyppng::Download &req, zyppng::NetworkAuthData &auth, const std::string &availAuth)> Download::sigAuthRequired()
@@ -794,9 +327,14 @@ namespace zyppng {
     return d_func()->_sigAuthRequired;
   }
 
-  DownloaderPrivate::DownloaderPrivate( )
+  DownloaderPrivate::DownloaderPrivate(std::shared_ptr<MirrorControl> mc, Downloader &p)
+    : BasePrivate(p)
+    , _mirrors( std::move(mc) )
   {
-    _requestDispatcher = std::make_shared<NetworkRequestDispatcher>(  );
+    _requestDispatcher = std::make_shared<NetworkRequestDispatcher>( );
+    if ( !_mirrors ) {
+      _mirrors = MirrorControl::create();
+    }
   }
 
   void DownloaderPrivate::onDownloadStarted(Download &download)
@@ -814,7 +352,6 @@ namespace zyppng {
 
     if ( it != _runningDownloads.end() ) {
       //make sure this is not deleted before all user code was done
-      EventDispatcher::unrefLater( *it );
       _runningDownloads.erase( it );
     }
 
@@ -822,20 +359,34 @@ namespace zyppng {
       _queueEmpty.emit( *z_func() );
   }
 
+  ZYPP_IMPL_PRIVATE(Downloader)
+
   Downloader::Downloader( )
-    : Base ( *new DownloaderPrivate( ) )
+    : Base ( *new DownloaderPrivate( {}, *this ) )
   {
 
   }
 
-  std::shared_ptr<Download> Downloader::downloadFile(zyppng::Url file, zypp::filesystem::Pathname targetPath, zypp::ByteCount expectedFileSize )
+  Downloader::Downloader( std::shared_ptr<MirrorControl> mc )
+    : Base ( *new DownloaderPrivate( mc, *this ) )
+  { }
+
+  Downloader::~Downloader()
+  {
+    Z_D();
+    while ( d->_runningDownloads.size() ) {
+      d->_runningDownloads.back()->cancel();
+      d->_runningDownloads.pop_back();
+    }
+  }
+
+  std::shared_ptr<Download> Downloader::downloadFile(const zyppng::DownloadSpec &spec )
   {
     Z_D();
-    std::shared_ptr<Download> dl = std::make_shared<Download>( std::move( *new DownloadPrivate( *this, d->_requestDispatcher, std::move(file), std::move(targetPath), std::move(expectedFileSize) ) ) );
+    std::shared_ptr<Download> dl ( new Download ( *this, d->_requestDispatcher, d->_mirrors, DownloadSpec(spec) ) );
 
     d->_runningDownloads.push_back( dl );
-    dl->sigFinished().connect( sigc::mem_fun( *d , &DownloaderPrivate::onDownloadFinished ) );
-
+    dl->connect( &Download::sigFinished, *d, &DownloaderPrivate::onDownloadFinished );
     d->_requestDispatcher->run();
 
     return dl;
index b688bff..8086c32 100644 (file)
@@ -1,19 +1,17 @@
 #ifndef ZYPP_NG_MEDIA_CURL_DOWNLOADER_H_INCLUDED
 #define ZYPP_NG_MEDIA_CURL_DOWNLOADER_H_INCLUDED
 
-#include <zypp/zyppng/base/zyppglobal.h>
-#include <zypp/zyppng/base/Base>
-#include <zypp/zyppng/base/signals.h>
-#include <zypp/zyppng/core/Url>
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/base/signals.h>
+#include <zypp-core/zyppng/core/Url>
 #include <zypp/zyppng/media/network/networkrequesterror.h>
 #include <zypp/zyppng/media/network/AuthData>
 
 #include <zypp/ByteCount.h>
 
-namespace zypp {
-  namespace media {
-    class TransferSettings;
-  }
+namespace zypp::media {
+  class TransferSettings;
 }
 
 namespace zyppng {
@@ -21,9 +19,12 @@ namespace zyppng {
   class NetworkRequestDispatcher;
   class DownloaderPrivate;
   class Download;
+  class DownloadSpec;
+  class MirrorControl;
 
   using TransferSettings = zypp::media::TransferSettings;
 
+
   /**
    * @brief The Downloader class
    *
@@ -39,15 +40,14 @@ namespace zyppng {
     using Ptr = std::shared_ptr<Downloader>;
     using WeakPtr = std::shared_ptr<Downloader>;
 
-    Downloader( );
+    Downloader();
+    Downloader( std::shared_ptr<MirrorControl> mc );
+    virtual ~Downloader();
 
     /*!
      * Generates a new Download object in waiting state
-     * \param file the \sa zyppng::Url to the source file that should be downloaded
-     * \param targetPath the local file path where the downloaded file needs to be stored
-     * \param expectedFileSize The expected file size of the source file, can be empty
      */
-    std::shared_ptr<Download> downloadFile ( Url file, zypp::filesystem::Pathname targetPath, zypp::ByteCount expectedFileSize = zypp::ByteCount() );
+    std::shared_ptr<Download> downloadFile ( const DownloadSpec &spec );
 
     /*!
      * Returns the internally used \sa zyppng::NetworkRequestDispatcher used by the \a Downloader
@@ -82,7 +82,7 @@ namespace zyppng {
    * it is represented internally as a state machine. All transitions are signalled and can be followed.
    *
    * \code
-   * zyppng::EventDispatcher::Ptr loop = zyppng::EventDispatcher::createMain();
+   * zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create();
    * zyppng::Downloader dl;
    *
    * dl.queueEmpty().connect( [ &loop ]( zyppng::Downloader & ) {
@@ -92,7 +92,7 @@ namespace zyppng {
    * zypp::Url url ( "https://download.opensuse.org/distribution/leap/15.0/repo/oss/x86_64/0ad-0.0.22-lp150.2.10.x86_64.rpm" );
    * zypp::Pathname target("/tmp/0ad-0.0.22-lp150.2.10.x86_64.rpm");
    *
-   * std::shared_ptr<zyppng::Download> req = dl.downloadFile( url, target );
+   * std::shared_ptr<zyppng::Download> req = dl.downloadFile( zypp::DownloadSpec(url, target) );
    * req->sigStarted().connect( []( zyppng::Download &dl ) {
    *   std::cout << "Download started: " << dl.targetPath() << std::endl;
    * });
@@ -134,29 +134,18 @@ namespace zyppng {
      * stage of the lifetime of a Download.
      */
     enum State {
-      InitialState,  //< This is the initial state, its only set before a download starts
-      Initializing = 10,  //< This state is kept during the first 265Bytes or until the data looks like a Metalink download
-      Running      = 20,  //< This state is set once there have been more than 256 bytes downloaded and it does not look like a metalink download
-      RunningMulti = 30,  //< Signals that the file is downloaded in chunks from different mirrors
-      Success = 200, //< Shows that the Download was successful
-      Failed         //< Shows that the Download failed
+      InitialState,   //< This is the initial state, its only set before a download starts
+      DetectMetaLink, //< Metalink downloads are enabled, trying to detect if we get a metalink or not
+      DlMetaLinkInfo, //< Downloading the metalink description file
+      PrepareMulti,   //< This state is set for async preparations of the multi download, like mirror rating
+      DlMetalink,     //< Metalink download is running
+      DlZChunkHead,   //< Zchunk header download is running
+      DlZChunk,       //< Zchunk download is running
+      DlSimple,       //< Simple download running, no optimizations
+      Finished,       //< Download has finished
     };
 
-
-    /*!
-     * A download can only directly be created by the \sa zyppng::Downloader
-     */
-    Download ( DownloadPrivate &&prv );
-
-    /*!
-     * Returns the source URL of the download
-     */
-    Url url () const;
-
-    /*!
-     * Returns the target file path, this is where the downloaded data is stored
-     */
-    zypp::Pathname targetPath () const;
+    virtual ~Download();
 
     /*!
      * Returns the current internal state of the Download
@@ -173,17 +162,15 @@ namespace zyppng {
     NetworkRequestError lastRequestError () const;
 
     /*!
-     * Returns a readable reason why the download failed.
-     * \sa lastRequestError
+     * Returns true if \ref lastRequestError would return a valid \ref NetworkRequestError
      */
-    std::string errorString () const;
+    bool hasError () const;
 
     /*!
-     * Returns a writeable reference to the \sa zyppng::TransferSettings for the download. The settings are reused for
-     * possible sub downloads, however authentication data is stripped if the subdownload uses a different host to
-     * fetch the data from. If there is no auth data known \sa sigAuthRequired is emitted.
+     * Returns a readable reason why the download failed.
+     * \sa lastRequestError
      */
-    TransferSettings &settings ();
+    std::string errorString () const;
 
     /*!
      * Triggers the start of the download, this needs to be called in order for the statemachine
@@ -192,22 +179,32 @@ namespace zyppng {
     void start ();
 
     /*!
-     * Enabled or disabled multipart handling. Enabled by default.
-     * \note if Multipart is enabled the Download tells the server that it accepts metalink files by adding a specific header
-     *       to the request.
+     * This will raise all requests currenty in pending state to have \ref NetworkRequest::Critial priority,
+     * which means they will be started even before requests with \ref NetworkRequest::High priority.
+     *
+     * \note Use this feature only if the request result is required right away because the application is waiting for it, overuse of this
+     *       might hurt performance
+     */
+    void prioritize();
+
+    /*!
+     * Aborts the current download
      */
-    void setMultiPartHandlingEnabled ( bool enable = true );
+    void cancel ();
 
     /*!
-     * Enables a special mode, in this case only the existance of the file is checked but no data is actually downloaded
+     * Returns a reference to the internally used download spec.
+     * \sa zyppng::DownloadSpec
+     * \note Changing settings after the download started might result in undefined or weird behaviour
      */
-    void setCheckExistsOnly ( bool set = true );
+    DownloadSpec &spec ();
+    const DownloadSpec &spec () const;
 
     /*!
-     * Set a already existing local file to be used for partial downloading, in case of a multichunk download all chunks from the
-     * file that have the expected checksum will be reused instead of downloaded
+     * Returns the timestamp of the last auth credentials that were loaded from the CredentialManager.
+     * If no credentials were tried, this returns 0
      */
-    void setDeltaFile ( const zypp::Pathname &file );
+    uint64_t lastAuthTimestamp () const;
 
     /*!
      * Returns a reference to the internally used \sa zyppng::NetworkRequestDispatcher
@@ -244,6 +241,13 @@ namespace zyppng {
      * A connected slot should fill in the \a auth information in order to provide login credentials.
      */
     SignalProxy<void ( Download &req, NetworkAuthData &auth, const std::string &availAuth )> sigAuthRequired ( );
+
+  private:
+    friend class zyppng::Downloader;
+    /*!
+     * A download can only directly be created by the \sa zyppng::Downloader
+     */
+    Download ( Downloader &parent, std::shared_ptr<NetworkRequestDispatcher> requestDispatcher, std::shared_ptr<MirrorControl> mirrors, DownloadSpec &&spec );
   };
 }
 
diff --git a/zypp/zyppng/media/network/downloadspec.cc b/zypp/zyppng/media/network/downloadspec.cc
new file mode 100644 (file)
index 0000000..34a3d3d
--- /dev/null
@@ -0,0 +1,191 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#include "downloadspec.h"
+#include <string>
+#include <zypp-proto/download.pb.h>
+
+namespace zyppng {
+
+  class DownloadSpecPrivate {
+  public:
+    DownloadSpecPrivate() = default;
+    DownloadSpecPrivate( const DownloadSpecPrivate &other ) = default;
+    DownloadSpecPrivate( DownloadSpecPrivate &&other ) = default;
+    DownloadSpecPrivate( zypp::proto::DownloadSpec spec ) :_protoData( std::move(spec) ) {}
+
+    DownloadSpecPrivate *clone () const {
+      return new DownloadSpecPrivate(*this);
+    }
+
+    zypp::proto::DownloadSpec _protoData;
+  };
+
+  ZYPP_IMPL_PRIVATE( DownloadSpec )
+
+  DownloadSpec::DownloadSpec( Url file , zypp::filesystem::Pathname targetPath, zypp::ByteCount expectedFileSize ) : d_ptr( new DownloadSpecPrivate() )
+  {
+    // default settings
+    *d_ptr->_protoData.mutable_settings() = std::move( TransferSettings().protoData() );
+
+    setUrl( file );
+    setTargetPath( targetPath );
+    setExpectedFileSize( expectedFileSize );
+    setPreferredChunkSize( zypp::ByteCount( 4096, zypp::ByteCount::K ) );
+    d_ptr->_protoData.set_checkexistanceonly( false );
+    d_ptr->_protoData.set_metalink_enabled( true );
+  }
+
+  DownloadSpec::DownloadSpec( const zypp::proto::DownloadSpec &spec ) : d_ptr( new DownloadSpecPrivate( spec ) )
+  { }
+
+  DownloadSpec::DownloadSpec( const DownloadSpec &other ) = default;
+
+  DownloadSpec &DownloadSpec::operator=(const DownloadSpec &other) = default;
+
+  Url DownloadSpec::url() const
+  {
+    return d_ptr->_protoData.url();
+  }
+
+  DownloadSpec &DownloadSpec::setUrl(const Url &url)
+  {
+    d_ptr->_protoData.set_url( url.asCompleteString() );
+    return *this;
+  }
+
+  zypp::Pathname DownloadSpec::targetPath() const
+  {
+    return zypp::Pathname(d_ptr->_protoData.targetpath());
+  }
+
+  DownloadSpec &DownloadSpec::setTargetPath(const zypp::filesystem::Pathname &path)
+  {
+    d_ptr->_protoData.set_targetpath( path.asString() );
+    return *this;
+  }
+
+  DownloadSpec &DownloadSpec::setMetalinkEnabled(bool enable)
+  {
+    d_ptr->_protoData.set_metalink_enabled( enable );
+    return *this;
+  }
+
+  bool DownloadSpec::metalinkEnabled() const
+  {
+    return d_ptr->_protoData.metalink_enabled();
+  }
+
+  DownloadSpec &DownloadSpec::setCheckExistsOnly(bool set)
+  {
+    d_ptr->_protoData.set_checkexistanceonly( set );
+    return *this;
+  }
+
+  bool DownloadSpec::checkExistsOnly() const
+  {
+    return d_ptr->_protoData.checkexistanceonly();
+  }
+
+  DownloadSpec &DownloadSpec::setDeltaFile(const zypp::filesystem::Pathname &file)
+  {
+    if ( !file.empty() )
+      d_ptr->_protoData.set_delta( file.asString() );
+    else
+      d_ptr->_protoData.clear_delta();
+    return *this;
+  }
+
+  zypp::filesystem::Pathname DownloadSpec::deltaFile() const
+  {
+    return d_ptr->_protoData.delta();
+  }
+
+  DownloadSpec &DownloadSpec::setPreferredChunkSize(const zypp::ByteCount &bc)
+  {
+    d_ptr->_protoData.set_preferred_chunk_size( bc.operator long long() );
+    return *this;
+  }
+
+  zypp::ByteCount DownloadSpec::preferredChunkSize() const
+  {
+    return d_ptr->_protoData.preferred_chunk_size();
+  }
+
+  TransferSettings DownloadSpec::settings() const
+  {
+    return TransferSettings( d_ptr->_protoData.settings() );
+  }
+
+  DownloadSpec & DownloadSpec::setTransferSettings(TransferSettings &&set)
+  {
+    (*d_ptr->_protoData.mutable_settings()) = std::move( set.protoData() );
+    return *this;
+  }
+
+  DownloadSpec & DownloadSpec::setTransferSettings(const TransferSettings &set)
+  {
+    (*d_ptr->_protoData.mutable_settings()) = set.protoData();
+    return *this;
+  }
+
+  DownloadSpec &DownloadSpec::setExpectedFileSize(const zypp::ByteCount &bc)
+  {
+    d_ptr->_protoData.set_expectedfilesize( bc.operator long long() );
+    return *this;
+  }
+
+  zypp::ByteCount DownloadSpec::expectedFileSize() const
+  {
+    return d_ptr->_protoData.expectedfilesize();
+  }
+
+  DownloadSpec &DownloadSpec::setHeaderSize(const zypp::ByteCount &bc)
+  {
+    d_ptr->_protoData.set_headersize( bc.operator long long() );
+    return *this;
+  }
+
+  zypp::ByteCount DownloadSpec::headerSize() const
+  {
+    return d_ptr->_protoData.headersize();
+  }
+
+  std::optional<zypp::CheckSum> DownloadSpec::headerChecksum() const
+  {
+    Z_D();
+    if ( !d->_protoData.has_headerchecksum() )
+      return {};
+
+    return zypp::CheckSum( d->_protoData.headerchecksum().type(), d->_protoData.headerchecksum().sum() );
+
+  }
+
+  DownloadSpec &DownloadSpec::setHeaderChecksum(const zypp::CheckSum &sum)
+  {
+    if ( sum.empty() )
+      d_func()->_protoData.clear_headerchecksum();
+    else {
+      auto csum = d_func()->_protoData.mutable_headerchecksum();
+      csum->set_type( sum.type() );
+      csum->set_sum( sum.checksum() );
+    }
+    return *this;
+  }
+
+  const zypp::proto::DownloadSpec &DownloadSpec::protoData() const
+  {
+    return d_ptr->_protoData;
+  }
+
+  zypp::proto::DownloadSpec &DownloadSpec::protoData()
+  {
+    return d_ptr->_protoData;
+  }
+}
+
diff --git a/zypp/zyppng/media/network/downloadspec.h b/zypp/zyppng/media/network/downloadspec.h
new file mode 100644 (file)
index 0000000..d8f3979
--- /dev/null
@@ -0,0 +1,123 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPPNG_MEDIA_NETWORK_DOWNLOADSPEC_H
+#define ZYPPNG_MEDIA_NETWORK_DOWNLOADSPEC_H
+
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/core/Url>
+#include <zypp/Pathname.h>
+#include <zypp/base/PtrTypes.h>
+#include <zypp/ByteCount.h>
+#include <zypp/CheckSum.h>
+#include <zypp/media/TransferSettings.h>
+
+#include <optional>
+
+namespace zypp::proto {
+  class DownloadSpec;
+}
+
+namespace zyppng {
+
+
+  class DownloadSpecPrivate;
+  using TransferSettings = zypp::media::TransferSettings;
+
+  /*!
+   * Specifies all aspects of a download. Used together with the
+   * \ref zyppng::Download and \ref zyppng::Downloader classes
+   */
+  class DownloadSpec
+  {
+    ZYPP_DECLARE_PRIVATE( DownloadSpec )
+
+  public:
+
+    DownloadSpec( Url file, zypp::filesystem::Pathname targetPath, zypp::ByteCount expectedFileSize = zypp::ByteCount() );
+    DownloadSpec( const zypp::proto::DownloadSpec &spec );
+
+    DownloadSpec( const DownloadSpec &other );
+    DownloadSpec &operator= ( const DownloadSpec &other );
+
+    /*!
+     * Returns the source URL of the download
+     */
+    Url url () const;
+    DownloadSpec &setUrl ( const Url &url );
+
+    /*!
+     * Returns the target file path, this is where the downloaded data is stored
+     */
+    zypp::filesystem::Pathname targetPath() const;
+    DownloadSpec &setTargetPath ( const zypp::Pathname &path );
+
+    /*!
+     * Enabled or disabled metalink handling. Enabled by default.
+     * \note if Metalink is enabled the Download tells the server that it accepts metalink files by adding a specific header
+     *       to the request.
+     */
+    DownloadSpec &setMetalinkEnabled ( bool enable = true );
+    bool metalinkEnabled (  ) const;
+
+    /*!
+     * Enables a special mode, in this case only the existance of the file is checked but no data is actually downloaded
+     */
+    DownloadSpec &setCheckExistsOnly ( bool set = true );
+    bool checkExistsOnly    ( ) const;
+
+    /*!
+     * Set a already existing local file to be used for partial downloading, in case of a multichunk download all chunks from the
+     * file that have the expected checksum will be reused instead of downloaded
+     */
+    DownloadSpec &setDeltaFile ( const zypp::Pathname &file );
+    zypp::filesystem::Pathname deltaFile() const;
+
+    /*!
+     * Sets the prefered amount of bytes the downloader tries to request from a single server per metalink chunk request.
+     * If the metalink description has smaller chunks those are coalesced to match the preferred size.
+     */
+    DownloadSpec &setPreferredChunkSize ( const zypp::ByteCount &bc );
+    zypp::ByteCount preferredChunkSize() const;
+
+    /*!
+     * Returns the \sa zyppng::TransferSettings for the download. The settings are reused for
+     * possible sub downloads, however authentication data is stripped if the subdownload uses a different host to
+     * fetch the data from. If there is no auth data known \sa sigAuthRequired is emitted.
+     */
+    TransferSettings settings () const;
+    DownloadSpec &setTransferSettings( TransferSettings &&set );
+    DownloadSpec &setTransferSettings( const TransferSettings &set );
+
+    DownloadSpec &setExpectedFileSize ( const zypp::ByteCount &bc );
+    zypp::ByteCount expectedFileSize() const;
+
+    DownloadSpec &setHeaderSize ( const zypp::ByteCount &bc );
+    zypp::ByteCount headerSize() const;
+
+    std::optional<zypp::CheckSum> headerChecksum () const;
+    DownloadSpec &setHeaderChecksum ( const zypp::CheckSum &sum );
+
+    const zypp::proto::DownloadSpec &protoData() const;
+    zypp::proto::DownloadSpec &protoData();
+
+  private:
+    zypp::RWCOW_pointer<DownloadSpecPrivate> d_ptr;
+  };
+
+}
+
+
+
+
+#endif // ZYPPNG_MEDIA_NETWORK_DOWNLOADSPEC_H
diff --git a/zypp/zyppng/media/network/mirrorcontrol.cc b/zypp/zyppng/media/network/mirrorcontrol.cc
new file mode 100644 (file)
index 0000000..269e0d3
--- /dev/null
@@ -0,0 +1,299 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+#include "private/mirrorcontrol_p.h"
+#include "private/mediadebug_p.h"
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/Signals>
+#include <zypp-core/base/String.h>
+#include <iostream>
+
+namespace zyppng {
+
+  constexpr uint penaltyIncrease = 100;
+  constexpr uint defaultSampleTime = 2;
+  constexpr uint defaultMaxConnections = 5;
+
+  MirrorControl::Mirror::Mirror( MirrorControl &parent ) : _parent( parent )
+  {}
+
+  void MirrorControl::Mirror::startTransfer()
+  {
+    runningTransfers++;
+  }
+
+  void MirrorControl::Mirror::finishTransfer(const bool success)
+  {
+    if ( success ) {
+      if ( penalty >= penaltyIncrease ) penalty -= penaltyIncrease;
+      successfulTransfers++;
+      failedTransfers = 0;
+    } else {
+      penalty += penaltyIncrease;
+      failedTransfers++;
+    }
+    transferUnref();
+  }
+
+  void MirrorControl::Mirror::cancelTransfer()
+  {
+    transferUnref();
+  }
+
+  uint MirrorControl::Mirror::maxConnections() const
+  {
+    return ( _maxConnections > 0 ? _maxConnections : defaultMaxConnections ); //max connections per mirror @todo make this configurable
+  }
+
+  bool MirrorControl::Mirror::hasFreeConnections() const
+  {
+    return ( runningTransfers < maxConnections() );
+  }
+
+  void MirrorControl::Mirror::transferUnref()
+  {
+    bool stillLoaded = ( runningTransfers - 1 ) >= maxConnections();
+    runningTransfers--;
+    if ( !stillLoaded )
+      _parent._sigNewMirrorsReady.emit();
+  }
+
+  MirrorControl::MirrorControl()
+  {
+    // set up the single shot timer, that way we can emit a signal after we finished processing all
+    // events that have queued up in the event loop instead of constantly firing the signal
+    _newMirrSigDelay = Timer::create();
+    _newMirrSigDelay->setSingleShot( true );
+    _newMirrSigDelay->connectFunc( &Timer::sigExpired, [this]( const auto & ){
+      _sigNewMirrorsReady.emit();
+    });
+
+    _dispatcher = std::make_shared<NetworkRequestDispatcher>();
+    _queueEmptyConn = _dispatcher->connectFunc( &NetworkRequestDispatcher::sigQueueFinished, [ this ]( NetworkRequestDispatcher& ) {
+      //tell the world the queue is empty
+
+      std::vector< std::unordered_map<std::string, MirrorHandle>::const_iterator > allOfEm;
+      for ( auto i = _handles.begin(); i != _handles.end(); i++ ) {
+        allOfEm.push_back( i );
+      }
+
+      std::sort( allOfEm.begin(), allOfEm.end(), []( const auto &a, const auto &b ){
+        return ( zypp::str::compareCI( a->second->mirrorUrl.asString().c_str(), b->second->mirrorUrl.asString().c_str() ) < 0 );
+      });
+
+      DBG_MEDIA << "Finished probing mirrors, these are the results: \n";
+      for ( const auto &iter : allOfEm ) {
+        DBG_MEDIA << "Mirror: " << iter->second->mirrorUrl << ", rating is: " << iter->second->rating << "\n";
+      }
+      DBG_MEDIA << "End Mirror probing results." << std::endl;
+
+      _sigAllMirrorsReady.emit();
+    }, *this );
+    _dispatcher->run();
+  }
+
+  MirrorControl::Ptr MirrorControl::create()
+  {
+    return std::shared_ptr<MirrorControl>( new MirrorControl );
+  }
+
+  MirrorControl::~MirrorControl()
+  {
+    // do not send signals to us while we are destructing
+    _queueEmptyConn.disconnect();
+
+    if ( _dispatcher->count() > 0 ) {
+      MIL << "Destroying MirrorControl while measurements are still running, aborting" << std::endl;
+      for ( auto &mirr : _handles )  {
+        if ( mirr.second->_request ) {
+          mirr.second->_finishedConn.disconnect();
+          _dispatcher->cancel( *mirr.second->_request );
+        }
+      }
+    }
+
+  }
+
+  void MirrorControl::registerMirrors( const std::vector<zypp::media::MetalinkMirror> &urls )
+  {
+    bool doesKnowSomeMirrors = false;
+    for ( const auto &mirror : urls ) {
+
+      const auto scheme = mirror.url.getScheme();
+      if ( scheme == "http" || scheme == "https" || scheme == "ftp" || scheme == "tftp" ) {
+
+        const std::string urlKey = makeKey( mirror.url );
+
+        // already there
+        const auto hndlIt = _handles.find( urlKey );
+        if ( hndlIt != _handles.end() ) {
+          doesKnowSomeMirrors = true;
+          continue;
+        }
+
+        auto mirrorHandle = std::shared_ptr<Mirror>( new Mirror(*this) );
+        mirrorHandle->rating          = mirror.priority;
+        mirrorHandle->_maxConnections = mirror.maxConnections;
+        mirrorHandle->mirrorUrl       = mirror.url;
+        mirrorHandle->mirrorUrl.setPathName("/");
+
+        mirrorHandle->_request = std::make_shared<NetworkRequest>( mirrorHandle->mirrorUrl, "/dev/null", NetworkRequest::WriteShared );
+        mirrorHandle->_request->setOptions( NetworkRequest::ConnectionTest );
+        mirrorHandle->_request->transferSettings().setTimeout( defaultSampleTime );
+        mirrorHandle->_request->transferSettings().setConnectTimeout( defaultSampleTime );
+        mirrorHandle->_finishedConn = mirrorHandle->_request->connectFunc( &NetworkRequest::sigFinished, [ mirrorHandle, &someReadyDelay = _newMirrSigDelay ](  NetworkRequest &req, const NetworkRequestError & ){
+
+          if ( req.hasError() )
+            ERR << "Mirror request failed: " << req.error().toString() << " ; " << req.extendedErrorString() << "; for url: "<<req.url()<<std::endl;
+
+          const auto timings = req.timings();
+          std::chrono::milliseconds connTime;
+          if ( timings ) {
+            connTime = std::chrono::duration_cast<std::chrono::milliseconds>(timings->connect - timings->namelookup);
+          } else {
+            // we can not get any measurements, maximum penalty
+            connTime = std::chrono::seconds( defaultSampleTime );
+          }
+
+          DBG_MEDIA << "Got rating for mirror: " <<  mirrorHandle->mirrorUrl << ", rating was " << mirrorHandle->rating;
+          mirrorHandle->rating += connTime.count();
+          DBG_MEDIA << " rating is now " << mirrorHandle->rating << " conn time was " << connTime.count() << std::endl;
+
+          // clean the request up
+          mirrorHandle->_finishedConn.disconnect();
+          mirrorHandle->_request.reset();
+
+          // start the timer to emit someMirrorsReady
+          someReadyDelay->start( 0 );
+        });
+
+        _dispatcher->enqueue( mirrorHandle->_request );
+        _handles.insert( std::make_pair(urlKey, mirrorHandle ) );
+      }
+    }
+
+    if ( doesKnowSomeMirrors )
+      _sigNewMirrorsReady.emit();
+
+    if ( _dispatcher->count() == 0 ) {
+      // we did know all Mirrors before, notify the outside world we are ready
+      _sigAllMirrorsReady.emit();
+    }
+  }
+
+  MirrorControl::PickResult MirrorControl::pickBestMirror( const std::vector<Url> &mirrors )
+  {
+    bool hasPendingRating = false;
+    std::vector< MirrorPick > possibleMirrs;
+    for ( auto i = mirrors.begin(); i != mirrors.end(); i++ ) {
+      const auto key = makeKey( *i );
+      const auto hdlIt = this->_handles.find( key );
+      if ( hdlIt == _handles.end( ) )
+        continue;
+      // still waiting for the request to finish
+      if ( hdlIt->second->_request ) {
+        hasPendingRating = true;
+        continue;
+      }
+      possibleMirrs.push_back( std::make_pair( i, hdlIt->second ) );
+    }
+
+    if ( possibleMirrs.empty() && hasPendingRating ) {
+      // still waiting return , tell the caller to try again later
+      return PickResult{ PickResult::Again, std::make_pair( mirrors.end(), MirrorHandle() ) };
+    }
+
+    std::stable_sort( possibleMirrs.begin(), possibleMirrs.end(), []( const auto &a, const auto &b ) {
+      return a.second->rating < b.second->rating;
+    });
+
+    bool hasLoadedOne = false; // do we have a mirror that will be ready again later?
+    for ( const auto &mirr : possibleMirrs ) {
+      if ( !mirr.second->hasFreeConnections() ) {
+        hasLoadedOne = true;
+        continue;
+      }
+      if ( mirr.second->failedTransfers >= 10 )
+        continue;
+      return PickResult{ PickResult::Ok, mirr };
+    }
+
+    if ( hasLoadedOne ){
+      // we have mirrors, but they have reached maximum capacity, tell the caller to delay the call
+      return PickResult{ PickResult::Again, std::make_pair( mirrors.end(), MirrorHandle() ) };
+    }
+
+    return PickResult{ PickResult::Unknown, std::make_pair( mirrors.end(), MirrorHandle() ) };
+  }
+
+  SignalProxy<void ()> MirrorControl::sigNewMirrorsReady()
+  {
+    return _sigNewMirrorsReady;
+  }
+
+  SignalProxy<void ()> MirrorControl::sigAllMirrorsReady()
+  {
+    return _sigAllMirrorsReady;
+  }
+
+  std::string MirrorControl::makeKey(const zypp::Url &url) const
+  {
+    return url.asString( zypp::Url::ViewOptions::WITH_SCHEME +
+                         zypp::Url::ViewOptions::WITH_HOST +
+                         zypp::Url::ViewOptions::WITH_PORT +
+                         zypp::Url::ViewOptions::EMPTY_AUTHORITY
+      );
+  }
+
+#if 0
+
+  MirrorRef::MirrorRef( MirrorControl::MirrorHandle handle )
+  {
+    _data = std::make_shared<Helper>( handle, false );
+  }
+
+  MirrorRef::~MirrorRef()
+  { }
+
+  void MirrorRef::startTransfer()
+  {
+    _data->_myHandle->startTransfer();
+    _data->_cancelOnDestruct = true;
+  }
+
+  void MirrorRef::finishTransfer(const bool success)
+  {
+    _data->_cancelOnDestruct = false;
+    _data->_myHandle->finishTransfer( success );
+  }
+
+  void MirrorRef::cancelTransfer()
+  {
+    _data->_cancelOnDestruct = false;
+    _data->_myHandle->cancelTransfer();
+  }
+
+  MirrorRef::operator bool() const
+  {
+    return _data->_myHandle.operator bool();
+  }
+
+  MirrorControl::MirrorHandle MirrorRef::get()
+  {
+    return _data->_myHandle;
+  }
+
+  MirrorRef::Helper::~Helper()
+  {
+    if ( _cancelOnDestruct )
+      _myHandle->cancelTransfer();
+  }
+#endif
+
+}
+
index c4177d6..53b4696 100644 (file)
@@ -1,9 +1,18 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
 #include <zypp/zyppng/media/network/private/networkrequestdispatcher_p.h>
 #include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
 #include <zypp/zyppng/media/network/private/request_p.h>
-#include <zypp/zyppng/base/Timer>
-#include <zypp/zyppng/base/SocketNotifier>
-#include <zypp/zyppng/base/EventDispatcher>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp-core/zyppng/base/Timer>
+#include <zypp-core/zyppng/base/SocketNotifier>
+#include <zypp-core/zyppng/base/EventDispatcher>
 #include <zypp/media/CurlHelper.h>
 #include <zypp/media/MediaUserAuth.h>
 #include <assert.h>
 
 using namespace boost;
 
+namespace zypp {
+  L_ENV_CONSTR_DEFINE_FUNC(ZYPP_MEDIA_CURL_DEBUG)
+}
+
+
 namespace zyppng {
 
-NetworkRequestDispatcherPrivate::NetworkRequestDispatcherPrivate( )
-  : _timer( Timer::create() )
-  , _multi ( curl_multi_init() )
+NetworkRequestDispatcherPrivate::NetworkRequestDispatcherPrivate(  NetworkRequestDispatcher &p  )
+    : BasePrivate( p )
+    , _timer( Timer::create() )
+    , _multi ( curl_multi_init() )
 {
-  internal::globalInitCurlOnce();
+  ::internal::globalInitCurlOnce();
 
   curl_multi_setopt( _multi, CURLMOPT_TIMERFUNCTION, NetworkRequestDispatcherPrivate::multi_timer_cb );
   curl_multi_setopt( _multi, CURLMOPT_TIMERDATA, reinterpret_cast<void *>( this ) );
   curl_multi_setopt( _multi, CURLMOPT_SOCKETFUNCTION, NetworkRequestDispatcherPrivate::static_socket_callback );
   curl_multi_setopt( _multi, CURLMOPT_SOCKETDATA, reinterpret_cast<void *>( this ) );
 
-  _timer->sigExpired().connect( sigc::mem_fun( *this, &NetworkRequestDispatcherPrivate::multiTimerTimout ) );
+  _timer->setSingleShot( true );
+  _timer->connect( &Timer::sigExpired, *this, &NetworkRequestDispatcherPrivate::multiTimerTimout );
 }
 
 NetworkRequestDispatcherPrivate::~NetworkRequestDispatcherPrivate()
@@ -73,7 +89,7 @@ int NetworkRequestDispatcherPrivate::socketCallback(CURL *easy, curl_socket_t s,
     socketp = SocketNotifier::create( s, SocketNotifier::Read, false );
     _socketHandler.insert( std::make_pair( s, socketp ) );
 
-    socketp->sigActivated().connect( sigc::mem_fun(*this, &NetworkRequestDispatcherPrivate::onSocketActivated) );
+    socketp->connect( &SocketNotifier::sigActivated, *this, &NetworkRequestDispatcherPrivate::onSocketActivated );
   } else {
     socketp = _socketHandler[s];
   }
@@ -98,7 +114,7 @@ int NetworkRequestDispatcherPrivate::socketCallback(CURL *easy, curl_socket_t s,
       return 0;
     } else {
       //a broken handle without anything assigned, also should never happen but make sure and clean it up
-      DBG << "Cleaning up unassigned  easy handle" << std::endl;
+      WAR_MEDIA << "Cleaning up unassigned  easy handle" << std::endl;
       curl_multi_remove_handle( _multi, easy );
       curl_easy_cleanup( easy );
       return 0;
@@ -109,9 +125,6 @@ int NetworkRequestDispatcherPrivate::socketCallback(CURL *easy, curl_socket_t s,
   if ( what == CURL_POLL_REMOVE ) {
     socketp->setEnabled( false );
     _socketHandler.erase( s );
-
-    //keep the reference until this iteration is over
-    EventDispatcher::unrefLater( socketp );
     return 0;
   }
 
@@ -162,12 +175,14 @@ void NetworkRequestDispatcherPrivate::handleMultiSocketAction(curl_socket_t nati
       CURLcode res = msg->data.result;
 
       void *privatePtr = nullptr;
-      if ( curl_easy_getinfo( easy, CURLINFO_PRIVATE, &privatePtr ) != CURLE_OK )
+      if ( curl_easy_getinfo( easy, CURLINFO_PRIVATE, &privatePtr ) != CURLE_OK ) {
+        WAR_MEDIA << "Unable to get CURLINFO_PRIVATE" << std::endl;
         continue;
+      }
 
       if ( !privatePtr ) {
         //broken easy handle not associated, should never happen but clean it up
-        DBG << "Cleaning up unassigned  easy handle" << std::endl;
+        WAR_MEDIA << "Cleaning up unassigned  easy handle" << std::endl;
         curl_multi_remove_handle( _multi, easy );
         curl_easy_cleanup( easy );
         continue;
@@ -176,7 +191,7 @@ void NetworkRequestDispatcherPrivate::handleMultiSocketAction(curl_socket_t nati
       NetworkRequestPrivate *request = reinterpret_cast<NetworkRequestPrivate *>( privatePtr );
 
       //trigger notification about file downloaded
-      NetworkRequestError e = NetworkRequestErrorPrivate::fromCurlError( *request->z_func(), res, request->_errorBuf.data() );
+      NetworkRequestError e = NetworkRequestErrorPrivate::fromCurlError( *request->z_func(), res, request->errorMessage() );
       setFinished( *request->z_func(), e );
 
       //attention request could be deleted from here on
@@ -203,23 +218,40 @@ void NetworkRequestDispatcherPrivate::cancelAll( NetworkRequestError result )
 
 void NetworkRequestDispatcherPrivate::setFinished( NetworkRequest &req, NetworkRequestError result )
 {
-  auto delReq = []( auto &list, NetworkRequest &req ) {
+  auto delReq = []( auto &list, NetworkRequest &req ) -> std::shared_ptr<NetworkRequest> {
     auto it = std::find_if( list.begin(), list.end(), [ &req ]( const std::shared_ptr<NetworkRequest> &r ) {
       return req.d_func() == r->d_func();
     } );
     if ( it != list.end() ) {
-      EventDispatcher::unrefLater( *it );
+      auto ptr = *it;
       list.erase( it );
+      return ptr;
     }
+    return nullptr;
   };
 
-  delReq( _runningDownloads, req );
-  delReq( _pendingDownloads, req );
+  // We have a tricky situation if a network request is called when inside a callback, in those cases its
+  // not allowed to call curl_multi_remove_handle, we need to tell the callback to fail, so the download
+  // is cancelled by curl itself. We also need to store the current result for later
+  auto rmode = std::get_if<NetworkRequestPrivate::running_t>( &req.d_func()->_runningMode );
+  if ( rmode ) {
+    if ( rmode->_isInCallback ) {
+      // the first cached result wins)
+      if  ( !rmode->_cachedResult )
+        rmode->_cachedResult = result;
+      return;
+    } else if ( rmode->_cachedResult ) {
+      result = rmode->_cachedResult.value();
+    }
+  }
+
+  auto rLocked = delReq( _runningDownloads, req );
+  if ( !rLocked )
+    rLocked = delReq( _pendingDownloads, req );
 
   void *easyHandle = req.d_func()->_easyHandle;
-  if ( easyHandle ) {
+  if ( easyHandle )
     curl_multi_remove_handle( _multi, easyHandle );
-  }
 
   req.d_func()->_dispatcher = nullptr;
 
@@ -237,7 +269,7 @@ void NetworkRequestDispatcherPrivate::dequeuePending()
   if ( !_isRunning || _locked )
     return;
 
-  while ( _maxConnections > _runningDownloads.size() ) {
+  while ( _maxConnections == -1 || ( (std::size_t)_maxConnections > _runningDownloads.size() ) ) {
     if ( !_pendingDownloads.size() )
       break;
 
@@ -247,14 +279,12 @@ void NetworkRequestDispatcherPrivate::dequeuePending()
     std::string errBuf = "Failed to initialize easy handle";
     if ( !req->d_func()->initialize( errBuf ) ) {
       //@TODO store the CURL error in the errors extra info
-      EventDispatcher::unrefLater( req );
       setFinished( *req, NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(errBuf) ) );
       continue;
     }
 
     CURLMcode rc = curl_multi_add_handle( _multi, req->d_func()->_easyHandle );
     if ( rc != 0 ) {
-      EventDispatcher::unrefLater( req );
       setFinished( *req, NetworkRequestErrorPrivate::fromCurlMError( rc ) );
       continue;
     }
@@ -273,8 +303,10 @@ void NetworkRequestDispatcherPrivate::dequeuePending()
   }
 }
 
+ZYPP_IMPL_PRIVATE(NetworkRequestDispatcher)
+
 NetworkRequestDispatcher::NetworkRequestDispatcher( )
-  : Base( * new NetworkRequestDispatcherPrivate ( ) )
+  : Base( * new NetworkRequestDispatcherPrivate ( *this ) )
 {
 
 }
@@ -298,7 +330,7 @@ bool NetworkRequestDispatcher::supportsProtocol( const Url &url )
   return true;
 }
 
-void NetworkRequestDispatcher::setMaximumConcurrentConnections( size_t maxConn )
+void NetworkRequestDispatcher::setMaximumConcurrentConnections( const int maxConn )
 {
   d_func()->_maxConnections = maxConn;
 }
@@ -310,12 +342,12 @@ void NetworkRequestDispatcher::enqueue(const std::shared_ptr<NetworkRequest> &re
   Z_D();
 
   if ( std::find( d->_runningDownloads.begin(), d->_runningDownloads.end(), req ) != d->_runningDownloads.end() )  {
-    WAR << "Ignoring request to enqueue download " << req->url().asString() << " request is already running " << std::endl;
+    WAR_MEDIA << "Ignoring request to enqueue download " << req->url().asString() << " request is already running " << std::endl;
     return;
   }
 
   if ( std::find( d->_pendingDownloads.begin(), d->_pendingDownloads.end(), req ) != d->_pendingDownloads.end() ) {
-    WAR << "Ignoring request to enqueue download " << req->url().asString() << " request is already enqueued " << std::endl;
+    WAR_MEDIA << "Ignoring request to enqueue download " << req->url().asString() << " request is already enqueued " << std::endl;
     return;
   }
 
@@ -323,11 +355,11 @@ void NetworkRequestDispatcher::enqueue(const std::shared_ptr<NetworkRequest> &re
   if ( req->priority() == NetworkRequest::Normal )
     d->_pendingDownloads.push_back( req );
   else {
-    auto it = std::find_if( d->_pendingDownloads.begin(), d->_pendingDownloads.end(), []( const auto &req ){
-      return req->priority() ==  NetworkRequest::Normal;
+    auto it = std::find_if( d->_pendingDownloads.begin(), d->_pendingDownloads.end(), [ prio = req->priority() ]( const auto &pendingReq ){
+      return pendingReq->priority() < prio;
     });
 
-    //if we have a valid iterator, decrement we found a Normal pending download request, insert before that
+    //if we have a valid iterator, decrement we found a pending download request with lower prio, insert before that
     if ( it != d->_pendingDownloads.end() && it != d->_pendingDownloads.begin() )
       it--;
     d->_pendingDownloads.insert( it, req );
@@ -363,6 +395,25 @@ void NetworkRequestDispatcher::run()
     d->dequeuePending();
 }
 
+void NetworkRequestDispatcher::reschedule()
+{
+  Z_D();
+  if ( !d->_pendingDownloads.size() )
+    return;
+
+  std::stable_sort( d->_pendingDownloads.begin(), d->_pendingDownloads.end(), []( const auto &a, const auto &b ){
+    return a->priority() < b->priority();
+  });
+
+  d->dequeuePending();
+}
+
+size_t NetworkRequestDispatcher::count()
+{
+  Z_D();
+  return d->_pendingDownloads.size() + d->_runningDownloads.size();
+}
+
 const zyppng::NetworkRequestError &NetworkRequestDispatcher::lastError() const
 {
   return d_func()->_lastError;
index 795c75f..c0ce3cc 100644 (file)
@@ -1,10 +1,10 @@
 #ifndef ZYPP_NG_MEDIA_CURL_CURL_H_INCLUDED
 #define ZYPP_NG_MEDIA_CURL_CURL_H_INCLUDED
 
-#include <zypp/zyppng/base/zyppglobal.h>
-#include <zypp/zyppng/base/Base>
-#include <zypp/zyppng/base/signals.h>
-#include <zypp/zyppng/core/Url>
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/base/signals.h>
+#include <zypp-core/zyppng/core/Url>
 #include <vector>
 
 #include <zypp/zyppng/media/network/networkrequesterror.h>
@@ -24,7 +24,7 @@ namespace zyppng {
    * the load on the network.
    *
    * \code
-   * zyppng::EventDispatcher::Ptr loop = zyppng::EventDispatcher::createMain();
+   * zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create();
    * zyppng::NetworkRequestDispatcher downloader;
    *
    * zypp::Url url ( "https://download.opensuse.org/distribution/leap/15.0/repo/oss/x86_64/0ad-0.0.22-lp150.2.10.x86_64.rpm" );
@@ -91,8 +91,9 @@ namespace zyppng {
 
       /*!
        * Change the number of the concurrently started requests, the default is 10.
+       * Setting this to -1 means there is no limit.
        */
-      void setMaximumConcurrentConnections (size_t maxConn );
+      void setMaximumConcurrentConnections ( const int maxConn );
 
       /*!
        * Enqueues a new \a request and puts it into the waiting queue. If the dispatcher
@@ -116,6 +117,16 @@ namespace zyppng {
       void run ( );
 
       /*!
+       * Reschedule enqueued requests based on their priorities
+       */
+      void reschedule ();
+
+      /*!
+       * Returns the number of requests in the running and waiting queues
+       */
+      size_t count ();
+
+      /*!
        * Returns the last encountered error in a request.
        */
       const NetworkRequestError &lastError() const;
index a16de56..ad2853a 100644 (file)
@@ -1,3 +1,11 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
 #include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
 #include <zypp/zyppng/media/network/request.h>
 #include <zypp/media/CurlHelper.h>
@@ -9,6 +17,9 @@ namespace zyppng {
 
 ZYPP_IMPL_PRIVATE(NetworkRequestError);
 
+constexpr std::string_view CurlNativeErrorCodeDescKey = "nativeErrorCodeDesc";
+constexpr std::string_view CurlNativeErrorDescKey = "nativeErrorDesc";
+
 NetworkRequestErrorPrivate::NetworkRequestErrorPrivate(NetworkRequestError::Type code, std::string &&msg, std::map<std::string, boost::any> &&extraInfo)
   : _errorCode(code)
   , _errorMessage( std::move(msg) )
@@ -25,7 +36,7 @@ NetworkRequestError NetworkRequestErrorPrivate::customError( NetworkRequestError
   return NetworkRequestError( *new NetworkRequestErrorPrivate(t, errorMsg.empty() ? typeToString(t) : std::move(errorMsg), std::move(extraInfo)) );
 }
 
-NetworkRequestError NetworkRequestErrorPrivate::fromCurlError( NetworkRequest &req, int nativeCode , const char *errBuf )
+NetworkRequestError NetworkRequestErrorPrivate::fromCurlError(NetworkRequest &req, int nativeCode , const std::string &nativeError )
 {
 
   Url url = req.url();
@@ -37,10 +48,10 @@ NetworkRequestError NetworkRequestErrorPrivate::fromCurlError( NetworkRequest &r
 
     const char *nativeErr = curl_easy_strerror( static_cast<CURLcode>(nativeCode) );
     if ( nativeErr != nullptr )
-      extraInfo.insert( { "nativeErrorCodeDesc",  std::string( nativeErr ) } );
+      extraInfo.insert( { CurlNativeErrorCodeDescKey.data(),  std::string( nativeErr ) } );
 
-    if ( errBuf != nullptr )
-      extraInfo.insert( { "nativeErrorDesc",  std::string( errBuf ) } );
+    if ( !nativeError.empty() )
+      extraInfo.insert( { CurlNativeErrorDescKey.data(),  nativeError } );
 
     extraInfo.insert( { "requestUrl", url } );
     extraInfo.insert( { "curlCode", nativeCode } );
@@ -200,7 +211,6 @@ NetworkRequestError NetworkRequestErrorPrivate::fromCurlMError( int nativeCode )
   return NetworkRequestError( *new NetworkRequestErrorPrivate(NetworkRequestError::InternalError, std::move(err), std::move(extraInfo)) );
 }
 
-
 NetworkRequestError::NetworkRequestError(zyppng::NetworkRequestErrorPrivate &d )
   : d_ptr( &d )
 { }
@@ -264,6 +274,8 @@ std::string NetworkRequestErrorPrivate::typeToString( NetworkRequestError::Type
       return "Login failed.";
     case NetworkRequestError::ServerReturnedError:
       return "Server returned an error for the given request.";
+    case NetworkRequestError::MissingData:
+      return "Server did not send all requested ranges.";
   }
   return std::string();
 }
@@ -272,14 +284,14 @@ std::string NetworkRequestError::nativeErrorString() const
 {
   Z_D();
 
-  auto it = d->_extraInfo.find("nativeErrorDesc");
+  auto it = d->_extraInfo.find(CurlNativeErrorDescKey.data());
   if ( it != d->_extraInfo.end() ) {
     try {
       return boost::any_cast<std::string>( it->second );
     } catch ( const boost::bad_any_cast &) { }
   }
 
-  it = d->_extraInfo.find("nativeErrorCodeDesc");
+  it = d->_extraInfo.find(CurlNativeErrorCodeDescKey.data());
   if ( it != d->_extraInfo.end() ) {
     try {
       return boost::any_cast<std::string>( it->second );
index 129a60a..30115b7 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef ZYPP_NG_MEDIA_CURL_NETWORK_REQUEST_ERROR_H_INCLUDED
 #define ZYPP_NG_MEDIA_CURL_NETWORK_REQUEST_ERROR_H_INCLUDED
 
-#include <zypp/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/zyppglobal.h>
 #include <zypp/base/PtrTypes.h>
 #include <boost/any.hpp>
 #include <string>
@@ -16,6 +16,9 @@ class NetworkRequestErrorPrivate;
    * @brief The NetworkRequestError class
    * Represents a error that occured in \see NetworkDownloadRequest
    * or \see NetworkRequestDispatcher
+   *
+   *
+   * \attention Keep in sync with zypp/zyppng/proto/networkrequest.proto !!!
    */
   class LIBZYPP_NG_EXPORT NetworkRequestError
   {
@@ -34,9 +37,10 @@ class NetworkRequestErrorPrivate;
       Timeout,                //< The request timed out
       Forbidden,              //< Accessing the requested ressource on the server was forbidden
       NotFound,               //< The requested path in the URL does not exist on the server
-      Unauthorized,       //<< No auth data given but authorization required
-      AuthFailed,         //<< Auth data was given, but authorization failed
-      ServerReturnedError //<< A error was returned by the server that is not explicitely handled
+      Unauthorized,        //<< No auth data given but authorization required
+      AuthFailed,          //<< Auth data was given, but authorization failed
+      ServerReturnedError, //<< A error was returned by the server that is not explicitely handled
+      MissingData          //<< The download was a multirange download and we did not get all data that was requested, if that is returned some ranges might have been downloaded successful
     };
 
     NetworkRequestError ();
@@ -89,7 +93,7 @@ class NetworkRequestErrorPrivate;
     NetworkRequestError( NetworkRequestErrorPrivate &d );
 
   private:
-    ZYPP_FWD_DECLARE_PRIVATE(NetworkRequestError)
+    ZYPP_DECLARE_PRIVATE(NetworkRequestError)
     zypp::RWCOW_pointer<NetworkRequestErrorPrivate> d_ptr;
   };
 }
index 8eaf93c..5915c71 100644 (file)
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
 #ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADER_P_H_INCLUDED
 #define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADER_P_H_INCLUDED
 
-#include <zypp/zyppng/base/private/base_p.h>
-#include <zypp/zyppng/base/signals.h>
-#include <zypp/zyppng/media/network/downloader.h>
-#include <zypp/zyppng/media/network/request.h>
-#include <zypp/zyppng/media/network/TransferSettings>
-#include <zypp/zyppng/media/network/networkrequesterror.h>
-#include <zypp/media/MediaBlockList.h>
-
-#include <deque>
+#include <zypp-core/zyppng/base/statemachine.h>
+
+#include "downloaderstates/base_p.h"
+#include "downloaderstates/initial_p.h"
+#include "downloaderstates/detectmeta_p.h"
+#include "downloaderstates/metalinkinfo_p.h"
+#include "downloaderstates/preparemulti_p.h"
+#include "downloaderstates/metalink_p.h"
+#include "downloaderstates/normal_p.h"
+#include "downloaderstates/final_p.h"
+#if ENABLE_ZCHUNK_COMPRESSION
+#include "downloaderstates/zck_p.h"
+#endif
 
 namespace zyppng {
 
-  class NetworkRequestDispatcher;
+  /**
+   * our known states:
+   * InitialState         //< initial state before we start downloading
+   * DetectMetalinkState  //< First attempt to get the zchunk header, but we might receive metalink data instead
+   * DlMetaLinkInfoState  //< We got Metalink, lets get the full metalink file or we got no zchunk in the first place
+   * PrepareMultiState    //< Parsing the metalink file and preparing the mirrors
+   * DLZckHeadState       //< Download the ZChunk Header
+   * DLZckState           //< Download the File in ZChunk Mode
+   * DlMetalinkState      //< Download the File in Metalink Mode
+   * DlNormalFileState    //< Simple Plain download, no chunking
+   * FinishedState        //< We are done
+   */
+
+  template <typename Derived>
+  using DownloadStatemachine = Statemachine< Derived, Download::State,
+    //          Source State,             State Change Event                     TargetState,    Transition Condition,  Transition operation
+    Transition< InitialState, &InitialState::sigTransitionToDetectMetalinkState, DetectMetalinkState >,
+    Transition< InitialState, &InitialState::sigTransitionToDlMetaLinkInfoState, DlMetaLinkInfoState >,
+#if ENABLE_ZCHUNK_COMPRESSION
+    Transition< InitialState, &InitialState::sigTransitionToDLZckHeaderState,    DLZckHeadState, DefaultStateCondition, &InitialState::toDLZckHeadState >,
+#endif
+    Transition< InitialState, &InitialState::sigTransitionToDlNormalFileState,   DlNormalFileState >,
 
-  class DownloadPrivate : public BasePrivate
-  {
-  public:
-    ZYPP_DECLARE_PUBLIC(Download)
-    DownloadPrivate ( Downloader &parent, std::shared_ptr<NetworkRequestDispatcher> requestDispatcher, Url &&file, zypp::filesystem::Pathname &&targetPath, zypp::ByteCount &&expectedFileSize );
-
-    struct Request : public NetworkRequest {
-
-      using NetworkRequest::NetworkRequest;
-      using Ptr = std::shared_ptr<Request>;
-      using WeakPtr = std::shared_ptr<Request>;
-
-      void connectSignals ( DownloadPrivate &dl );
-      void disconnectSignals ();
-
-      size_t _myBlock = -1;
-      int _retryCount = 0;       //< how many times was this request restarted
-      bool _triedCredFromStore = false; //< already tried to authenticate from credential store?
-      Url _originalUrl;  //< The unstripped URL as it was passed to Download , before transfer settings are removed
-
-      connection _sigStartedConn;
-      connection _sigProgressConn;
-      connection _sigFinishedConn;
-    };
-
-    //keep a list with failed blocks in case we run out of mirrors,
-    //in that case we can retry to download them once we have a finished download
-    struct FailedBlock {
-      size_t _block = -1;
-      int    _retryCount = 0;
-      NetworkRequestError _failedWithErr;
-    };
-    std::deque<FailedBlock> _failedBlocks;
-
-    std::vector< std::shared_ptr<Request> > _runningRequests;
-    std::shared_ptr<NetworkRequestDispatcher> _requestDispatcher;
+    Transition< DetectMetalinkState, &DetectMetalinkState::sigFinished,   DlMetaLinkInfoState, &DetectMetalinkState::toMetalinkGuard, &DetectMetalinkState::toDlMetaLinkInfoState >,
+#if ENABLE_ZCHUNK_COMPRESSION
+    Transition< DetectMetalinkState, &DetectMetalinkState::sigFinished,   DLZckHeadState,      &DetectMetalinkState::toZckHeadDownloadGuard, &DetectMetalinkState::toDLZckHeadState  >,
+#endif
+    Transition< DetectMetalinkState, &DetectMetalinkState::sigFinished,   DlNormalFileState,   &DetectMetalinkState::toSimpleDownloadGuard >,
 
-    Url _url;
-    zypp::filesystem::Pathname _targetPath;
-    zypp::Pathname _deltaFilePath;
-    zypp::ByteCount _expectedFileSize;
-    std::string _errorString;
-    NetworkRequestError _requestError;
+    Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigFinished,    FinishedState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToFinished >,
+    Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigGotMetalink, PrepareMultiState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToPrepareMulti >,
+    Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigFailed,      FinishedState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToFinished >,
 
-    TransferSettings _transferSettings;
+    Transition< PrepareMultiState, &PrepareMultiState::sigFinished,   DlMetalinkState,  &PrepareMultiState::toMetalinkDownloadGuard , &PrepareMultiState::transitionToMetalinkDl >,
+#if ENABLE_ZCHUNK_COMPRESSION
+    Transition< PrepareMultiState, &PrepareMultiState::sigFinished,   DLZckHeadState,   &PrepareMultiState::toZckHeadDownloadGuard, &PrepareMultiState::transitionToZckHeadDl >,
+#endif
+    Transition< PrepareMultiState, &PrepareMultiState::sigFallback,   DlNormalFileState, DefaultStateCondition, &PrepareMultiState::fallbackToNormalTransition >,
+    Transition< PrepareMultiState, &PrepareMultiState::sigFailed,     DlNormalFileState >,
 
-    //data requires for multi part downloads
-    off_t _downloadedMultiByteCount = 0; //< the number of bytes that were already fetched in RunningMulti state
-    std::deque<Url> _multiPartMirrors;
-    zypp::media::MediaBlockList _blockList;
-    size_t _blockIter    = 0;
+#if ENABLE_ZCHUNK_COMPRESSION
+    Transition< DLZckHeadState, &DLZckHeadState::sigFinished, DLZckState, DefaultStateCondition, &DLZckHeadState::transitionToDlZckState >,
+    Transition< DLZckHeadState, &DLZckHeadState::sigFailed,   DlNormalFileState >,
 
-    Downloader *_parent = nullptr;
-    Download::State _state = Download::InitialState;
+    Transition< DLZckState, &DLZckState::sigFinished, FinishedState, DefaultStateCondition, &DLZckState::transitionToFinished >,
+    Transition< DLZckState, &DLZckState::sigFallback, DlNormalFileState >,
+#endif
 
-    bool _isMultiDownload = false;   //< State flag, shows if we are currently downloading a multi part file
-    bool _isMultiPartEnabled = true; //< Enables/Disables automatic multipart downloads
-    bool _checkExistsOnly = false;   //< Set to true if Downloader should only check if the URL exits
+    Transition< DlMetalinkState, &DlMetalinkState::sigFinished, FinishedState, DefaultStateCondition, &DlMetalinkState::transitionToFinished >,
+    Transition< DlMetalinkState, &DlMetalinkState::sigFailed, FinishedState, &DlMetalinkState::toFinalStateCondition, &DlMetalinkState::transitionToFinished   >,
+    Transition< DlMetalinkState, &DlMetalinkState::sigFailed, DlNormalFileState, &DlMetalinkState::toSimpleDownloadCondition >,
 
-    signal<void ( Download &req )> _sigStarted;
-    signal<void ( Download &req, Download::State state )> _sigStateChanged;
-    signal<void ( Download &req, off_t dlnow  )> _sigAlive;
-    signal<void ( Download &req, off_t dltotal, off_t dlnow )> _sigProgress;
-    signal<void ( Download &req )> _sigFinished;
-    signal<void ( zyppng::Download &req, zyppng::NetworkAuthData &auth, const std::string &availAuth )> _sigAuthRequired;
+    Transition< DlNormalFileState, &DlNormalFileState::sigFinished, FinishedState, DefaultStateCondition, &DlNormalFileState::transitionToFinished >,
+    Transition< DlNormalFileState, &DlNormalFileState::sigFailed, FinishedState, DefaultStateCondition, &DlNormalFileState::transitionToFinished  >
+    >;
 
-  private:
+  class DownloadPrivate : public DownloadPrivateBase, public DownloadStatemachine<DownloadPrivate>
+  {
+  public:
+    DownloadPrivate ( Downloader &parent, std::shared_ptr<NetworkRequestDispatcher> requestDispatcher, std::shared_ptr<MirrorControl> mirrors, DownloadSpec &&spec, Download &p );
     void start ();
-    void setState ( Download::State newState );
-    void onRequestStarted  ( NetworkRequest & );
-    void onRequestProgress ( NetworkRequest &req, off_t dltotal, off_t dlnow, off_t, off_t );
-    void onRequestFinished ( NetworkRequest &req , const NetworkRequestError &err );
-    void addNewRequest     (std::shared_ptr<Request> req );
-    std::shared_ptr<Request> initMultiRequest(size_t block , NetworkRequestError &err);
-    bool findNextMirror( Url &url, TransferSettings &set, NetworkRequestError &err );
-    void setFailed         ( std::string && reason );
-    void setFinished       ( bool success = true );
-    NetworkRequestError safeFillSettingsFromURL ( const Url &url, TransferSettings &set );
+    void init() override;
   };
 
   class DownloaderPrivate : public BasePrivate
   {
     ZYPP_DECLARE_PUBLIC(Downloader)
   public:
-    DownloaderPrivate( );
+    DownloaderPrivate( std::shared_ptr<MirrorControl> mc, Downloader &p );
 
     std::vector< std::shared_ptr<Download> > _runningDownloads;
     std::shared_ptr<NetworkRequestDispatcher> _requestDispatcher;
@@ -107,9 +106,10 @@ namespace zyppng {
     void onDownloadStarted ( Download &download );
     void onDownloadFinished ( Download &download );
 
-    signal<void ( Downloader &parent, Download& download )> _sigStarted;
-    signal<void ( Downloader &parent, Download& download )> _sigFinished;
-    signal<void ( Downloader &parent )> _queueEmpty;
+    Signal< void ( Downloader &parent, Download& download )> _sigStarted;
+    Signal< void ( Downloader &parent, Download& download )> _sigFinished;
+    Signal< void ( Downloader &parent )> _queueEmpty;
+    std::shared_ptr<MirrorControl> _mirrors;
   };
 
 }
diff --git a/zypp/zyppng/media/network/private/downloaderstates/base_p.h b/zypp/zyppng/media/network/private/downloaderstates/base_p.h
new file mode 100644 (file)
index 0000000..76ae50f
--- /dev/null
@@ -0,0 +1,114 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_BASE_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_BASE_P_H_INCLUDED
+
+#include <zypp-core/zyppng/base/private/base_p.h>
+#include <zypp-core/zyppng/base/signals.h>
+#include <zypp-core/TriBool.h>
+#include <zypp/zyppng/media/network/downloader.h>
+#include <zypp/zyppng/media/network/downloadspec.h>
+#include <zypp-core/zyppng/core/ByteArray>
+#include <zypp/zyppng/media/network/request.h>
+#include <zypp/zyppng/media/network/TransferSettings>
+#include <zypp/zyppng/media/network/private/mirrorcontrol_p.h>
+#include <zypp/zyppng/media/network/networkrequesterror.h>
+
+namespace zyppng {
+
+  class NetworkRequestDispatcher;
+  class DownloadPrivate;
+
+  /*!
+   * The pimpl for Downloader, the reason this is split up in DownloadPrivateBase and DownloadBase
+   * is that for defining the States in the Statemachine while making DownloadPrivate the statemachine itself
+   * we need this separation. This trick allowes the states to "know" the statemachine type and access some of
+   * its features.
+   */
+  class DownloadPrivateBase : public BasePrivate
+  {
+    ZYPP_DECLARE_PUBLIC(Download)
+  public:
+    DownloadPrivateBase ( Downloader &parent, std::shared_ptr<NetworkRequestDispatcher> requestDispatcher, std::shared_ptr<MirrorControl> mirrors, DownloadSpec &&spec, Download &p );
+    ~DownloadPrivateBase ();
+
+    struct Block {
+      off_t  start = 0;
+      size_t len = 0;
+
+      std::string chksumtype;
+      std::optional<UByteArray> chksumVec;
+      std::optional<size_t> chksumCompareLen; //< initialized if only the first few bytes of the checksum should be considered
+
+      int _retryCount = 0;  //< how many times was this request restarted
+      NetworkRequestError _failedWithErr; //< what was the error this request failed with
+    };
+
+    struct Request : public NetworkRequest {
+
+      using NetworkRequest::NetworkRequest;
+      using Ptr = std::shared_ptr<Request>;
+      using WeakPtr = std::shared_ptr<Request>;
+
+      template <typename Receiver>
+      void connectSignals ( Receiver &dl ) {
+        _sigStartedConn  = connect ( &NetworkRequest::sigStarted,  dl, &Receiver::onRequestStarted );
+        _sigProgressConn = connect ( &NetworkRequest::sigProgress, dl, &Receiver::onRequestProgress );
+        _sigFinishedConn = connect ( &NetworkRequest::sigFinished, dl, &Receiver::onRequestFinished );
+      }
+      void disconnectSignals ();
+
+      bool _triedCredFromStore = false; //< already tried to authenticate from credential store?
+      time_t _authTimestamp = 0; //< timestamp of the AuthData we tried from the store
+      Url _originalUrl;  //< The unstripped URL as it was passed to Download , before transfer settings are removed
+      MirrorControl::MirrorHandle _myMirror;
+
+      connection _sigStartedConn;
+      connection _sigProgressConn;
+      connection _sigFinishedConn;
+    };
+
+
+    bool _emittedSigStart = false;
+    bool handleRequestAuthError(std::shared_ptr<Request> req, const zyppng::NetworkRequestError &err);
+
+    NetworkRequestError safeFillSettingsFromURL ( const Url &url, TransferSettings &set );
+
+#if ENABLE_ZCHUNK_COMPRESSION
+    bool hasZckInfo () const;
+#endif
+
+    std::shared_ptr<NetworkRequestDispatcher> _requestDispatcher;
+    std::shared_ptr<MirrorControl> _mirrorControl;
+
+    DownloadSpec _spec; // the download settings
+    mutable zypp::TriBool _specHasZckInfo = zypp::indeterminate;
+
+    Downloader *_parent = nullptr;
+
+    time_t _lastTriedAuthTime = 0; //< if initialized this shows the last timestamp that we loaded a cred for the given URL from CredentialManager
+    NetworkRequest::Priority _defaultSubRequestPriority = NetworkRequest::High;
+
+    Signal< void ( Download &req )> _sigStarted;
+    Signal< void ( Download &req, Download::State state )> _sigStateChanged;
+    Signal< void ( Download &req, off_t dlnow  )> _sigAlive;
+    Signal< void ( Download &req, off_t dltotal, off_t dlnow )> _sigProgress;
+    Signal< void ( Download &req )> _sigFinished;
+    Signal< void ( zyppng::Download &req, zyppng::NetworkAuthData &auth, const std::string &availAuth )> _sigAuthRequired;
+
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/basicdownloader_p.cc b/zypp/zyppng/media/network/private/downloaderstates/basicdownloader_p.cc
new file mode 100644 (file)
index 0000000..31717c6
--- /dev/null
@@ -0,0 +1,199 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
+#include <zypp/media/CurlHelper.h>
+
+#include "basicdownloader_p.h"
+
+namespace zyppng {
+
+  BasicDownloaderStateBase::BasicDownloaderStateBase(std::shared_ptr<Request> &&req, DownloadPrivate &parent)
+    : MirrorHandlingStateBase( parent )
+    , _request( std::move(req) )
+  { }
+
+  void BasicDownloaderStateBase::enter()
+  {
+    if ( _request ) {
+      const auto &spec =  stateMachine()._spec;
+      MIL_MEDIA << "Reusing request from previous state" << std::endl;
+      _request->setOptions( Request::Default );
+      _request->setPriority( Request::Normal );
+      _request->resetRequestRanges();
+      _request->setTargetFilePath( spec.targetPath() );
+      _request->setFileOpenMode( Request::WriteExclusive );
+      _request->transferSettings() = spec.settings();
+      startRequest();
+      return;
+    }
+
+    if ( _fileMirrors.size() ) {
+      const auto res = prepareNextMirror();
+      // for Delayed or OK we can just continue here
+      if ( res != MirrorHandlingStateBase::Failed )
+        return;
+    }
+    failedToPrepare();
+  }
+
+  void BasicDownloaderStateBase::exit()
+  {
+    if ( _request ) {
+      _request->disconnectSignals();
+      _request.reset();
+    }
+  }
+
+  void BasicDownloaderStateBase::mirrorReceived( MirrorControl::MirrorPick mirror )
+  {
+    auto &sm = stateMachine();
+    auto url = sm._spec.url();
+    auto set = sm._spec.settings();
+
+    auto err = setupMirror( mirror, url, set );
+    if ( err.isError() ) {
+      WAR_MEDIA << "Setting up mirror " << mirror.second->mirrorUrl << " failed with error: " << err.toString() << "(" << err.nativeErrorString() << "), falling back to original URL." << std::endl;
+      failedToPrepare();
+    }
+    startWithMirror( mirror.second, url, set );
+  }
+
+  void BasicDownloaderStateBase::failedToPrepare()
+  {
+    startWithoutMirror();
+  }
+
+  void BasicDownloaderStateBase::startWithMirror( MirrorControl::MirrorHandle mirror, const zypp::Url &url, const TransferSettings &set )
+  {
+    auto &sm = stateMachine();
+    const auto &spec = sm._spec;
+
+    _request = std::make_shared<Request>( ::internal::clearQueryString(url), spec.targetPath() ) ;
+    _request->_myMirror = mirror;
+    _request->_originalUrl = url;
+    _request->transferSettings() = set;
+
+    startRequest();
+  }
+
+  void BasicDownloaderStateBase::startWithoutMirror()
+  {
+    auto &sm = stateMachine();
+    const auto &spec = sm._spec;
+
+    auto url = spec.url();
+    auto set = spec.settings();
+    auto err = sm.safeFillSettingsFromURL( url, set );
+    if ( err.isError() )
+      return failed( std::move(err) );
+    startWithMirror( nullptr, url, set );
+  }
+
+  void BasicDownloaderStateBase::startRequest()
+  {
+    auto &sm = stateMachine();
+
+    if ( !_request )
+      return failed("Request was not intialized before starting it.");
+
+    if ( _chksumtype  && _chksumVec ) {
+      std::shared_ptr<zypp::Digest> fileDigest = std::make_shared<zypp::Digest>();
+      if ( fileDigest->create( *_chksumtype ) )
+        // to run the checksum for the full file we need to request one big range with open end
+        _request->addRequestRange( 0, 0, fileDigest, *_chksumVec );
+    }
+
+    if ( !initializeRequest( _request ) ) {
+      return failed( "Failed to initialize request" );
+    }
+
+    if ( stateMachine().previousState() && *stateMachine().previousState() != Download::InitialState ) {
+      //make sure this request will run asap
+      _request->setPriority( sm._defaultSubRequestPriority );
+    }
+
+    _request->connectSignals( *this );
+    sm._requestDispatcher->enqueue( _request );
+  }
+
+  bool BasicDownloaderStateBase::initializeRequest( std::shared_ptr<Request> & )
+  {
+    return true;
+  }
+
+  void BasicDownloaderStateBase::gotFinished()
+  {
+    _sigFinished.emit();
+  }
+
+  void BasicDownloaderStateBase::failed( std::string &&str )
+  {
+    failed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(str) ) );
+  }
+
+  void BasicDownloaderStateBase::failed( NetworkRequestError &&err )
+  {
+    _error = std::move( err );
+    _sigFailed.emit();
+  }
+
+  void BasicDownloaderStateBase::onRequestStarted( NetworkRequest & )
+  {
+    auto &sm = stateMachine();
+    if ( !sm._emittedSigStart ) {
+      sm._emittedSigStart = true;
+      stateMachine()._sigStarted.emit( *stateMachine().z_func() );
+    }
+    if ( _request->_myMirror )
+      _request->_myMirror->startTransfer();
+  }
+
+  void BasicDownloaderStateBase::handleRequestProgress( NetworkRequest &req, off_t dltotal, off_t dlnow )
+  {
+    auto &sm = stateMachine();
+    const off_t expFSize = sm._spec.expectedFileSize();
+    if ( expFSize  > 0 && expFSize < dlnow ) {
+      sm._requestDispatcher->cancel( req, NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) );
+      return;
+    }
+    return sm._sigProgress.emit( *sm.z_func(), (expFSize > 0 ? expFSize : dltotal), dlnow );
+  }
+
+  void BasicDownloaderStateBase::onRequestProgress( NetworkRequest &req, off_t dltotal, off_t dlnow, off_t, off_t )
+  {
+    handleRequestProgress( req, dltotal, dlnow );
+  }
+
+  void BasicDownloaderStateBase::onRequestFinished( NetworkRequest &req, const NetworkRequestError &err )
+  {
+    auto lck = stateMachine().z_func()->shared_from_this();
+    auto &sm = stateMachine();
+
+    if ( _request->_myMirror )
+      _request->_myMirror->finishTransfer( !err.isError() );
+
+    if ( req.hasError() ) {
+      // if we get authentication failure we try to recover
+      if ( sm.handleRequestAuthError( _request, err ) ) {
+        //make sure this request will run asap
+        _request->setPriority( sm._defaultSubRequestPriority );
+        sm._requestDispatcher->enqueue( _request );
+        return;
+      }
+      MIL_MEDIA << "Downloading on " << stateMachine()._spec.url() << " failed with error "<< err.toString() << " " << err.nativeErrorString() << std::endl;
+      return failed( NetworkRequestError(err) );
+    }
+
+    gotFinished();
+  }
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/basicdownloader_p.h b/zypp/zyppng/media/network/private/downloaderstates/basicdownloader_p.h
new file mode 100644 (file)
index 0000000..0da85ef
--- /dev/null
@@ -0,0 +1,71 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_BASICDOWNLOADER_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_BASICDOWNLOADER_P_H_INCLUDED
+
+#include "base_p.h"
+#include "mirrorhandling_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+namespace zyppng {
+
+  /*!
+   * State implementation for the generic part of a simple file downloader, that knows
+   * how to use the mirrors if available.
+   */
+  struct BasicDownloaderStateBase : public MirrorHandlingStateBase {
+
+    using Request = DownloadPrivateBase::Request;
+
+    BasicDownloaderStateBase ( DownloadPrivate &parent ) : MirrorHandlingStateBase( parent ){}
+    BasicDownloaderStateBase ( std::shared_ptr<Request> &&req, DownloadPrivate &parent );
+
+    void enter ();
+    void exit ();
+
+    virtual bool initializeRequest ( std::shared_ptr<Request> &r );
+    virtual void gotFinished ();
+    virtual void failed(NetworkRequestError &&err);
+    void failed (std::string &&str );
+
+    void onRequestStarted  ( NetworkRequest & );
+    void onRequestProgress ( NetworkRequest &, off_t dltotal, off_t dlnow, off_t, off_t );
+    void onRequestFinished ( NetworkRequest &req , const NetworkRequestError &err );
+
+    const NetworkRequestError &error () const {
+      return _error;
+    }
+
+    std::shared_ptr<Request> _request;
+    std::optional<std::string> _chksumtype; //< The file checksum type if available
+    std::optional<UByteArray>  _chksumVec;  //< The file checksum if available
+
+    // MirrorHandlingStateBase interface
+    void mirrorReceived(MirrorControl::MirrorPick mirror) override;
+    void failedToPrepare() override;
+
+  protected:
+    void startWithMirror ( MirrorControl::MirrorHandle mirror, const zypp::Url &url, const TransferSettings &set );
+    void startWithoutMirror (  );
+    void startRequest ();
+    virtual void handleRequestProgress (NetworkRequest &req, off_t dltotal, off_t dlnow );
+    NetworkRequestError _error;
+    Signal< void () > _sigFinished;
+    Signal< void () > _sigFailed;
+
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/detectmeta_p.cc b/zypp/zyppng/media/network/private/downloaderstates/detectmeta_p.cc
new file mode 100644 (file)
index 0000000..8e12c4e
--- /dev/null
@@ -0,0 +1,116 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp/media/CurlHelper.h>
+
+#include "detectmeta_p.h"
+#include "metalinkinfo_p.h"
+
+namespace zyppng {
+
+  DetectMetalinkState::DetectMetalinkState(DownloadPrivate &parent) : SimpleState( parent ){
+    MIL_MEDIA << "Creating DetectMetalinkState" << std::endl;
+  }
+
+  void DetectMetalinkState::enter()
+  {
+    _request.reset();
+    _gotMetalink = false;
+
+    auto &sm = stateMachine();
+    const auto &url = sm._spec.url();
+
+    MIL_MEDIA << "Detecting if metalink is available on " << url << std::endl;
+
+    _request = std::make_shared<Request>( ::internal::clearQueryString( url ), zypp::Pathname("/dev/null") );
+
+    _request->_originalUrl = url;
+    _request->transferSettings() = sm._spec.settings();
+    _request->transferSettings().addHeader("Accept: */*, application/metalink+xml, application/metalink4+xml");
+    _request->setOptions( _request->options() | NetworkRequest::HeadRequest );
+
+    _request->connectSignals( *this );
+    sm._requestDispatcher->enqueue( _request );
+  }
+
+  void DetectMetalinkState::exit()
+  {
+    if ( _request ) {
+      _request->disconnectSignals();
+      _request.reset();
+    }
+  }
+
+  void DetectMetalinkState::onRequestStarted( NetworkRequest & )
+  {
+    stateMachine()._sigStarted.emit( *stateMachine().z_func() );
+  }
+
+  void DetectMetalinkState::onRequestProgress( NetworkRequest &, off_t, off_t dlnow, off_t, off_t )
+  {
+    stateMachine()._sigAlive.emit( *stateMachine().z_func(), dlnow );
+  }
+
+  void DetectMetalinkState::onRequestFinished( NetworkRequest &req, const NetworkRequestError &err )
+  {
+    auto lck = stateMachine().z_func()->shared_from_this();
+    if ( req.hasError() ) {
+      WAR << "Detecing if metalink is possible for url " << req.url() << " failed with error " << err.toString() << " falling back to download without metalink." << std::endl;
+      _error = err;
+      _gotMetalink = false;
+      return _sigFinished.emit();
+    }
+
+    std::string cType = req.contentType();
+    _gotMetalink = ( cType.find("application/metalink+xml") == 0 || cType.find("application/metalink4+xml") == 0 );
+    MIL << "Metalink detection result on url " << req.url() << " is " << _gotMetalink << std::endl;
+    _sigFinished.emit();
+  }
+
+  std::shared_ptr<DlMetaLinkInfoState> DetectMetalinkState::toDlMetaLinkInfoState()
+  {
+    _request->disconnectSignals();
+    auto nState = std::make_shared<DlMetaLinkInfoState>( std::move( _request ), stateMachine() );
+    _request = nullptr;
+    return nState;
+  }
+
+  bool DetectMetalinkState::toSimpleDownloadGuard() const
+  {
+#if ENABLE_ZCHUNK_COMPRESSION
+    return !toMetalinkGuard() && !toZckHeadDownloadGuard();
+#else
+    return !toMetalinkGuard();
+#endif
+  }
+
+#if ENABLE_ZCHUNK_COMPRESSION
+  bool DetectMetalinkState::toZckHeadDownloadGuard() const
+  {
+    return !toMetalinkGuard() && stateMachine().hasZckInfo();
+  }
+
+  std::shared_ptr<DLZckHeadState> DetectMetalinkState::toDLZckHeadState()
+  {
+    // we have no mirrors, the range downloader would need to fall back to using the base URL
+    if ( _error.isError() || !_request )
+      return std::make_shared<DLZckHeadState>( std::vector<Url> { stateMachine()._spec.url() }, stateMachine() );
+    else {
+      // reuse our request
+      _request->disconnectSignals();
+      auto nstate = std::make_shared<DLZckHeadState>( std::vector<Url> { stateMachine()._spec.url() }, std::move(_request), stateMachine() );
+      _request = nullptr;
+      return nstate;
+    }
+  }
+#endif
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/detectmeta_p.h b/zypp/zyppng/media/network/private/downloaderstates/detectmeta_p.h
new file mode 100644 (file)
index 0000000..ed3b645
--- /dev/null
@@ -0,0 +1,81 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_DETECTMETA_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_DETECTMETA_P_H_INCLUDED
+
+#include "base_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+namespace zyppng {
+
+  struct DlMetaLinkInfoState;
+#if ENABLE_ZCHUNK_COMPRESSION
+  struct DLZckHeadState;
+#endif
+
+  /*!
+   * State implementation for the metalink detection phase,
+   * this state issues a HEAD request while setting the magic
+   * "Accept: *\/*, application/metalink+xml, application/metalink4+xml"
+   * header in the request to figure out if a metalink file is available or not.
+   *
+   * In order to use metalink support the server
+   * needs to correctly return the metalink file content type,
+   * otherwise we proceed to not downloading a metalink file
+   */
+  struct DetectMetalinkState : public zyppng::SimpleState< DownloadPrivate, Download::DetectMetaLink, false > {
+
+    using Request = DownloadPrivateBase::Request;
+
+    DetectMetalinkState ( DownloadPrivate &parent );
+
+    void enter ();
+    void exit ();
+
+    void onRequestStarted  ( NetworkRequest & );
+    void onRequestProgress ( NetworkRequest &, off_t, off_t dlnow, off_t, off_t );
+    void onRequestFinished ( NetworkRequest &req , const NetworkRequestError &err );
+
+
+    const NetworkRequestError &error () const {
+      return _error;
+    }
+
+    SignalProxy< void () > sigFinished() {
+      return _sigFinished;
+    }
+
+    bool toMetalinkGuard () const {
+      return _gotMetalink;
+    }
+    std::shared_ptr<DlMetaLinkInfoState> toDlMetaLinkInfoState();
+
+    bool toSimpleDownloadGuard () const;
+
+#if ENABLE_ZCHUNK_COMPRESSION
+    bool toZckHeadDownloadGuard () const;
+    std::shared_ptr<DLZckHeadState> toDLZckHeadState();
+#endif
+
+    std::shared_ptr<Request> _request;
+
+  private:
+    NetworkRequestError _error;
+    bool _gotMetalink = false;
+    Signal< void () > _sigFinished;
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/final_p.cc b/zypp/zyppng/media/network/private/downloaderstates/final_p.cc
new file mode 100644 (file)
index 0000000..3c427e6
--- /dev/null
@@ -0,0 +1,23 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include "final_p.h"
+
+namespace zyppng {
+
+  FinishedState::FinishedState(NetworkRequestError &&error, DownloadPrivate &parent)
+    : SimpleState( parent )
+    , _error( std::move(error) )
+  {
+    MIL_MEDIA << "About to enter FinishedState for url " << parent._spec.url() << std::endl;
+  }
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/final_p.h b/zypp/zyppng/media/network/private/downloaderstates/final_p.h
new file mode 100644 (file)
index 0000000..4544b79
--- /dev/null
@@ -0,0 +1,38 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_FINAL_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_FINAL_P_H_INCLUDED
+
+#include "base_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+namespace zyppng {
+
+  /*!
+   * Final state implementation, we enter this state as the very last step. It carries
+   * the result of the whole operation.
+   */
+  struct FinishedState : public SimpleState< DownloadPrivate, Download::Finished, true >
+  {
+    FinishedState ( NetworkRequestError &&error, DownloadPrivate &parent );
+
+    void enter (){}
+    void exit (){}
+
+    NetworkRequestError _error;
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/initial_p.cc b/zypp/zyppng/media/network/private/downloaderstates/initial_p.cc
new file mode 100644 (file)
index 0000000..e701a04
--- /dev/null
@@ -0,0 +1,68 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+
+#include "initial_p.h"
+#if ENABLE_ZCHUNK_COMPRESSION
+#include "zck_p.h"
+#endif
+
+namespace zyppng {
+
+  void InitialState::enter(){ MIL << "Entering initial state"  << std::endl; }
+
+  void InitialState::exit(){  MIL << "Leaving initial state"  << std::endl;  }
+
+  void InitialState::initiate()
+  {
+    auto &sm = stateMachine();
+    const auto &spec = sm._spec;
+
+    if ( spec.checkExistsOnly() ) {
+      MIL_MEDIA << "Check exists only enabled" << std::endl;
+      return _sigTransitionToDlNormalFileState.emit();
+    }
+
+#if ENABLE_ZCHUNK_COMPRESSION
+    bool deltaZck = isZchunkFile( spec.deltaFile() );
+#endif
+    if ( spec.metalinkEnabled() ) {
+#if ENABLE_ZCHUNK_COMPRESSION
+      if ( deltaZck && spec.headerSize() > 0 ) {
+        MIL_MEDIA << "We might have a zck file, detecting metalink first" << std::endl;
+        return _sigTransitionToDetectMetalinkState.emit();
+      }
+#endif
+      MIL_MEDIA << "No zchunk data available but metalink requested, going to download metalink directly." << std::endl;
+      return _sigTransitionToDlMetaLinkInfoState.emit();
+    }
+
+#if ENABLE_ZCHUNK_COMPRESSION
+    // no Metalink, maybe we can directly download zck
+    if ( deltaZck && spec.headerSize() > 0 ) {
+      MIL_MEDIA << "No metalink but zckunk data availble trying to download ZckHead directly." << std::endl;
+      return _sigTransitionToDLZckHeaderState.emit();
+    }
+#endif
+    MIL_MEDIA << "Fallback to normal DL" << std::endl;
+    _sigTransitionToDlNormalFileState.emit();
+  }
+
+#if ENABLE_ZCHUNK_COMPRESSION
+  std::shared_ptr<DLZckHeadState> InitialState::toDLZckHeadState()
+  {
+    // we have no mirrors, the range downloader would need to fall back to using the base URL
+    return std::make_shared<DLZckHeadState>( std::vector<Url> { stateMachine()._spec.url() }, stateMachine() );
+  }
+#endif
+
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/initial_p.h b/zypp/zyppng/media/network/private/downloaderstates/initial_p.h
new file mode 100644 (file)
index 0000000..72713fb
--- /dev/null
@@ -0,0 +1,71 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_INITIAL_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_INITIAL_P_H_INCLUDED
+
+#include "base_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+namespace zyppng {
+
+#if ENABLE_ZCHUNK_COMPRESSION
+  struct DLZckHeadState;
+#endif
+
+  /*!
+   * Initial state implementation, this state is used only to kickstart the statemachine
+   */
+  struct InitialState : public zyppng::SimpleState< DownloadPrivate, Download::InitialState, false > {
+
+    InitialState ( DownloadPrivate &parent ) : SimpleState( parent ){}
+
+    void enter ();;
+    void exit ();
+
+    void initiate();
+
+    SignalProxy< void () > sigTransitionToDetectMetalinkState() {
+      return _sigTransitionToDetectMetalinkState;
+    }
+
+    SignalProxy< void () > sigTransitionToDlMetaLinkInfoState() {
+      return _sigTransitionToDlMetaLinkInfoState;
+    }
+
+#if ENABLE_ZCHUNK_COMPRESSION
+    SignalProxy< void () > sigTransitionToDLZckHeaderState() {
+      return _sigTransitionToDLZckHeaderState;
+    }
+#endif
+
+    SignalProxy< void () > sigTransitionToDlNormalFileState() {
+      return _sigTransitionToDlNormalFileState;
+    }
+
+#if ENABLE_ZCHUNK_COMPRESSION
+    std::shared_ptr<DLZckHeadState> toDLZckHeadState ();
+#endif
+
+  private:
+    Signal<void()> _sigTransitionToDetectMetalinkState;
+    Signal<void()> _sigTransitionToDlMetaLinkInfoState;
+#if ENABLE_ZCHUNK_COMPRESSION
+    Signal<void()> _sigTransitionToDLZckHeaderState;
+#endif
+    Signal<void()> _sigTransitionToDlNormalFileState;
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/metalink_p.cc b/zypp/zyppng/media/network/private/downloaderstates/metalink_p.cc
new file mode 100644 (file)
index 0000000..a164f88
--- /dev/null
@@ -0,0 +1,134 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
+#include <zypp/PathInfo.h>
+
+#include "metalink_p.h"
+#include "final_p.h"
+
+ #include <iostream>
+#include <fstream>
+
+namespace zyppng {
+
+  DlMetalinkState::DlMetalinkState(zypp::media::MediaBlockList &&blockList, std::vector<Url> &&mirrors, DownloadPrivate &parent)
+    : RangeDownloaderBaseState( std::move(mirrors), parent )
+    , _blockList( std::move(blockList) )
+  {
+    MIL_MEDIA << "About to enter DlMetalinkState for url " << parent._spec.url() << std::endl;
+  }
+
+  void DlMetalinkState::enter()
+  {
+    auto &sm = stateMachine();
+    const auto &spec = sm._spec;
+
+    //first we try to reuse blocks from the deltafile , if we have one
+    if ( !spec.deltaFile().empty() ) {
+      zypp::PathInfo dFileInfo ( spec.deltaFile() );
+      if ( dFileInfo.isFile() && dFileInfo.isR() ) {
+        FILE *f = fopen( spec.targetPath().asString().c_str(), "w+b" );
+        if ( !f ) {
+          setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, zypp::str::Format("Failed to open target file.(errno %1%)" ) % errno ) );
+          return;
+        }
+
+        try {
+          _blockList.reuseBlocks ( f, spec.deltaFile().asString() );
+        } catch ( ... ) { }
+
+        fclose( f );
+      }
+    }
+
+    // setup the base downloader
+    _error = {};
+    _ranges.clear();
+    _failedRanges.clear();
+    _downloadedMultiByteCount = 0;
+
+    if ( _blockList.haveFileChecksum() ) {
+      _fileChecksumType = _blockList.fileChecksumType();
+      _fileChksumVec    = _blockList.getFileChecksum();
+    }
+
+    const size_t fLen = _blockList.getFilesize();
+    if ( _fileSize > 0 ) {
+      // check if the file size as reported by zchunk is equal to the one we expect
+      if ( _fileSize != fLen ) {
+        return setFailed( NetworkRequestErrorPrivate::customError(
+          NetworkRequestError::ExceededMaxLen,
+          zypp::str::Format("Metalink file reports a different filesize than what was expected ( Meta: %1% != Exp: %2%).") % fLen % _fileSize )
+          );
+      }
+    } else {
+      _fileSize = fLen;
+    }
+
+    // remember how many bytes we need to download
+    size_t bytesToDl = 0;
+    for ( size_t i = 0; i < _blockList.numBlocks(); i++ ) {
+      const auto &mediaBlock = _blockList.getBlock( i );
+      _ranges.push_back(
+        Block{
+          .start = mediaBlock.off,
+          .len   = mediaBlock.size,
+          .chksumtype = _blockList.getChecksumType(),
+          .chksumVec  = _blockList.getChecksum ( i )
+        } );
+
+      bytesToDl += mediaBlock.size;
+    }
+    // substract the length of the blocks we have to download from the overall file size
+    _downloadedMultiByteCount = fLen - bytesToDl;
+
+    ensureDownloadsRunning();
+  }
+
+  void DlMetalinkState::exit()
+  {
+    cancelAll( NetworkRequestError() );
+  }
+
+  void DlMetalinkState::setFinished()
+  {
+    if ( _fileChecksumType.size() && _fileChksumVec ) {
+      //TODO move this into a external application so we do not need to block on it
+      //need to check file digest
+      zypp::Digest dig;
+      dig.create( _fileChecksumType );
+
+      std::ifstream istrm( stateMachine()._spec.targetPath().asString(), std::ios::binary);
+      if ( !istrm.is_open() ) {
+        setFailed( "Failed to verify file digest (Could not open target file)." );
+        return;
+      }
+      if ( !dig.update( istrm ) ) {
+        setFailed( "Failed to verify file digest (Could not read target file)." );
+        return;
+      }
+
+      const auto &calculatedChksum = dig.digestVector();
+      if ( *_fileChksumVec != calculatedChksum ) {
+        setFailed( "Failed to verify file digest (Checksum did not match)." );
+        return;
+      }
+    }
+    RangeDownloaderBaseState::setFinished();
+  }
+
+  std::shared_ptr<FinishedState> DlMetalinkState::transitionToFinished()
+  {
+    return std::make_shared<FinishedState>( std::move(_error), stateMachine() );
+  }
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/metalink_p.h b/zypp/zyppng/media/network/private/downloaderstates/metalink_p.h
new file mode 100644 (file)
index 0000000..a6a330b
--- /dev/null
@@ -0,0 +1,69 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_METALINK_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_METALINK_P_H_INCLUDED
+
+#include "base_p.h"
+#include "rangedownloader_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+#include <zypp/media/MediaBlockList.h>
+
+namespace zyppng {
+
+  struct FinishedState;
+
+  /*!
+   * Metalink download state implementation, this downloads the requested file
+   * in metalink ranges.
+   */
+  struct DlMetalinkState : public RangeDownloaderBaseState {
+
+    static constexpr auto stateId = Download::DlMetalink;
+
+    DlMetalinkState ( zypp::media::MediaBlockList &&blockList, std::vector<Url> &&mirrors, DownloadPrivate &parent );
+
+    void enter ();
+    void exit ();
+    virtual void setFinished () override;
+
+    std::shared_ptr<FinishedState> transitionToFinished ();
+
+    // in case of error we might fall back, except for the errors listed here
+    bool toFinalStateCondition () {
+      return (  _error.type() == NetworkRequestError::Unauthorized
+               || _error.type() == NetworkRequestError::AuthFailed );
+    }
+
+    bool toSimpleDownloadCondition () {
+      return !toFinalStateCondition();
+    }
+
+    SignalProxy< void () > sigFinished() {
+      return _sigFinished;
+    }
+
+    SignalProxy< void () > sigFailed() {
+      return _sigFailed;
+    }
+
+  private:
+    zypp::media::MediaBlockList _blockList;
+    std::string        _fileChecksumType;
+    std::optional<std::vector<unsigned char>> _fileChksumVec;
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/metalinkinfo_p.cc b/zypp/zyppng/media/network/private/downloaderstates/metalinkinfo_p.cc
new file mode 100644 (file)
index 0000000..220ed6b
--- /dev/null
@@ -0,0 +1,135 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp/zyppng/media/network/private/request_p.h>
+#include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
+
+#include "metalinkinfo_p.h"
+
+namespace zyppng {
+
+  namespace  {
+
+    constexpr auto minMetalinkProbeSize = 256; //< The maximum probe size we download before we decide we really got no metalink file
+
+    bool looks_like_metalink_data( const std::vector<char> &data )
+    {
+      if ( data.empty() )
+        return false;
+
+      const char *p = data.data();
+      while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
+        p++;
+
+      if (!strncasecmp(p, "<?xml", 5))
+      {
+        while (*p && *p != '>')
+          p++;
+        if (*p == '>')
+          p++;
+        while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
+          p++;
+      }
+      bool ret = !strncasecmp( p, "<metalink", 9 ) ? true : false;
+      return ret;
+    }
+
+    bool looks_like_metalink_file( const zypp::Pathname &file )
+    {
+      std::unique_ptr<FILE, decltype(&fclose)> fd( fopen( file.c_str(), "r" ), &fclose );
+      if ( !fd )
+        return false;
+      return looks_like_metalink_data( zyppng::peek_data_fd( fd.get(), 0, minMetalinkProbeSize ) );
+    }
+  }
+
+  DlMetaLinkInfoState::DlMetaLinkInfoState(DownloadPrivate &parent)
+    : BasicDownloaderStateBase( parent )
+  {
+    MIL_MEDIA << "Downloading metalink on " << parent._spec.url() << std::endl;
+  }
+
+  DlMetaLinkInfoState::DlMetaLinkInfoState(std::shared_ptr<Request> &&prevRequest, DownloadPrivate &parent)
+    : BasicDownloaderStateBase( std::move(prevRequest), parent )
+  {
+    MIL_MEDIA << "Downloading metalink on " << parent._spec.url() << std::endl;
+  }
+
+  std::shared_ptr<FinishedState> DlMetaLinkInfoState::transitionToFinished()
+  {
+    MIL_MEDIA << "Downloading on " << stateMachine()._spec.url() << " transition to final state. " << std::endl;
+    return std::make_shared<FinishedState>( std::move(_error), stateMachine() );
+  }
+
+  std::shared_ptr<PrepareMultiState> DlMetaLinkInfoState::transitionToPrepareMulti()
+  {
+    _request->disconnectSignals();
+    auto nState = std::make_shared<PrepareMultiState>( std::move( _request ), stateMachine() );
+    _request = nullptr;
+    return nState;
+  }
+
+  bool DlMetaLinkInfoState::initializeRequest(std::shared_ptr<Request> &r )
+  {
+    r->transferSettings().addHeader("Accept: */*, application/metalink+xml, application/metalink4+xml");
+    return BasicDownloaderStateBase::initializeRequest(r);
+  }
+
+  void DlMetaLinkInfoState::gotFinished()
+  {
+    // some proxies do not store the content type, so also look at the file to find
+    // out if we received a metalink (bnc#649925)
+    if ( !_isMetalink )
+      _isMetalink = looks_like_metalink_file( _request->targetFilePath() );
+    if ( !_isMetalink ) {
+      // Move to finished state
+      MIL << "Downloading on " << stateMachine()._spec.url() << " was successful, no metalink data. " << std::endl;
+      return BasicDownloaderStateBase::gotFinished();
+    }
+
+    // Move to Prepare Multi state
+    MIL << "Downloading on " << stateMachine()._spec.url() << " returned a Metalink " << std::endl;
+    _sigGotMetalink.emit();
+  }
+
+  void DlMetaLinkInfoState::handleRequestProgress(NetworkRequest &req, off_t dltotal, off_t dlnow)
+  {
+    auto &sm = stateMachine();
+
+    if ( !_isMetalink && dlnow < minMetalinkProbeSize ) {
+      // can't tell yet, ...
+      return sm._sigAlive.emit( *sm.z_func(), dlnow );
+    }
+
+    if ( !_isMetalink ) {
+      std::string cType = req.contentType();
+      _isMetalink = ( cType.find("application/metalink+xml") == 0 || cType.find("application/metalink4+xml") == 0 );
+    }
+
+    if ( !_isMetalink ) {
+      _isMetalink = looks_like_metalink_data( req.peekData( 0, minMetalinkProbeSize ) );
+    }
+
+    if ( _isMetalink ) {
+      // this is a metalink file change the expected filesize
+      if ( zypp::ByteCount( 2, zypp::ByteCount::MB) < static_cast<zypp::ByteCount::SizeType>( dlnow ) ) {
+        WAR << "Metalink file exceeds 2MB in filesize, aborting."<<std::endl;
+        sm._requestDispatcher->cancel( req, NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) );
+        return;
+      }
+    } else {
+      // still no metalink, we assume a normal download, not perfect though
+      return BasicDownloaderStateBase::handleRequestProgress( req, dltotal, dlnow );
+    }
+  }
+
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/metalinkinfo_p.h b/zypp/zyppng/media/network/private/downloaderstates/metalinkinfo_p.h
new file mode 100644 (file)
index 0000000..6fc978e
--- /dev/null
@@ -0,0 +1,62 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_METALINKINFO_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_METALINKINFO_P_H_INCLUDED
+
+#include "base_p.h"
+#include "basicdownloader_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+namespace zyppng {
+
+  struct FinishedState;
+  struct PrepareMultiState;
+
+  /*!
+     * State to download the actual metalink file, we can however not be 100% sure that we actually
+     * will get a metalink file, so we need to check the content type or in bad cases the
+     * data we get from the server.
+     */
+  struct DlMetaLinkInfoState : public BasicDownloaderStateBase {
+    static constexpr auto stateId = Download::DlMetaLinkInfo;
+
+    DlMetaLinkInfoState( DownloadPrivate &parent );
+    DlMetaLinkInfoState( std::shared_ptr<Request> &&prevRequest,  DownloadPrivate &parent );
+
+    SignalProxy< void () > sigFinished() {
+      return _sigFinished;
+    }
+    SignalProxy< void () > sigGotMetalink() {
+      return _sigGotMetalink;
+    }
+    SignalProxy< void () > sigFailed() {
+      return _sigFailed;
+    }
+
+    std::shared_ptr<FinishedState> transitionToFinished ();
+    std::shared_ptr<PrepareMultiState> transitionToPrepareMulti ();
+
+    bool initializeRequest( std::shared_ptr<Request> &r ) override;
+    virtual void gotFinished () override;
+
+  protected:
+    bool _isMetalink = false;
+    Signal< void () > _sigGotMetalink;
+
+    virtual void handleRequestProgress ( NetworkRequest &req, off_t dltotal, off_t dlnow ) override;
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/mirrorhandling_p.cc b/zypp/zyppng/media/network/private/downloaderstates/mirrorhandling_p.cc
new file mode 100644 (file)
index 0000000..f2f0a5a
--- /dev/null
@@ -0,0 +1,70 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+
+#include "mirrorhandling_p.h"
+
+namespace zyppng {
+
+  MirrorHandlingStateBase::MirrorHandlingStateBase( DownloadPrivate &parent )
+    : BasicState(parent)
+  { }
+
+  MirrorHandlingStateBase::~MirrorHandlingStateBase()
+  {
+    _sigMirrorsReadyConn.disconnect();
+  }
+
+  MirrorHandlingStateBase::PrepareResult MirrorHandlingStateBase::prepareNextMirror()
+  {
+    auto &sm = stateMachine();
+    auto res = sm._mirrorControl->pickBestMirror( _fileMirrors );
+    if ( res.code == MirrorControl::PickResult::Again ) {
+      if ( !_sigMirrorsReadyConn )
+        _sigMirrorsReadyConn = sm._mirrorControl->connectFunc( &MirrorControl::sigNewMirrorsReady, [this](){
+          _sigMirrorsReadyConn.disconnect();
+          prepareNextMirror();
+        }, *this );
+      return Delayed;
+    } else if ( res.code == MirrorControl::PickResult::Unknown ) {
+      failedToPrepare();
+      return Failed;
+    }
+    mirrorReceived( res.result );
+    return Ok;
+  }
+
+  NetworkRequestError MirrorHandlingStateBase::setupMirror( const MirrorControl::MirrorPick &pick, Url &url, TransferSettings &set )
+  {
+    auto &sm = stateMachine();
+    Url myUrl;
+    TransferSettings settings;
+
+    myUrl = *pick.first;
+
+    settings = sm._spec.settings();
+    //if this is a different host than the initial request, we reset username/password
+    if ( myUrl.getHost() != sm._spec.url().getHost() ) {
+      settings.setUsername( std::string() );
+      settings.setPassword( std::string() );
+      settings.setAuthType( std::string() );
+    }
+
+    NetworkRequestError err = sm.safeFillSettingsFromURL( myUrl, settings );
+    if ( err.type() != NetworkRequestError::NoError )
+      return err;
+
+    url = myUrl;
+    set = settings;
+    return err;
+  }
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/mirrorhandling_p.h b/zypp/zyppng/media/network/private/downloaderstates/mirrorhandling_p.h
new file mode 100644 (file)
index 0000000..9838d86
--- /dev/null
@@ -0,0 +1,70 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_MIRRORHANDLING_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_MIRRORHANDLING_P_H_INCLUDED
+
+#include <zypp-core/zyppng/base/statemachine.h>
+#include "base_p.h"
+
+namespace zyppng {
+
+  /*!
+   * superclass state implementation for all states that need to handle async mirror requests
+   */
+  struct MirrorHandlingStateBase  : public zyppng::BasicState< DownloadPrivate, false >
+  {
+
+    MirrorHandlingStateBase ( DownloadPrivate &parent );
+    virtual ~MirrorHandlingStateBase();
+    enum PrepareResult {
+      Failed,
+      Ok,
+      Delayed
+    };
+
+    /*!
+     * Request a new mirror, the \a PrepareResult shows if \ref setupMirror was already called
+     * or if the request was \a Delayed.
+     */
+    PrepareResult prepareNextMirror ();
+
+
+    /*!
+     * Common code to setup a mirror after it was received, can result in errors if the mirror url contains
+     * settings that are invalid.
+     * Will return settings and url via parameters.
+     */
+    NetworkRequestError setupMirror( const MirrorControl::MirrorPick &pick, Url &url, TransferSettings &set );
+
+    /*!
+     * This is called once a mirror became ready, either directly if a mirror is ready or it was delayed
+     * and called asynchronously
+     */
+    virtual void mirrorReceived ( MirrorControl::MirrorPick mirror ) = 0;
+
+    /*!
+     * Gets called in case a mirror failed to prepare,
+     * probably because none of the mirrors in \a _fileMirrors is known by \ref MirrorControl
+     */
+    virtual void failedToPrepare (){};
+
+    std::vector<Url> _fileMirrors; //< all mirrors of the currently requested file
+
+  private:
+    connection _sigMirrorsReadyConn; //< the internal connection to the mirrors ready signal
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/normal_p.cc b/zypp/zyppng/media/network/private/downloaderstates/normal_p.cc
new file mode 100644 (file)
index 0000000..128b61b
--- /dev/null
@@ -0,0 +1,35 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+
+#include "normal_p.h"
+#include "final_p.h"
+
+namespace zyppng {
+
+  DlNormalFileState::DlNormalFileState( DownloadPrivate &parent ) : BasicDownloaderStateBase( parent )
+  {
+    MIL_MEDIA << "About to enter DlNormalFileState for url " << parent._spec.url() << std::endl;
+  }
+
+
+  DlNormalFileState::DlNormalFileState( std::shared_ptr<Request> &&oldReq, DownloadPrivate &parent ) : BasicDownloaderStateBase( std::move(oldReq), parent )
+  {
+    MIL_MEDIA << "About to enter DlNormalFileState for url " << parent._spec.url() << std::endl;
+  }
+
+  std::shared_ptr<FinishedState> DlNormalFileState::transitionToFinished()
+  {
+    return std::make_shared<FinishedState>( std::move(_error), stateMachine() );
+  }
+
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/normal_p.h b/zypp/zyppng/media/network/private/downloaderstates/normal_p.h
new file mode 100644 (file)
index 0000000..85e67a6
--- /dev/null
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_NORMAL_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_NORMAL_P_H_INCLUDED
+
+#include "base_p.h"
+#include "basicdownloader_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+namespace zyppng {
+
+  struct FinishedState;
+
+  /*!
+     * Just a plain normal file download, no metalink, nothing fancy.
+     * If this fails we have no more fallbacks
+     */
+  struct DlNormalFileState : public BasicDownloaderStateBase {
+    static constexpr auto stateId = Download::DlSimple;
+
+    DlNormalFileState( DownloadPrivate &parent );
+    DlNormalFileState( std::shared_ptr<Request> &&oldReq, DownloadPrivate &parent );
+
+    std::shared_ptr<FinishedState> transitionToFinished ();
+
+    SignalProxy< void () > sigFinished() {
+      return _sigFinished;
+    }
+    SignalProxy< void () > sigFailed() {
+      return _sigFailed;
+    }
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/preparemulti_p.cc b/zypp/zyppng/media/network/private/downloaderstates/preparemulti_p.cc
new file mode 100644 (file)
index 0000000..f4174db
--- /dev/null
@@ -0,0 +1,212 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
+#include <zypp/media/CurlHelper.h>
+
+#include "preparemulti_p.h"
+
+#if ENABLE_ZCHUNK_COMPRESSION
+#include "zck_p.h"
+#endif
+
+namespace zyppng {
+
+  PrepareMultiState::PrepareMultiState( std::shared_ptr<Request> oldReq, DownloadPrivate &parent ) : SimpleState( parent )
+  {
+    MIL_MEDIA << "About to enter PrepareMultiState" << std::endl;
+  }
+
+  void PrepareMultiState::enter( )
+  {
+    auto &sm = stateMachine();
+    const auto &spec = sm._spec;
+    const auto &url = spec.url();
+    const auto &targetPath = spec.targetPath();
+#if ENABLE_ZCHUNK_COMPRESSION
+    _haveZckData = (isZchunkFile( spec.deltaFile() )  && spec.headerSize() > 0);
+    DBG_MEDIA << " Upgrading request for URL: "<< url << " to multipart download , which zckunk=" << _haveZckData << std::endl;
+#else
+    DBG_MEDIA << " Upgrading request for URL: "<< url << " to multipart download , which zckunk=false" << std::endl;
+#endif
+
+
+    //we have a metalink download, lets parse it and see what we got
+    _mirrors.clear();
+
+    std::vector<zypp::media::MetalinkMirror> mirrs;
+
+    try {
+      zypp::media::MetaLinkParser parser;
+      parser.parse( targetPath );
+
+      // we only care about the metalink chunks if we have no zchunk data
+#if ENABLE_ZCHUNK_COMPRESSION
+      if ( !_haveZckData ) {
+#else
+      if ( true ) {
+#endif
+        auto bl = parser.getBlockList();
+        if ( !bl.haveBlocks() )
+          MIL_MEDIA << "Got no blocks for URL " << spec.url() << " but got filesize? " << bl.getFilesize() << std::endl;
+        if ( bl.haveBlocks() || bl.haveFilesize() )
+          _blockList = std::move(bl);
+      }
+
+      //migrate some settings from the base url to the mirror
+      mirrs = parser.getMirrors();
+      for ( auto urliter = mirrs.begin(); urliter != mirrs.end(); ++urliter ) {
+        try {
+          const std::string scheme = urliter->url.getScheme();
+          if (scheme == "http" || scheme == "https" || scheme == "ftp" || scheme == "tftp") {
+            if ( !sm._requestDispatcher->supportsProtocol( urliter->url )) {
+              urliter = mirrs.erase( urliter );
+              continue;
+            }
+            urliter->url = ::internal::propagateQueryParams( urliter->url, url );
+            _mirrors.push_back( urliter->url );
+          }
+        }
+        catch (...) {  }
+      }
+
+      if ( mirrs.empty() ) {
+        mirrs.push_back( { 0, -1, url } );
+        _mirrors.push_back( url );
+      }
+
+    } catch ( const zypp::Exception &ex ) {
+      _error = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, zypp::str::Format("Failed to parse metalink information.(%1%)" ) % ex.asUserString() );
+      _sigFailed.emit();
+      return;
+    }
+
+    if ( mirrs.size() == 0 ) {
+      _error = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, zypp::str::Format("Invalid metalink information.( No mirrors in metalink file)" ) );
+      _sigFailed.emit();
+      return;
+    }
+
+    //remove the metalink file
+    zypp::filesystem::unlink( targetPath );
+    _mirrorControlReadyConn = sm._mirrorControl->connect( &MirrorControl::sigNewMirrorsReady, *this, &PrepareMultiState::onMirrorsReady );
+
+    // this will emit a mirrorsReady signal once some connection tests have been done
+    sm._mirrorControl->registerMirrors( mirrs );
+  }
+
+  void PrepareMultiState::exit()
+  {
+    // if we did not pass on the existing request to the next state we destroy it here
+    if ( _oldRequest )
+      _oldRequest.reset();
+  }
+
+  void PrepareMultiState::onMirrorsReady()
+  {
+    auto &sm = stateMachine();
+    const auto &spec = sm._spec;
+    const auto &url = spec.url();
+    _mirrorControlReadyConn.disconnect();
+
+#if ENABLE_ZCHUNK_COMPRESSION
+    if ( _haveZckData  ) {
+      _sigFinished.emit();
+      return;
+    }
+#endif
+
+    // we have no zchunk data, so for a multi download we need a blocklist
+    if ( !_blockList.haveBlocks() )  {
+      //if we have no filesize we can not generate a blocklist, we need to fall back to normal download
+      if ( !_blockList.haveFilesize() ) {
+
+        //fall back to normal download but use a mirror from the mirror list
+        //otherwise we get HTTPS to HTTP redirect errors
+        _sigFallback.emit();
+        return;
+      } else {
+        //we generate a blocklist on the fly based on the filesize
+
+        MIL_MEDIA << "Generate blocklist, since there was none in the metalink file." << url  << std::endl;
+
+        off_t currOff = 0;
+        off_t filesize = _blockList.getFilesize();
+        while ( currOff <  filesize )  {
+
+          auto blksize = filesize - currOff ;
+          if ( blksize > sm._spec.preferredChunkSize() )
+            blksize = sm._spec.preferredChunkSize();
+
+          _blockList.addBlock( currOff, blksize );
+          currOff += blksize;
+        }
+
+        MIL_MEDIA << "Generated blocklist: " << std::endl << _blockList << std::endl << " End blocklist " << std::endl;
+      }
+    }
+
+    _sigFinished.emit();
+  }
+
+  std::shared_ptr<DlNormalFileState> PrepareMultiState::fallbackToNormalTransition()
+  {
+    MIL_MEDIA << "No blocklist and no filesize, falling back to normal download for URL " << stateMachine()._spec.url() << std::endl;
+    std::shared_ptr<DlNormalFileState> ptr;
+    if ( _oldRequest ) {
+      ptr = std::make_shared<DlNormalFileState>( std::move(_oldRequest), stateMachine() );
+    } else {
+      ptr = std::make_shared<DlNormalFileState>( stateMachine() );
+    }
+
+    ptr->_fileMirrors = std::move(_mirrors);
+    if ( _blockList.haveFileChecksum() ) {
+      ptr->_chksumtype = _blockList.fileChecksumType();
+      ptr->_chksumVec  = _blockList.getFileChecksum();
+    }
+
+    return ptr;
+  }
+
+  std::shared_ptr<DlMetalinkState> PrepareMultiState::transitionToMetalinkDl()
+  {
+    return std::make_shared<DlMetalinkState>( std::move(_blockList), std::move(_mirrors), stateMachine() );
+  }
+
+  std::shared_ptr<FinishedState> PrepareMultiState::transitionToFinished()
+  {
+    return std::make_shared<FinishedState>( std::move(_error), stateMachine() );
+  }
+
+#if ENABLE_ZCHUNK_COMPRESSION
+  std::shared_ptr<DLZckHeadState> PrepareMultiState::transitionToZckHeadDl()
+  {
+    if ( _oldRequest )
+      return std::make_shared<DLZckHeadState>( std::move(_mirrors), std::move(_oldRequest), stateMachine() );
+    return std::make_shared<DLZckHeadState>( std::move(_mirrors), stateMachine() );
+  }
+
+  bool PrepareMultiState::toZckHeadDownloadGuard() const
+  {
+    return ( stateMachine().hasZckInfo() );
+  }
+#endif
+
+  bool PrepareMultiState::toMetalinkDownloadGuard() const
+  {
+#if ENABLE_ZCHUNK_COMPRESSION
+    return (!toZckHeadDownloadGuard());
+#else
+    return true;
+#endif
+  }
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/preparemulti_p.h b/zypp/zyppng/media/network/private/downloaderstates/preparemulti_p.h
new file mode 100644 (file)
index 0000000..88db87a
--- /dev/null
@@ -0,0 +1,89 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_PREPAREMULTI_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_PREPAREMULTI_P_H_INCLUDED
+
+#include "base_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+#include <zypp/media/MediaBlockList.h>
+
+namespace zyppng {
+
+  struct DlNormalFileState;
+  struct DlMetalinkState;
+  struct FinishedState;
+
+#if ENABLE_ZCHUNK_COMPRESSION
+  struct DLZckHeadState;
+#endif
+
+  /*!
+   * Metalink peparation state implementation, this state parses the downloaded Metalink file
+   * and registeres all mirrors in \ref MirrorControl. Once the first mirror becomes ready it passes on
+   * to the next state.
+   */
+  struct PrepareMultiState : public zyppng::SimpleState< DownloadPrivate, Download::PrepareMulti, false > {
+
+    using Request = DownloadPrivateBase::Request;
+
+    PrepareMultiState ( std::shared_ptr<Request> oldReq, DownloadPrivate &parent );
+
+    void enter ();
+    void exit ();
+
+    const NetworkRequestError &error () const {
+      return _error;
+    }
+
+    SignalProxy< void () > sigFinished() {
+      return _sigFinished;
+    }
+    SignalProxy< void () > sigFailed() {
+      return _sigFailed;
+    }
+    SignalProxy< void () > sigFallback() {
+      return _sigFallback;
+    }
+
+    std::shared_ptr<DlNormalFileState>  fallbackToNormalTransition ();
+    std::shared_ptr<DlMetalinkState>    transitionToMetalinkDl ();
+    std::shared_ptr<FinishedState>      transitionToFinished ();
+#if ENABLE_ZCHUNK_COMPRESSION
+    std::shared_ptr<DLZckHeadState>     transitionToZckHeadDl ();
+    bool toZckHeadDownloadGuard () const;
+#endif
+
+    bool toMetalinkDownloadGuard () const;
+
+    std::vector<Url> _mirrors;
+    zypp::media::MediaBlockList _blockList;
+
+  private:
+    sigc::connection _mirrorControlReadyConn;
+
+    void onMirrorsReady ();
+#if ENABLE_ZCHUNK_COMPRESSION
+    bool _haveZckData = false; //< do we have zck data ready
+#endif
+    std::shared_ptr<Request> _oldRequest; //< exising request of previous states, that the next states might reuse
+    NetworkRequestError _error;
+    Signal< void () > _sigFinished;
+    Signal< void () > _sigFallback;
+    Signal< void () > _sigFailed;
+  };
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/rangedownloader_p.cc b/zypp/zyppng/media/network/private/downloaderstates/rangedownloader_p.cc
new file mode 100644 (file)
index 0000000..b913cb4
--- /dev/null
@@ -0,0 +1,407 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
+#include <zypp/media/CurlHelper.h>
+#include <zypp-core/AutoDispose.h>
+
+#include "rangedownloader_p.h"
+
+namespace zyppng {
+
+  void RangeDownloaderBaseState::onRequestStarted( NetworkRequest & )
+  { }
+
+  void RangeDownloaderBaseState::onRequestProgress( NetworkRequest &, off_t , off_t, off_t , off_t  )
+  {
+    off_t dlnowMulti = _downloadedMultiByteCount;
+    for( const auto &req : _runningRequests ) {
+      dlnowMulti += req->downloadedByteCount();
+    }
+    stateMachine()._sigProgress.emit( *stateMachine().z_func(), _fileSize, dlnowMulti );
+  }
+
+  void RangeDownloaderBaseState::onRequestFinished( NetworkRequest &req, const zyppng::NetworkRequestError &err )
+  {
+    auto lck = stateMachine().z_func()->shared_from_this();
+    auto it = std::find_if( _runningRequests.begin(), _runningRequests.end(), [ &req ]( const std::shared_ptr<Request> &r ) {
+      return ( r.get() == &req );
+    });
+    if ( it == _runningRequests.end() )
+      return;
+
+    auto reqLocked = *it;
+
+    //remove from running
+    _runningRequests.erase( it );
+
+    //feed the working URL back into the mirrors in case there are still running requests that might fail
+    // @TODO , finishing the transfer might never be called in case of cancelling the request, need a better way to track running transfers
+    if ( reqLocked->_myMirror )
+      reqLocked->_myMirror->finishTransfer( !err.isError() );
+
+    if ( err.isError() ) {
+      return handleRequestError( reqLocked, err );
+    }
+
+    _downloadedMultiByteCount += req.downloadedByteCount();
+
+    MIL_MEDIA << "Request finished "<<std::endl;
+    const auto &rngs = reqLocked->requestedRanges();
+    std::for_each( rngs.begin(), rngs.end(), []( const auto &b ){ DBG << "-> Block " << b.start << " finished." << std::endl; } );
+
+    auto restartReqWithBlock = [ this ]( std::shared_ptr<Request> &req, std::vector<Block> &&blocks ) {
+      MIL_MEDIA << "Reusing Request to download blocks:"<<std::endl;
+      if ( !addBlockRanges( req, std::move( blocks ) ) )
+        return false;
+
+      //this is not a new request, only add to queues but do not connect signals again
+      addNewRequest( req, false );
+      return true;
+    };
+
+    //check if we already have enqueued all blocks if not reuse the request
+    if ( _ranges.size() ) {
+      MIL_MEDIA << "Reusing to download blocks: "<<std::endl;
+      if ( !restartReqWithBlock( reqLocked, getNextBlocks( reqLocked->url().getScheme() ) ) ) {
+        return setFailed( "Failed to restart request with new blocks." );
+      }
+      return;
+
+    } else {
+      //if we have failed blocks, try to download them with this mirror
+      if ( !_failedRanges.empty() ) {
+
+        auto fblks = getNextFailedBlocks( reqLocked->url().getScheme() );
+        MIL_MEDIA << "Reusing to download failed blocks: "<<std::endl;
+        if ( !restartReqWithBlock( reqLocked, std::move(fblks) ) ) {
+          return setFailed( "Failed to restart request with previously failed blocks." );
+        }
+        return;
+      }
+    }
+
+    //feed the working URL back into the mirrors in case there are still running requests that might fail
+    _fileMirrors.push_back( reqLocked->_originalUrl );
+
+    // make sure downloads are running, at this point
+    ensureDownloadsRunning();
+  }
+
+  void RangeDownloaderBaseState::handleRequestError( std::shared_ptr<Request> req, const zyppng::NetworkRequestError &err )
+  {
+    bool retry = false;
+    auto &parent = stateMachine();
+
+
+    //Handle the auth errors explicitely, we need to give the user a way to put in new credentials
+    //if we get valid new credentials we can retry the request
+    if ( err.type() == NetworkRequestError::Unauthorized || err.type() == NetworkRequestError::AuthFailed ) {
+      retry = parent.handleRequestAuthError( req, err );
+    } else {
+
+      //if a error happens during a multi download we try to use another mirror to download the failed block
+      MIL << "Request failed " << req->extendedErrorString() << "(" << req->url() << ")" << std::endl;
+
+      NetworkRequestError dummyErr;
+
+      const auto &fRanges = req->failedRanges();
+      try {
+        std::transform( fRanges.begin(), fRanges.end(), std::back_inserter(_failedRanges), [ &req ]( const auto &r ){
+          Block b = std::any_cast<Block>(r.userData);;
+          b._failedWithErr = req->error();
+          DBG_MEDIA << "Adding failed block to failed blocklist: " << b.start << " " << b.len << " (" << req->error().toString() << " [" << req->error().nativeErrorString()<< "])" << std::endl;
+          return b;
+        });
+
+        // try to fill the open spot right away
+        ensureDownloadsRunning();
+        return;
+
+      } catch ( const zypp::Exception &ex ) {
+        //we just log the exception and fall back to a normal download
+        WAR << "Multipart download failed: " << ex.asString() << std::endl;
+      }
+    }
+
+    //if rety is true we just enqueue the request again, usually this means authentication was updated
+    if ( retry ) {
+      //make sure this request will run asap
+      req->setPriority( parent._defaultSubRequestPriority );
+
+      //this is not a new request, only add to queues but do not connect signals again
+      addNewRequest( req, false );
+      return;
+    }
+
+    //we do not have more mirrors left we can try
+    cancelAll ( err );
+
+    // not all hope is lost, maybe a normal download can work out?
+    // fall back to normal download
+    _sigFailed.emit();
+  }
+
+  void RangeDownloaderBaseState::ensureDownloadsRunning()
+  {
+    if ( _inEnsureDownloadsRunning )
+      return;
+
+    zypp::OnScopeExit clearFlag( [this]() {
+      _inEnsureDownloadsRunning = false;
+    });
+
+    _inEnsureDownloadsRunning = true;
+
+    //check if there is still work to do
+    while ( _ranges.size() || _failedRanges.size() ) {
+
+      // download was already finished
+      if ( _error.isError() )
+        return;
+
+      if ( _runningRequests.size() >= 10 )
+        break;
+
+      // prepareNextMirror will automatically call mirrorReceived() once there is a mirror ready
+      const auto &res = prepareNextMirror();
+      // if mirrors are delayed we stop here, once the mirrors are ready we get called again
+      if ( res == MirrorHandlingStateBase::Delayed )
+        return;
+      else if ( res == MirrorHandlingStateBase::Failed ) {
+        failedToPrepare();
+        return;
+      }
+    }
+
+    // check if we are done at this point
+    if ( _runningRequests.empty() ) {
+
+      if ( _failedRanges.size() || _ranges.size() ) {
+        setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Unable to download all blocks." ) );
+        return;
+      }
+
+      // seems we were successfull , transition to finished state
+      setFinished();
+    }
+  }
+
+  void RangeDownloaderBaseState::mirrorReceived( MirrorControl::MirrorPick mirror )
+  {
+
+    auto &parent = stateMachine();
+    Url myUrl;
+    TransferSettings settings;
+
+    auto err = setupMirror( mirror, myUrl, settings );
+    if ( err.isError() ) {
+      WAR << "Failure to setup mirror " << myUrl << " with error " << err.toString() << "("<< err.nativeErrorString() << "), dropping it from the list of mirrors." << std::endl;
+      // if a mirror fails , we remove it from our list
+      _fileMirrors.erase( mirror.first );
+
+      // make sure this is retried
+      ensureDownloadsRunning();
+      return;
+    }
+
+    auto blocks = getNextBlocks( myUrl.getScheme() );
+    if ( !blocks.size() )
+      blocks = getNextFailedBlocks( myUrl.getScheme() );
+
+    if ( !blocks.size() ) {
+      // we have not blocks, in theory that should never happen but for safety we error out here, its better than
+      // getting stuck
+      setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Mirror requested after all blocks were downloaded." ) );
+      return;
+    }
+
+    const auto &spec = parent._spec;
+
+    std::shared_ptr<Request> req = std::make_shared<Request>( ::internal::clearQueryString( myUrl ), spec.targetPath(), NetworkRequest::WriteShared );
+    req->_myMirror = mirror.second;
+    req->_originalUrl = myUrl;
+    req->setPriority( parent._defaultSubRequestPriority );
+    req->transferSettings() = settings;
+
+    // if we download chunks we do not want to wait for too long on mirrors that have slow activity
+    // note: this sets the activity timeout, not the download timeout
+    req->transferSettings().setTimeout( 2 );
+
+    DBG_MEDIA << "Creating Request to download blocks:"<<std::endl;
+    if ( !addBlockRanges( req, std::move(blocks) ) ) {
+      setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Failed to add blocks to request." ) );
+      return;
+    }
+
+    // we just use a mirror once per file, remove it from the list
+    _fileMirrors.erase( mirror.first );
+
+    addNewRequest( req );
+
+    // trigger next downloads
+    ensureDownloadsRunning();
+  }
+
+  void RangeDownloaderBaseState::failedToPrepare()
+  {
+    // it was impossible to find a new mirror, check if we still have running requests we can wait for, if not
+    // we can only fail at this point
+    if ( !_runningRequests.size() ) {
+      setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "No valid mirror found" ) );
+    }
+  }
+
+  void RangeDownloaderBaseState::reschedule()
+  {
+    bool triggerResched = false;
+    for ( auto &req : _runningRequests ) {
+      if ( req->state() == NetworkRequest::Pending ) {
+        triggerResched = true;
+        req->setPriority( NetworkRequest::Critical, false );
+      }
+    }
+    if ( triggerResched )
+      stateMachine()._requestDispatcher->reschedule();
+  }
+
+  void RangeDownloaderBaseState::addNewRequest(std::shared_ptr<Request> req , const bool connectSignals)
+  {
+    if ( connectSignals )
+      req->connectSignals( *this );
+
+    _runningRequests.push_back( req );
+    stateMachine()._requestDispatcher->enqueue( req );
+
+    if ( req->_myMirror )
+      req->_myMirror->startTransfer();
+  }
+
+  /**
+   * Just initialize the requests ranges from the internal blocklist
+   */
+  bool RangeDownloaderBaseState::addBlockRanges ( std::shared_ptr<Request> req , std::vector<Block> &&blocks ) const
+  {
+    req->resetRequestRanges();
+    for ( const auto &block : blocks ) {
+      if ( block.chksumVec && block.chksumtype.size() ) {
+        std::shared_ptr<zypp::Digest> dig = std::make_shared<zypp::Digest>();
+        if ( !dig->create( block.chksumtype ) ) {
+          WAR_MEDIA << "Trying to create Digest with chksum type " << block.chksumtype << " failed " << std::endl;
+          return false;
+        }
+
+        DBG_MEDIA << "Starting block " << block.start << " with checksum " << zypp::Digest::digestVectorToString( *block.chksumVec ) << "." << std::endl;
+        req->addRequestRange( block.start, block.len, dig, *block.chksumVec, std::any( block ), block.chksumCompareLen );
+      } else {
+        DBG_MEDIA << "Starting block " << block.start << " without checksum." << std::endl;
+        req->addRequestRange( block.start, block.len, {}, {}, std::any( block ) );
+      }
+    }
+    return true;
+  }
+
+  void zyppng::RangeDownloaderBaseState::setFailed(NetworkRequestError &&err)
+  {
+    _error = std::move( err );
+    cancelAll( _error );
+    zypp::filesystem::unlink( stateMachine()._spec.targetPath() );
+    _sigFailed.emit();
+  }
+
+  void RangeDownloaderBaseState::setFailed(std::string &&reason)
+  {
+    setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(reason) ) );
+  }
+
+  void RangeDownloaderBaseState::setFinished()
+  {
+    _error = NetworkRequestError();
+    _sigFinished.emit();
+  }
+
+  void RangeDownloaderBaseState::cancelAll(const NetworkRequestError &err)
+  {
+    while( _runningRequests.size() ) {
+      auto req = _runningRequests.back();
+      req->disconnectSignals();
+      _runningRequests.pop_back();
+      stateMachine()._requestDispatcher->cancel( *req, err );
+      if ( req->_myMirror )
+        req->_myMirror->cancelTransfer();
+    }
+  }
+
+  std::vector<RangeDownloaderBaseState::Block> RangeDownloaderBaseState::getNextBlocks( const std::string &urlScheme )
+  {
+    std::vector<Block> blocks;
+    const auto prefSize = static_cast<size_t>( stateMachine()._spec.preferredChunkSize() );
+    size_t accumulatedSize = 0;
+
+    bool canDoRandomBlocks = ( zypp::str::hasPrefixCI( urlScheme, "http") );
+
+    std::optional<size_t> lastBlockEnd;
+    while ( _ranges.size() && accumulatedSize < prefSize ) {
+      const auto &r = _ranges.front();
+
+      if ( !canDoRandomBlocks && lastBlockEnd ) {
+        if ( static_cast<const size_t>(r.start) != (*lastBlockEnd)+1 )
+          break;
+      }
+
+      lastBlockEnd = r.start + r.len - 1;
+      accumulatedSize += r.len;
+
+      blocks.push_back( std::move( _ranges.front() ) );
+      _ranges.pop_front();
+
+    }
+    DBG_MEDIA << "Accumulated " << blocks.size() <<  " blocks with accumulated size of: " << accumulatedSize << "." << std::endl;
+    return blocks;
+  }
+
+  std::vector<RangeDownloaderBaseState::Block> RangeDownloaderBaseState::getNextFailedBlocks( const std::string &urlScheme )
+  {
+    const auto prefSize = static_cast<size_t>( stateMachine()._spec.preferredChunkSize() );
+    // sort the failed requests by block number, this should make sure get them in offset order as well
+    _failedRanges.sort( []( const auto &a , const auto &b ){ return a.start < b.start; } );
+
+    bool canDoRandomBlocks = ( zypp::str::hasPrefixCI( urlScheme, "http") );
+
+    std::vector<Block> fblks;
+    std::optional<size_t> lastBlockEnd;
+    size_t accumulatedSize = 0;
+    while ( _failedRanges.size() ) {
+
+      const auto &block =_failedRanges.front();
+
+      //we need to check if we have consecutive blocks because only http mirrors support random request ranges
+      if ( !canDoRandomBlocks && lastBlockEnd ) {
+        if ( static_cast<const size_t>(block.start) != (*lastBlockEnd)+1 )
+          break;
+      }
+
+      lastBlockEnd = block.start + block.len - 1;
+      accumulatedSize += block.len;
+
+      fblks.push_back( std::move( _failedRanges.front() ));
+      _failedRanges.pop_front();
+
+      fblks.back()._retryCount += 1;
+
+      if ( accumulatedSize >= prefSize )
+        break;
+    }
+
+    return fblks;
+  }
+
+}
diff --git a/zypp/zyppng/media/network/private/downloaderstates/rangedownloader_p.h b/zypp/zyppng/media/network/private/downloaderstates/rangedownloader_p.h
new file mode 100644 (file)
index 0000000..cb0dc88
--- /dev/null
@@ -0,0 +1,89 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_RANGEDOWNLOADER_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_RANGEDOWNLOADER_P_H_INCLUDED
+
+#include "base_p.h"
+#include "mirrorhandling_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+namespace zyppng {
+
+  /*!
+   * Generic state implementation for all states that download a file in blocks from
+   * a fixed set of mirrors.
+   */
+  struct RangeDownloaderBaseState : public MirrorHandlingStateBase {
+
+    using Request = DownloadPrivateBase::Request;
+    using Block   = DownloadPrivateBase::Block;
+
+    RangeDownloaderBaseState ( std::vector<Url> &&mirrors, DownloadPrivate &parent ) :
+      MirrorHandlingStateBase(parent) {
+      _fileMirrors = std::move(mirrors);
+    }
+
+    void ensureDownloadsRunning ();
+    void reschedule ();
+
+    const NetworkRequestError &error () const {
+      return _error;
+    }
+
+    void setFailed  ( NetworkRequestError &&err );
+    void setFailed  ( std::string && reason );
+    virtual void setFinished ( );
+    void cancelAll  ( const NetworkRequestError &err  );
+
+    void onRequestStarted  ( NetworkRequest & );
+    void onRequestProgress ( NetworkRequest &, off_t, off_t, off_t, off_t );
+    void onRequestFinished ( NetworkRequest &req , const NetworkRequestError &err );
+
+    // MirrorHandlingStateBase interface
+    void mirrorReceived(MirrorControl::MirrorPick mirror) override;
+    void failedToPrepare() override;
+
+  protected:
+    NetworkRequestError _error;
+    bool _inEnsureDownloadsRunning = false; //< Flag to prevent multiple entry to ensureDownloadsRunning
+
+    size_t             _fileSize = 0; //< The expected filesize, this is used to make sure we do not write after the end offset of the expected file size
+    std::list<Block>   _ranges;
+
+    //keep a list with failed blocks in case we run out of mirrors,
+    //in that case we can retry to download them once we have a finished download
+    std::list<Block>   _failedRanges;
+
+    off_t _downloadedMultiByteCount = 0; //< the number of bytes that were already fetched in RunningMulti state
+
+    std::vector< std::shared_ptr<Request> > _runningRequests;
+
+    // we only define the signals here and add the accessor functions in the subclasses, static casting of
+    // the class type is not allowed at compile time, so they would not be useable in the transition table otherwise
+    Signal< void () > _sigFinished;
+    Signal< void () > _sigFailed;
+
+  private:
+    void handleRequestError( std::shared_ptr<Request> req, const zyppng::NetworkRequestError &err );
+    bool addBlockRanges( std::shared_ptr<Request> req, std::vector<Block> &&blocks ) const;
+    void addNewRequest     (std::shared_ptr<Request> req, const bool connectSignals = true );
+
+    std::vector<Block> getNextBlocks ( const std::string &urlScheme );
+    std::vector<Block> getNextFailedBlocks( const std::string &urlScheme );
+  };
+
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/zck_p.cc b/zypp/zyppng/media/network/private/downloaderstates/zck_p.cc
new file mode 100644 (file)
index 0000000..87b6015
--- /dev/null
@@ -0,0 +1,278 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
+
+#if ENABLE_ZCHUNK_COMPRESSION
+
+#include <zypp/zyppng/media/network/private/downloader_p.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
+#include <zypp-core/AutoDispose.h>
+
+#include "zck_p.h"
+
+#include <iostream>
+#include <fstream>
+#include <fcntl.h>
+
+extern "C" {
+#include <zck.h>
+}
+
+namespace zyppng {
+
+  bool isZchunkFile ( const zypp::Pathname &file ) {
+    std::ifstream dFile( file.c_str() );
+    if ( !dFile.is_open() )
+      return false;
+
+    constexpr std::string_view magic("\0ZCK1", 5);
+
+    std::array< char, magic.size() > lead;
+    lead.fill('\0');
+    dFile.read( lead.data(), lead.size() );
+    return ( magic == std::string_view( lead.data(), lead.size()) );
+  }
+
+  DLZckHeadState::DLZckHeadState( std::vector<Url> &&mirrors, std::shared_ptr<Request> &&oldReq, DownloadPrivate &parent )
+    : BasicDownloaderStateBase( std::move(oldReq), parent )
+  {
+    _fileMirrors = std::move(mirrors);
+    MIL_MEDIA << "About to enter DlZckHeadState for url " << parent._spec.url() << std::endl;
+  }
+
+  DLZckHeadState::DLZckHeadState( std::vector<Url> &&mirrors, DownloadPrivate &parent )
+    : BasicDownloaderStateBase( parent )
+  {
+    _fileMirrors = std::move(mirrors);
+    MIL_MEDIA << "About to enter DlZckHeadState for url " << parent._spec.url() << std::endl;
+  }
+
+
+  bool DLZckHeadState::initializeRequest(std::shared_ptr<Request> &r )
+  {
+    BasicDownloaderStateBase::initializeRequest( r );
+
+    const auto &s = stateMachine()._spec;
+    if ( s.headerSize() == 0 ) {
+      ERR_MEDIA << "Downloading the zck header was requested, but headersize is zero." << std::endl;
+      return false;
+    }
+
+    std::shared_ptr<zypp::Digest> digest;
+    NetworkRequest::CheckSumBytes sum;
+
+    const auto &headerSum = s.headerChecksum();
+    if ( headerSum ) {
+      digest = std::make_shared<zypp::Digest>();
+      if ( !digest->create( headerSum->type() ) ) {
+        ERR << "Unknown header checksum type " << headerSum->type() << std::endl;
+        return false;
+      }
+      sum = zypp::Digest::hexStringToUByteArray( headerSum->checksum() );
+    }
+
+    r->addRequestRange( 0, s.headerSize(), digest, sum );
+    return true;
+  }
+
+  void DLZckHeadState::gotFinished()
+  {
+    if ( isZchunkFile( stateMachine()._spec.targetPath() ) )
+      return BasicDownloaderStateBase::gotFinished();
+    failed ( "Downloaded header is not a zchunk header");
+  }
+
+  std::shared_ptr<DLZckState> DLZckHeadState::transitionToDlZckState()
+  {
+    MIL_MEDIA << "Downloaded the header of size: " << _request->downloadedByteCount() << std::endl;
+    return std::make_shared<DLZckState>( std::move(_fileMirrors), stateMachine() );
+  }
+
+  DLZckState::DLZckState(std::vector<Url> &&mirrors, DownloadPrivate &parent)
+    : RangeDownloaderBaseState( std::move(mirrors), parent )
+  {
+    MIL_MEDIA << "About to enter DLZckState for url " << parent._spec.url() << std::endl;
+  }
+
+  void DLZckState::enter()
+  {
+    const auto &spec = stateMachine()._spec;
+
+    // setup the base downloader
+    _error = {};
+    _ranges.clear();
+    _failedRanges.clear();
+
+    // @TODO get this from zchunk file?
+    _fileSize = spec.expectedFileSize();
+
+    zypp::AutoFD src_fd = open( spec.deltaFile().asString().c_str(), O_RDONLY);
+    if(src_fd < 0)
+      return setFailed ( zypp::str::Format("Unable to open %1%") % spec.deltaFile() );
+
+    zypp::AutoDispose<zckCtx *> zck_src ( zck_create(), []( auto ptr ) { if ( ptr ) zck_free( &ptr ); } );
+    if( !zck_src )
+      return setFailed ( zypp::str::Format("%1%") % zck_get_error(NULL) );
+
+    if(!zck_init_read(zck_src, src_fd))
+      return setFailed ( zypp::str::Format( "Unable to open %1%: %2%") %  spec.deltaFile() % zck_get_error(zck_src) );
+
+    zypp::AutoFD target_fd = open( spec.targetPath().asString().c_str(), O_RDWR);
+    if(target_fd < 0)
+      return setFailed ( zypp::str::Format("Unable to open %1%") % spec.targetPath() );
+
+    zypp::AutoDispose<zckCtx *> zckTarget ( zck_create(), []( auto ptr ) { if ( ptr ) zck_free( &ptr ); } );
+    if( !zckTarget )
+      return setFailed ( zypp::str::Format("%1%") % zck_get_error(NULL) );
+
+    if(!zck_init_read(zckTarget, target_fd))
+      return setFailed ( zypp::str::Format( "Unable to open %1%: %2%") %  spec.targetPath() % zck_get_error(zckTarget) );
+
+    // Returns 0 for error, -1 for invalid checksum and 1 for valid checksum
+    switch ( zck_find_valid_chunks(zckTarget) ) {
+      case 0: // Returns 0 if there was a error
+        return setFailed ( zypp::str::Format( "Unable to open %1%: %2%") %  spec.targetPath() % zck_get_error(zckTarget) );
+      case 1: // getting a 1 would mean the file is already complete, basically impossible but lets handle it anyway
+        return setFinished();
+    }
+
+    const auto srcHashType = zck_get_chunk_hash_type( zckTarget );
+    const auto targetHashType = zck_get_chunk_hash_type( zckTarget );
+
+    const size_t fLen = zck_get_length( zckTarget );
+    if ( _fileSize > 0 ) {
+      // check if the file size as reported by zchunk is equal to the one we expect
+      if ( _fileSize != fLen ) {
+        return setFailed( NetworkRequestErrorPrivate::customError(
+          NetworkRequestError::ExceededMaxLen,
+          zypp::str::Format("Zchunk header reports a different filesize than what was expected ( Zck: %1% != Exp: %2%).") % fLen % _fileSize )
+          );
+      }
+    } else {
+      _fileSize = fLen;
+    }
+
+    if( srcHashType != targetHashType )
+      return setFailed ( zypp::str::Format( "ERROR: Chunk hash types don't match. Source Hash: %1% vs Target Hash: %2%")
+                        % zck_hash_name_from_type ( srcHashType )
+                        % zck_hash_name_from_type ( targetHashType ) );
+
+    if(!zck_copy_chunks( zck_src, zckTarget ))
+      return setFailed ( zypp::str::Format( "Unable to copy chunks from deltafile.") );
+
+    // will reset all chunks that are marked as failed back to missing
+    zck_reset_failed_chunks( zckTarget );
+
+
+    // we calculate what is already downloaded by substracting the block sizes we still need to download from the full file size
+    _downloadedMultiByteCount = _fileSize;
+
+    auto chunk = zck_get_first_chunk( zckTarget );
+    do {
+      // Get validity of current chunk: 1 = valid, 0 = missing, -1 = invalid
+      if ( zck_get_chunk_valid( chunk ) == 1 )
+        continue;
+
+      zypp::AutoFREE<char> zckDigest( zck_get_chunk_digest( chunk ) );
+      UByteArray chksumVec = zypp::Digest::hexStringToUByteArray( std::string_view( zckDigest.value() ) );
+      std::string chksumName;
+      std::optional<size_t> chksumCompareLen;
+
+      switch ( targetHashType ) {
+        case ZCK_HASH_SHA1: {
+          chksumName = zypp::Digest::sha1();
+          break;
+        }
+        case ZCK_HASH_SHA256: {
+          chksumName = zypp::Digest::sha256();
+          break;
+        }
+        case ZCK_HASH_SHA512: {
+          chksumName = zypp::Digest::sha512();
+          break;
+        }
+        case ZCK_HASH_SHA512_128: {
+          // defined in zchunk as
+          // SHA-512/128 (first 128 bits of SHA-512 checksum)
+          chksumName = zypp::Digest::sha512();
+          chksumCompareLen = chksumVec.size();
+          break;
+        }
+        default: {
+          return setFailed ( zypp::str::Format( "Unsupported chunk hash type: %1%.") % zck_hash_name_from_type( targetHashType ) );
+        }
+      }
+
+      const auto s = static_cast<off_t>( zck_get_chunk_start( chunk ) );
+      const auto l = static_cast<size_t>( zck_get_chunk_comp_size ( chunk ) );
+
+      MIL_MEDIA << "Downloading block " << s << " with length " << l << " checksum " << zckDigest.value() << " type " << chksumName << std::endl;
+
+      _ranges.push_back( Block{
+        .start = s,
+        .len   = l,
+        .chksumtype = chksumName,
+        .chksumVec  = std::move( chksumVec ),
+        .chksumCompareLen = std::move(chksumCompareLen)
+      } );
+
+      // substract the block length from the already downloaded bytes size
+      _downloadedMultiByteCount -= l;
+
+    } while ( (chunk = zck_get_next_chunk( chunk )) );
+
+    ensureDownloadsRunning();
+  }
+
+  void DLZckState::exit()
+  {
+    cancelAll( NetworkRequestError() );
+  }
+
+  std::shared_ptr<FinishedState> DLZckState::transitionToFinished()
+  {
+    return std::make_shared<FinishedState>( std::move(_error), stateMachine() );
+  }
+
+  void DLZckState::setFinished()
+  {
+    const auto &spec = stateMachine()._spec;
+
+    zypp::AutoFD target_fd = open( spec.targetPath().asString().c_str(), O_RDONLY );
+    if( target_fd < 0 )
+      return setFailed ( zypp::str::Format("Unable to open %1%") % spec.targetPath() );
+
+    zypp::AutoDispose<zckCtx *> zckTarget ( zck_create(), []( auto ptr ) { if ( ptr ) zck_free( &ptr ); } );
+    if( !zckTarget )
+      return setFailed ( zypp::str::Format("%1%") % zck_get_error(nullptr) );
+
+    if(!zck_init_read(zckTarget, target_fd))
+      return setFailed ( zypp::str::Format( "Unable to open %1%: %2%") %  spec.targetPath() % zck_get_error(zckTarget) );
+
+    /* Validate the chunk and data checksums for the current file.
+     * Returns 0 for error, -1 for invalid checksum and 1 for valid checksum */
+    const auto res = zck_validate_checksums( zckTarget );
+    if ( res == 0 || res == -1 ) {
+      if( zck_is_error(nullptr) ) {
+        std::string err = zck_get_error(NULL);
+        zck_clear_error(NULL);
+        return setFailed( std::move(err) );
+      }
+      if( zck_is_error(zckTarget) )
+        return setFailed( zck_get_error(zckTarget) );
+      return setFailed( "zck_validate_checksums returned a unknown error." );
+    }
+
+    // everything is valid
+    RangeDownloaderBaseState::setFinished();
+  }
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/downloaderstates/zck_p.h b/zypp/zyppng/media/network/private/downloaderstates/zck_p.h
new file mode 100644 (file)
index 0000000..00fb441
--- /dev/null
@@ -0,0 +1,85 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_ZCK_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_DOWNLOADERSTATES_ZCK_P_H_INCLUDED
+
+#include "base_p.h"
+#include "basicdownloader_p.h"
+#include "rangedownloader_p.h"
+#include <zypp-core/zyppng/base/statemachine.h>
+
+namespace zyppng {
+
+#if ENABLE_ZCHUNK_COMPRESSION
+
+  struct DLZckState;
+  struct FinishedState;
+
+  bool isZchunkFile ( const zypp::Pathname &file );
+
+  /*!
+   * Zchunk header download state implementation. This downloads only the
+   * zck header to calculate which ranges/blocks are required for download.
+   */
+  struct DLZckHeadState : public BasicDownloaderStateBase {
+    static constexpr auto stateId = Download::DlZChunkHead;
+
+    DLZckHeadState( std::vector<Url> &&mirrors, DownloadPrivate &parent );
+    DLZckHeadState( std::vector<Url> &&mirrors, std::shared_ptr<Request> &&oldReq, DownloadPrivate &parent );
+
+    virtual bool initializeRequest( std::shared_ptr<Request> &r ) override;
+    virtual void gotFinished () override;
+
+    std::shared_ptr<DLZckState> transitionToDlZckState ();
+
+    SignalProxy< void () > sigFinished() {
+      return _sigFinished;
+    }
+    SignalProxy< void () > sigFailed() {
+      return _sigFailed;
+    }
+  };
+
+  /*!
+   * State implementation for the actual zck download. This downloads the
+   * zck file from different mirrors in ranges.
+   */
+  struct DLZckState : public RangeDownloaderBaseState {
+
+    static constexpr auto stateId = Download::DlZChunk;
+
+    DLZckState ( std::vector<Url> &&mirrors, DownloadPrivate &parent );
+
+    void enter ();
+    void exit ();
+
+    std::shared_ptr<FinishedState> transitionToFinished ();
+
+    SignalProxy< void () > sigFinished() {
+      return _sigFinished;
+    }
+
+    SignalProxy< void () > sigFallback() {
+      return _sigFailed;
+    }
+
+    void setFinished() override;
+
+  };
+
+#endif
+
+}
+
+#endif
diff --git a/zypp/zyppng/media/network/private/mediadebug_p.h b/zypp/zyppng/media/network/private/mediadebug_p.h
new file mode 100644 (file)
index 0000000..34c705e
--- /dev/null
@@ -0,0 +1,46 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIADEBUG_H_INCLUDED
+#define ZYPP_NG_MEDIADEBUG_H_INCLUDED
+
+#include <zypp/base/LogControl.h>
+namespace zypp {
+  L_ENV_CONSTR_FWD_DECLARE_FUNC(ZYPP_MEDIA_CURL_DEBUG);
+}
+
+#ifdef ZYPP_BASE_LOGGER_LOGGROUP
+#undef ZYPP_BASE_LOGGER_LOGGROUP
+#endif
+
+#define ZYPP_BASE_LOGGER_LOGGROUP "ZYPP_MEDIA_CURL"
+
+#define XXX_MEDIA L_XXX_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP )
+#define DBG_MEDIA L_DBG_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP )
+#define MIL_MEDIA L_MIL_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP )
+#define WAR_MEDIA L_WAR_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP )
+#define ERR_MEDIA L_ERR_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP )
+#define SEC_MEDIA L_SEC_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP )
+#define INT_MEDIA L_INT_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP )
+#define USR_MEDIA L_USR_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP )
+
+#define L_XXX_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_XXX )
+#define L_DBG_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP"++", zypp::base::logger::E_MIL )
+#define L_MIL_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_MIL )
+#define L_WAR_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_WAR )
+#define L_ERR_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_ERR )
+#define L_SEC_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_SEC )
+#define L_INT_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_INT )
+#define L_USR_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_USR )
+
+#endif // ZYPP_NG_MEDIADEBUG_H_INCLUDED
diff --git a/zypp/zyppng/media/network/private/mirrorcontrol_p.h b/zypp/zyppng/media/network/private/mirrorcontrol_p.h
new file mode 100644 (file)
index 0000000..c31b675
--- /dev/null
@@ -0,0 +1,132 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_HTTP_PRIVATE_MIRRORCONTROL_P_H
+#define ZYPP_NG_MEDIA_HTTP_PRIVATE_MIRRORCONTROL_P_H
+
+#include <zypp-core/zyppng/core/Url>
+#include <zypp-core/zyppng/base/Signals>
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/base/Timer>
+#include <zypp/zyppng/media/network/networkrequestdispatcher.h>
+#include <zypp/zyppng/media/network/request.h>
+#include <zypp/media/MetaLinkParser.h>
+#include <vector>
+#include <unordered_map>
+
+namespace zyppng {
+
+  class MirrorControl : public Base {
+
+  public:
+
+    struct Mirror {
+
+      Url mirrorUrl;
+      uint rating              = 100; // rating based on connection time higher is worse
+      uint penalty             = 0; //additional value that is added to the rating when sorting the mirrors, is increased and lowered for failed or successful transactions
+      uint maxRanges           = 0; //the maximum number of ranges that can be requested from this mirror
+      uint finishedTransfers   = 0; //how many transfers did we already send to the mirror
+      uint runningTransfers    = 0; //currently running transfers
+      uint failedTransfers     = 0; //how many transfers have failed in a row using this mirror
+      uint successfulTransfers = 0; //how many transfers were successful
+
+      void startTransfer();
+      void finishTransfer( const bool success );
+      void cancelTransfer();
+      uint maxConnections () const;
+      bool hasFreeConnections () const;
+
+    private:
+      Mirror( MirrorControl &parent );
+      void transferUnref ();
+
+    private:
+      friend class MirrorControl;
+      MirrorControl &_parent;
+      NetworkRequest::Ptr _request;
+      sigc::connection _finishedConn;
+
+      uint _maxConnections      = 0; //the maximum number of concurrent connections to this mirror, 0 means use system default
+    };
+
+    using Ptr = std::shared_ptr<MirrorControl>;
+    using MirrorHandle = std::shared_ptr<Mirror>;
+    using MirrorPick   = std::pair< std::vector<Url>::const_iterator, MirrorHandle >;
+
+    static Ptr create ();
+    virtual ~MirrorControl();
+    void registerMirrors( const std::vector<zypp::media::MetalinkMirror> &urls );
+
+    /*!
+     * Tries to pick the best mirror from the set of URLs passed.
+     * In case of a pending request, the result code will be set to "Again".
+     */
+    struct PickResult {
+      enum {
+        Ok,
+        Again,
+        Unknown
+      } code = Unknown;
+      MirrorPick result;
+    };
+    PickResult pickBestMirror( const std::vector<Url> &mirrors );
+
+    bool allMirrorsReady () const;
+
+    SignalProxy<void()> sigNewMirrorsReady();
+    SignalProxy<void()> sigAllMirrorsReady();
+  private:
+    MirrorControl();
+    std::string makeKey ( const zypp::Url &url ) const;
+    sigc::connection _queueEmptyConn;
+    NetworkRequestDispatcher::Ptr _dispatcher; //Mirror Control using its own NetworkRequestDispatcher, to avoid waiting for other downloads
+    std::unordered_map<std::string, MirrorHandle> _handles;
+
+    Timer::Ptr _newMirrSigDelay; // we use a delay timer to emit the "someMirrorsReady" signal
+
+    Signal<void()> _sigAllMirrorsReady;
+    Signal<void()> _sigNewMirrorsReady;
+  };
+
+#if 0
+
+  /*!
+   * Simple helper class to automatically cancel running transfers on destruction
+   */
+  class MirrorRef
+  {
+  public:
+    MirrorRef ( MirrorControl::MirrorHandle handle );
+    ~MirrorRef();
+
+    void startTransfer();
+    void finishTransfer( const bool success );
+    void cancelTransfer();
+    operator bool() const;
+
+    MirrorControl::MirrorHandle get();
+
+  private:
+    struct Helper {
+      ~Helper();
+      MirrorControl::MirrorHandle _myHandle;
+      bool _cancelOnDestruct = false;
+    };
+    std::shared_ptr<Helper> _data;
+  };
+#endif
+
+}
+
+#endif // ZYPP_NG_MEDIA_HTTP_PRIVATE_MIRRORCONTROL_P_H
index 1b0129c..93134bb 100644 (file)
@@ -1,8 +1,21 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
 #ifndef ZYPP_NG_MEDIA_CURL_PRIVATE_CURL_P_H_INCLUDED
 #define ZYPP_NG_MEDIA_CURL_PRIVATE_CURL_P_H_INCLUDED
 
 #include <zypp/zyppng/media/network/networkrequestdispatcher.h>
-#include <zypp/zyppng/base/private/base_p.h>
+#include <zypp-core/zyppng/base/private/base_p.h>
 #include <curl/curl.h>
 #include <deque>
 #include <set>
@@ -16,10 +29,10 @@ class NetworkRequestDispatcherPrivate : public BasePrivate
 {
   ZYPP_DECLARE_PUBLIC(NetworkRequestDispatcher)
 public:
-  NetworkRequestDispatcherPrivate ( );
+  NetworkRequestDispatcherPrivate ( NetworkRequestDispatcher &p );
   virtual ~NetworkRequestDispatcherPrivate();
 
-  size_t _maxConnections = 10;
+  int _maxConnections = 10;
 
   std::deque< std::shared_ptr<NetworkRequest> > _pendingDownloads;
   std::vector< std::shared_ptr<NetworkRequest> > _runningDownloads;
@@ -34,10 +47,10 @@ public:
   NetworkRequestError _lastError;
 
   //signals
-  signal<void ( NetworkRequestDispatcher &, NetworkRequest & )> _sigDownloadStarted;
-  signal<void ( NetworkRequestDispatcher &, NetworkRequest & )> _sigDownloadFinished;
-  signal<void ( NetworkRequestDispatcher & )> _sigQueueFinished;
-  signal<void ( NetworkRequestDispatcher & )> _sigError;
+  Signal< void ( NetworkRequestDispatcher &, NetworkRequest & )> _sigDownloadStarted;
+  Signal< void ( NetworkRequestDispatcher &, NetworkRequest & )> _sigDownloadFinished;
+  Signal< void ( NetworkRequestDispatcher & )> _sigQueueFinished;
+  Signal< void ( NetworkRequestDispatcher & )> _sigError;
 
 private:
   static int multi_timer_cb ( CURLM *multi, long timeout_ms, void *g );
index db5c698..693e305 100644 (file)
@@ -1,3 +1,19 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPP_NG_MEDIA_CURL_PRIVATE_NETWORKREQUESTERROR_P_H_INCLUDED
+#define ZYPP_NG_MEDIA_CURL_PRIVATE_NETWORKREQUESTERROR_P_H_INCLUDED
+
 #include <zypp/zyppng/media/network/networkrequesterror.h>
 #include <map>
 
@@ -15,9 +31,11 @@ public:
   std::map<std::string, boost::any> _extraInfo;
 
   static zyppng::NetworkRequestError customError( NetworkRequestError::Type t, std::string &&errorMsg = "", std::map<std::string, boost::any> &&extraInfo = {} );
-  static zyppng::NetworkRequestError fromCurlError( NetworkRequest &req, int nativeCode , const char *errBuf );
+  static zyppng::NetworkRequestError fromCurlError( NetworkRequest &req, int nativeCode , const std::string &nativeError );
   static zyppng::NetworkRequestError fromCurlMError ( int nativeCode );
   static std::string typeToString( NetworkRequestError::Type t );
 };
 
 }
+
+#endif
index 526caf0..dc50431 100644 (file)
@@ -1,30 +1,66 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
 #ifndef ZYPP_NG_MEDIA_CURL_PRIVATE_REQUEST_P_H_INCLUDED
 #define ZYPP_NG_MEDIA_CURL_PRIVATE_REQUEST_P_H_INCLUDED
 
-#include <zypp/zyppng/base/private/base_p.h>
+#include <zypp-core/zyppng/base/private/base_p.h>
 #include <zypp/zyppng/media/network/request.h>
 #include <zypp/media/MediaException.h>
-#include <zypp/zyppng/base/Timer>
+#include <zypp-core/zyppng/base/Timer>
+#include <zypp/base/Regex.h>
 #include <curl/curl.h>
 #include <array>
 #include <memory>
 #include <zypp/Digest.h>
+#include <zypp/AutoDispose.h>
+
+#include <boost/optional.hpp>
+#include <variant>
+#include <boost/utility/string_view.hpp>
 
 namespace zyppng {
 
+
+
   class NetworkRequestPrivate : public BasePrivate
   {
-  public:
     ZYPP_DECLARE_PUBLIC(NetworkRequest)
+  public:
+    enum class ProtocolMode{
+      Default, //< use this mode if no special checks are required in header or write callbacks
+      HTTP    //< this mode is used for HTTP and HTTPS downloads
+    } _protocolMode = ProtocolMode::Default;
 
-    NetworkRequestPrivate( Url &&url, zypp::Pathname &&targetFile, off_t &&start, off_t &&len, NetworkRequest::FileMode fMode );
+    NetworkRequestPrivate(Url &&url, zypp::Pathname &&targetFile, NetworkRequest::FileMode fMode, NetworkRequest &p );
     virtual ~NetworkRequestPrivate();
 
     bool initialize(std::string &errBuf );
     void aboutToStart ();
     void setResult ( NetworkRequestError &&err );
     void reset ();
+    void resetActivityTimer ();
     void onActivityTimeout (Timer &);
+    bool checkIfRangeChkSumIsValid(const NetworkRequest::Range &rng);
+    void validateRange ( NetworkRequest::Range &rng );
+    bool parseContentRangeHeader (const boost::string_view &line, size_t &start , size_t &len);
+    bool parseContentTypeMultiRangeHeader ( const boost::string_view &line, std::string &boundary );
+
+    std::string errorMessage () const;
+
+
+    std::array<char, CURL_ERROR_SIZE+1> _errorBuf; //provide a buffer for a nicely formatted error for CURL
+    std::optional<std::string> _originalError; // if this is initialized we manually set a error that caused the error stored in _errorBuf
 
     template<typename T>
     void setCurlOption ( CURLoption opt, T data )
@@ -35,45 +71,73 @@ namespace zyppng {
       }
     }
 
-    Url   _url;        //file URL
-    zypp::Pathname _targetFile; //target file
-    TransferSettings _settings;
-    NetworkRequest::Options _options;
+    Url                                 _url;        //file URL
+    zypp::Pathname                      _targetFile; //target file
+    TransferSettings                    _settings;
+    NetworkRequest::Options             _options;
+    zypp::ByteCount                     _expectedFileSize; // the file size as expected by the user code
+    std::vector<NetworkRequest::Range>  _requestedRanges; ///< the requested ranges that need to be downloaded
+
+    NetworkRequest::FileMode            _fMode = NetworkRequest::WriteExclusive;
+    NetworkRequest::Priority            _priority = NetworkRequest::Normal;
 
     long _curlDebug = 0L;
     std::string _lastRedirect; ///< to log/report redirections
-    std::string _currentCookieFile = "/var/lib/YaST2/cookies";
-
-    off_t _start = -1;  //start offset of block to request
-    off_t _len   = 0;  //len of block to request ( 0 if full length
-    off_t _downloaded = -1; //downloaded bytes
-    off_t _reportedSize = 0; //size reported by the curl backend
-    bool  _expectRangeStatus = false;
-    NetworkRequest::FileMode _fMode = NetworkRequest::WriteExclusive;
-    NetworkRequest::Priority _priority = NetworkRequest::Normal;
-
-    std::shared_ptr<zypp::Digest> _digest; //digest to be used to calculate checksum
-    std::vector<unsigned char> _expectedChecksum; //checksum to be expected after download is finished
-
-    NetworkRequest::State _state = NetworkRequest::Pending;
-    NetworkRequestError _result;
-    std::array<char, CURL_ERROR_SIZE+1> _errorBuf; //provide a buffer for a nicely formatted error
+    const std::string _currentCookieFile = "/var/lib/YaST2/cookies";
 
-    FILE *_outFile = nullptr;
     void *_easyHandle = nullptr; // the easy handle that controlling this request
     NetworkRequestDispatcher *_dispatcher = nullptr; // the parent downloader owning this request
 
-    Timer::Ptr _activityTimer;
-
     //signals
-    signal<void ( NetworkRequest &req )> _sigStarted;
-    signal<void ( NetworkRequest &req, off_t dltotal, off_t dlnow, off_t ultotal, off_t ulnow )> _sigProgress;
-    signal<void ( NetworkRequest &req, const NetworkRequestError &err )> _sigFinished;
+    Signal< void ( NetworkRequest &req )> _sigStarted;
+    Signal< void ( NetworkRequest &req, zypp::ByteCount count )> _sigBytesDownloaded;
+    Signal< void ( NetworkRequest &req, off_t dltotal, off_t dlnow, off_t ultotal, off_t ulnow )> _sigProgress;
+    Signal< void ( NetworkRequest &req, const NetworkRequestError &err )> _sigFinished;
 
     static int curlProgressCallback ( void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow );
-    static size_t writeCallback ( char *ptr, size_t size, size_t nmemb, void *userdata );
+    size_t headerCallback (  char *ptr, size_t size, size_t nmemb  );
+    size_t writeCallback ( char *ptr, size_t size, size_t nmemb );
 
     std::unique_ptr< curl_slist, decltype (&curl_slist_free_all) > _headers;
+
+    struct pending_t {
+      pending_t(){}
+      bool _requireStatusPartial  = false;
+    };
+
+    struct running_t  {
+      running_t( pending_t &&prevState );
+
+      Timer::Ptr _activityTimer = Timer::create();
+
+      zypp::AutoFILE _outFile;
+      off_t  _currentRange = -1;
+      std::optional<NetworkRequest::Range> _currentSrvRange;
+
+      bool _allHeadersReceived    = false;
+      bool _gotContentRangeHeader = false;
+      bool _gotMultiRangeHeader   = false;
+      bool _requireStatusPartial  = false;
+
+      // handle the case when cancel() is called from a slot to the progress signal
+      bool _isInCallback          = false;
+      std::optional<NetworkRequestError> _cachedResult;
+
+      off_t _downloaded = 0; //downloaded bytes
+      zypp::ByteCount _contentLenght; // the content length as reported by the server
+
+      //multirange support for HTTP requests (https://tools.ietf.org/html/rfc7233)
+      std::string _seperatorString; ///< The seperator string for multipart responses as defined in RFC 7233 Section 4.1
+      std::vector<char> _rangePrefaceBuffer; ///< Here we buffer
+    };
+
+    struct finished_t {
+      off_t               _downloaded = 0; //downloaded bytes
+      zypp::ByteCount     _contentLenght = 0; // the content length as reported by the server
+      NetworkRequestError _result; // the overall result of the download
+    };
+
+    std::variant< pending_t, running_t, finished_t > _runningMode = pending_t();
   };
 
   std::vector<char> peek_data_fd ( FILE *fd, off_t offset, size_t count );
index 3930785..d67a318 100644 (file)
@@ -1,20 +1,57 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------*/
 #include <zypp/zyppng/media/network/private/request_p.h>
 #include <zypp/zyppng/media/network/private/networkrequesterror_p.h>
 #include <zypp/zyppng/media/network/networkrequestdispatcher.h>
+#include <zypp/zyppng/media/network/private/mediadebug_p.h>
+#include <zypp-core/zyppng/base/EventDispatcher>
+#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
+#include <zypp-core/zyppng/core/String>
 #include <zypp/media/CurlHelper.h>
 #include <zypp/media/CurlConfig.h>
 #include <zypp/media/MediaUserAuth.h>
 #include <zypp/ZConfig.h>
-#include <zypp/base/Logger.h>
 #include <zypp/base/String.h>
 #include <zypp/Pathname.h>
+#include <curl/curl.h>
 #include <stdio.h>
 #include <fcntl.h>
 #include <sstream>
+#include <utility>
+
+#include <iostream>
+#include <boost/variant.hpp>
+#include <boost/variant/polymorphic_get.hpp>
 
 
 namespace zyppng {
 
+  namespace  {
+    static size_t nwr_headerCallback (  char *ptr, size_t size, size_t nmemb, void *userdata  ) {
+      if ( !userdata )
+        return 0;
+
+      NetworkRequestPrivate *that = reinterpret_cast<NetworkRequestPrivate *>( userdata );
+      return that->headerCallback( ptr, size, nmemb );
+    }
+    static size_t nwr_writeCallback ( char *ptr, size_t size, size_t nmemb, void *userdata ) {
+      if ( !userdata )
+        return 0;
+
+      NetworkRequestPrivate *that = reinterpret_cast<NetworkRequestPrivate *>( userdata );
+      return that->writeCallback( ptr, size, nmemb );
+    }
+
+    //helper for std::visit
+    template<class T> struct always_false : std::false_type {};
+  }
+
   std::vector<char> peek_data_fd( FILE *fd, off_t offset, size_t count )
   {
     if ( !fd )
@@ -33,17 +70,32 @@ namespace zyppng {
     return data;
   }
 
-  NetworkRequestPrivate::NetworkRequestPrivate(Url &&url, zypp::Pathname &&targetFile, off_t &&start, off_t &&len, NetworkRequest::FileMode fMode )
-    : _url ( std::move(url) )
+  NetworkRequest::Range NetworkRequest::Range::make(size_t start, size_t len, zyppng::NetworkRequest::DigestPtr &&digest, zyppng::NetworkRequest::CheckSumBytes &&expectedChkSum, std::any &&userData, std::optional<size_t> digestCompareLen )
+  {
+    return NetworkRequest::Range {
+      start,
+      len,
+      0,
+      std::move( digest ),
+      std::move( expectedChkSum ),
+      std::move( digestCompareLen ),
+      false,
+      std::move( userData )
+    };
+  }
+
+  NetworkRequestPrivate::running_t::running_t( pending_t &&prevState )
+    : _requireStatusPartial( prevState._requireStatusPartial )
+  {
+  }
+
+  NetworkRequestPrivate::NetworkRequestPrivate(Url &&url, zypp::Pathname &&targetFile, NetworkRequest::FileMode fMode , NetworkRequest &p)
+    : BasePrivate(p)
+    , _url ( std::move(url) )
     , _targetFile ( std::move( targetFile) )
-    , _start ( std::move(start) )
-    , _len ( std::move(len) )
     , _fMode ( std::move(fMode) )
-    , _activityTimer ( Timer::create() )
     , _headers( std::unique_ptr< curl_slist, decltype (&curl_slist_free_all) >( nullptr, &curl_slist_free_all ) )
-  {
-    _activityTimer->sigExpired().connect( sigc::mem_fun( this, &NetworkRequestPrivate::onActivityTimeout ));
-  }
+  { }
 
   NetworkRequestPrivate::~NetworkRequestPrivate()
   {
@@ -65,9 +117,14 @@ namespace zyppng {
     else
       _easyHandle = curl_easy_init();
 
+    _originalError.reset();
     _errorBuf.fill( '\0' );
     curl_easy_setopt( _easyHandle, CURLOPT_ERRORBUFFER, this->_errorBuf.data() );
 
+    const std::string urlScheme = _url.getScheme();
+    if ( urlScheme == "http" ||  urlScheme == "https" )
+      _protocolMode = ProtocolMode::HTTP;
+
     try {
 
       setCurlOption( CURLOPT_PRIVATE, this );
@@ -80,33 +137,101 @@ namespace zyppng {
       std::string urlBuffer( _url.asString() );
       setCurlOption( CURLOPT_URL, urlBuffer.c_str() );
 
-      setCurlOption( CURLOPT_WRITEFUNCTION, NetworkRequestPrivate::writeCallback );
+      setCurlOption( CURLOPT_WRITEFUNCTION, nwr_writeCallback );
       setCurlOption( CURLOPT_WRITEDATA, this );
 
+      if ( _options & NetworkRequest::ConnectionTest ) {
+        setCurlOption( CURLOPT_CONNECT_ONLY, 1L );
+        setCurlOption( CURLOPT_FRESH_CONNECT, 1L );
+      }
       if ( _options & NetworkRequest::HeadRequest ) {
         // instead of returning no data with NOBODY, we return
         // little data, that works with broken servers, and
         // works for ftp as well, because retrieving only headers
         // ftp will return always OK code ?
         // See http://curl.haxx.se/docs/knownbugs.html #58
-        if (  (_url.getScheme() == "http" ||  _url.getScheme() == "https") && _settings.headRequestsAllowed() )
+        if (  _protocolMode == ProtocolMode::HTTP && _settings.headRequestsAllowed() )
           setCurlOption( CURLOPT_NOBODY, 1L );
         else
           setCurlOption( CURLOPT_RANGE, "0-1" );
-      } else {
+      }
+
+      if( !( _options & NetworkRequest::ConnectionTest ) && !( _options & NetworkRequest::HeadRequest ) ){
         std::string rangeDesc;
-        if ( _start >= 0) {
-          _expectRangeStatus = true;
-          rangeDesc = zypp::str::form("%llu-", static_cast<unsigned long long>( _start ));
-          if( _len > 0 ) {
-            rangeDesc.append( zypp::str::form( "%llu", static_cast<unsigned long long>(_start + _len - 1) ) );
-          }
-          if ( setCurlOption( CURLOPT_RANGE, rangeDesc.c_str() ), CURLE_OK ) {
-            strncpy( _errorBuf.data(), "curl_easy_setopt range failed", CURL_ERROR_SIZE);
+
+        if ( _requestedRanges.size() ) {
+
+          if ( _requestedRanges.size() > 1 && _protocolMode != ProtocolMode::HTTP ) {
+            errBuf = "Using more than one range is not supported with protocols other than HTTP/HTTPS";
             return false;
           }
+
+          // check if we have one big range convering the whole file
+          if ( _requestedRanges.size() == 1 && _requestedRanges.front().start == 0 && _requestedRanges.front().len == 0 ) {
+            std::get<pending_t>( _runningMode )._requireStatusPartial = false;
+
+          } else {
+            std::sort( _requestedRanges.begin(), _requestedRanges.end(), []( const auto &elem1, const auto &elem2 ){
+              return ( elem1.start < elem2.start );
+            });
+
+            std::get<pending_t>( _runningMode )._requireStatusPartial = true;
+
+            // helper function to build up the request string for the range
+            auto addRangeString = [ &rangeDesc ]( const std::pair<size_t, size_t> &range ) {
+              std::string rangeD = zypp::str::form("%llu-", static_cast<unsigned long long>( range.first ) );
+              if( range.second > 0 )
+                rangeD.append( zypp::str::form( "%llu", static_cast<unsigned long long>( range.second ) ) );
+
+              if ( rangeDesc.size() )
+                rangeDesc.append(",").append( rangeD );
+              else
+                rangeDesc = std::move( rangeD );
+            };
+
+            std::optional<std::pair<size_t, size_t>> currentZippedRange;
+            bool closedRange = true;
+            for ( auto &range : _requestedRanges ) {
+
+              //reset the download results
+              range._valid = false;
+              range.bytesWritten = 0;
+
+              //when we have a open range in the list of ranges we will get from start of range to end of file,
+              //all following ranges would never be marked as valid, so we have to fail early
+              if ( !closedRange ) {
+                errBuf = "It is not supported to request more ranges after a open range.";
+                return false;
+              }
+
+              const auto rangeEnd = range.len > 0 ? range.start + range.len - 1 : 0;
+              closedRange = (rangeEnd > 0);
+
+              // we try to compress the requested ranges into as big chunks as possible for the request,
+              // when receiving we still track the original ranges so we can collect and test their checksums
+              if ( !currentZippedRange ) {
+                currentZippedRange = std::make_pair( range.start, rangeEnd );
+              } else {
+                //range is directly consecutive to the previous range
+                if ( currentZippedRange->second + 1 == range.start ) {
+                  currentZippedRange->second = rangeEnd;
+                } else {
+                  //this range does not directly follow the previous one, we build the string and start a new one
+                  addRangeString( *currentZippedRange );
+                  currentZippedRange = std::make_pair( range.start, rangeEnd );
+                }
+              }
+            }
+
+            // add the last range too
+            if ( currentZippedRange )
+              addRangeString( *currentZippedRange );
+
+            setCurlOption( CURLOPT_RANGE, rangeDesc.c_str() );
+          }
         } else {
-          _expectRangeStatus = false;
+          std::get<pending_t>( _runningMode )._requireStatusPartial = false;
+          _requestedRanges.push_back( NetworkRequest::Range() );
         }
 
       }
@@ -117,8 +242,8 @@ namespace zyppng {
       // add custom headers for download.opensuse.org (bsc#955801)
       if ( _url.getHost() == "download.opensuse.org" )
       {
-        locSet.addHeader( internal::anonymousIdHeader() );
-        locSet.addHeader( internal::distributionFlavorHeader() );
+        locSet.addHeader( ::internal::anonymousIdHeader() );
+        locSet.addHeader( ::internal::distributionFlavorHeader() );
       }
 
       locSet.addHeader("Pragma:");
@@ -126,7 +251,7 @@ namespace zyppng {
       locSet.setTimeout( zypp::ZConfig::instance().download_transfer_timeout() );
       locSet.setConnectTimeout( CONNECT_TIMEOUT );
 
-      locSet.setUserAgentString( internal::agentString() );
+      locSet.setUserAgentString( ::internal::agentString() );
 
       {
         char *ptr = getenv("ZYPP_MEDIA_CURL_DEBUG");
@@ -134,21 +259,21 @@ namespace zyppng {
         if( _curlDebug > 0)
         {
           setCurlOption( CURLOPT_VERBOSE, 1L);
-          setCurlOption( CURLOPT_DEBUGFUNCTION, internal::log_curl);
+          setCurlOption( CURLOPT_DEBUGFUNCTION, ::internal::log_curl);
           setCurlOption( CURLOPT_DEBUGDATA, &_curlDebug);
         }
       }
 
       /** Force IPv4/v6 */
-      switch ( internal::env::ZYPP_MEDIA_CURL_IPRESOLVE() )
+      switch ( zypp::env::ZYPP_MEDIA_CURL_IPRESOLVE() )
       {
         case 4: setCurlOption( CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); break;
         case 6: setCurlOption( CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6 ); break;
         default: break;
       }
 
-      setCurlOption( CURLOPT_HEADERFUNCTION, internal::log_redirects_curl );
-      setCurlOption( CURLOPT_HEADERDATA, &_lastRedirect );
+      setCurlOption( CURLOPT_HEADERFUNCTION, &nwr_headerCallback );
+      setCurlOption( CURLOPT_HEADERDATA, this );
 
       /**
         * Connect timeout
@@ -162,7 +287,7 @@ namespace zyppng {
         setCurlOption( CURLOPT_TIMEOUT, 3600L );
       }
 
-      if ( _url.getScheme() == "https" )
+      if ( urlScheme == "https" )
       {
 #if CURLVERSION_AT_LEAST(7,19,4)
         // restrict following of redirections from https to https only
@@ -172,10 +297,6 @@ namespace zyppng {
          setCurlOption( CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS );
 #endif
 
-#if CURLVERSION_AT_LEAST(7,60,0)       // SLE15+
-        setCurlOption( CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS );
-#endif
-
         if( locSet.verifyPeerEnabled() ||
              locSet.verifyHostEnabled() )
         {
@@ -265,7 +386,7 @@ namespace zyppng {
 
         if ( ! proxyuserpwd.empty() )
         {
-          setCurlOption(CURLOPT_PROXYUSERPWD, internal::curlUnEscape( proxyuserpwd ).c_str());
+          setCurlOption(CURLOPT_PROXYUSERPWD, ::internal::curlUnEscape( proxyuserpwd ).c_str());
         }
       }
 #if CURLVERSION_AT_LEAST(7,19,4)
@@ -281,7 +402,7 @@ namespace zyppng {
       else
       {
         DBG << "Proxy: not explicitly set" << std::endl;
-        DBG << "Proxy: libcurl may look into the environment" << std::endl;
+        DBG_MEDIA << "Proxy: libcurl may look into the environment" << std::endl;
       }
 
       /** Speed limits */
@@ -309,10 +430,8 @@ namespace zyppng {
 #endif
 
       // append settings custom headers to curl
-      for ( TransferSettings::Headers::const_iterator it = locSet.headersBegin();
-            it != locSet.headersEnd();
-            ++it ) {
-        if ( !z_func()->addRequestHeader( it->c_str() ) )
+      for ( const auto &header : locSet.headers() ) {
+        if ( !z_func()->addRequestHeader( header.c_str() ) )
           ZYPP_THROW(zypp::media::MediaCurlInitException(_url));
       }
 
@@ -330,63 +449,68 @@ namespace zyppng {
 
   void NetworkRequestPrivate::aboutToStart()
   {
-    if ( _activityTimer )
-      _activityTimer->start( static_cast<uint64_t>( _settings.timeout() ) * 1000 );
+    _runningMode = running_t( std::move(std::get<pending_t>( _runningMode )) );
+
+    auto &m = std::get<running_t>( _runningMode );
+
+    if ( m._activityTimer ) {
+      m._activityTimer->connect( &Timer::sigExpired, *this, &NetworkRequestPrivate::onActivityTimeout );
+      m._activityTimer->start( static_cast<uint64_t>( _settings.timeout() * 1000 ) );
+    }
 
-    _state = NetworkRequest::Running;
     _sigStarted.emit( *z_func() );
   }
 
   void NetworkRequestPrivate::setResult( NetworkRequestError &&err )
   {
-    if ( _outFile )
-      fclose( _outFile );
-    _outFile = nullptr;
 
-    _result = std::move(err);
+    finished_t resState;
+    resState._result = std::move(err);
 
-    if ( _activityTimer )
-      _activityTimer->stop();
+    if ( std::holds_alternative<running_t>(_runningMode) ) {
 
-    if ( _result.type() == NetworkRequestError::NoError ) {
-      //we have a successful download, lets see if the checksum is fine IF we have one
-      _state = NetworkRequest::Finished;
-      if ( _expectedChecksum.size() && _digest ) {
-        if ( _digest->digestVector() != _expectedChecksum ) {
-          _state = NetworkRequest::Error;
+      auto &rmode = std::get<running_t>( _runningMode );
+      rmode._outFile.reset();
+      resState._downloaded = rmode._downloaded;
+      resState._contentLenght = rmode._contentLenght;
 
-          auto hexToStr = []( const std::vector<u_char> &hex ) {
-            std::string res;
-            for (std::vector<u_char>::size_type j = 0; j < hex.size(); j++)
-              res += zypp::str::form("%02hhx", hex[j]);
-            return res;
-          };
+      if ( resState._result.type() == NetworkRequestError::NoError && !(_options & NetworkRequest::HeadRequest) && !(_options & NetworkRequest::ConnectionTest) ) {
+
+        // check if the current range is a open range, if it is set it valid by checking the checksum
+        if ( rmode._currentRange >= 0 ) {
+          auto &currR = _requestedRanges[rmode._currentRange];
+          rmode._currentRange = -1;
+          validateRange( currR );
+        }
 
-          _result = NetworkRequestErrorPrivate::customError( NetworkRequestError::InvalidChecksum, (zypp::str::Format("Invalid checksum %1%, expected checksum %2%") % _digest->digest() % hexToStr( _expectedChecksum ) ) );
+        //we have a successful download lets see if we got everything we needed
+        for ( const auto &r : _requestedRanges ) {
+          if ( !r._valid ) {
+            if ( r.len > 0 && r.bytesWritten != r.len )
+              resState._result = NetworkRequestErrorPrivate::customError( NetworkRequestError::MissingData, (zypp::str::Format("Did not receive all requested data from the server.") ) );
+            else if ( r._digest && r._checksum.size() && ! checkIfRangeChkSumIsValid(r) )  {
+              resState._result = NetworkRequestErrorPrivate::customError( NetworkRequestError::InvalidChecksum, (zypp::str::Format("Invalid checksum %1%, expected checksum %2%") % r._digest->digest() % zypp::Digest::digestVectorToString( r._checksum ) ) );
+            } else {
+              resState._result = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, (zypp::str::Format("Download of block failed.") ) );
+            }
+            //we only report the first error
+            break;
+          }
         }
       }
-    } else
-      _state = NetworkRequest::Error;
+    }
 
-    _sigFinished.emit( *z_func(), _result );
+    _runningMode = std::move( resState );
+    _sigFinished.emit( *z_func(), std::get<finished_t>(_runningMode)._result );
   }
 
   void NetworkRequestPrivate::reset()
   {
-    if ( _outFile )
-      fclose( _outFile );
-
-    if ( _digest )
-      _digest->reset();
-
-    _outFile = nullptr;
-    _easyHandle = nullptr;
-    _result = NetworkRequestError();
-    _state = NetworkRequest::Pending;
-    _downloaded = -1;
-    _reportedSize = 0;
-    _errorBuf.fill( 0 );
+    _protocolMode = ProtocolMode::Default;
     _headers.reset( nullptr );
+    _originalError.reset();
+    _errorBuf.fill( 0 );
+    _runningMode = pending_t();
   }
 
   void NetworkRequestPrivate::onActivityTimeout( Timer & )
@@ -397,97 +521,409 @@ namespace zyppng {
     _dispatcher->cancel( *z_func(), NetworkRequestErrorPrivate::customError( NetworkRequestError::Timeout, "Download timed out", std::move(extraInfo) ) );
   }
 
+  bool NetworkRequestPrivate::checkIfRangeChkSumIsValid ( const NetworkRequest::Range &rng )
+  {
+    if ( rng._digest && rng._checksum.size() ) {
+      auto digVec = rng._digest->digestVector();
+      if ( rng._relevantDigestLen ) {
+        digVec.resize( *rng._relevantDigestLen );
+      }
+      return ( digVec == rng._checksum );
+    }
+    return false;
+  }
+
+  void NetworkRequestPrivate::validateRange( NetworkRequest::Range &rng )
+  {
+    if ( rng._digest && rng._checksum.size() ) {
+      rng._valid = checkIfRangeChkSumIsValid(rng);
+    } else {
+      rng._valid = rng.len == 0 ? true : rng.bytesWritten == rng.len;
+    }
+  }
+
+  bool NetworkRequestPrivate::parseContentRangeHeader(const boost::string_view &line, size_t &start, size_t &len )
+  {
+    static const zypp::str::regex regex("^Content-Range:[[:space:]]+bytes[[:space:]]+([0-9]+)-([0-9]+)\\/([0-9]+)$");
+
+    zypp::str::smatch what;
+    if( !zypp::str::regex_match( line.to_string(), what, regex ) || what.size() != 4 ) {
+      DBG << "Invalid Content-Range Header format: '" << line.to_string() << std::endl;
+      _originalError = "Invalid Content-Range header format.";
+      return false;
+    }
+
+    size_t s = zypp::str::strtonum<size_t>( what[1]);
+    size_t e = zypp::str::strtonum<size_t>( what[2]);
+    start = std::move(s);
+    len   = ( e - s ) + 1;
+    return true;
+  }
+
+  bool NetworkRequestPrivate::parseContentTypeMultiRangeHeader(const boost::string_view &line, std::string &boundary)
+  {
+    static const zypp::str::regex regex("^Content-Type:[[:space:]]+multipart\\/byteranges;[[:space:]]+boundary=(.*)$");
+
+    zypp::str::smatch what;
+    if( zypp::str::regex_match( line.to_string(), what, regex )  ) {
+      if ( what.size() >= 2 ) {
+        boundary = what[1];
+        return true;
+      }
+    }
+    return false;
+  }
+
+  std::string NetworkRequestPrivate::errorMessage() const
+  {
+    if ( _originalError )
+      return *_originalError;
+
+    return std::string( _errorBuf.data() );
+  }
+
+  void NetworkRequestPrivate::resetActivityTimer()
+  {
+    if ( std::holds_alternative<running_t>( _runningMode ) ){
+      auto &rmode = std::get<running_t>( _runningMode );
+      if ( rmode._activityTimer && rmode._activityTimer->isRunning() )
+        rmode._activityTimer->start();
+    }
+  }
+
   int NetworkRequestPrivate::curlProgressCallback( void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow )
   {
     if ( !clientp )
-      return 0;
+      return CURLE_OK;
     NetworkRequestPrivate *that = reinterpret_cast<NetworkRequestPrivate *>( clientp );
 
+    if ( !std::holds_alternative<running_t>(that->_runningMode) ){
+      DBG_MEDIA << "Curl progress callback was called in invalid state "<< that->z_func()->state() << std::endl;
+      return -1;
+    }
+
+    auto &rmode = std::get<running_t>( that->_runningMode );
+
     //reset the timer
-    if ( that->_activityTimer && that->_activityTimer->isRunning() )
-      that->_activityTimer->start();
+    that->resetActivityTimer();
 
-    //keep signals to a minimum
-    if ( that->_downloaded == dlnow )
-      return 0;
+    rmode._isInCallback = true;
+    that->_sigProgress.emit( *that->z_func(), dltotal, dlnow, ultotal, ulnow );
+    rmode._isInCallback = false;
 
-    that->_downloaded   = dlnow;
-    that->_reportedSize = dltotal;
+    return rmode._cachedResult ? CURLE_ABORTED_BY_CALLBACK : CURLE_OK;
+  }
 
-    if ( that->_len > 0 && that->_len < dlnow ) {
-      that->_dispatcher->cancel( *that->z_func(), NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) );
+  size_t NetworkRequestPrivate::headerCallback(char *ptr, size_t size, size_t nmemb)
+  {
+    //it is valid to call this function with no data to write, just return OK
+    if ( size * nmemb == 0)
       return 0;
+
+    resetActivityTimer();
+
+    if ( _protocolMode == ProtocolMode::HTTP ) {
+
+      boost::string_view hdr( ptr, size*nmemb );
+
+      hdr.remove_prefix( std::min( hdr.find_first_not_of(" \t\r\n"), hdr.size() ) );
+      const auto lastNonWhitespace = hdr.find_last_not_of(" \t\r\n");
+      if ( lastNonWhitespace != hdr.npos )
+        hdr.remove_suffix( hdr.size() - (lastNonWhitespace + 1) );
+      else
+        hdr.clear();
+
+      DBG_MEDIA << "Received header: " << hdr << std::endl;
+
+      auto &rmode = std::get<running_t>( _runningMode );
+      if ( hdr.starts_with("HTTP/") ) {
+
+        long statuscode = 0;
+        (void)curl_easy_getinfo( _easyHandle, CURLINFO_RESPONSE_CODE, &statuscode);
+
+        // ignore other status codes, maybe we are redirected etc.
+        if ( statuscode >= 200 && statuscode <= 299 ) {
+          if ( rmode._requireStatusPartial && statuscode != 206 ) {
+            _originalError = "Expected range status code 206, but got none.";
+            return 0;
+          }
+        }
+      } else if ( hdr.starts_with( "Location:" ) ) {
+        _lastRedirect = hdr.substr( 9 ).to_string();
+        DBG << "redirecting to " << _lastRedirect << std::endl;
+
+      } else if ( hdr.starts_with("Content-Type:") ) {
+        std::string sep;
+        if ( parseContentTypeMultiRangeHeader( hdr, sep ) ) {
+          rmode._gotMultiRangeHeader = true;
+          rmode._seperatorString = "--"+sep;
+        }
+      } else if ( hdr.starts_with("Content-Range:") ) {
+        NetworkRequest::Range r;
+        if ( !parseContentRangeHeader( hdr, r.start, r.len) )
+          return 0;
+        DBG_MEDIA << "Got content range :" << r.start << " len " << r.len << std::endl;
+        rmode._gotContentRangeHeader = true;
+        rmode._currentSrvRange = r;
+
+      } else if ( hdr.starts_with("Content-Length:") )  {
+        auto lenStr = str::trim( hdr.substr( 15 ), zypp::str::TRIM );
+        auto str = std::string ( lenStr.data(), lenStr.length() );
+        auto len = zypp::str::strtonum<typename zypp::ByteCount::SizeType>( str.data() );
+        if ( len > 0 ) {
+          DBG_MEDIA << "Got Content-Length Header: " << len << std::endl;
+          rmode._contentLenght = zypp::ByteCount(len, zypp::ByteCount::B);
+        }
+      }
     }
 
-    that->_sigProgress.emit( *that->z_func(), dltotal, dlnow, ultotal, ulnow );
-    return 0;
+    return ( size * nmemb );
   }
 
-  size_t NetworkRequestPrivate::writeCallback( char *ptr, size_t size, size_t nmemb, void *userdata )
+  size_t NetworkRequestPrivate::writeCallback(char *ptr, size_t size, size_t nmemb)
   {
-    if ( !userdata )
-      return 0;
+    const auto max = ( size * nmemb );
+
+    resetActivityTimer();
 
     //it is valid to call this function with no data to write, just return OK
-    if ( size * nmemb == 0)
+    if ( max == 0)
       return 0;
 
-    NetworkRequestPrivate *that = reinterpret_cast<NetworkRequestPrivate *>( userdata );
-
     //in case of a HEAD request, we do not write anything
-    if ( that->_options & NetworkRequest::HeadRequest ) {
+    if ( _options & NetworkRequest::HeadRequest ) {
       return ( size * nmemb );
     }
 
-    //If we expect a file range we better double check that we got the status code for it
-    if ( that->_expectRangeStatus ) {
-      char *effurl;
-      (void)curl_easy_getinfo( that->_easyHandle, CURLINFO_EFFECTIVE_URL, &effurl);
-      if (effurl && !strncasecmp(effurl, "http", 4))
-      {
-        long statuscode = 0;
-        (void)curl_easy_getinfo( that->_easyHandle, CURLINFO_RESPONSE_CODE, &statuscode);
-        if (statuscode != 206) {
-          strncpy( that->_errorBuf.data(), "Expected range status code 206, but got none.", CURL_ERROR_SIZE);
+    auto &rmode = std::get<running_t>( _runningMode );
+
+    auto writeDataToFile = [ this, &rmode ]( off_t offset, const char *data, size_t len ) -> off_t {
+
+      if ( rmode._currentRange < 0 ) {
+        DBG_MEDIA << "Current range is zero in write request" << std::endl;
+        return 0;
+      }
+
+      // if we have no open file create or open it
+      if ( !rmode._outFile ) {
+        std::string openMode = "w+b";
+        if ( _fMode == NetworkRequest::WriteShared )
+          openMode = "r+b";
+
+        rmode._outFile = fopen( _targetFile.asString().c_str() , openMode.c_str() );
+
+        //if the file does not exist create a new one
+        if ( !rmode._outFile && _fMode == NetworkRequest::WriteShared ) {
+          rmode._outFile = fopen( _targetFile.asString().c_str() , "w+b" );
+        }
+
+        if ( !rmode._outFile ) {
+          _originalError = zypp::str::Format("Unable to open target file (%1%). Errno: (%2%:%3%)") % _targetFile.asString() % errno % strerr_cxx();
           return 0;
         }
       }
-    }
 
-    if ( !that->_outFile ) {
-      std::string openMode = "w+b";
-      if ( that->_fMode == NetworkRequest::WriteShared )
-        openMode = "r+b";
+      // seek to the given offset
+      if ( offset >= 0 ) {
+        if ( fseek( rmode._outFile, offset, SEEK_SET ) != 0 ) {
+          _originalError = "Unable to set output file pointer.";
+          return 0;
+        }
+      }
 
-      that->_outFile = fopen( that->_targetFile.asString().c_str() , openMode.c_str() );
+      auto &rng = _requestedRanges[ rmode._currentRange ];
+      const auto bytesToWrite = rng.len > 0 ? std::min( rng.len - rng.bytesWritten, len ) : len;
 
-      //if the file does not exist create a new one
-      if ( !that->_outFile && that->_fMode == NetworkRequest::WriteShared ) {
-        that->_outFile = fopen( that->_targetFile.asString().c_str() , "w+b" );
+      //make sure we do not write after the expected file size
+      if ( _expectedFileSize && _expectedFileSize <= static_cast<zypp::ByteCount::SizeType>(rng.start + rng.bytesWritten + bytesToWrite) ) {
+        _originalError = "Downloaded data exceeds expected length.";
+        return 0;
       }
 
-      if ( !that->_outFile ) {
-        strncpy( that->_errorBuf.data(), "Unable to open target file.", CURL_ERROR_SIZE);
+      auto written = fwrite( data, 1, bytesToWrite, rmode._outFile );
+      if ( written == 0 )
         return 0;
+
+      if ( rng._digest && rng._checksum.size() ) {
+        if ( !rng._digest->update( data, written ) )
+          return 0;
+      }
+
+      rng.bytesWritten += written;
+      if ( rmode._currentSrvRange ) rmode._currentSrvRange->bytesWritten += written;
+
+      if ( rng.len > 0 && rng.bytesWritten >= rng.len ) {
+        rmode._currentRange = -1;
+        validateRange( rng );
+      }
+
+      if ( rmode._currentSrvRange && rmode._currentSrvRange->len > 0 && rmode._currentSrvRange->bytesWritten >= rmode._currentSrvRange->len ) {
+        rmode._currentSrvRange.reset();
+        // we ran out of data in the current chunk, reset the target range as well because next data will be
+        // a chunk header again
+        rmode._currentRange = -1;
+      }
+
+      // count the number of real bytes we have downloaded so far
+      rmode._downloaded += written;
+      _sigBytesDownloaded.emit( *z_func(), rmode._downloaded );
+
+      return written;
+    };
+
+    // we are currenty writing a range, continue until we hit the end of the requested chunk, or if we hit end of data
+    size_t bytesWrittenSoFar = 0;
+
+    while ( bytesWrittenSoFar != max ) {
+
+      off_t seekTo = -1;
+
+      // this is called after all headers have been processed
+      if ( !rmode._allHeadersReceived ) {
+        rmode._allHeadersReceived = true;
+
+        // no ranges at all, must be a normal download
+        if ( !rmode._gotMultiRangeHeader && !rmode._gotContentRangeHeader ) {
+
+          if ( rmode._requireStatusPartial ) {
+            //we got a invalid response, the status code pointed to being partial but we got no range definition
+            _originalError = "Invalid data from server, range respone was announced but there was no range definiton.";
+            return 0;
+          }
+
+          //we always download a range even if its not explicitely requested
+          if ( _requestedRanges.empty() ) {
+            _requestedRanges.push_back( NetworkRequest::Range() );
+          }
+
+          rmode._currentRange = 0;
+          seekTo = _requestedRanges[0].start;
+        }
       }
 
-      if ( that->_start > 0 )
-        if ( fseek( that->_outFile, that->_start, SEEK_SET ) != 0 ) {
-          strncpy( that->_errorBuf.data(), "Unable to set output file pointer.", CURL_ERROR_SIZE);
+      if ( rmode._currentSrvRange && rmode._currentRange == -1  ) {
+        //if we enter this branch, we just have finished writing a requested chunk but
+        //are still inside a chunk that was sent by the server, due to the std the server can coalesce requested ranges
+        //to optimize downloads we need to find the best match ( because the current offset might not even be in our requested ranges )
+        //Or we just parsed a Content-Lenght header and start a new block
+
+        std::optional<uint> foundRange;
+        const size_t beginRange = rmode._currentSrvRange->start + rmode._currentSrvRange->bytesWritten;
+        const size_t endRange = beginRange + (rmode._currentSrvRange->len - rmode._currentSrvRange->bytesWritten);
+        auto currDist  = ULONG_MAX;
+        for ( uint i = 0; i < _requestedRanges.size(); i++ ) {
+          const auto &currR = _requestedRanges[i];
+
+          // do not allow double ranges
+          if ( currR._valid )
+            continue;
+
+          // check if the range was already written
+          if ( currR.len == currR.bytesWritten )
+            continue;
+
+          const auto currRBegin = currR.start + currR.bytesWritten;
+          if ( !( beginRange <= currRBegin && endRange >= currRBegin ) )
+            continue;
+
+          // calculate the distance of the current ranges offset+data written to the range we got back from the server
+          const auto newDist   = currRBegin - beginRange;
+
+          if ( !foundRange ) {
+            foundRange = i;
+            currDist = newDist;
+          } else {
+            //pick the range with the closest distance
+            if ( newDist < currDist ) {
+              foundRange = i;
+              currDist = newDist;
+            }
+          }
+        }
+        if ( !foundRange ) {
+          _originalError = "Unable to find a matching range for data returned by the server.";
           return 0;
         }
-    }
 
-     size_t written = fwrite( ptr, size, nmemb, that->_outFile );
-     if ( that->_digest ) {
-       that->_digest->update( ptr, written );
-     }
+        //set the found range as the current one
+        rmode._currentRange = *foundRange;
+
+        //continue writing where we stopped
+        seekTo = _requestedRanges[*foundRange].start + _requestedRanges[*foundRange].bytesWritten;
 
-     return written;
+        //if we skip bytes we need to advance our written bytecount
+        const auto skipBytes = seekTo - beginRange;
+        bytesWrittenSoFar += skipBytes;
+        rmode._currentSrvRange->bytesWritten += skipBytes;
+      }
+
+      if ( rmode._currentRange >= 0 ) {
+        auto availableData = max - bytesWrittenSoFar;
+        if ( rmode._currentSrvRange ) {
+          availableData = std::min( availableData, rmode._currentSrvRange->len - rmode._currentSrvRange->bytesWritten );
+        }
+        auto bw = writeDataToFile( seekTo, ptr + bytesWrittenSoFar, availableData );
+        if ( bw <= 0 )
+          return 0;
+
+        bytesWrittenSoFar += bw;
+      }
+
+      if ( bytesWrittenSoFar == max )
+        return max;
+
+      if ( rmode._currentRange == -1 ) {
+
+        // we still are inside the current range from the server
+        if ( rmode._currentSrvRange )
+          continue;
+
+        boost::string_view incoming( ptr + bytesWrittenSoFar, max - bytesWrittenSoFar );
+        auto hdrEnd = incoming.find("\r\n\r\n");
+        if ( hdrEnd == incoming.npos ) {
+          //no header end in the data yet, push to buffer and return
+           rmode._rangePrefaceBuffer.insert( rmode._rangePrefaceBuffer.end(), incoming.begin(), incoming.end() );
+           return max;
+        }
+
+        //append the data of the current header to the buffer and parse it
+        rmode._rangePrefaceBuffer.insert( rmode._rangePrefaceBuffer.end(), incoming.begin(), incoming.begin() + ( hdrEnd + 4 )  );
+        bytesWrittenSoFar += ( hdrEnd + 4 ); //header data plus header end
+
+        boost::string_view data( rmode._rangePrefaceBuffer.data(), rmode._rangePrefaceBuffer.size() );
+        auto sepStrIndex = data.find( rmode._seperatorString );
+        if ( sepStrIndex == data.npos ) {
+          _originalError = "Invalid multirange header format, seperator string missing.";
+          return 0;
+        }
+
+        auto startOfHeader = sepStrIndex + rmode._seperatorString.length();
+
+        std::vector<boost::string_view> lines;
+        str::split( data.substr( startOfHeader ), std::back_inserter(lines), "\r\n", zypp::str::TRIM );
+        for ( const auto &hdrLine : lines ) {
+          if ( hdrLine.starts_with("Content-Range:") ) {
+            NetworkRequest::Range r;
+            //if we can not parse the header the message must be broken
+            if(! parseContentRangeHeader( hdrLine, r.start, r.len ) ) {
+              WAR << "Broken header for Network Request to " << _url << std::endl;
+              return 0;
+            }
+            rmode._currentSrvRange = r;
+            break;
+          }
+        }
+        //clear the buffer again
+        rmode._rangePrefaceBuffer.clear();
+      }
+    }
+    return bytesWrittenSoFar;
   }
 
-  NetworkRequest::NetworkRequest(zyppng::Url url, zypp::filesystem::Pathname targetFile, off_t start, off_t len, zyppng::NetworkRequest::FileMode fMode)
-    : Base ( *new NetworkRequestPrivate( std::move(url), std::move(targetFile), std::move(start), std::move(len), std::move(fMode) ) )
+  ZYPP_IMPL_PRIVATE(NetworkRequest)
+
+  NetworkRequest::NetworkRequest(zyppng::Url url, zypp::filesystem::Pathname targetFile, zyppng::NetworkRequest::FileMode fMode)
+    : Base ( *new NetworkRequestPrivate( std::move(url), std::move(targetFile), std::move(fMode), *this ) )
   {
   }
 
@@ -497,14 +933,19 @@ namespace zyppng {
 
     if ( d->_dispatcher )
       d->_dispatcher->cancel( *this, "Request destroyed while still running" );
+  }
 
-    if ( d->_outFile )
-      fclose( d->_outFile );
+  void NetworkRequest::setExpectedFileSize( zypp::ByteCount expectedFileSize )
+  {
+    d_func()->_expectedFileSize = std::move( expectedFileSize );
   }
 
-  void NetworkRequest::setPriority(NetworkRequest::Priority prio)
+  void NetworkRequest::setPriority( NetworkRequest::Priority prio, bool triggerReschedule )
   {
-    d_func()->_priority = prio;
+    Z_D();
+    d->_priority = prio;
+    if ( state() == Pending && triggerReschedule && d->_dispatcher )
+      d->_dispatcher->reschedule();
   }
 
   NetworkRequest::Priority NetworkRequest::priority() const
@@ -522,13 +963,51 @@ namespace zyppng {
     return d_func()->_options;
   }
 
-  void NetworkRequest::setRequestRange(off_t start, off_t len)
+  void NetworkRequest::addRequestRange( size_t start, size_t len, DigestPtr digest, CheckSumBytes expectedChkSum , std::any userData, std::optional<size_t> digestCompareLen  )
+  {
+    Z_D();
+    if ( state() == Running )
+      return;
+
+    d->_requestedRanges.push_back( Range::make( start, len, std::move(digest), std::move( expectedChkSum ), std::move( userData ), digestCompareLen ) );
+  }
+
+  void NetworkRequest::addRequestRange( const NetworkRequest::Range &range )
   {
     Z_D();
-    if ( d->_state == Running )
+    if ( state() == Running )
       return;
-    d->_start = start;
-    d->_len = len;
+
+     d->_requestedRanges.push_back( range );
+  }
+
+  void NetworkRequest::resetRequestRanges()
+  {
+    Z_D();
+    if ( state() == Running )
+      return;
+    d->_requestedRanges.clear();
+  }
+
+  std::vector<NetworkRequest::Range> NetworkRequest::failedRanges() const
+  {
+    const auto mystate = state();
+    if ( mystate != Finished && mystate != Error )
+      return {};
+
+    Z_D();
+
+    std::vector<Range> failed;
+    for ( const auto &r : d->_requestedRanges ) {
+      if ( !r._valid )
+        failed.push_back( r );
+    }
+    return failed;
+  }
+
+  const std::vector<NetworkRequest::Range> &NetworkRequest::requestedRanges() const
+  {
+    return d_func()->_requestedRanges;
   }
 
   const std::string &NetworkRequest::lastRedirectInfo() const
@@ -541,10 +1020,40 @@ namespace zyppng {
     return d_func()->_easyHandle;
   }
 
+  std::optional<zyppng::NetworkRequest::Timings> NetworkRequest::timings() const
+  {
+    const auto myerr = error();
+    const auto mystate = state();
+    if ( mystate != Finished )
+      return {};
+
+    Timings t;
+
+    auto getMeasurement = [ this ]( const CURLINFO info, std::chrono::microseconds &target ){
+      using FPSeconds = std::chrono::duration<double, std::chrono::seconds::period>;
+      double val = 0;
+      const auto res = curl_easy_getinfo( d_func()->_easyHandle, info, &val );
+      if ( CURLE_OK == res ) {
+        target = std::chrono::duration_cast<std::chrono::microseconds>( FPSeconds(val) );
+      }
+    };
+
+    getMeasurement( CURLINFO_NAMELOOKUP_TIME, t.namelookup );
+    getMeasurement( CURLINFO_CONNECT_TIME, t.connect);
+    getMeasurement( CURLINFO_APPCONNECT_TIME, t.appconnect);
+    getMeasurement( CURLINFO_PRETRANSFER_TIME , t.pretransfer);
+    getMeasurement( CURLINFO_TOTAL_TIME, t.total);
+    getMeasurement( CURLINFO_REDIRECT_TIME, t.redirect);
+
+    return t;
+  }
+
   std::vector<char> NetworkRequest::peekData( off_t offset, size_t count ) const
   {
     Z_D();
-    return peek_data_fd( d->_outFile, offset, count );
+
+    const auto &rmode = std::get<NetworkRequestPrivate::running_t>( d->_runningMode );
+    return peek_data_fd( rmode._outFile, offset, count );
   }
 
   Url NetworkRequest::url() const
@@ -555,7 +1064,7 @@ namespace zyppng {
   void NetworkRequest::setUrl(const Url &url)
   {
     Z_D();
-    if ( d->_state == NetworkRequest::Running )
+    if ( state() == NetworkRequest::Running )
       return;
 
     d->_url = url;
@@ -566,45 +1075,61 @@ namespace zyppng {
     return d_func()->_targetFile;
   }
 
-  std::string NetworkRequest::contentType() const
-  {
-    char *ptr = NULL;
-    if ( curl_easy_getinfo( d_func()->_easyHandle, CURLINFO_CONTENT_TYPE, &ptr ) == CURLE_OK && ptr )
-      return std::string(ptr);
-    return std::string();
-  }
-
-  off_t NetworkRequest::downloadOffset() const
+  void NetworkRequest::setTargetFilePath( const zypp::filesystem::Pathname &path )
   {
-    return d_func()->_start;
+    Z_D();
+    if ( state() == NetworkRequest::Running )
+      return;
+    d->_targetFile = path;
   }
 
-  off_t NetworkRequest::reportedByteCount() const
+  NetworkRequest::FileMode NetworkRequest::fileOpenMode() const
   {
-    return d_func()->_reportedSize;
+    return d_func()->_fMode;
   }
 
-  off_t NetworkRequest::expectedByteCount() const
+  void NetworkRequest::setFileOpenMode( FileMode mode )
   {
-    return d_func()->_len;
+    Z_D();
+    if ( state() == NetworkRequest::Running )
+      return;
+    d->_fMode = std::move( mode );
   }
 
-  off_t NetworkRequest::downloadedByteCount() const
+  std::string NetworkRequest::contentType() const
   {
-    Z_D();
-    if ( d->_downloaded == -1 )
-      return 0;
-    return d->_downloaded;
+    char *ptr = NULL;
+    if ( curl_easy_getinfo( d_func()->_easyHandle, CURLINFO_CONTENT_TYPE, &ptr ) == CURLE_OK && ptr )
+      return std::string(ptr);
+    return std::string();
   }
 
-  void NetworkRequest::setDigest( std::shared_ptr<zypp::Digest> dig )
+  zypp::ByteCount NetworkRequest::reportedByteCount() const
   {
-    d_func()->_digest = dig;
+    return std::visit([](auto&& arg) -> zypp::ByteCount {
+      using T = std::decay_t<decltype(arg)>;
+      if constexpr (std::is_same_v<T, NetworkRequestPrivate::pending_t>)
+        return zypp::ByteCount(0);
+      else if constexpr (std::is_same_v<T, NetworkRequestPrivate::running_t>
+                         || std::is_same_v<T, NetworkRequestPrivate::finished_t>)
+        return arg._contentLenght;
+      else
+        static_assert(always_false<T>::value, "Unhandled state type");
+    }, d_func()->_runningMode);
   }
 
-  void NetworkRequest::setExpectedChecksum(std::vector<unsigned char> checksum )
+  zypp::ByteCount NetworkRequest::downloadedByteCount() const
   {
-    d_func()->_expectedChecksum = std::move(checksum);
+    return std::visit([](auto&& arg) -> zypp::ByteCount {
+      using T = std::decay_t<decltype(arg)>;
+      if constexpr (std::is_same_v<T, NetworkRequestPrivate::pending_t>)
+        return zypp::ByteCount();
+      else if constexpr (std::is_same_v<T, NetworkRequestPrivate::running_t>
+                          || std::is_same_v<T, NetworkRequestPrivate::finished_t>)
+        return arg._downloaded;
+      else
+        static_assert(always_false<T>::value, "Unhandled state type");
+    }, d_func()->_runningMode);
   }
 
   TransferSettings &NetworkRequest::transferSettings()
@@ -612,28 +1137,39 @@ namespace zyppng {
     return d_func()->_settings;
   }
 
-  std::shared_ptr<zypp::Digest> NetworkRequest::digest( ) const
-  {
-    return d_func()->_digest;
-  }
-
   NetworkRequest::State NetworkRequest::state() const
   {
-    return d_func()->_state;
+    return std::visit([this](auto&& arg) {
+      using T = std::decay_t<decltype(arg)>;
+      if constexpr (std::is_same_v<T, NetworkRequestPrivate::pending_t>)
+        return Pending;
+      else if constexpr (std::is_same_v<T, NetworkRequestPrivate::running_t>)
+        return Running;
+      else if constexpr (std::is_same_v<T, NetworkRequestPrivate::finished_t>) {
+        if ( std::get<NetworkRequestPrivate::finished_t>( d_func()->_runningMode )._result.isError() )
+          return Error;
+        else
+          return Finished;
+      }
+      else
+        static_assert(always_false<T>::value, "Unhandled state type");
+    }, d_func()->_runningMode);
   }
 
-  const NetworkRequestError &NetworkRequest::error() const
+  NetworkRequestError NetworkRequest::error() const
   {
-    return d_func()->_result;
+    const auto s = state();
+    if ( s != Error && s != Finished )
+      return NetworkRequestError();
+    return std::get<NetworkRequestPrivate::finished_t>( d_func()->_runningMode)._result;
   }
 
   std::string NetworkRequest::extendedErrorString() const
   {
-    Z_D();
     if ( !hasError() )
       return std::string();
 
-    return d->_result.nativeErrorString();
+    return error().nativeErrorString();
   }
 
   bool NetworkRequest::hasError() const
@@ -660,6 +1196,11 @@ namespace zyppng {
     return d_func()->_sigStarted;
   }
 
+  SignalProxy<void (NetworkRequest &req, zypp::ByteCount count)> NetworkRequest::sigBytesDownloaded()
+  {
+    return d_func()->_sigBytesDownloaded;
+  }
+
   SignalProxy<void (NetworkRequest &req, off_t dltotal, off_t dlnow, off_t ultotal, off_t ulnow)> NetworkRequest::sigProgress()
   {
     return d_func()->_sigProgress;
@@ -669,6 +1210,4 @@ namespace zyppng {
   {
     return d_func()->_sigFinished;
   }
-
-
 }
index 019d1a0..35d46a6 100644 (file)
@@ -3,12 +3,17 @@
 
 #include <zypp/zyppng/media/network/networkrequesterror.h>
 #include <zypp/zyppng/media/network/TransferSettings>
-#include <zypp/zyppng/base/Base>
-#include <zypp/zyppng/core/Url>
-#include <zypp/zyppng/base/zyppglobal.h>
-#include <zypp/zyppng/base/signals.h>
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/core/Url>
+#include <zypp-core/zyppng/core/ByteArray>
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/signals.h>
 #include <zypp/base/Flags.h>
+#include <zypp/ByteCount.h>
+#include <optional>
 #include <vector>
+#include <chrono>
+#include <any>
 
 namespace zypp {
   class Digest;
@@ -38,6 +43,8 @@ namespace zyppng {
 
     using Ptr = std::shared_ptr<NetworkRequest>;
     using WeakPtr = std::weak_ptr<NetworkRequest>;
+    using DigestPtr = std::shared_ptr<zypp::Digest>;
+    using CheckSumBytes = UByteArray;
 
     enum State {
       Pending,    //< waiting to be dispatched
@@ -47,8 +54,9 @@ namespace zyppng {
     };
 
     enum Priority {
-      Normal, //< Requests with normal priority will be enqueued at the end
-      High    //< Request with high priority will be moved to the front of the queue
+      Normal,         //< Requests with normal priority will be enqueued as they come in
+      High,           //< Request with high priority will be moved to the front of the queue
+      Critical = 100, //< Those requests will be enqueued as fast as possible, even before High priority requests, this should be used only if requests needs to start immediately
     };
 
     enum FileMode {
@@ -57,26 +65,62 @@ namespace zyppng {
     };
 
     enum OptionBits {
-      HeadRequest = 0x01 //< only request the header part of the file
+      Default        = 0x00, //< no special options, just do a normal download
+      HeadRequest    = 0x01, //< only request the header part of the file
+      ConnectionTest = 0x02  //< only connect to collect connection speed information
     };
     ZYPP_DECLARE_FLAGS(Options, OptionBits);
 
+    struct Range {
+      size_t start = 0;
+      size_t len = 0;
+      size_t bytesWritten = 0;
+      DigestPtr _digest; //< zypp::Digest that is updated when data is written, can be used to validate the file contents with a checksum
+
+      /**
+      * Enables automated checking of downloaded contents against a checksum.
+      * Only makes a difference if \ref _digest is initialized too
+      *
+      * \note expects checksum in byte NOT in string format
+      */
+      CheckSumBytes _checksum;
+      std::optional<size_t> _relevantDigestLen; //< If this is initialized , it defines how many bytes of the resulting checkum are compared
+      bool _valid = false;
+      std::any userData; //< Custom data the user can associate with the Range
+
+      static Range make ( size_t start, size_t len = 0, DigestPtr &&digest = nullptr, CheckSumBytes &&expectedChkSum = CheckSumBytes(), std::any &&userData = std::any(), std::optional<size_t> digestCompareLen = {} );
+    };
+
+    struct Timings {
+      std::chrono::microseconds namelookup;
+      std::chrono::microseconds connect;
+      std::chrono::microseconds appconnect;
+      std::chrono::microseconds pretransfer;
+      std::chrono::microseconds total;
+      std::chrono::microseconds redirect;
+    };
+
     /*!
      * \param url The source URL of the download
      * \param targetFile The path where the file should be stored
-     * \param start File offset, if set this will create a range download request
-     * \param len File range length
      * \param fMode The mode in which the file is opened in.
      */
-    NetworkRequest( Url url, zypp::Pathname targetFile, off_t start = -1, off_t len = 0, FileMode fMode = WriteExclusive );
+    NetworkRequest(Url url, zypp::Pathname targetFile, FileMode fMode = WriteExclusive );
     virtual ~NetworkRequest();
 
     /*!
+     * Sets the expected file size for the download.
+     * In case of a Multi-Range-Download the \a NetworkRequest will check if the download
+     * would write behind the expectedFileSize and fail.
+     */
+    void setExpectedFileSize ( zypp::ByteCount expectedFileSize );
+
+    /*!
      * Sets the priority of the NetworkRequest, this will affect where
      * the \sa NetworkRequestDispatcher puts the Request in the Queue.
-     * \note changing this makes only sense before enqueueing the request
+     * \note changing this makes only sense in Pending state.
      */
-    void setPriority ( Priority prio );
+    void setPriority ( Priority prio, bool triggerReschedule = true );
 
     /*!
      * Returns the requested priority of the NetworkRequest
@@ -84,7 +128,7 @@ namespace zyppng {
     Priority priority ( ) const;
 
     /*!
-     * Change request options, currently only the \sa OptionBits::HeadRequest option is supported
+     * Change request options.
      *
      * \note changing this makes only sense before the request was started
      */
@@ -96,12 +140,21 @@ namespace zyppng {
     Options options () const;
 
     /*!
-     * Sets the range description
+     * Adds a new range to the requested range list, the ranges can not overlap
      * \note This will not change a running download
-     * \param start
-     * \param len
      */
-    void setRequestRange ( off_t start = -1, off_t len = 0 );
+    void addRequestRange ( size_t start, size_t len = 0, DigestPtr digest = nullptr, CheckSumBytes expectedChkSum = CheckSumBytes(), std::any userData = std::any(), std::optional<size_t> digestCompareLen = {}  );
+
+    void addRequestRange ( const Range &range );
+
+    /*!
+     * Clears all requested ranges, the next download will get the complete file
+     * \note This will not change a running download
+     */
+    void resetRequestRanges ( );
+
+    std::vector<Range> failedRanges () const;
+    const std::vector<Range> &requestedRanges () const;
 
     /*!
      * Returns the last redirect information from the headers.
@@ -116,6 +169,12 @@ namespace zyppng {
      */
     void *nativeHandle () const;
 
+    /**
+     * After the request is finished query the timings that were collected
+     * during download
+     */
+    std::optional<Timings> timings () const;
+
     /*!
      * Will return the data at \a offset with length \a count.
      * If there is not yet enough data a empty vector will be returned
@@ -139,52 +198,38 @@ namespace zyppng {
     const zypp::Pathname & targetFilePath () const;
 
     /**
-     * Returns the content type as reported from the server
-     * \note can only return a valid value if the download has started already
-     */
-    std::string contentType () const;
-
-    /**
-     * Returns the requested start offset
-     */
-    off_t downloadOffset () const;
-
-    /**
-     * Returns the number of bytes that are reported from the backend as the full download size, those can
-     * be 0 even when the download is already running.
+     * Changes the target file path of the download
+     * \note calling this on a currently running request has no impact
      */
-    off_t reportedByteCount   () const;
+    void setTargetFilePath ( const zypp::Pathname &path );
 
     /**
-     * Returns the expected byte count that was passed to the constructor, zero if
-     * none was given
+     * Returns the currently configured file open mode
      */
-    off_t expectedByteCount   () const;
+    FileMode fileOpenMode () const;
 
     /**
-     * Returns the number of already downloaded bytes as reported by the backend
+     * Sets the file open mode to \a mode.
+     * \note calling this on a currently running request has no impact
      */
-    off_t downloadedByteCount () const;
+    void setFileOpenMode ( FileMode mode );
 
     /**
-     * Set a \sa zypp::Digest that is updated when data is written, can be used to
-     * validate the file contents with a checksum
+     * Returns the content type as reported from the server
+     * \note can only return a valid value if the download has started already
      */
-    void setDigest ( std::shared_ptr<zypp::Digest> dig );
+    std::string contentType () const;
 
     /**
-     * Returns the currently used \sa zypp::Digest, null if non was set.
+     * Returns the number of bytes that are reported from the backend as the full download size, those can
+     * be 0 even when the download is already running.
      */
-    std::shared_ptr<zypp::Digest> digest () const;
+    zypp::ByteCount reportedByteCount() const;
 
     /**
-     * Enables automated checking of downloaded contents against a checksum.
-     * Only makes a difference if a \sa zypp::Digest was with with \sa setDigest.
-     *
-     * \note expects checksum in byte NOT in string format
+     * Returns the number of already downloaded bytes as reported by the backend
      */
-    void setExpectedChecksum (std::vector<unsigned char> checksum );
-
+    zypp::ByteCount downloadedByteCount() const;
 
     /*!
      * Returns a writeable reference to the internal \sa zyppng::TransferSettings.
@@ -200,7 +245,7 @@ namespace zyppng {
     /**
      * Returns the last set Error
      */
-    const NetworkRequestError &error () const;
+    NetworkRequestError error () const;
 
     /**
      * In some cases curl can provide extended error informations collected at
@@ -225,7 +270,14 @@ namespace zyppng {
     SignalProxy<void ( NetworkRequest &req )> sigStarted  ();
 
     /**
+     * Signals that new data has been downloaded, this is only the payload and does not include control data bytes
+     */
+    SignalProxy<void ( NetworkRequest &req, zypp::ByteCount count )> sigBytesDownloaded ();
+
+    /**
      * Signals if there was data read from the download
+     * \note this signals the raw numbers of bytes that were downloaded, for the number of payload data bytes ( excluding control data )
+     *       use \ref downloadedByteCount
      */
     SignalProxy<void ( NetworkRequest &req, off_t dltotal, off_t dlnow, off_t ultotal, off_t ulnow )> sigProgress ();
 
diff --git a/zypp/zyppng/media/private/medianetworkserver_p.h b/zypp/zyppng/media/private/medianetworkserver_p.h
new file mode 100644 (file)
index 0000000..15cddaf
--- /dev/null
@@ -0,0 +1,115 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+----------------------------------------------------------------------/
+*
+* This file contains private API, this might break at any time between releases.
+* You have been warned!
+*
+*/
+#ifndef ZYPPNG_MEDIA_MEDIANETWORKSERVER_H_INCLUDED
+#define ZYPPNG_MEDIA_MEDIANETWORKSERVER_H_INCLUDED
+
+#include <zypp-core/zyppng/base/zyppglobal.h>
+#include <zypp-core/zyppng/base/signals.h>
+#include <zypp/base/String.h>
+#include <zypp-core/zyppng/base/Base>
+#include <zypp-core/zyppng/io/Socket>
+#include <zypp/TmpPath.h>
+#include <zypp-core/zyppng/thread/Wakeup>
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <memory>
+#include <optional>
+#include <list>
+#include <thread>
+
+namespace google::protobuf {
+  class Message;
+}
+
+namespace zyppng {
+
+  class Downloader;
+  class MediaNetworkConn;
+
+  using RequestId = uint32_t;
+
+  class LIBZYPP_NG_NO_EXPORT MediaNetworkServer : public Base
+  {
+  public:
+    using ConnectionList = std::list< std::shared_ptr<MediaNetworkConn> >;
+
+    MediaNetworkServer();
+
+    void listen ( const std::string &sockPath );
+
+    std::shared_ptr<Downloader> downloader ();
+
+  private:
+    void onIncomingConnection ();
+
+  private:
+    std::shared_ptr<Socket> _serverSocket;
+    std::shared_ptr<Downloader> _downloadManager;
+    ConnectionList _clients;
+  };
+
+  class LIBZYPP_NG_NO_EXPORT MediaNetworkConn : public Base
+  {
+    struct Request;
+    using ReqPtr  = std::shared_ptr<Request>;
+    using ReqList = std::list< ReqPtr >;
+  public:
+    MediaNetworkConn ( MediaNetworkServer &server, std::shared_ptr<Socket> &&socket );
+    ~MediaNetworkConn ( );
+
+    SignalProxy<void()> sigDisconnected ();
+
+  private:
+    void onDisconnected ();
+    void onReadyRead ();
+    void onError ( Socket::SocketError err );
+    void trackRequest ( Request &r );
+    void signalRequestStarted ( Request &r );
+    void trackedDlFinished ( Request &r );
+
+    template <typename T>
+    void sendMessage ( T &m );
+
+  private:
+    MediaNetworkServer &_server;
+    ReqList _requests;
+    std::shared_ptr<Socket> _connection;
+    std::optional<int32_t> _pendingMessageSize;
+    Signal<void()> _disconnected;
+  };
+
+  class LIBZYPP_NG_NO_EXPORT MediaNetworkThread : public Base
+  {
+  public:
+    ~MediaNetworkThread();
+    static MediaNetworkThread &instance ();
+
+    static std::string sockPath () {
+      static std::string path = zypp::str::Format("zypp-mediasocket-%1%") % getpid();
+      return path;
+    }
+
+  private:
+    MediaNetworkThread();
+    void threadMain ();
+    std::thread _t;
+    zyppng::Wakeup _shutdownSignal;
+  };
+
+}
+
+
+
+#endif // MEDIANETWORKSERVER_H
diff --git a/zypp/zyppng/proto/CMakeLists.txt b/zypp/zyppng/proto/CMakeLists.txt
new file mode 100644 (file)
index 0000000..8d3957c
--- /dev/null
@@ -0,0 +1,9 @@
+SET( zyppng_PROTOBUF_SOURCES
+
+)
+
+protobuf_generate_cpp(ZYPPNG_PROTO_SRCS ZYPPNG_PROTO_HDRS ${zyppng_PROTOBUF_SOURCES})
+
+ADD_LIBRARY( zyppng-protobuf OBJECT ${ZYPPNG_PROTO_SRCS} ${ZYPPNG_PROTO_HDRS} )
+
+add_dependencies( zyppng-protobuf zypp-protobuf )