From 086fe207a05adcfda71ddc36ce80ba4cd907222e Mon Sep 17 00:00:00 2001 From: DongHun Kwak Date: Tue, 1 Nov 2016 11:12:34 +0900 Subject: [PATCH] Imported Upstream version 16.1.0 Change-Id: Id5063ba2eff49da11ed8d6eb11631edae0e3d748 Signed-off-by: DongHun Kwak --- VERSION.cmake | 6 +-- package/libzypp.changes | 6 +++ po/nl.po | 77 ++++++++++++++++----------------- zypp/Capabilities.h | 11 +++++ zypp/Pattern.cc | 111 ++++++++++++++++++++++++++++++++++++++++++++++++ zypp/Pattern.h | 16 +++++++ zypp/ResStatus.h | 3 ++ zypp/base/String.h | 1 + zypp/sat/SolvableSet.h | 12 +++++- 9 files changed, 200 insertions(+), 43 deletions(-) diff --git a/VERSION.cmake b/VERSION.cmake index 86fcf87..a65f194 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -60,9 +60,9 @@ # SET(LIBZYPP_MAJOR "16") SET(LIBZYPP_COMPATMINOR "0") -SET(LIBZYPP_MINOR "0") -SET(LIBZYPP_PATCH "5") +SET(LIBZYPP_MINOR "1") +SET(LIBZYPP_PATCH "0") # -# LAST RELEASED: 16.0.5 (0) +# LAST RELEASED: 16.1.0 (0) # (The number in parenthesis is LIBZYPP_COMPATMINOR) #======= diff --git a/package/libzypp.changes b/package/libzypp.changes index 64c609d..4b94ad5 100644 --- a/package/libzypp.changes +++ b/package/libzypp.changes @@ -1,4 +1,10 @@ ------------------------------------------------------------------- +Fri Jun 24 12:33:29 CEST 2016 - ma@suse.de + +- API enahncements for zypper (FATE#320447) +- version 16.1.0 (0) + +------------------------------------------------------------------- Tue Jun 21 11:11:03 CEST 2016 - ma@suse.de - Filter duplicate resolver solutions (bsc#985674) diff --git a/po/nl.po b/po/nl.po index c1be2f6..745fa93 100644 --- a/po/nl.po +++ b/po/nl.po @@ -16,15 +16,16 @@ msgstr "" "Project-Id-Version: zypp.nl\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-05-03 15:55+0200\n" -"PO-Revision-Date: 2015-11-16 22:02+0100\n" +"PO-Revision-Date: 2016-06-21 13:40+0000\n" "Last-Translator: Freek de Kruijf \n" -"Language-Team: Dutch \n" +"Language-Team: Dutch " +"\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural= n != 1;\n" -"X-Generator: Lokalize 1.5\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2.6\n" #: zypp/target/hal/HalException.h:46 zypp/target/hal/HalException.h:55 #: zypp/target/hal/HalException.h:64 @@ -33,7 +34,7 @@ msgstr "Hal-uitzondering" #: zypp/Url.cc:114 msgid "Invalid LDAP URL query string" -msgstr "Ongeldige LDAP-URL-queryreeks" +msgstr "Ongeldige LDAP-URL-querytekenreeks" #: zypp/Url.cc:153 #, c-format, boost-format @@ -106,7 +107,7 @@ msgstr "Verbetert" #: zypp/Dep.cc:104 msgid "Supplements" -msgstr "Maakt vollediger" +msgstr "Voegt toe" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp/CheckSum.cc:136 @@ -142,7 +143,7 @@ msgstr "Fout bij het zenden van een melding over een bijwerkbericht." #: zypp/target/TargetImpl.cc:658 msgid "New update message" -msgstr "Bericht over een nieuwe opwaardering" +msgstr "Bericht over een nieuw element voor bijwerken" #: zypp/target/TargetImpl.cc:1219 zypp/target/TargetImpl.cc:1288 #: zypp/target/TargetImpl.cc:1640 @@ -268,7 +269,7 @@ msgstr "Ondertekening is OK" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2367 msgid "Unknown type of signature" -msgstr "Onbekende type ondertekening" +msgstr "Onbekend type ondertekening" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2369 @@ -356,7 +357,7 @@ msgstr "Kan map voor metadata-cache niet aanmaken." #: zypp/RepoManager.cc:1282 #, c-format, boost-format msgid "Building repository '%s' cache" -msgstr "Cache van bron '%s' bouwen" +msgstr "Cache van installatiebron '%s' wordt gebouwd" #: zypp/RepoManager.cc:1302 #, c-format, boost-format @@ -370,7 +371,7 @@ msgstr "Kan installatiebron (%d) niet opslaan in de cache." #: zypp/RepoManager.cc:1377 msgid "Unhandled repository type" -msgstr "Niet behandeld installatiebrontype" +msgstr "Niet behandeld type installatiebron" #. prepare exception to be thrown if the type could not be determined #. due to a media exception. We can't throw right away, because of some @@ -392,7 +393,7 @@ msgstr "Onbekend fout bij lezen van '%s'" #: zypp/RepoManager.cc:1611 #, c-format, boost-format msgid "Adding repository '%s'" -msgstr "Bron '%s' toevoegen" +msgstr "Bron '%s' wordt toegevoegd" #. TranslatorExplanation '%s' is an URL #: zypp/RepoManager.cc:1701 @@ -403,7 +404,7 @@ msgstr "Ongeldige naam van installatiebronbestand bij '%s'" #: zypp/RepoManager.cc:1740 #, c-format, boost-format msgid "Removing repository '%s'" -msgstr "Bron '%s' verwijderen" +msgstr "Bron '%s' wordt verwijderd" #: zypp/RepoManager.cc:1759 zypp/RepoManager.cc:1835 msgid "Can't figure out where the repo is stored." @@ -422,7 +423,7 @@ msgstr "Kan er niet achter komen waar de service is opgeslagen." #: zypp/url/UrlBase.cc:154 #, c-format, boost-format msgid "Url scheme does not allow a %s" -msgstr "%s is niet toegestaan in URL-schema " +msgstr "%s is niet toegestaan in URL-schema" #: zypp/url/UrlBase.cc:173 #, c-format, boost-format @@ -449,11 +450,11 @@ msgstr "Ongeldig URL-schema '%s'" #: zypp/url/UrlBase.cc:949 msgid "Url scheme does not allow a username" -msgstr "Gebruikersnaam is niet toegestaan in URL-schema " +msgstr "Gebruikersnaam is niet toegestaan in URL-schema" #: zypp/url/UrlBase.cc:983 msgid "Url scheme does not allow a password" -msgstr "Wachtwoord is niet toegestaan in URL-schema " +msgstr "Wachtwoord is niet toegestaan in URL-schema" #: zypp/url/UrlBase.cc:1012 msgid "Url scheme requires a host component" @@ -461,7 +462,7 @@ msgstr "URL-schema vereist hostcomponent" #: zypp/url/UrlBase.cc:1022 msgid "Url scheme does not allow a host component" -msgstr "Hostcomponent is niet toegestaan in URL-schema " +msgstr "Hostcomponent is niet toegestaan in URL-schema" #: zypp/url/UrlBase.cc:1049 #, c-format, boost-format @@ -470,7 +471,7 @@ msgstr "Ongeldige hostcomponent '%s'" #: zypp/url/UrlBase.cc:1070 msgid "Url scheme does not allow a port" -msgstr "Poort is niet toegestaan in URL-schema " +msgstr "Poort is niet toegestaan in URL-schema" #: zypp/url/UrlBase.cc:1081 #, c-format, boost-format @@ -535,7 +536,7 @@ msgstr "Kan '%s' niet uitvoeren (%s)." #: zypp/ExternalProgram.cc:381 #, c-format, boost-format msgid "Can't fork (%s)." -msgstr "Kan geen fork doen (%s)." +msgstr "Kan geen fork (%s) uitvoeren." #: zypp/ExternalProgram.cc:507 #, c-format, boost-format @@ -604,7 +605,7 @@ msgstr "ongeldig" #: zypp/VendorSupportOptions.cc:39 msgid "The level of support is unspecified" -msgstr "Het ondersteuningsniveau is niet gedefiniëerd." +msgstr "Het ondersteuningsniveau is niet gedefinieerd" #: zypp/VendorSupportOptions.cc:42 msgid "The vendor does not provide support." @@ -740,7 +741,7 @@ msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" -msgstr "Aland Islands" +msgstr "Aland-eilanden" #. :ALA:248: #: zypp/CountryCode.cc:174 @@ -825,7 +826,7 @@ msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" -msgstr "Bouvet Island" +msgstr "Bouvet-eiland" #. :BVT:074: #: zypp/CountryCode.cc:191 @@ -850,7 +851,7 @@ msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" -msgstr "Cocos (Keeling) eilanden" +msgstr "Cocos(Keeling)eilanden" #. :CCK:166: #. :CAF:140: @@ -871,12 +872,12 @@ msgstr "Zwitserland" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" -msgstr "Cote D'Ivoire" +msgstr "Ivoorkust" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" -msgstr "Cook Islands" +msgstr "Cookeilanden" #. :COK:184: #: zypp/CountryCode.cc:202 @@ -916,7 +917,7 @@ msgstr "Kaapverdië" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" -msgstr "Christmas Eiland" +msgstr "Christmas-eiland" #. :CXR:162: #: zypp/CountryCode.cc:210 @@ -1080,7 +1081,7 @@ msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" -msgstr "Guinea" +msgstr "Guinee" #. :GIN:324: #: zypp/CountryCode.cc:243 @@ -1090,7 +1091,7 @@ msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" -msgstr "Equatoriaal Guinea" +msgstr "Equatoriaal-Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 @@ -1278,7 +1279,7 @@ msgstr "Kazachstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" -msgstr "Lao People's Democratic Republic" +msgstr "Democratische volksrepubliek Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 @@ -1353,11 +1354,11 @@ msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" -msgstr "Saint Martin" +msgstr "Sint-Maarten" #: zypp/CountryCode.cc:298 msgid "Madagascar" -msgstr "Madagascar" +msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 @@ -1387,7 +1388,7 @@ msgstr "Mongolië" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" -msgstr "Macao" +msgstr "Macau" #. :MAC:446: #: zypp/CountryCode.cc:305 @@ -1462,7 +1463,7 @@ msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" -msgstr "Norfolk Island" +msgstr "Norfolk eiland" #. :NFK:574: #: zypp/CountryCode.cc:320 @@ -1588,7 +1589,7 @@ msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" -msgstr "Reunion" +msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 @@ -1819,7 +1820,7 @@ msgstr "Oezbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" -msgstr "Holy See (Vatican City State)" +msgstr "Staat Vaticaanstad" #. :VAT:336: #: zypp/CountryCode.cc:391 @@ -1839,7 +1840,7 @@ msgstr "Britse Maagdeneilanden" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." -msgstr "Maagdeneilanden, VS" +msgstr "Maagdeneilanden, V.S." #. :VIR:850: #: zypp/CountryCode.cc:395 @@ -1919,7 +1920,7 @@ msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" -msgstr "Adyghe" +msgstr "Adygees" #. language code: afa #: zypp/LanguageCode.cc:173 @@ -1939,7 +1940,7 @@ msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" -msgstr "Ainu" +msgstr "Aino" #. language code: aka ak #: zypp/LanguageCode.cc:181 @@ -2109,7 +2110,7 @@ msgstr "Baskisch" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" -msgstr "Basa" +msgstr "Balinees" #. language code: bat #: zypp/LanguageCode.cc:255 diff --git a/zypp/Capabilities.h b/zypp/Capabilities.h index d1986f9..99026ed 100644 --- a/zypp/Capabilities.h +++ b/zypp/Capabilities.h @@ -74,6 +74,10 @@ namespace zypp /** Iterator pointing behind the last \ref Capability. */ const_iterator end() const; + public: + /** Return whether \a lhs matches at least one capability in set. */ + bool matches( const Capability & lhs ) const; + private: const sat::detail::IdType * _begin; }; @@ -165,6 +169,13 @@ namespace zypp inline Capabilities::const_iterator Capabilities::end() const { return const_iterator( 0 ); } + inline bool Capabilities::matches( const Capability & lhs ) const + { + for ( const Capability & rhs : *this ) + if ( lhs.matches( rhs ) == CapMatch::yes ) + return true; + return false; + } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// diff --git a/zypp/Pattern.cc b/zypp/Pattern.cc index 99c83a0..fb0049f 100644 --- a/zypp/Pattern.cc +++ b/zypp/Pattern.cc @@ -296,6 +296,117 @@ namespace zypp return result; } + /////////////////////////////////////////////////////////////////// + namespace + { + // Get packages referenced by depKeeper dependency. + inline void dependsSetDoCollect( sat::Solvable depKeeper_r, Dep dep_r, Pattern::Contents & set_r ) + { + CapabilitySet caps; + addCaps( caps, depKeeper_r, dep_r ); + sat::WhatProvides prv( caps ); + for ( ui::Selectable::Ptr sel : prv.selectable() ) + { + const PoolItem & pi( sel->theObj() ); + if ( pi.isKind() ) + set_r.insert( pi ); + } + } + + // Get packages referenced by depKeeper. + inline void dependsSet( sat::Solvable depKeeper_r, Pattern::ContentsSet & collect_r ) + { + dependsSetDoCollect( depKeeper_r, Dep::REQUIRES, collect_r.req ); + dependsSetDoCollect( depKeeper_r, Dep::RECOMMENDS, collect_r.rec ), + dependsSetDoCollect( depKeeper_r, Dep::SUGGESTS, collect_r.sug ); + } + + // Whether this is a patterns depkeeper. + inline bool isPatternsPackage( sat::Solvable depKeeper_r ) + { + static const Capability indicator( "pattern()" ); + return depKeeper_r.provides().matches( indicator ); + } + } // namespace + /////////////////////////////////////////////////////////////////// + void Pattern::contentsSet( ContentsSet & collect_r, bool recursively_r ) const + { + sat::Solvable depKeeper( autoPackage() ); // (my required) patterns-package + if ( ! depKeeper ) + return; + + // step 2 data + std::set recTodo; // recommended patterns-packages to process + std::set allDone; // patterns-packages already expanded + { + // step 1: Expand requirements, remember recommends.... + // step 1 data (scoped to step1) + std::set reqTodo; // required patterns-packages to process + + collect_r.req.insert( depKeeper );// collect the depKeeper + reqTodo.insert( depKeeper ); // and expand it... + + while ( ! reqTodo.empty() ) + { + // pop one patterns-package from todo + depKeeper = ( *reqTodo.begin() ); + reqTodo.erase( reqTodo.begin() ); + allDone.insert( depKeeper ); + + // collects stats + ContentsSet result; + dependsSet( depKeeper, result ); + + // evaluate result.... + for ( sat::Solvable solv : result.req ) // remember unprocessed required patterns-packages... + { + if ( collect_r.req.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) + reqTodo.insert( solv ); + } + for ( sat::Solvable solv : result.rec ) // remember unprocessed recommended patterns-packages... + { + if ( collect_r.rec.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) + recTodo.insert( solv ); + } + for ( sat::Solvable solv : result.sug ) // NOTE: We don't expand suggested patterns! + { + collect_r.sug.insert( solv ); + } + } + } + // step 2: All requirements are expanded, now check remaining recommends.... + while ( ! recTodo.empty() ) + { + // pop one patterns-package from todo + depKeeper = ( *recTodo.begin() ); + recTodo.erase( recTodo.begin() ); + if ( ! allDone.insert( depKeeper ).second ) + continue; // allready expanded (in requires) + + // collects stats + ContentsSet result; + dependsSet( depKeeper, result ); + + // evaluate result.... + for ( sat::Solvable solv : result.req ) // remember unprocessed required patterns-packages... + { + // NOTE: Requirements of recommended patterns count as 'recommended' + if ( collect_r.rec.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) + recTodo.insert( solv ); + } + for ( sat::Solvable solv : result.rec ) // remember unprocessed recommended patterns-packages... + { + if ( collect_r.rec.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) + recTodo.insert( solv ); + } + for ( sat::Solvable solv : result.sug ) // NOTE: We don't expand suggested patterns! + { + collect_r.sug.insert( solv ); + } + } + } + + ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// diff --git a/zypp/Pattern.h b/zypp/Pattern.h index 36b14a5..6d94263 100644 --- a/zypp/Pattern.h +++ b/zypp/Pattern.h @@ -96,6 +96,22 @@ namespace zypp Contents contentsNoSuggests() const { return contents( false ); } + public: + struct ContentsSet + { + Contents req; ///< required content set + Contents rec; ///< recommended content set + Contents sug; ///< suggested content set + }; + /** Dependency based content set (does not evaluate includes/extends relation). + * If \a recursively_r, required and recommended + * patterns are recursively expanded. + */ + void contentsSet( ContentsSet & collect_r, bool recursively_r = false ) const; + /** \overload Convenience for recursively expanded contentsSet */ + void fullContentsSet( ContentsSet & collect_r ) const + { return contentsSet( collect_r, /*recursively_r*/true ); } + protected: friend Ptr make( const sat::Solvable & solvable_r ); /** Ctor */ diff --git a/zypp/ResStatus.h b/zypp/ResStatus.h index 499abc0..a7e7dd3 100644 --- a/zypp/ResStatus.h +++ b/zypp/ResStatus.h @@ -191,6 +191,9 @@ namespace zypp bool isUnneeded() const { return _bitfield.test( UNNEEDED ); } + bool hasWeak() const + { return ! fieldValueIs( NO_WEAK ); } + void resetWeak() { return fieldValueAssign( NO_WEAK ); } diff --git a/zypp/base/String.h b/zypp/base/String.h index 7915f8b..010b824 100644 --- a/zypp/base/String.h +++ b/zypp/base/String.h @@ -217,6 +217,7 @@ namespace zypp { _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; } diff --git a/zypp/sat/SolvableSet.h b/zypp/sat/SolvableSet.h index e4a8391..cd177bc 100644 --- a/zypp/sat/SolvableSet.h +++ b/zypp/sat/SolvableSet.h @@ -30,7 +30,7 @@ namespace zypp // // CLASS NAME : SolvableSet // - /** Solvable set wrapper to allow adding additioanal convenience iterators. + /** Solvable set wrapper to allow adding additional convenience iterators. */ class SolvableSet : public SolvIterMixin::const_iterator> { @@ -77,14 +77,22 @@ namespace zypp { return _pimpl->end(); } public: + /** Clear the container */ + void clear() + { get().clear(); } /** Insert a Solvable. * \return \c true if it was actually inserted, or \c false if already present. - */ + */ template bool insert( const TSolv & solv_r ) { return get().insert( asSolvable()( solv_r ) ).second; } + /** Insert a range of Solvables. */ + template + void insert( TIterator begin_r, TIterator end_r ) + { for_( it, begin_r, end_r ) insert( *it ); } + public: /** The set. */ Container & get() -- 2.7.4