Fix susetags repo to parse dikusage data (#293039)
authorMichael Andres <ma@suse.de>
Fri, 3 Aug 2007 21:48:30 +0000 (21:48 +0000)
committerMichael Andres <ma@suse.de>
Fri, 3 Aug 2007 21:48:30 +0000 (21:48 +0000)
VERSION.cmake
devel/devel.ma/Test.cc
zypp/CMakeLists.txt
zypp/data/ResolvableData.h
zypp/parser/susetags/PackagesDuFileReader.cc [new file with mode: 0644]
zypp/parser/susetags/PackagesDuFileReader.h [new file with mode: 0644]
zypp/parser/susetags/RepoParser.cc

index a17be34..3721309 100644 (file)
@@ -47,4 +47,4 @@
 SET(LIBZYPP_MAJOR "3")
 SET(LIBZYPP_MINOR "13")
 SET(LIBZYPP_COMPATMINOR "13")
-SET(LIBZYPP_PATCH "11")
+SET(LIBZYPP_PATCH "12")
index ebed466..089a73c 100644 (file)
 #include <zypp/CheckSum.h>
 #include <zypp/Date.h>
 
+#include "zypp/parser/TagParser.h"
+#include "zypp/parser/susetags/PackagesFileReader.h"
+#include "zypp/parser/susetags/PackagesLangFileReader.h"
+#include "zypp/parser/susetags/PatternFileReader.h"
+#include "zypp/parser/susetags/ContentFileReader.h"
+#include "zypp/parser/susetags/RepoIndex.h"
+#include "zypp/parser/susetags/RepoParser.h"
 #include "zypp/cache/CacheStore.h"
-#include <zypp/DiskUsage.h>
 
 using namespace std;
 using namespace zypp;
+using namespace zypp::parser;
+using namespace zypp::parser::susetags;
 
 ///////////////////////////////////////////////////////////////////
 
+struct DummyConsumer : public zypp::data::ResolvableDataConsumer
+                     , private base::NonCopyable
+{
+  std::string idString( const data::ResObject_Ptr & res_r, ResolvableTraits::KindType kind_r )
+  {
+    std::string ret( kind_r.asString() );
+    ret += ":";
+    ret += res_r->name;
+    ret += "-";
+    ret += res_r->edition.asString();
+    ret += ".";
+    ret += res_r->arch.asString();
+    return ret;
+  }
+
+  data::RecordId                       _lastId;
+  std::map<std::string,data::RecordId> _idMap;
+  std::map<data::RecordId,std::string> _reverseMap;
+
+  bool hasEntry( const std::string & id_r )
+  {
+    return _idMap.find( id_r ) != _idMap.end();
+  }
+
+  data::RecordId newId( const data::ResObject_Ptr & res_r, ResolvableTraits::KindType kind_r )
+  {
+    std::string id( idString( res_r, kind_r ) );
+    if ( hasEntry( id ) )
+      ZYPP_THROW(Exception(id));
+    _idMap[id] = ++_lastId;
+    _reverseMap[_lastId] = id;
+    MIL << "NEW_ID " << _lastId << " - " << id << endl;
+    logNew( res_r, kind_r );
+    return _lastId;
+  }
+
+  data::RecordId getId( const data::ResObject_Ptr & res_r, ResolvableTraits::KindType kind_r )
+  {
+    std::string id( idString( res_r, kind_r ) );
+    if ( ! hasEntry( id ) )
+      ZYPP_THROW(Exception(id));
+    data::RecordId ret = _idMap[id];
+    DBG << ret << " " << id << endl;
+    return ret;
+  }
+
+  std::string lookup( data::RecordId id_r )
+  {
+    if ( id_r == data::noRecordId )
+    {
+      return "";
+    }
+
+    if ( _reverseMap.find( id_r ) != _reverseMap.end() )
+    {
+      return _reverseMap[id_r];
+    }
+
+    WAR << "Lookup id " << id_r << "failed" << endl;
+    return std::string();
+  }
+
+  //
+  void logNew( const data::ResObject_Ptr & res_r, ResolvableTraits::KindType kind_r )
+  {
+    std::string shr( lookup( res_r->shareDataWith ) );
+  }
+
+  public:
+
+  virtual data::RecordId consumePackage( const data::RecordId & repository_id, const data::Package_Ptr & res_r )
+  {
+    return newId( res_r, ResTraits<Package>::kind );
+  }
+
+  virtual data::RecordId consumeSourcePackage( const data::RecordId & repository_id, const data::SrcPackage_Ptr & res_r )
+  {
+    return newId( res_r, ResTraits<SrcPackage>::kind );
+  }
+
+  virtual data::RecordId consumeProduct      ( const data::RecordId & repository_id, const data::Product_Ptr & res_r )
+  {
+    return newId( res_r, ResTraits<Product>::kind );
+  }
+
+  virtual data::RecordId consumePatch        ( const data::RecordId & repository_id, const data::Patch_Ptr & res_r )
+  {
+    return newId( res_r, ResTraits<Patch>::kind );
+  }
+
+  virtual data::RecordId consumePackageAtom  ( const data::RecordId & repository_id, const data::PackageAtom_Ptr & res_r )
+  {
+    return newId( res_r, ResTraits<Atom>::kind );
+  }
+
+  virtual data::RecordId consumeMessage      ( const data::RecordId & repository_id, const data::Message_Ptr & res_r )
+  {
+    return newId( res_r, ResTraits<Message>::kind );
+  }
+
+  virtual data::RecordId consumeScript       ( const data::RecordId & repository_id, const data::Script_Ptr & res_r )
+  {
+    return newId( res_r, ResTraits<Script>::kind );
+  }
+
+  virtual data::RecordId consumePattern      ( const data::RecordId & repository_id, const data::Pattern_Ptr & res_r )
+  {
+    return newId( res_r, ResTraits<Pattern>::kind );
+  }
+
+  virtual data::RecordId consumeChangelog    ( const data::RecordId & repository_id, const Changelog & )
+  { return data::RecordId(); }
+
+  virtual data::RecordId consumeFilelist     ( const data::RecordId & repository_id, const data::Filenames & )
+  { return data::RecordId(); }
+
+  virtual void consumeDiskUsage    ( const data::RecordId & repository_id, const DiskUsage & du )
+  {
+    ERR << lookup( repository_id ) << endl;
+    WAR << du << endl;
+    return;
+  }
+
+
+  void updatePackageLang( const data::RecordId & resolvable_id,
+                         const data::Packagebase_Ptr & data_r )
+  {
+    return;
+    SEC << lookup( resolvable_id ) << endl;
+    INT << "  " << data_r->summary.text() << endl;
+    INT << "  " << data_r->summary.text( Locale("en") ) << endl;
+    if ( data_r->licenseToConfirm.locales().size() )
+    {
+      INT << "  " << data_r->licenseToConfirm.text() << endl;
+      INT << "  " << data_r->licenseToConfirm.text( Locale("en") ) << endl;
+      INT << "  " << data_r->licenseToConfirm.locales() << endl;
+    }
+ }
+};
 
 /******************************************************************
 **
@@ -37,9 +184,10 @@ int main( int argc, char * argv[] )
 {
   INT << "===[START]==========================================" << endl;
 
-  DiskUsage a;
-  MIL << a << endl;
+  DummyConsumer dummy;
+  RepoParser parser( data::RecordId(), dummy );
 
+  parser.parse( "REPO" );
 
   INT << "===[END]============================================" << endl << endl;
   return 0;
index 0c36539..7077c73 100644 (file)
@@ -448,6 +448,7 @@ SET( zypp_parser_susetags_SRCS
   parser/susetags/ContentFileReader.cc
   parser/susetags/PackagesFileReader.cc
   parser/susetags/PackagesLangFileReader.cc
+  parser/susetags/PackagesDuFileReader.cc
   parser/susetags/PatternFileReader.cc
   parser/susetags/RepoParser.cc
 )
@@ -459,6 +460,7 @@ SET( zypp_parser_susetags_HEADERS
   parser/susetags/FileReaderBaseImpl.h
   parser/susetags/PackagesFileReader.h
   parser/susetags/PackagesLangFileReader.h
+  parser/susetags/PackagesDuFileReader.h
   parser/susetags/PatternFileReader.h
   parser/susetags/RepoParser.h
 )
index e0bcaae..0ddf126 100644 (file)
@@ -32,6 +32,7 @@
 #include "zypp/Date.h"
 #include "zypp/TranslatedText.h"
 #include "zypp/OnMediaLocation.h"
+#include "zypp/DiskUsage.h"
 
 namespace zypp
 {
@@ -322,6 +323,7 @@ namespace data
       std::string postun;
 
       OnMediaLocation repositoryLocation;
+      DiskUsage       diskusage;
   };
 
   DEFINE_PTR_TYPE(Package);
diff --git a/zypp/parser/susetags/PackagesDuFileReader.cc b/zypp/parser/susetags/PackagesDuFileReader.cc
new file mode 100644 (file)
index 0000000..201867f
--- /dev/null
@@ -0,0 +1,245 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/parser/susetags/PackagesDuFileReader.cc
+ *
+*/
+#include <iostream>
+#include "zypp/base/Easy.h"
+#include "zypp/base/Logger.h"
+
+#include "zypp/parser/susetags/PackagesDuFileReader.h"
+#include "zypp/parser/susetags/FileReaderBaseImpl.h"
+
+using std::endl;
+#undef  ZYPP_BASE_LOGGER_LOGGROUP
+#define ZYPP_BASE_LOGGER_LOGGROUP "parser::susetags"
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+  ///////////////////////////////////////////////////////////////////
+  namespace parser
+  { /////////////////////////////////////////////////////////////////
+    ///////////////////////////////////////////////////////////////////
+    namespace susetags
+    { /////////////////////////////////////////////////////////////////
+
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       CLASS NAME : PackagesDuFileReader::Impl
+      //
+      /** PackagesDuFileReader implementation. */
+      class PackagesDuFileReader::Impl : public BaseImpl
+      {
+       public:
+         Impl( const PackagesDuFileReader & parent_r )
+         : BaseImpl( parent_r )
+         {}
+
+         virtual ~Impl()
+         {}
+
+         bool hasPackage() const
+         { return _pkgData; }
+
+         bool hasSourcepackage() const
+         { return _srcpkgData; }
+
+         data::Package_Ptr handoutPackage()
+         {
+           data::Package_Ptr ret;
+           ret.swap( _pkgData );
+           _srcpkgData = 0;
+           _data       = 0;
+           return ret;
+         }
+
+         data::SrcPackage_Ptr handoutSourcepackage()
+         {
+           data::SrcPackage_Ptr ret;
+           ret.swap( _srcpkgData );
+           _pkgData = 0;
+           _data    = 0;
+           return ret;
+         }
+
+       public: // single tags
+         /** Consume =Ver:. */
+         void consumeVer( const SingleTagPtr & tag_r )
+         { /* NOP */; }
+
+         /** Consume =Pkg:. */
+         void consumePkg( const SingleTagPtr & tag_r )
+         {
+           std::vector<std::string> words;
+           if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
+           {
+             ZYPP_THROW( error( tag_r, "Expected [name version release arch]") );
+           }
+
+           if ( words[3] == "src" || words[3] == "nosrc")
+           {
+             ++_c_srcpkg;
+             _data = _srcpkgData = new data::SrcPackage;
+             _pkgData = 0;
+             // _data->arch is arch_noarch per default
+           }
+           else
+           {
+             ++_c_pkg;
+             _data = _pkgData = new data::Package;
+             _srcpkgData = 0;
+             _data->arch = Arch( words[3] );
+           }
+           _data->name    = words[0];
+           _data->edition = Edition( words[1],words[2] );
+         }
+
+
+       public: // multi tags
+         /** Consume +Dir:. */
+         void consumeDir( const MultiTagPtr & tag_r )
+         {
+            static str::regex  sizeEntryRX( "^(.*/)[[:space:]]+([[:digit:]]+)[[:space:]]+([[:digit:]]+)[[:space:]]+([[:digit:]]+)[[:space:]]+([[:digit:]]+)[[:space:]]*$" );
+            static str::smatch what;
+
+            _data->diskusage;
+
+            for_( it, tag_r->value.begin(), tag_r->value.end() )
+            {
+              if ( str::regex_match( *it, what, sizeEntryRX, str::match_extra ) )
+              {
+                _data->diskusage.add( what[1],
+                                      str::strtonum<unsigned>(what[2]) + str::strtonum<unsigned>(what[3]),
+                                      str::strtonum<unsigned>(what[4]) + str::strtonum<unsigned>(what[5]) );
+              }
+              else
+              {
+                ZYPP_THROW( error( tag_r, "Expected du-entry [path num num num num]") );
+              }
+            }
+         }
+
+       public:
+         DefaultIntegral<unsigned,0> _c_pkg;
+         DefaultIntegral<unsigned,0> _c_srcpkg;
+
+       private:
+         data::Packagebase_Ptr   _data;
+         data::Package_Ptr       _pkgData;
+         data::SrcPackage_Ptr    _srcpkgData;
+      };
+      ///////////////////////////////////////////////////////////////////
+
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       CLASS NAME : PackagesDuFileReader
+      //
+      ///////////////////////////////////////////////////////////////////
+
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       METHOD NAME : PackagesDuFileReader::PackagesDuFileReader
+      //       METHOD TYPE : Ctor
+      //
+      PackagesDuFileReader::PackagesDuFileReader()
+      {}
+
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       METHOD NAME : PackagesDuFileReader::~PackagesDuFileReader
+      //       METHOD TYPE : Dtor
+      //
+      PackagesDuFileReader::~PackagesDuFileReader()
+      {}
+
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       METHOD NAME : PackagesDuFileReader::beginParse
+      //       METHOD TYPE : void
+      //
+      void PackagesDuFileReader::beginParse()
+      {
+       _pimpl.reset( new Impl(*this) );
+      }
+
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       METHOD NAME : PackagesDuFileReader::consume
+      //       METHOD TYPE : void
+      //
+      void PackagesDuFileReader::consume( const SingleTagPtr & tag_r )
+      {
+#define TAGN(V)   tag_r->name == #V
+#define TAGFWD(V) ( TAGN(V) ) _pimpl->consume##V( tag_r )
+
+       if ( TAGN( Pkg ) )
+       {
+         // consume old data
+         if ( _pimpl->hasPackage() )
+         {
+           if ( _pkgConsumer )
+             _pkgConsumer( _pimpl->handoutPackage() );
+         }
+         else if ( _pimpl->hasSourcepackage() )
+         {
+           if ( _srcPkgConsumer )
+             _srcPkgConsumer( _pimpl->handoutSourcepackage() );
+         }
+         // start new data
+         _pimpl->consumePkg( tag_r );
+       }
+       else if TAGFWD( Ver );
+       else
+       { WAR << errPrefix( tag_r, "Unknown tag" ) << endl; }
+      }
+
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       METHOD NAME : PackagesDuFileReader::consume
+      //       METHOD TYPE : void
+      //
+      void PackagesDuFileReader::consume( const MultiTagPtr & tag_r )
+      {
+       if TAGFWD( Dir );
+       else
+       { WAR << errPrefix( tag_r, "Unknown tag" ) << endl; }
+      }
+
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       METHOD NAME : PackagesDuFileReader::lastData
+      //       METHOD TYPE : void
+      //
+      void PackagesDuFileReader::endParse()
+      {
+        // consume oldData
+       if ( _pimpl->hasPackage() )
+       {
+         if ( _pkgConsumer )
+           _pkgConsumer( _pimpl->handoutPackage() );
+       }
+       else if ( _pimpl->hasSourcepackage() )
+       {
+         if ( _srcPkgConsumer )
+           _srcPkgConsumer( _pimpl->handoutSourcepackage() );
+       }
+       MIL << "[PackagesDu]" << "(" << _pimpl->_c_pkg << "|" << _pimpl->_c_srcpkg << ")" << endl;
+       _pimpl.reset();
+      }
+
+      /////////////////////////////////////////////////////////////////
+    } // namespace susetags
+    ///////////////////////////////////////////////////////////////////
+    /////////////////////////////////////////////////////////////////
+  } // namespace parser
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
diff --git a/zypp/parser/susetags/PackagesDuFileReader.h b/zypp/parser/susetags/PackagesDuFileReader.h
new file mode 100644 (file)
index 0000000..1c74afc
--- /dev/null
@@ -0,0 +1,94 @@
+/*---------------------------------------------------------------------\
+|                          ____ _   __ __ ___                          |
+|                         |__  / \ / / . \ . \                         |
+|                           / / \ V /|  _/  _/                         |
+|                          / /__ | | | | | |                           |
+|                         /_____||_| |_| |_|                           |
+|                                                                      |
+\---------------------------------------------------------------------*/
+/** \file      zypp/parser/susetags/PackagesDuFileReader.h
+ *
+*/
+#ifndef ZYPP_PARSER_SUSETAGS_PACKAGESDUFILEREADER_H
+#define ZYPP_PARSER_SUSETAGS_PACKAGESDUFILEREADER_H
+
+#include <iosfwd>
+
+#include "zypp/parser/susetags/FileReaderBase.h"
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+
+  ///////////////////////////////////////////////////////////////////
+  namespace data
+  { /////////////////////////////////////////////////////////////////
+    class Package;
+    DEFINE_PTR_TYPE(Package);
+    class SrcPackage;
+    DEFINE_PTR_TYPE(SrcPackage);
+    /////////////////////////////////////////////////////////////////
+  } // namespace data
+  ///////////////////////////////////////////////////////////////////
+
+  ///////////////////////////////////////////////////////////////////
+  namespace parser
+  { /////////////////////////////////////////////////////////////////
+    ///////////////////////////////////////////////////////////////////
+    namespace susetags
+    { /////////////////////////////////////////////////////////////////
+
+      ///////////////////////////////////////////////////////////////////
+      //
+      //       CLASS NAME : PackagesDuFileReader
+      //
+      /** */
+      class PackagesDuFileReader : public FileReaderBase
+      {
+       public:
+         typedef function<void(const data::Package_Ptr &)> PkgConsumer;
+         typedef function<void(const data::SrcPackage_Ptr &)> SrcPkgConsumer;
+
+       public:
+         /** Default ctor */
+         PackagesDuFileReader();
+         /** Dtor */
+         virtual ~PackagesDuFileReader();
+
+       public:
+         /** Consumer to call when a (binary) package entry was parsed. */
+         void setPkgConsumer( const PkgConsumer & fnc_r )
+         { _pkgConsumer = fnc_r; }
+
+         /** Consumer to call when a (source) package entry was parsed. */
+         void setSrcPkgConsumer( const SrcPkgConsumer & fnc_r )
+         { _srcPkgConsumer = fnc_r; }
+
+       private:
+         /** Called when start parsing. */
+         virtual void beginParse();
+         /** Called when a single-tag is found. */
+         virtual void consume( const SingleTagPtr & tag_r );
+         /** Called when a multi-tag is found. */
+         virtual void consume( const MultiTagPtr & tag_r );
+         /** Called when the parse is done. */
+         virtual void endParse();
+
+       private:
+         class Impl;
+         RW_pointer<Impl,rw_pointer::Scoped<Impl> > _pimpl;
+         PkgConsumer      _pkgConsumer;
+         SrcPkgConsumer   _srcPkgConsumer;
+      };
+      ///////////////////////////////////////////////////////////////////
+
+      /////////////////////////////////////////////////////////////////
+    } // namespace susetags
+    ///////////////////////////////////////////////////////////////////
+    /////////////////////////////////////////////////////////////////
+  } // namespace parser
+  ///////////////////////////////////////////////////////////////////
+  /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_PARSER_SUSETAGS_PACKAGESDUFILEREADER_H
index 65269b0..7e319fe 100644 (file)
@@ -22,6 +22,7 @@
 #include "zypp/parser/susetags/ContentFileReader.h"
 #include "zypp/parser/susetags/PackagesFileReader.h"
 #include "zypp/parser/susetags/PackagesLangFileReader.h"
+#include "zypp/parser/susetags/PackagesDuFileReader.h"
 #include "zypp/parser/susetags/PatternFileReader.h"
 #include "zypp/parser/susetags/RepoIndex.h"
 #include "zypp/parser/ParseException.h"
@@ -146,6 +147,32 @@ namespace zypp
          }
 
          ///////////////////////////////////////////////////////////////////
+         void consumePkgDu( const data::Package_Ptr & data_r )
+          {
+           data::RecordId id = idMapGet( makeSharedIdent( ResTraits<Package>::kind,
+                                                          data_r->name,
+                                                          data_r->edition,
+                                                          data_r->arch ) );
+           if ( id != data::noRecordId )
+           {
+             _consumer.consumeDiskUsage( id, data_r->diskusage );
+           }
+         }
+
+         ///////////////////////////////////////////////////////////////////
+          void consumeSrcPkgDu( const data::SrcPackage_Ptr & data_r )
+          {
+           data::RecordId id = idMapGet( makeSharedIdent( ResTraits<SrcPackage>::kind,
+                                                          data_r->name,
+                                                          data_r->edition,
+                                                          data_r->arch ) );
+           if ( id != data::noRecordId )
+           {
+             _consumer.consumeDiskUsage( id, data_r->diskusage );
+           }
+         }
+
+         ///////////////////////////////////////////////////////////////////
           void consumePat( const data::Pattern_Ptr & data_r )
           {
             //SEC << "[Pattern]" << data_r << endl;
@@ -385,8 +412,8 @@ namespace zypp
           reader.setPkgConsumer( bind( &Impl::consumePkg, this, _1 ) );
           reader.setSrcPkgConsumer( bind( &Impl::consumeSrcPkg, this, _1 ) );
 
-          CombinedProgressData packageprogress( _ticks, PathInfo(inputfile).size() );
-          reader.parse( inputfile, packageprogress );
+          CombinedProgressData progress( _ticks, PathInfo(inputfile).size() );
+          reader.parse( inputfile, progress );
         }
 
         // Now process packages.lang. Always parse 'en'.
@@ -398,6 +425,17 @@ namespace zypp
        // some fallback, if locale is not present.
        parseLocaleIf( ZConfig::instance().textLocale() );
 
+        // Now process packages.DU.
+        {
+          Pathname inputfile( getOptionalFile( _descrdir / "packages.DU" ) );
+          PackagesDuFileReader reader;
+          reader.setPkgConsumer( bind( &Impl::consumePkgDu, this, _1 ) );
+          reader.setSrcPkgConsumer( bind( &Impl::consumeSrcPkgDu, this, _1 ) );
+
+          CombinedProgressData progress( _ticks, PathInfo(inputfile).size() );
+          reader.parse( inputfile, progress );
+        }
+
         // Now process the rest of RepoIndex
        for ( RepoIndex::FileChecksumMap::const_iterator it = _repoIndex->metaFileChecksums.begin();
              it != _repoIndex->metaFileChecksums.end(); ++it )
@@ -409,8 +447,8 @@ namespace zypp
            {
              PatternFileReader reader;
              reader.setConsumer( bind( &Impl::consumePat, this, _1 ) );
-              CombinedProgressData patternprogress( _ticks, PathInfo(inputfile).size()  );
-             reader.parse( inputfile, patternprogress );
+              CombinedProgressData progress( _ticks, PathInfo(inputfile).size()  );
+             reader.parse( inputfile, progress );
            }
           }
         }