Imported Upstream version 16.1.0 14/94714/1
authorDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 1 Nov 2016 02:12:34 +0000 (11:12 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Tue, 1 Nov 2016 02:12:35 +0000 (11:12 +0900)
Change-Id: Id5063ba2eff49da11ed8d6eb11631edae0e3d748
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
VERSION.cmake
package/libzypp.changes
po/nl.po
zypp/Capabilities.h
zypp/Pattern.cc
zypp/Pattern.h
zypp/ResStatus.h
zypp/base/String.h
zypp/sat/SolvableSet.h

index 86fcf87..a65f194 100644 (file)
@@ -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)
 #=======
index 64c609d..4b94ad5 100644 (file)
@@ -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)
index c1be2f6..745fa93 100644 (file)
--- 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 <freek@opensuse.org>\n"
-"Language-Team: Dutch <opensuse-nl@opensuse.org>\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"
 "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
index d1986f9..99026ed 100644 (file)
@@ -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
 ///////////////////////////////////////////////////////////////////
index 99c83a0..fb0049f 100644 (file)
@@ -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<Package>() )
+         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<sat::Solvable> recTodo;   // recommended patterns-packages to process
+    std::set<sat::Solvable> allDone;   // patterns-packages already expanded
+    {
+      // step 1: Expand requirements, remember recommends....
+      // step 1 data (scoped to step1)
+      std::set<sat::Solvable> 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
 ///////////////////////////////////////////////////////////////////
index 36b14a5..6d94263 100644 (file)
@@ -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<Self>( const sat::Solvable & solvable_r );
       /** Ctor */
index 499abc0..a7e7dd3 100644 (file)
@@ -191,6 +191,9 @@ namespace zypp
     bool isUnneeded() const
     { return _bitfield.test( UNNEEDED ); }
 
+    bool hasWeak() const
+    { return ! fieldValueIs<WeakField>( NO_WEAK ); }
+
     void resetWeak()
     { return fieldValueAssign<WeakField>( NO_WEAK ); }
 
index 7915f8b..010b824 100644 (file)
@@ -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; }
index e4a8391..cd177bc 100644 (file)
@@ -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<SolvableSet,std::unordered_set<Solvable>::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<class TSolv>
        bool insert( const TSolv & solv_r )
        { return get().insert( asSolvable()( solv_r ) ).second; }
 
+       /** Insert a range of Solvables. */
+       template<class TIterator>
+       void insert( TIterator begin_r, TIterator end_r )
+       { for_( it, begin_r, end_r ) insert( *it ); }
+
       public:
         /** The set. */
         Container & get()