Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / zypp / Package.cc
index 723ad1a..db58620 100644 (file)
@@ -9,7 +9,18 @@
 /** \file      zypp/Package.cc
  *
 */
+#include <iostream>
+#include <fstream>
+
+#include "zypp/base/Logger.h"
+#include "zypp/base/String.h"
 #include "zypp/Package.h"
+#include "zypp/sat/LookupAttr.h"
+#include "zypp/ZYppFactory.h"
+#include "zypp/target/rpm/RpmDb.h"
+#include "zypp/target/rpm/RpmHeader.h"
+
+using namespace std;
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
@@ -34,92 +45,169 @@ namespace zypp
   Package::~Package()
   {}
 
-  ///////////////////////////////////////////////////////////////////
-  //
-  //   Package interface forwarded to implementation
-  //
-  ///////////////////////////////////////////////////////////////////
+  VendorSupportOption Package::vendorSupport() const
+  {
+    static const IdString support_unsupported( "support_unsupported" );
+    static const IdString support_acc( "support_acc" );
+    static const IdString support_l1( "support_l1" );
+    static const IdString support_l2( "support_l2" );
+    static const IdString support_l3( "support_l3" );
+
+    VendorSupportOption ret( VendorSupportUnknown );
+    // max over all identical packages
+    for ( const auto & solv : sat::WhatProvides( (Capability(ident().id())) ) )
+    {
+      if ( solv.edition() == edition()
+       && solv.ident() == ident()
+       && identical( solv ) )
+      {
+       for ( PackageKeyword kw : Keywords( sat::SolvAttr::keywords, solv ) )
+       {
+         switch ( ret )
+         {
+           case VendorSupportUnknown:
+             if ( kw == support_unsupported )  { ret = VendorSupportUnsupported; break; }
+           case VendorSupportUnsupported:
+             if ( kw == support_acc )  { ret = VendorSupportACC; break; }
+           case VendorSupportACC:
+             if ( kw == support_l1 )   { ret = VendorSupportLevel1; break; }
+           case VendorSupportLevel1:
+             if ( kw == support_l2 )   { ret = VendorSupportLevel2; break; }
+           case VendorSupportLevel2:
+             if ( kw == support_l3 )   { return VendorSupportLevel3; break; }
+           case VendorSupportLevel3:
+             /* make gcc happy */ break;
+         }
+       }
+      }
+    }
+    return ret;
+  }
+
+  bool Package::maybeUnsupported() const
+  {
+    static const VendorSupportOptions unsupportedOpts( VendorSupportUnknown
+                                                    | VendorSupportUnsupported
+                                                    | VendorSupportACC );
+    return unsupportedOpts.testFlag( vendorSupport() );
+  }
 
   Changelog Package::changelog() const
-  { return Changelog(); }
+  {
+      Target_Ptr target( getZYpp()->getTarget() );
+      if ( ! target )
+      {
+        ERR << "Target not initialized. Changelog is not available." << std::endl;
+        return Changelog();
+      }
+
+      if ( repository().isSystemRepo() )
+      {
+          target::rpm::RpmHeader::constPtr header;
+          target->rpmDb().getData(name(), header);
+          return header ? header->tag_changelog() : Changelog(); // might be deleted behind our back (bnc #530595)
+      }
+      WAR << "changelog is not available for uninstalled packages" << std::endl;
+      return Changelog();
+  }
 
-  /** */
   std::string Package::buildhost() const
-  { return std::string(); }
+  { return lookupStrAttribute( sat::SolvAttr::buildhost ); }
 
-  /** */
   std::string Package::distribution() const
-  { return std::string(); }
+  { return lookupStrAttribute( sat::SolvAttr::distribution ); }
 
-  /** */
-  Label Package::license() const
-  { return Label(); }
+  std::string Package::license() const
+  { return lookupStrAttribute( sat::SolvAttr::license ); }
 
-  /** */
   std::string Package::packager() const
-  { return std::string(); }
+  { return lookupStrAttribute( sat::SolvAttr::packager ); }
 
-  /** */
-  PackageGroup Package::group() const
-  { return PackageGroup(); }
+  std::string Package::group() const
+  { return lookupStrAttribute( sat::SolvAttr::group ); }
 
   Package::Keywords Package::keywords() const
-  { return Keywords(); }
+  { return Keywords( sat::SolvAttr::keywords, satSolvable() ); }
 
-  /** Don't ship it as class Url, because it might be
-   * in fact anything but a legal Url. */
   std::string Package::url() const
-  { return std::string(); }
-
-  /** */
-  std::string Package::os() const
-  { return std::string(); }
-
-  /** */
-  Text Package::prein() const
-  { return Text(); }
-
-  /** */
-  Text Package::postin() const
-  { return Text(); }
+  { return lookupStrAttribute( sat::SolvAttr::url ); }
 
-  /** */
-  Text Package::preun() const
-  { return Text(); }
-
-  /** */
-  Text Package::postun() const
-  { return Text(); }
-
-  /** */
   ByteCount Package::sourcesize() const
-  { return ByteCount(); }
+  { return lookupNumAttribute( sat::SolvAttr::sourcesize ); }
 
-  /** */
   std::list<std::string> Package::authors() const
-  { return std::list<std::string>(); }
+  {
+    std::list<std::string> ret;
+    str::split( lookupStrAttribute( sat::SolvAttr::authors ), std::back_inserter(ret), "\n" );
+    return ret;
+  }
 
-  /** */
-  std::list<std::string> Package::filenames() const
-  { return std::list<std::string>(); }
+  Package::FileList Package::filelist() const
+  { return FileList( sat::SolvAttr::filelist, satSolvable() ); }
+
+  CheckSum Package::checksum() const
+  { return lookupCheckSumAttribute( sat::SolvAttr::checksum ); }
 
   OnMediaLocation Package::location() const
+  { return lookupLocation(); }
+
+  namespace
+  {
+    bool schemeIsLocalDir( const Url & url_r )
+    {
+      std::string s( url_r.getScheme() );
+      return s == "dir" || s == "file";
+    }
+  }
+
+  Pathname Package::cachedLocation() const
   {
-    OnMediaLocation loc;
-    unsigned medianr;
-    std::string filename = lookupLocation( medianr );
-    /* XXX someone else needs to do this prepending of the datadir.
-       It's not necessarily "suse".  */
-    filename = "suse/" + filename;
-    loc.setLocation(filename, medianr);
-    return loc;
+    OnMediaLocation loc( location() );
+    PathInfo pi( repoInfo().packagesPath() / loc.filename() );
+
+    if ( ! pi.isExist() )
+      return Pathname();       // no file in cache
+
+    if ( loc.checksum().empty() )
+    {
+      Url url( repoInfo().url() );
+      if ( ! schemeIsLocalDir( url ) )
+       return Pathname();      // same name but no checksum to verify
+
+      // for local repos compare with the checksum in repo
+      if ( CheckSum( CheckSum::md5Type(), std::ifstream( (url.getPathName() / loc.filename()).c_str() ) )
+       != CheckSum( CheckSum::md5Type(), std::ifstream( pi.c_str() ) ) )
+       return Pathname();      // same name but wrong checksum
+    }
+    else
+    {
+      if ( loc.checksum() != CheckSum( loc.checksum().type(), std::ifstream( pi.c_str() ) ) )
+       return Pathname();      // same name but wrong checksum
+    }
+
+    return pi.path();          // the right one
   }
 
   std::string Package::sourcePkgName() const
-  { return std::string(); }
+  {
+    // no id means same as package
+    sat::detail::IdType id( lookupIdAttribute( sat::SolvAttr::sourcename ) );
+    return id ? IdString( id ).asString() : name();
+  }
 
   Edition Package::sourcePkgEdition() const
-  { return Edition(); }
+  {
+   // no id means same as package
+    sat::detail::IdType id( lookupIdAttribute( sat::SolvAttr::sourceevr ) );
+    return id ? Edition( id ) : edition();
+  }
+
+  std::string Package::sourcePkgType() const
+  { return lookupStrAttribute( sat::SolvAttr::sourcearch ); }
+
+  std::string Package::sourcePkgLongName() const
+  { return str::form( "%s-%s.%s", sourcePkgName().c_str(), sourcePkgEdition().c_str(), sourcePkgType().c_str() ); }
+
 
   /////////////////////////////////////////////////////////////////
 } // namespace zypp