- merge repomd branch
authorpmatilai <pmatilai>
Sun, 19 Mar 2006 10:16:06 +0000 (10:16 +0000)
committerpmatilai <pmatilai>
Sun, 19 Mar 2006 10:16:06 +0000 (10:16 +0000)
36 files changed:
Makefile.in
aclocal.m4
apt-pkg/Makefile.am
apt-pkg/Makefile.in
apt-pkg/acquire-item.cc
apt-pkg/acquire-item.h
apt-pkg/acquire-worker.cc
apt-pkg/acquire.cc
apt-pkg/acquire.h
apt-pkg/indexfile.h
apt-pkg/init.cc
apt-pkg/pkgrecords.cc
apt-pkg/pkgsystem.h
apt-pkg/repository.h
apt-pkg/rpm/repomd.cc [new file with mode: 0644]
apt-pkg/rpm/repomd.h [new file with mode: 0644]
apt-pkg/rpm/rpmhandler.cc
apt-pkg/rpm/rpmhandler.h
apt-pkg/rpm/rpmindexfile.cc
apt-pkg/rpm/rpmindexfile.h
apt-pkg/rpm/rpmlistparser.cc
apt-pkg/rpm/rpmlistparser.h
apt-pkg/rpm/rpmrecords.cc
apt-pkg/rpm/rpmrecords.h
apt-pkg/rpm/rpmsrcrecords.cc
apt-pkg/rpm/rpmsrcrecords.h
apt-pkg/sourcelist.cc
buildlib/Makefile.in
cmdline/Makefile.in
configure
configure.in
doc/Makefile.in
lua/Makefile.in
m4/Makefile.in
methods/Makefile.in
tools/Makefile.in

index 5748996..662ad41 100644 (file)
@@ -141,6 +141,8 @@ LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSTDCPP_VER = @LIBSTDCPP_VER@
 LIBTOOL = @LIBTOOL@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
@@ -167,6 +169,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 POSUB = @POSUB@
 PTHREADLIB = @PTHREADLIB@
 RANLIB = @RANLIB@
@@ -188,6 +191,7 @@ ac_ct_CXX = @ac_ct_CXX@
 ac_ct_F77 = @ac_ct_F77@
 ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
 am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
index dc1b8f0..b4520d4 100644 (file)
@@ -6171,6 +6171,163 @@ SED=$lt_cv_path_SED
 AC_MSG_RESULT([$SED])
 ])
 
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# 
+# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=m4_default([$1], [0.9.0])
+       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+               PKG_CONFIG=""
+       fi
+               
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$PKG_CONFIG"; then
+    if test -n "$$1"; then
+        pkg_cv_[]$1="$$1"
+    else
+        PKG_CHECK_EXISTS([$3],
+                         [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+                        [pkg_failed=yes])
+    fi
+else
+       pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+        else 
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+       ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+               [$4])
+elif test $pkg_failed = untried; then
+       ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
+               [$4])
+else
+       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+       ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
 # Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
index ebf0398..5870d0e 100644 (file)
@@ -39,6 +39,8 @@ libapt_pkg_la_SOURCES = \
        contrib/strutl.cc \
        contrib/strutl.h \
        contrib/system.h \
+       rpm/repomd.cc \
+       rpm/repomd.h \
        rpm/rpmhandler.cc \
        rpm/rpmhandler.h \
        rpm/rpmindexfile.cc \
index f0486a2..65f5c04 100644 (file)
@@ -75,15 +75,16 @@ am_libapt_pkg_la_OBJECTS = contrib/cdromutl.lo contrib/cmndline.lo \
        contrib/configuration.lo contrib/crc-16.lo contrib/error.lo \
        contrib/fileutl.lo contrib/hashes.lo contrib/md5.lo \
        contrib/mmap.lo contrib/progress.lo contrib/sha1.lo \
-       contrib/strutl.lo rpm/rpmhandler.lo rpm/rpmindexfile.lo \
-       rpm/rpmlistparser.lo rpm/rpmpackagedata.lo rpm/rpmpm.lo \
-       rpm/rpmrecords.lo rpm/rpmsrcrecords.lo rpm/rpmsystem.lo \
-       rpm/rpmversion.lo acquire.lo acquire-item.lo acquire-method.lo \
-       acquire-worker.lo algorithms.lo cachefile.lo clean.lo \
-       depcache.lo indexfile.lo init.lo luaiface.lo orderlist.lo \
-       packagemanager.lo pkgcache.lo pkgcachegen.lo pkgrecords.lo \
-       pkgsystem.lo policy.lo repository.lo sourcelist.lo \
-       srcrecords.lo tagfile.lo version.lo versionmatch.lo
+       contrib/strutl.lo rpm/repomd.lo rpm/rpmhandler.lo \
+       rpm/rpmindexfile.lo rpm/rpmlistparser.lo rpm/rpmpackagedata.lo \
+       rpm/rpmpm.lo rpm/rpmrecords.lo rpm/rpmsrcrecords.lo \
+       rpm/rpmsystem.lo rpm/rpmversion.lo acquire.lo acquire-item.lo \
+       acquire-method.lo acquire-worker.lo algorithms.lo cachefile.lo \
+       clean.lo depcache.lo indexfile.lo init.lo luaiface.lo \
+       orderlist.lo packagemanager.lo pkgcache.lo pkgcachegen.lo \
+       pkgrecords.lo pkgsystem.lo policy.lo repository.lo \
+       sourcelist.lo srcrecords.lo tagfile.lo version.lo \
+       versionmatch.lo
 libapt_pkg_la_OBJECTS = $(am_libapt_pkg_la_OBJECTS)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include
 depcomp = $(SHELL) $(top_srcdir)/buildlib/depcomp
@@ -172,6 +173,8 @@ LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSTDCPP_VER = @LIBSTDCPP_VER@
 LIBTOOL = @LIBTOOL@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
@@ -198,6 +201,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 POSUB = @POSUB@
 PTHREADLIB = @PTHREADLIB@
 RANLIB = @RANLIB@
@@ -219,6 +223,7 @@ ac_ct_CXX = @ac_ct_CXX@
 ac_ct_F77 = @ac_ct_F77@
 ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
 am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
@@ -288,6 +293,8 @@ libapt_pkg_la_SOURCES = \
        contrib/strutl.cc \
        contrib/strutl.h \
        contrib/system.h \
+       rpm/repomd.cc \
+       rpm/repomd.h \
        rpm/rpmhandler.cc \
        rpm/rpmhandler.h \
        rpm/rpmindexfile.cc \
@@ -478,6 +485,7 @@ rpm/$(am__dirstamp):
 rpm/$(DEPDIR)/$(am__dirstamp):
        @$(mkdir_p) rpm/$(DEPDIR)
        @: > rpm/$(DEPDIR)/$(am__dirstamp)
+rpm/repomd.lo: rpm/$(am__dirstamp) rpm/$(DEPDIR)/$(am__dirstamp)
 rpm/rpmhandler.lo: rpm/$(am__dirstamp) rpm/$(DEPDIR)/$(am__dirstamp)
 rpm/rpmindexfile.lo: rpm/$(am__dirstamp) rpm/$(DEPDIR)/$(am__dirstamp)
 rpm/rpmlistparser.lo: rpm/$(am__dirstamp) \
@@ -519,6 +527,8 @@ mostlyclean-compile:
        -rm -f contrib/sha1.lo
        -rm -f contrib/strutl.$(OBJEXT)
        -rm -f contrib/strutl.lo
+       -rm -f rpm/repomd.$(OBJEXT)
+       -rm -f rpm/repomd.lo
        -rm -f rpm/rpmhandler.$(OBJEXT)
        -rm -f rpm/rpmhandler.lo
        -rm -f rpm/rpmindexfile.$(OBJEXT)
@@ -577,6 +587,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@contrib/$(DEPDIR)/progress.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@contrib/$(DEPDIR)/sha1.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@contrib/$(DEPDIR)/strutl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@rpm/$(DEPDIR)/repomd.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@rpm/$(DEPDIR)/rpmhandler.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@rpm/$(DEPDIR)/rpmindexfile.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@rpm/$(DEPDIR)/rpmlistparser.Plo@am__quote@
index 15ea22d..33f8b8b 100644 (file)
@@ -26,6 +26,7 @@
 // CNC:2002-07-03
 #include <apt-pkg/repository.h>
 #include <apt-pkg/md5.h>
+#include <apt-pkg/sha1.h>
 #include <config.h>
 #include <apt-pkg/luaiface.h>
 #include <iostream>
@@ -48,14 +49,17 @@ using std::string;
 // ---------------------------------------------------------------------
 /* Returns false only if the checksums fail (the file not existing is not
    a checksum mismatch) */
-bool VerifyChecksums(string File,unsigned long Size,string MD5)
+bool VerifyChecksums(string File,unsigned long Size,string MD5, string method)
 {
    struct stat Buf;
    
    if (stat(File.c_str(),&Buf) != 0) 
       return true;
 
-   if (Buf.st_size != Size)
+   // LORG:2006-03-09
+   // XXX hack alert: repomd doesn't have index sizes so ignore it and
+   // rely on checksum
+   if (Size > 0 && Buf.st_size != Size)
    {
       if (_config->FindB("Acquire::Verbose", false) == true)
         cout << "Size of "<<File<<" did not match what's in the checksum list and was redownloaded."<<endl;
@@ -64,16 +68,30 @@ bool VerifyChecksums(string File,unsigned long Size,string MD5)
 
    if (MD5.empty() == false)
    {
-      MD5Summation md5sum = MD5Summation();
-      FileFd F(File, FileFd::ReadOnly);
-      
-      md5sum.AddFD(F.Fd(), F.Size());
-      if (md5sum.Result().Value() != MD5)
-      {
-         if (_config->FindB("Acquire::Verbose", false) == true)
-           cout << "MD5Sum of "<<File<<" did not match what's in the checksum list and was redownloaded."<<endl;
-         return false;
-      }
+      if (method == "MD5-Hash") {
+        MD5Summation md5sum = MD5Summation();
+        FileFd F(File, FileFd::ReadOnly);
+        
+        md5sum.AddFD(F.Fd(), F.Size());
+        if (md5sum.Result().Value() != MD5)
+        {
+           if (_config->FindB("Acquire::Verbose", false) == true)
+              cout << "MD5Sum of "<<File<<" did not match what's in the checksum list and was redownloaded."<<endl;
+           return false;
+        }
+      } else if (method == "SHA1-Hash") {
+        SHA1Summation sha1sum = SHA1Summation();
+        FileFd F(File, FileFd::ReadOnly);
+        
+        sha1sum.AddFD(F.Fd(), F.Size());
+        if (sha1sum.Result().Value() != MD5)
+        {
+           if (_config->FindB("Acquire::Verbose", false) == true)
+              cout << "SHASum of "<<File<<" did not match what's in the checksum list and was redownloaded."<<endl;
+           return false;
+        }
+      } 
+        
    }
    
    return true;
@@ -191,7 +209,7 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,pkgRepository *Repository,
 
    // Create the item
    // CNC:2002-07-03
-   Desc.URI = URI + _config->Find("Acquire::ComprExtension", ".bz2");
+   Desc.URI = URI + "." + Repository->GetComprMethod();
    Desc.Description = URIDesc;
    Desc.Owner = this;
    Desc.ShortDesc = ShortDesc;
@@ -222,7 +240,7 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,pkgRepository *Repository,
         string FinalFile = _config->FindDir("Dir::State::lists");
         FinalFile += URItoFileName(RealURI);
 
-        if (VerifyChecksums(FinalFile,Size,MD5Hash) == false)
+        if (VerifyChecksums(FinalFile,Size,MD5Hash,Repository->GetCheckMethod()) == false)
         {
            unlink(FinalFile.c_str());
            unlink(DestFile.c_str());
@@ -239,6 +257,11 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,pkgRepository *Repository,
    QueueURI(Desc);
 }
                                                                        /*}}}*/
+string pkgAcqIndex::ChecksumType()
+{
+   return Repository->GetCheckMethod();
+}
+   
 // AcqIndex::Custom600Headers - Insert custom request headers          /*{{{*/
 // ---------------------------------------------------------------------
 /* The only header we use is the last-modified header. */
@@ -277,7 +300,10 @@ void pkgAcqIndex::Done(string Message,unsigned long Size,string MD5,
       {
         // We must always get here if the repository is authenticated
         
-        if (FSize != Size)
+        // LORG:2006-03-09
+        // XXX hack alert: repomd doesn't know index sizes so it returns
+        // zero for them, don't check but rely on checksums instead
+        if (FSize > 0 && FSize != Size)
         {
            Status = StatError;
            ErrorText = _("Size mismatch");
@@ -360,11 +386,18 @@ void pkgAcqIndex::Done(string Message,unsigned long Size,string MD5,
    
    Decompression = true;
    DestFile += ".decomp";
-   // CNC:2002-07-03
-   Desc.URI = "bzip2:" + FileName;
+   // LORG:2006-02-23 compression is a feature of repository type
+   if (Repository->GetComprMethod() == "gz") {
+      Desc.URI = "gzip:" + FileName;
+      Mode = "gzip";
+   } else if (Repository->GetComprMethod() == "bz2") {
+      Desc.URI = "bzip2:" + FileName;
+      Mode = "bzip2";
+   } else {
+      _error->Warning(_("Uknown compression extension, trying uncompressed"));
+      Desc.URI = FileName;
+   }
    QueueURI(Desc);
-   // CNC:2002-07-03
-   Mode = "bzip2";
 }
                                                                        /*}}}*/
 
@@ -415,7 +448,7 @@ pkgAcqIndexRel::pkgAcqIndexRel(pkgAcquire *Owner,pkgRepository *Repository,
         string FinalFile = _config->FindDir("Dir::State::lists");
         FinalFile += URItoFileName(RealURI);
 
-        if (VerifyChecksums(FinalFile,Size,MD5Hash) == false)
+        if (VerifyChecksums(FinalFile,Size,MD5Hash,Repository->GetCheckMethod()) == false)
         {
            unlink(FinalFile.c_str());
            unlink(DestFile.c_str()); // Necessary?
@@ -638,6 +671,8 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
 {
    Retries = _config->FindI("Acquire::Retries",0);
 
+   ChkType = "";
+
    if (Version.Arch() == 0)
    {
       _error->Error(_("I wasn't able to locate a file for the %s package. "
@@ -697,14 +732,22 @@ bool pkgAcqArchive::QueueNext()
       pkgIndexFile *Index;
       if (Sources->FindIndex(Vf.File(),Index) == false)
            continue;
-      
+
       // Grab the text package record
       pkgRecords::Parser &Parse = Recs->Lookup(Vf);
       if (_error->PendingError() == true)
         return false;
       
       string PkgFile = Parse.FileName();
-      MD5 = Parse.MD5Hash();
+      // LORG:2006-03-16 
+      // Repomd uses SHA checksums for packages wheras others use MD5..
+      ChkType = Index->ChecksumType();
+      if (Index->ChecksumType() == "SHA1-Hash") {
+        MD5 = Parse.SHA1Hash();
+      } else {
+        MD5 = Parse.MD5Hash();
+      }
+
       if (PkgFile.empty() == true)
         return _error->Error(_("The package index files are corrupted. No Filename: "
                              "field for package %s."),
index 4303648..bd86a6a 100644 (file)
@@ -70,6 +70,9 @@ class pkgAcquire::Item
    virtual string Custom600Headers() {return string();};
    virtual string DescURI() = 0;
    virtual void Finished() {};
+
+   // LORG:2006-03-16
+   virtual string ChecksumType() {return "MD5-Hash";};
    
    // Inquire functions
    virtual string MD5Sum() {return string();};
@@ -103,6 +106,9 @@ class pkgAcqIndex : public pkgAcquire::Item
    virtual string Custom600Headers();
    virtual string DescURI() {return RealURI;}; // CNC:2003-02-14
 
+   // LORG:2006-03-16
+   virtual string ChecksumType();
+
    // CNC:2002-07-03
    pkgAcqIndex(pkgAcquire *Owner,pkgRepository *Repository,string URI,
               string URIDesc,string ShortDesct);
@@ -147,6 +153,7 @@ class pkgAcqArchive : public pkgAcquire::Item
    pkgSourceList *Sources;
    pkgRecords *Recs;
    string MD5;
+   string ChkType;
    string &StoreFilename;
    pkgCache::VerFileIterator Vf;
    unsigned int Retries;
@@ -164,6 +171,9 @@ class pkgAcqArchive : public pkgAcquire::Item
    virtual string DescURI() {return Desc.URI;};
    virtual void Finished();
    
+   // LORG:2006-03-16
+   virtual string ChecksumType() {return ChkType;};
+
    pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
                 pkgRecords *Recs,pkgCache::VerIterator const &Version,
                 string &StoreFilename);
index c2673a7..a1dfe76 100644 (file)
@@ -303,8 +303,11 @@ bool pkgAcquire::Worker::RunMessages()
               _error->Warning("Bizarre Error - File size is not what the server reported %s %lu",
                               LookupTag(Message,"Size","0").c_str(),TotalSize);
 
+           // LORG:2006-03-09
+           // Look up the checksum type from owner
            Owner->Done(Message,atoi(LookupTag(Message,"Size","0").c_str()),
-                       LookupTag(Message,"MD5-Hash"),Config);
+                       LookupTag(Message,Owner->ChecksumType().c_str()),Config);
+           
            ItemDone();
            
            // Log that we are done
index 233247a..4702609 100644 (file)
@@ -509,6 +509,7 @@ pkgAcquire::MethodConfig::MethodConfig()
    // CNC:2004-04-27
    HasPreferredURI = false;
    DonePreferredURI = false;
+   CheckMethod = "SHA1-Hash";
 }
                                                                        /*}}}*/
 
index b29c8f6..4eaabc7 100644 (file)
@@ -244,6 +244,7 @@ struct pkgAcquire::MethodConfig
    bool HasPreferredURI;
    bool DonePreferredURI;
    string PreferredURI;
+   string CheckMethod;
    
    MethodConfig();
 };
index b247e22..4892ef1 100644 (file)
@@ -65,6 +65,8 @@ class pkgIndexFile
    // Interface for acquire
    virtual string ArchiveURI(string /*File*/) const {return string();};
    virtual bool GetIndexes(pkgAcquire *Owner) const;
+   // LORG:2006-03-16
+   virtual string ChecksumType() {return "MD5-Hash";};
 
    // CNC:2002-07-04
    virtual bool GetReleases(pkgAcquire *Owner) const {return true;};
index 815e828..4c75b83 100644 (file)
@@ -77,7 +77,6 @@ bool pkgInitConfig(Configuration &Cnf)
    Cnf.Set("Dir::Etc::parts","apt.conf.d");
    Cnf.Set("Dir::Etc::preferences","preferences");
    Cnf.Set("Dir::Bin::methods",LIBDIR "/apt/methods");
-   Cnf.Set("Acquire::ComprExtension", ".bz2");
              
    bool Res = true;
    
@@ -158,7 +157,7 @@ bool pkgInitSystem(Configuration &Cnf,pkgSystem *&Sys)
         return _error->Error(_("Unable to determine a suitable system type"));
    }
 
-   // PM:2006-02-06
+   // LORG:2006-02-06
    if (Cnf.Find("APT::DistroVersion", "").empty()) {
        Cnf.Set("APT::DistroVersion", Sys->DistroVer(Cnf));
    }
index b39031b..105fad9 100644 (file)
@@ -19,6 +19,7 @@
     
 #include <apti18n.h>   
                                                                        /*}}}*/
+using namespace std;
 
 // Records::pkgRecords - Constructor                                   /*{{{*/
 // ---------------------------------------------------------------------
index 6ea113d..59dbd2d 100644 (file)
@@ -98,7 +98,7 @@ class pkgSystem
       etc.. */
    virtual signed Score(Configuration const &/*Cnf*/) {return 0;};
 
-   // PM:2006-02-06 Distro version from package system
+   // LORG:2006-02-06 Distro version from package system
    virtual string DistroVer(Configuration const &/*Cnf*/) {return "";};
    
    // CNC:2002-07-03
index 189001b..48a5843 100644 (file)
@@ -28,7 +28,9 @@ class pkgRepository
    map<string,Checksum> IndexChecksums; // path -> checksum data   
 
    bool GotRelease;
-   
+   string ComprMethod;
+   string CheckMethod;
+
    public:   
 
    string URI;
@@ -38,11 +40,15 @@ class pkgRepository
 
    bool Acquire;
    
-   bool ParseRelease(string File);
-   bool HasRelease() const { return GotRelease; }
+   // LORG:2006-02-21 make these methods virtual
+   virtual bool ParseRelease(string File);
+   virtual bool HasRelease() const { return GotRelease; }
 
-   bool IsAuthenticated() const { return !FingerPrint.empty(); };
-   bool FindChecksums(string URI,unsigned long &Size, string &MD5);
+   virtual bool IsAuthenticated() const { return !FingerPrint.empty(); };
+   virtual bool FindChecksums(string URI,unsigned long &Size, string &MD5);
+   // LORG:2006-02-23 
+   virtual string GetComprMethod() {return ComprMethod;};
+   virtual string GetCheckMethod() {return CheckMethod;};
    
    pkgRepository(string URI,string Dist, const pkgSourceList::Vendor *Vendor,
                 string RootURI)
@@ -50,6 +56,8 @@ class pkgRepository
        Acquire(1)
    {
       if (Vendor) FingerPrint = Vendor->FingerPrint;
+      ComprMethod = "bz2";
+      CheckMethod = "MD5-Hash";
    };
 
 };
diff --git a/apt-pkg/rpm/repomd.cc b/apt-pkg/rpm/repomd.cc
new file mode 100644 (file)
index 0000000..8eef260
--- /dev/null
@@ -0,0 +1,88 @@
+// CNC:2002-07-03
+
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: repository.cc,v 1.4 2002/07/29 18:13:52 niemeyer Exp $
+/* ######################################################################
+
+   Repository abstraction for 1 or more unique URI+Dist
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+// Include Files                                                       /*{{{*/
+#ifdef __GNUG__
+#pragma implementation "apt-pkg/repomd.h"
+#endif
+
+#include <iostream>
+#include <apt-pkg/repomd.h>
+#include <apt-pkg/error.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+#include <apti18n.h>
+
+using namespace std;
+
+xmlNode *FindNode(xmlNode *Node, const string Name)
+{
+   for (xmlNode *n = Node->children; n; n = n->next) {
+      if (strcmp((char*)n->name, Name.c_str()) == 0) {
+         return n;
+      }
+   }
+   return NULL;
+}
+
+
+// Parse repomd.xml file for checksums
+bool repomdRepository::ParseRelease(string File)
+{
+   RepoMD = xmlReadFile(File.c_str(), NULL, XML_PARSE_NONET);
+   if ((Root = xmlDocGetRootElement(RepoMD)) == NULL) {
+      xmlFreeDoc(RepoMD);
+      return _error->Error(_("could not open Release file '%s'"),File.c_str());
+   }
+
+   for (xmlNode *Node = Root->children; Node; Node = Node->next) {
+      if (Node->type != XML_ELEMENT_NODE || 
+         strcmp((char*)Node->name, "data") != 0)
+        continue;
+
+      string Hash = "";
+      string Path = "";
+      string Type = "";
+      string Timestamp = "";
+      xmlNode *n = NULL;
+
+      n = FindNode(Node, "location");
+      if (n)
+        Path = (char*)xmlGetProp(n, (xmlChar*)"href");
+
+      n = NULL;
+      if (flExtension(Path) == "gz") {
+        Path = Path.substr(0, Path.size()-3);
+        n = FindNode(Node, "open-checksum");
+      } else {
+        n = FindNode(Node, "checksum");
+      }
+      if (n) {
+        Hash = (char*)xmlNodeGetContent(n);
+        Type = (char*)xmlGetProp(n, (xmlChar*)"type");
+      }
+      IndexChecksums[Path].MD5 = Hash;
+      IndexChecksums[Path].Size = 0;
+      if (Type == "sha") {
+        CheckMethod = "SHA1-Hash";
+      } else {
+        CheckMethod = "MDA5-Hash";
+      }
+   }
+   
+   GotRelease = true;
+
+   xmlFreeDoc(RepoMD);
+   return true;
+}
+
+// vim:sts=3:sw=3
diff --git a/apt-pkg/rpm/repomd.h b/apt-pkg/rpm/repomd.h
new file mode 100644 (file)
index 0000000..b1a1d22
--- /dev/null
@@ -0,0 +1,41 @@
+// CNC:2002-07-03
+
+#ifndef PKGLIB_REPOMD_H
+#define PKBLIB_REPOMD_H
+
+#ifdef __GNUG__
+#pragma interface "apt-pkg/repomd.h"
+#endif
+
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <apt-pkg/repository.h>
+
+using namespace std;
+
+class repomdRepository : public pkgRepository
+{
+   protected:
+
+   xmlDocPtr RepoMD;
+   xmlNode *Root;
+
+   public:   
+
+   virtual bool IsAuthenticated() const { return false; };
+   virtual bool ParseRelease(string File);
+   
+   repomdRepository(string URI,string Dist, const pkgSourceList::Vendor *Vendor,
+                string RootURI)
+      : pkgRepository(URI, Dist, Vendor, RootURI) 
+   {
+      ComprMethod = "gz";
+      // repomd always has a "release" file
+      GotRelease = true;
+   };
+
+};
+
+#endif
+
+// vim:sts=3:sw=3
index 0413a49..cf06de0 100644 (file)
 #include <utime.h>
 #include <unistd.h>
 #include <assert.h>
+#include <libgen.h>
 
 #include <apt-pkg/error.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/md5.h>
+#include <apt-pkg/crc-16.h>
 
 #include <apt-pkg/rpmhandler.h>
 #include <apt-pkg/rpmpackagedata.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
 
 #include <apti18n.h>
 
 #if RPM_VERSION >= 0x040100
 #include <rpm/rpmts.h>
 #include <rpm/rpmdb.h>
+#include <rpm/rpmds.h>
 #define rpmxxInitIterator(a,b,c,d) rpmtsInitIterator(a,(rpmTag)b,c,d)
 #else
 #define rpmxxInitIterator(a,b,c,d) rpmdbInitIterator(a,b,c,d)
 #endif
 
+string RPMHandler::Epoch()
+{
+   char str[512];
+   int_32 count, type, *epoch;
+   assert(HeaderP != NULL);
+   int rc = headerGetEntry(HeaderP, RPMTAG_EPOCH,
+                          &type, (void**)&epoch, &count);
+   if (rc == 1 && count > 0) {
+      snprintf(str, sizeof(str), "%i", epoch[0]);
+      return str;
+   } else { 
+      return string(rc?str:"");
+   }
+}
+
+unsigned long RPMHandler::GetITag(rpmTag Tag)
+{
+   char *str;
+   int_32 count, type, *num;
+   assert(HeaderP != NULL);
+   int rc = headerGetEntry(HeaderP, Tag,
+                          &type, (void**)&num, &count);
+   return rc?num[0]:0;
+}
+
+string RPMHandler::GetSTag(rpmTag Tag)
+{
+   char *str;
+   int_32 count, type;
+   assert(HeaderP != NULL);
+   int rc = headerGetEntry(HeaderP, Tag,
+                          &type, (void**)&str, &count);
+   return string(rc?str:"");
+}
+
+bool RPMHandler::HasFile(const char *File)
+{
+   if (*File == '\0')
+      return false;
+   char **names = NULL;
+   int_32 count = 0;
+   rpmHeaderGetEntry(HeaderP, RPMTAG_OLDFILENAMES,
+                     NULL, (void **) &names, &count);
+   while (count--)
+   {
+      char *name = names[count];
+      if (strcmp(name, File) == 0)
+         return true;
+   }
+   free(names);
+   return false;
+}
+
+bool RPMHandler::InternalDep(const char *name, const char *ver, int_32 flag) 
+{
+   if (strncmp(name, "rpmlib(", sizeof("rpmlib(")-1) == 0) {
+#if RPM_VERSION >= 0x040404
+     rpmds rpmlibProv = NULL;
+     rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
+                           name, ver?ver:NULL, flag);
+     rpmdsRpmlib(&rpmlibProv, NULL);
+     int res = rpmdsSearch(rpmlibProv, ds) >= 0;
+     rpmdsFree(ds);
+     rpmdsFree(rpmlibProv);
+#elif RPM_VERSION >= 0x040100
+      rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
+                            name, ver?ver:NULL, flag);
+      int res = rpmCheckRpmlibProvides(ds);
+      rpmdsFree(ds);
+#else
+      int res = rpmCheckRpmlibProvides(name, ver?ver:NULL,
+                                      flag);
+#endif
+      if (res) 
+        return true;
+   }
+
+#if RPM_VERSION >= 0x040404
+   // uhhuh, any of these changing would require full cache rebuild...
+   if (strncmp(name, "getconf(", sizeof("getconf(")-1) == 0)
+   {
+     rpmds getconfProv = NULL;
+     rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
+                           name, ver?ver:NULL, flag);
+     rpmdsGetconf(&getconfProv, NULL);
+     int res = rpmdsSearch(getconfProv, ds);
+     rpmdsFree(ds);
+     rpmdsFree(getconfProv);
+     if (res) 
+        return true;
+   }
+
+   if (strncmp(name, "cpuinfo(", sizeof("cpuinfo(")-1) == 0)
+   {
+     rpmds cpuinfoProv = NULL;
+     rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
+                           name, ver?ver:NULL, flag);
+     rpmdsCpuinfo(&cpuinfoProv, NULL);
+     int res = rpmdsSearch(cpuinfoProv, ds);
+     rpmdsFree(ds);
+     rpmdsFree(cpuinfoProv);
+     if (res) 
+        return true;
+   }
+
+   if (strncmp(name, "sysinfo(", sizeof("sysinfo(")-1) == 0)
+   {
+     rpmds sysinfoProv = NULL;
+     rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
+                           name, ver?ver:NULL, flag);
+     rpmdsCpuinfo(&sysinfoProv, NULL);
+     int res = rpmdsSearch(sysinfoProv, ds);
+     rpmdsFree(ds);
+     rpmdsFree(sysinfoProv);
+     if (res)
+        return true;
+   }
+
+   if (strncmp(name, "uname(", sizeof("uname(")-1) == 0)
+   {
+     rpmds unameProv = NULL;
+     rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
+                           name, ver?ver:NULL, flag);
+     rpmdsUname(&unameProv, NULL);
+     int res = rpmdsSearch(unameProv, ds);
+     rpmdsFree(ds);
+     rpmdsFree(unameProv);
+     if (res)
+        return true;
+   }
+
+   if (strlen(name) > 5 && name[strlen(name)-1] == ')' &&
+       ((strchr("Rr_", name[0]) != NULL &&
+        strchr("Ww_", name[1]) != NULL &&
+        strchr("Xx_", name[2]) != NULL &&
+        name[3] == '(') ||
+        strncmp(name, "exists(", sizeof("exists(")-1) == 0 ||
+        strncmp(name, "executable(", sizeof("executable(")-1) == 0 ||
+        strncmp(name, "readable(", sizeof("readable(")-1) == 0 ||
+        strncmp(name, "writable(", sizeof("writable(")-1)== 0 ))
+   {
+      int res = rpmioAccess(name, NULL, X_OK);
+      if (res == 0)
+        return true;
+   }
+
+   /* TODO
+    * - /etc/rpm/sysinfo provides
+    * - macro probe provides 
+    * - actually implement soname() and access() dependencies
+    */
+   if (strncmp(name, "soname(", sizeof("soname(")-1) == 0)
+   {
+      cout << "FIXME, ignoring soname() dependency: " << name << endl;
+      return true;
+   }
+#endif
+   return false; 
+}
+
+bool RPMHandler::Depends(unsigned int Type, vector<Dependency*> &Deps)
+{
+   char **namel = NULL;
+   char **verl = NULL;
+   int *flagl = NULL;
+   int res, type, count;
+
+   switch (Type)
+   {
+   case pkgCache::Dep::Depends:
+      res = headerGetEntry(HeaderP, RPMTAG_REQUIRENAME, &type,
+                           (void **)&namel, &count);
+      if (res != 1)
+          return true;
+      res = headerGetEntry(HeaderP, RPMTAG_REQUIREVERSION, &type,
+                           (void **)&verl, &count);
+      res = headerGetEntry(HeaderP, RPMTAG_REQUIREFLAGS, &type,
+                           (void **)&flagl, &count);
+      break;
+
+   case pkgCache::Dep::Obsoletes:
+      res = headerGetEntry(HeaderP, RPMTAG_OBSOLETENAME, &type,
+                           (void **)&namel, &count);
+      if (res != 1)
+          return true;
+      res = headerGetEntry(HeaderP, RPMTAG_OBSOLETEVERSION, &type,
+                           (void **)&verl, &count);
+      res = headerGetEntry(HeaderP, RPMTAG_OBSOLETEFLAGS, &type,
+                           (void **)&flagl, &count);
+      break;
+   case pkgCache::Dep::Conflicts:
+      res = headerGetEntry(HeaderP, RPMTAG_CONFLICTNAME, &type,
+                           (void **)&namel, &count);
+      if (res != 1)
+          return true;
+      res = headerGetEntry(HeaderP, RPMTAG_CONFLICTVERSION, &type,
+                           (void **)&verl, &count);
+      res = headerGetEntry(HeaderP, RPMTAG_CONFLICTFLAGS, &type,
+                           (void **)&flagl, &count);
+      break;
+#if RPM_VERSION >= 0x040403
+   case pkgCache::Dep::Suggests:
+      res = headerGetEntry(HeaderP, RPMTAG_SUGGESTSNAME, &type,
+                           (void **)&namel, &count);
+      if (res != 1)
+          return true; 
+      res = headerGetEntry(HeaderP, RPMTAG_SUGGESTSVERSION, &type,
+                           (void **)&verl, &count);
+      res = headerGetEntry(HeaderP, RPMTAG_SUGGESTSFLAGS, &type,
+                           (void **)&flagl, &count);
+      break;
+#if 0 // Enhances is not even known to apt, sigh...
+   case pkgCache::Dep::Enhances:
+      res = headerGetEntry(HeaderP, RPMTAG_ENHANCESNAME, &type,
+                           (void **)&namel, &count);
+      if (res != 1)
+          return true;
+      res = headerGetEntry(HeaderP, RPMTAG_ENHANCESVERSION, &type,
+                           (void **)&verl, &count);
+      res = headerGetEntry(HeaderP, RPMTAG_ENHANCESFLAGS, &type,
+                           (void **)&flagl, &count);
+      break;
+#endif
+#endif
+   }
+
+   unsigned int Op = 0;
+   bool DepMode = false;
+   if (Type == pkgCache::Dep::Depends)
+      DepMode = true;
+
+   for (int i = 0; i < count; i++) {
+
+      if (InternalDep(namel[i], verl[i] ? verl[i]:"", flagl[i]) == true) {
+        continue;
+      }
+      if (DepMode == true) {
+         if (flagl[i] & RPMSENSE_PREREQ)
+            Type = pkgCache::Dep::PreDepends;
+#if RPM_VERSION >= 0x040403
+         else if (flagl[i] & RPMSENSE_MISSINGOK)
+            Type = pkgCache::Dep::Suggests;
+#endif
+         else
+            Type = pkgCache::Dep::Depends;
+      }
+
+      Dependency *Dep = new Dependency;
+      Dep->Name = namel[i];
+      Dep->Version = verl[i] ? verl[i]:"";
+      if (!verl[i]) {
+         Op = pkgCache::Dep::NoOp;
+      } else {
+         if (flagl[i] & RPMSENSE_LESS) {
+            if (flagl[i] & RPMSENSE_EQUAL)
+                Op = pkgCache::Dep::LessEq;
+            else
+                Op = pkgCache::Dep::Less;
+         } else if (flagl[i] & RPMSENSE_GREATER) {
+            if (flagl[i] & RPMSENSE_EQUAL)
+                Op = pkgCache::Dep::GreaterEq;
+            else
+                Op = pkgCache::Dep::Greater;
+         } else if (flagl[i] & RPMSENSE_EQUAL) {
+            Op = pkgCache::Dep::Equals;
+        }
+      }
+      Dep->Op = Op;
+      Dep->Type = Type;
+      Deps.push_back(Dep);
+   }
+   free(namel);
+   free(verl);
+   return true;
+      
+}
+
+bool RPMHandler::Provides(vector<Dependency*> &Provs)
+{
+   int type, count;
+   char **namel = NULL;
+   char **verl = NULL;
+   int res;
+
+   res = headerGetEntry(HeaderP, RPMTAG_PROVIDENAME, &type,
+                        (void **)&namel, &count);
+   if (res != 1)
+       return true;
+
+   res = headerGetEntry(HeaderP, RPMTAG_PROVIDEVERSION, &type,
+                        (void **)&verl, NULL);
+
+   if (res != 1)
+      verl = NULL;
+
+   for (int i = 0; i < count; i++) {
+      Dependency *Dep = new Dependency;
+      Dep->Name = namel[i];
+      if (verl) {
+        Dep->Version = *verl[i] ? verl[i]:"";
+        Dep->Op = pkgCache::Dep::Equals;
+      } else {
+        Dep->Version = "";
+      }
+      Provs.push_back(Dep);
+   }
+   return true;
+
+}
+
+bool RPMHandler::FileProvides(vector<string> &FileProvs)
+{
+   const char **names = NULL;
+   int_32 count = 0;
+   bool ret = true;
+   rpmHeaderGetEntry(HeaderP, RPMTAG_OLDFILENAMES,
+                     NULL, (void **) &names, &count);
+   while (count--) {
+      FileProvs.push_back(names[count]);
+   }
+   free(names);
+   return ret;
+
+}
+
+unsigned short RPMHandler::VersionHash()
+{
+   int Sections[] = {
+          RPMTAG_VERSION,
+          RPMTAG_RELEASE,
+          RPMTAG_ARCH,
+          RPMTAG_REQUIRENAME,
+          RPMTAG_OBSOLETENAME,
+          RPMTAG_CONFLICTNAME,
+          0
+   };
+   unsigned long Result = INIT_FCS;
+
+   for (const int *sec = Sections; *sec != 0; sec++)
+   {
+      char *Str;
+      int Len;
+      int type, count;
+      int res;
+      char **strings = NULL;
+
+      res = headerGetEntry(HeaderP, *sec, &type, (void **)&strings, &count);
+      if (res != 1)
+         continue;
+
+      switch (type)
+      {
+      case RPM_STRING_ARRAY_TYPE:
+         //qsort(strings, count, sizeof(char*), compare);
+         while (count-- > 0)
+         {
+            Str = strings[count];
+            Len = strlen(Str);
+            /* Suse patch.rpm hack. */
+            if (Len == 17 && *Str == 'r' && *sec == RPMTAG_REQUIRENAME &&
+                strcmp(Str, "rpmlib(PatchRPMs)") == 0)
+               continue;
+
+            Result = AddCRC16(Result,Str,Len);
+         }
+         free(strings);
+         break;
+
+      case RPM_STRING_TYPE:
+         Str = (char*)strings;
+         Len = strlen(Str);
+         Result = AddCRC16(Result,Str,Len);
+         break;
+      }
+   }
+
+   return Result;
+}
+
+
 RPMFileHandler::RPMFileHandler(string File)
 {
    ID = File;
@@ -103,44 +488,22 @@ void RPMFileHandler::Rewind()
 
 string RPMFileHandler::FileName()
 {
-   char *str;
-   int_32 count, type;
-   assert(HeaderP != NULL);
-   int rc = headerGetEntry(HeaderP, CRPMTAG_FILENAME,
-                          &type, (void**)&str, &count);
-   assert(rc != 0);
-   return str;
+   return GetSTag(CRPMTAG_FILENAME);
 }
 
 string RPMFileHandler::Directory()
 {
-   char *str;
-   int_32 count, type;
-   assert(HeaderP != NULL);
-   int rc = headerGetEntry(HeaderP, CRPMTAG_DIRECTORY,
-                          &type, (void**)&str, &count);
-   return (rc?str:"");
+   return GetSTag(CRPMTAG_DIRECTORY);
 }
 
 unsigned long RPMFileHandler::FileSize()
 {
-   int_32 count, type;
-   int_32 *num;
-   int rc = headerGetEntry(HeaderP, CRPMTAG_FILESIZE,
-                          &type, (void**)&num, &count);
-   assert(rc != 0);
-   return (unsigned long)num[0];
+   return GetITag(CRPMTAG_FILESIZE);
 }
 
 string RPMFileHandler::MD5Sum()
 {
-   char *str;
-   int_32 count, type;
-   assert(HeaderP != NULL);
-   int rc = headerGetEntry(HeaderP, CRPMTAG_MD5,
-                          &type, (void**)&str, &count);
-   assert(rc != 0);
-   return str;
+   return GetSTag(CRPMTAG_MD5);
 }
 
 bool RPMSingleFileHandler::Skip()
@@ -525,4 +888,367 @@ void RPMDBHandler::Rewind()
 }
 #endif
 
+RPMRepomdHandler::RPMRepomdHandler(string File)
+{
+   //cout << "Repomd handler constr. " << File << endl;
+   ID = File;
+   Root = NULL;
+
+   Primary = xmlReadFile(File.c_str(), NULL, XML_PARSE_NONET);
+   if ((Root = xmlDocGetRootElement(Primary)) == NULL) {
+      xmlFreeDoc(Primary);
+      cout << "getting root element failed" << endl;
+   }
+   NodeP = Root->children;
+   iSize = atoi((char*)xmlGetProp(Root, (xmlChar*)"packages"));
+
+   if (NodeP == NULL)
+      cout << "NodeP is null, ugh..." << endl;
+}
+
+bool RPMRepomdHandler::Skip()
+{
+   //iOffset++;
+   //cout << "Repomd handler skip, offset " << iOffset << endl;
+   for (NodeP = NodeP->next; NodeP; NodeP = NodeP->next) {
+      //cout << "skip() current  " << NodeP << endl;
+      if (NodeP->type != XML_ELEMENT_NODE || strcmp((char*)NodeP->name, "package") != 0) {
+        continue;
+      } else {
+        iOffset++;
+        //cout << "in node " << xmlNodePGetContent(node) << endl;
+        return true;
+      }
+   } 
+   return false;
+   
+}
+
+bool RPMRepomdHandler::Jump(unsigned int Offset)
+{
+   NodeP = Root->children;
+   iOffset = 0;
+   for (NodeP = NodeP->next; NodeP; NodeP = NodeP->next) {
+      if (iOffset+1 == Offset) {
+        return Skip();
+      }
+      if (NodeP->type != XML_ELEMENT_NODE || 
+         strcmp((char*)NodeP->name, "package") != 0) {
+        continue;
+      } else {
+        iOffset++;
+        //cout << "at offset " << iOffset << " of " << Offset << endl;
+      }
+   }
+   return false;
+}
+
+void RPMRepomdHandler::Rewind()
+{
+   //cout << "Repomd handler rewind" << endl;
+   iOffset = 0;
+   NodeP = Root->children;
+}
+
+xmlNode *RPMRepomdHandler::FindNode(const string Name)
+{
+   for (xmlNode *n = NodeP->children; n; n = n->next) {
+      if (strcmp((char*)n->name, Name.c_str()) == 0) {
+         return n;
+      }
+   }
+   return NULL;
+}
+
+xmlNode *RPMRepomdHandler::FindNode(xmlNode *Node, const string Name)
+{
+   for (xmlNode *n = Node->children; n; n = n->next) {
+      if (strcmp((char*)n->name, Name.c_str()) == 0) {
+         return n;
+      }
+   }
+   return NULL;
+}
+
+string RPMRepomdHandler::FindTag(xmlNode *Node, string Tag)
+{
+   xmlNode *n = FindNode(Node, Tag);
+   if (n) {
+      return (char*)xmlNodeGetContent(n);
+   } else {
+      return "";
+   }
+}
+
+string RPMRepomdHandler::GetContent(xmlNode *Node, string Tag)
+{
+   if (Node) {
+      return (char*)xmlNodeGetContent(Node);
+   } else {
+      return "";
+   }
+}
+
+string RPMRepomdHandler::GetProp(xmlNode *Node, char *Prop)
+{
+   if (Node) {
+      return (char*)xmlGetProp(Node, (xmlChar*)Prop);
+   } else {
+      return "";
+   }
+}
+
+string RPMRepomdHandler::Group()
+{
+   xmlNode *n = FindNode("format");
+   return FindTag(n, "group");
+}
+
+string RPMRepomdHandler::Vendor()
+{
+   xmlNode *n = FindNode("format");
+   return FindTag(n, "vendor");
+}
+
+string RPMRepomdHandler::Release()
+{
+   xmlNode *n = FindNode("version");
+   return GetProp(n, "rel");
+}
+
+string RPMRepomdHandler::Version()
+{
+   xmlNode *n = FindNode("version");
+   return GetProp(n, "ver");
+}
+
+string RPMRepomdHandler::Epoch()
+{
+   xmlNode *n = FindNode("version");
+   return GetProp(n, "epoch");
+}
+
+string RPMRepomdHandler::FileName()
+{
+   xmlNode *n;
+   if ((n = FindNode("location"))) {
+      return basename((char*)xmlGetProp(n, (xmlChar*)"href"));
+   } else {
+      return "";
+   }
+}
+
+string RPMRepomdHandler::Directory()
+{
+   xmlNode *n;
+   char *dir = "";
+   if ((n = FindNode("location"))) {
+      dir = dirname((char*)xmlGetProp(n, (xmlChar*)"href"));
+   }
+   return dir;
+}
+
+string RPMRepomdHandler::MD5Sum()
+{
+   // XXX FIXME the method should be an abstract Checksum type using
+   // md5 / sha1 appropriately, for now relying on hacks elsewhere..
+   return SHA1Sum();
+}
+
+string RPMRepomdHandler::SHA1Sum()
+{
+   xmlNode *n;
+   if ((n = FindNode("checksum"))) {
+      return (char*)xmlNodeGetContent(n);
+   } else {
+      return "";
+   }
+}
+unsigned long RPMRepomdHandler::FileSize()
+{
+   xmlNode *n;
+   if ((n = FindNode("size"))) {
+      return atol((char*)xmlGetProp(n, (xmlChar*)"package"));
+   } else {
+      return 0;
+   }
+}
+
+unsigned long RPMRepomdHandler::InstalledSize()
+{
+   xmlNode *n;
+   if ((n = FindNode("size"))) {
+      return atol((char*)xmlGetProp(n, (xmlChar*)"installed"));
+   } else {
+      return 0;
+   }
+}
+
+bool RPMRepomdHandler::HasFile(const char *File)
+{
+   if (*File == '\0')
+      return false;
+
+   bool inprimary = false;
+   bool found = false;
+
+   xmlNode *format = FindNode("format");
+   for (xmlNode *n = format->children; n; n = n->next) {
+      if (strcmp((char*)n->name, "file") != 0) 
+        continue;
+      if (strcmp(File, (char*)xmlNodeGetContent(n)) == 0) {
+        //cout << "file in primary: " << File << endl;
+        inprimary = true;
+        break;
+      }
+   }
+   // XXX FIXME: should plunge into filelist.xml if not found
+   // in primary.xml
+   found = inprimary;
+   return found;
+
+}
+
+bool RPMRepomdHandler::Depends(unsigned int Type, vector<Dependency*> &Deps)
+{
+   xmlNode *format = FindNode("format");
+   xmlNode *dco;
+
+   xmlNode *n;
+
+   switch (Type) {
+      case pkgCache::Dep::Depends:
+         dco = FindNode(format, "requires");
+         break;
+      case pkgCache::Dep::Conflicts:
+         dco = FindNode(format, "conflicts");
+         break;
+      case pkgCache::Dep::Obsoletes:
+         dco = FindNode(format, "obsoletes");
+         break;
+   }
+
+   if (! dco) {
+      return true;
+   }
+   for (n = dco->children; n; n = n->next) {
+      unsigned int Op;
+      string deptype, depver;
+      char *ver, *rel, *epoch, *depname, *flags, *pre;
+      if ((depname = (char*)xmlGetProp(n, (xmlChar*)"name")) == NULL) continue;
+
+      if ((flags = (char*)xmlGetProp(n, (xmlChar*)"flags"))) {
+         ver = (char*)xmlGetProp(n, (xmlChar*)"ver");
+         rel = (char*)xmlGetProp(n, (xmlChar*)"rel");
+         epoch = (char*)xmlGetProp(n, (xmlChar*)"epoch");
+         if (epoch)
+            depver += string(epoch) + ":";
+         ver = (char*)xmlGetProp(n, (xmlChar*)"ver");
+         if (ver)
+            depver += string(ver);
+         rel = (char*)xmlGetProp(n, (xmlChar*)"rel");
+         if (rel)
+            depver += "-" + string(rel);
+
+         deptype = flags;
+
+         if (deptype == "EQ")
+            Op = pkgCache::Dep::Equals;
+         else if (deptype == "GE")
+            Op = pkgCache::Dep::GreaterEq;
+         else if (deptype == "GT")
+            Op = pkgCache::Dep::Greater;
+         else if (deptype == "LE")
+            Op = pkgCache::Dep::LessEq;
+         else if (deptype == "LT")
+            Op = pkgCache::Dep::Less;
+      } else {
+         Op = pkgCache::Dep::NoOp;
+      }
+      // XXX FIXME: Op isn't right here.. convert to rpm dep flag
+      if (InternalDep(depname, depver.c_str(), Op) == true) {
+        continue;
+      }
+      if (Type == pkgCache::Dep::Depends) {
+        pre = (char*)xmlGetProp(n, (xmlChar*)"pre"); 
+        if (pre) {
+           Type = pkgCache::Dep::PreDepends;
+        }
+      }
+      Dependency *Dep = new Dependency;
+      Dep->Name = depname;
+      Dep->Version = depver;
+      Dep->Op = Op;
+      Dep->Type = Type;
+      Deps.push_back(Dep);
+   }
+   return true;
+}
+
+bool RPMRepomdHandler::Provides(vector<Dependency*> &Provs)
+{
+   xmlNode *format = FindNode("format");
+   xmlNode *provides = FindNode(format, "provides");
+   bool ret = true;
+
+   if (! provides)
+      return true;
+
+   for (xmlNode *n = provides->children; n; n = n->next) {
+      string depver = "";
+      char *ver, *rel, *epoch, *depname, *flags;
+
+      if (strcmp((char*)n->name, "entry") != 0)  continue;
+
+      Dependency *Dep = new Dependency;
+      if ((depname = (char*)xmlGetProp(n, (xmlChar*)"name")) == NULL) continue;
+
+      if ((flags = (char*)xmlGetProp(n, (xmlChar*)"flags"))) {
+         epoch = (char*)xmlGetProp(n, (xmlChar*)"epoch");
+         if (epoch)
+            depver += string(epoch) + ":";
+         ver = (char*)xmlGetProp(n, (xmlChar*)"ver");
+         if (ver)
+            depver += string(ver);
+         rel = (char*)xmlGetProp(n, (xmlChar*)"rel");
+         if (rel)
+            depver += "-" + string(rel);
+
+      }
+      Dep->Name = depname;
+      Dep->Version = depver;
+      if (depver.empty() == false)
+        Dep->Op = pkgCache::Dep::Equals;
+      Provs.push_back(Dep);
+   }
+   return true;
+}
+
+bool RPMRepomdHandler::FileProvides(vector<string> &FileProvs)
+{
+   xmlNode *format = FindNode("format");
+   for (xmlNode *n = format->children; n; n = n->next) {
+      if (strcmp((char*)n->name, "file") != 0)  continue;
+      FileProvs.push_back((char*)xmlNodeGetContent(n));
+   }
+   return true;
+}
+
+unsigned short RPMRepomdHandler::VersionHash()
+{
+   // XXX FIXME: rpmlistparser versionhash for all the things we should do here
+   unsigned long Result = INIT_FCS;
+   string nevra = Name() + Version() + Arch();
+   Result = AddCRC16(Result, nevra.c_str(), nevra.length());
+   //cout << "versionhash: " << Result << endl;
+   return Result;
+}
+
+
+
+RPMRepomdHandler::~RPMRepomdHandler()
+{
+   xmlFreeDoc(Primary);
+}
+
 // vim:sts=3:sw=3
index 28eeb6b..70c730a 100644 (file)
 #define PKGLIB_RPMHANDLER_H
 
 #include <apt-pkg/fileutl.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
 
 #include <rpm/rpmlib.h>
 #include <rpm/rpmmacro.h>
 
 #include <config.h>
 
+#include <vector>
+
+// Our Extra RPM tags. These should not be accessed directly. Use
+// the methods in RPMHandler instead.
+#define CRPMTAG_FILENAME          (rpmTag)1000000
+#define CRPMTAG_FILESIZE          (rpmTag)1000001
+#define CRPMTAG_MD5               (rpmTag)1000005
+#define CRPMTAG_SHA1              (rpmTag)1000006
+
+#define CRPMTAG_DIRECTORY         (rpmTag)1000010
+#define CRPMTAG_BINARY            (rpmTag)1000011
+
+#define CRPMTAG_UPDATE_SUMMARY    (rpmTag)1000020
+#define CRPMTAG_UPDATE_IMPORTANCE (rpmTag)1000021
+#define CRPMTAG_UPDATE_DATE       (rpmTag)1000022
+#define CRPMTAG_UPDATE_URL        (rpmTag)1000023
+
+using namespace std;
+
+struct Dependency
+{
+   string Name;
+   string Version;
+   unsigned int Op;
+   unsigned int Type;
+};
+
+
 class RPMHandler
 {
    protected:
@@ -26,6 +56,10 @@ class RPMHandler
    Header HeaderP;
    string ID;
 
+   string GetSTag(rpmTag Tag);
+   unsigned long GetITag(rpmTag Tag);
+
+
    public:
 
    // Return a unique ID for that handler. Actually, implemented used
@@ -38,15 +72,37 @@ class RPMHandler
    inline unsigned Offset() {return iOffset;};
    virtual bool OrderedOffset() {return true;};
    inline unsigned Size() {return iSize;};
-   inline Header GetHeader() {return HeaderP;};
    virtual bool IsDatabase() = 0;
 
    virtual string FileName() {return "";};
    virtual string Directory() {return "";};
    virtual unsigned long FileSize() {return 1;};
    virtual string MD5Sum() {return "";};
+   virtual string SHA1Sum() {return "";};
    virtual bool ProvideFileName() {return false;};
 
+   virtual string Name() {return GetSTag(RPMTAG_NAME);};
+   virtual string Arch() {return GetSTag(RPMTAG_ARCH);};
+   //virtual string Epoch() {return GetSTag(RPMTAG_EPOCH);};
+   virtual string Epoch();
+   virtual string Version() {return GetSTag(RPMTAG_VERSION);};
+   virtual string Release() {return GetSTag(RPMTAG_RELEASE);};
+   virtual string Group() {return GetSTag(RPMTAG_GROUP);};
+   virtual string Packager() {return GetSTag(RPMTAG_PACKAGER);};
+   virtual string Vendor() {return GetSTag(RPMTAG_VENDOR);};
+   virtual string Summary() {return GetSTag(RPMTAG_SUMMARY);};
+   virtual string Description() {return GetSTag(RPMTAG_DESCRIPTION);};
+   virtual unsigned long InstalledSize() {return GetITag(RPMTAG_SIZE);};
+
+   bool InternalDep(const char *name, const char *ver, int_32 flag);
+   virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps);
+   virtual bool Provides(vector<Dependency*> &Provs);
+   virtual bool FileProvides(vector<string> &FileProvs);
+   virtual unsigned short VersionHash();
+
+   virtual bool HasFile(const char *File);
+
+
    RPMHandler() : iOffset(0), iSize(0), HeaderP(0) {};
    virtual ~RPMHandler() {};
 };
@@ -160,20 +216,55 @@ class RPMDirHandler : public RPMHandler
    virtual ~RPMDirHandler();
 };
 
+class RPMRepomdHandler : public RPMHandler
+{
+
+   xmlDocPtr Primary;
+   xmlNode *Root;
+   xmlNode *NodeP;
 
-// Our Extra RPM tags. These should not be accessed directly. Use
-// the methods in RPMHandler instead.
-#define CRPMTAG_FILENAME          1000000
-#define CRPMTAG_FILESIZE          1000001
-#define CRPMTAG_MD5               1000005
-#define CRPMTAG_SHA1              1000006
-
-#define CRPMTAG_DIRECTORY         1000010
-#define CRPMTAG_BINARY            1000011
-
-#define CRPMTAG_UPDATE_SUMMARY    1000020
-#define CRPMTAG_UPDATE_IMPORTANCE 1000021
-#define CRPMTAG_UPDATE_DATE       1000022
-#define CRPMTAG_UPDATE_URL        1000023
+   xmlNode *FindNode(const string Name);
+   xmlNode *FindNode(xmlNode *Node, const string Name);
+
+   string FindTag(xmlNode *Node, const string Tag);
+   string GetContent(xmlNode *Node, string Tag);
+   string GetProp(xmlNode *Node, char *Prop);
+
+   public:
+
+
+   virtual bool Skip();
+   virtual bool Jump(unsigned int Offset);
+   virtual void Rewind();
+   virtual inline bool IsDatabase() {return false;};
+
+   virtual string FileName();
+   virtual string Directory();
+   virtual unsigned long FileSize();
+   virtual unsigned long InstalledSize();
+   virtual string MD5Sum();
+   virtual string SHA1Sum();
+
+   virtual string Name() {return FindTag(NodeP, "name");};
+   virtual string Arch() {return FindTag(NodeP, "arch");};
+   virtual string Epoch();
+   virtual string Version();
+   virtual string Release();
+
+   virtual string Group();
+   virtual string Packager() {return FindTag(NodeP, "packager");};
+   virtual string Vendor();
+   virtual string Summary() {return FindTag(NodeP, "summary");};
+   virtual string Description() {return FindTag(NodeP, "description");};
+
+   virtual bool HasFile(const char *File);
+   virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps);
+   virtual bool Provides(vector<Dependency*> &Provs);
+   virtual bool FileProvides(vector<string> &FileProvs);
+   virtual unsigned short VersionHash();
+
+   RPMRepomdHandler(string File);
+   virtual ~RPMRepomdHandler();
+};
 
 #endif
index d9379a7..a166ffa 100644 (file)
@@ -30,7 +30,7 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/acquire-item.h>
-#include <apt-pkg/repository.h>
+#include <apt-pkg/repomd.h>
 
 #include <apti18n.h>
 
@@ -533,7 +533,243 @@ string rpmSingleSrcIndex::ArchiveURI(string File) const
    free(cwd);
    return URI;
 }
+
+string rpmRepomdIndex::ArchiveURI(string File) const
+{
+   RPMPackageData *rpmdata = RPMPackageData::Singleton();
+   string Res;
+
+   //cout << Dist << File << endl;
+
+   Res += URI + '/' + Dist + '/' + File;
+   //cout << "repomd archiveuri " << " " << Res << endl;
+
+   return Res;
+}
+
+string rpmRepomdIndex::ArchiveInfo(pkgCache::VerIterator Ver) const
+{
+   string Res = ::URI::SiteOnly(URI) + ' ';
+   if (Dist[Dist.size() - 1] == '/')
+   {
+      if (Dist != "/")
+        Res += Dist;
+   }
+   else
+      Res += Dist + '/';
+   
+   Res += " ";
+   Res += Ver.ParentPkg().Name();
+   Res += " ";
+   Res += Ver.VerStr();
+   return Res;
+}
+pkgCache::PkgFileIterator rpmRepomdIndex::FindInCache(pkgCache &Cache) const
+{
+   string FileName = IndexPath();
+   pkgCache::PkgFileIterator File = Cache.FileBegin();
+   for (; File.end() == false; File++)
+   {
+      if (FileName != File.FileName())
+        continue;
+      
+      struct stat St;
+      if (stat(File.FileName(),&St) != 0)
+        return pkgCache::PkgFileIterator(Cache);
+
+      if ((unsigned)St.st_size != File->Size || St.st_mtime != File->mtime)
+        return pkgCache::PkgFileIterator(Cache);
+      return File;
+   }
+   
+   return File;
+}
+string rpmRepomdIndex::ReleaseURI(string Type) const
+{
+   RPMPackageData *rpmdata = RPMPackageData::Singleton();
+   string Res;
+   Res = URI + Dist + "/repodata/" + "repomd.xml";
+
+   //cout << "XXXXX repomd releaseuri " << Res << endl;
+   
+   return Res;
+}
+
+string rpmRepomdIndex::ReleaseInfo(string Type) const
+{
+   string Info = ::URI::SiteOnly(URI) + ' ';
+   if (Dist[Dist.size() - 1] == '/')
+   {
+      if (Dist != "/")
+        Info += Dist;
+   }
+   else
+      Info += Dist;   
+   Info += " ";
+   Info += Type;
+   //cout << "repomd releaseinfo " << Info << endl;
+   return Info;
+};
+
+string rpmRepomdIndex::Info(string Type) const 
+{
+   string Info = ::URI::SiteOnly(URI) + ' ';
+   if (Dist[Dist.size() - 1] == '/')
+   {
+      if (Dist != "/")
+        Info += Dist;
+   }
+   else
+      Info += Dist + '/' ;   
+   Info += " ";
+   Info += Type;
+   //cout << "repomd info " << Info << endl;
+   return Info;
+}
+
+string rpmRepomdIndex::IndexURI(string Type) const
+{
+   RPMPackageData *rpmdata = RPMPackageData::Singleton();
+   string Res = URI + Dist;
+   if (Dist[Dist.size() - 1] != '/') {
+        Res += "/";
+   }
+   Res += "repodata/primary.xml";
+   return Res;
+}
                                                                        /*}}}*/
+bool rpmRepomdIndex::GetReleases(pkgAcquire *Owner) const
+{
+   if (!Repository->Acquire)
+      return true;
+   Repository->Acquire = false;
+   // ignore for now - we need to parse the file for checksum and 
+   // optimally for location of other xml files as well
+   new pkgAcqIndexRel(Owner,Repository,ReleaseURI("repomd.xml"),
+                      ReleaseInfo("repomd.xml"), "repomd.xml", true);
+   return true;
+}
+
+bool rpmRepomdIndex::GetIndexes(pkgAcquire *Owner) const
+{
+   new pkgAcqIndex(Owner,Repository,IndexURI("primary.xml"),
+                  Info("primary.xml"), "primary.xml");
+// wont be needing these for a while...
+#if 0
+   new pkgAcqIndex(Owner,Repository,IndexURI("filelists.xml"),
+                  Info("filelists.xml"), "filelists.xml");
+   new pkgAcqIndex(Owner,Repository,IndexURI("other.xml"),
+                  Info("other.xml"), "other.xml");
+#endif
+   return true;
+}
+
+string rpmRepomdIndex::Describe(bool Short) const
+{
+   char S[300];
+   if (Short == true)
+      snprintf(S,sizeof(S),"%s",Info(MainType()).c_str());
+   else
+      snprintf(S,sizeof(S),"%s (%s)",Info(MainType()).c_str(),
+         IndexFile(MainType()).c_str());
+   return S;
+}
+
+string rpmRepomdIndex::IndexFile(string Type) const
+{
+   //cout << "XXX indexfile " << _config->FindDir("Dir::State::lists")+URItoFileName(IndexURI(Type)) << endl;
+   return _config->FindDir("Dir::State::lists")+URItoFileName(IndexURI(Type));
+};
+
+
+bool rpmRepomdIndex::Exists() const
+{
+   return FileExists(IndexPath());
+}
+
+string rpmRepomdIndex::ReleasePath() const
+{
+   return _config->FindDir("Dir::State::lists")+URItoFileName(ReleaseURI("release.xml"));
+}
+
+
+bool rpmRepomdIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const
+{
+   //cout << "repomd MERGE" << endl;
+   string PackageFile = IndexPath();
+   RPMHandler *Handler = CreateHandler();
+
+   Prog.SubProgress(0,Info(MainType()));
+   ::URI Tmp(URI);
+   if (Gen.SelectFile(PackageFile,Tmp.Host,*this) == false)
+   {
+      delete Handler;
+      return _error->Error(_("Problem with SelectFile %s"),PackageFile.c_str());
+   }
+
+   // Store the IMS information
+   pkgCache::PkgFileIterator File = Gen.GetCurFile();
+   //cout << "merge pkgfile " << PackageFile << endl;
+   struct stat St;
+   if (stat(PackageFile.c_str(),&St) != 0) 
+   {
+      delete Handler;
+      return _error->Errno("stat",_("Failed to stat %s"), PackageFile.c_str());
+   }
+   File->Size = St.st_size;
+   File->mtime = St.st_mtime;
+   
+   rpmRepomdParser Parser(Handler);
+   if (_error->PendingError() == true) 
+   {
+      delete Handler;
+      return _error->Error(_("Problem opening %s"),PackageFile.c_str());
+   }
+   
+   if (Gen.MergeList(Parser) == false)
+   {
+      delete Handler;
+      return _error->Error(_("Problem with MergeList %s"),PackageFile.c_str());
+   }
+   
+   delete Handler;
+
+   // Check the release file
+   string RelFile = ReleasePath();
+   if (FileExists(RelFile) == true)
+   {
+      Parser.LoadReleaseInfo(File,RelFile);
+   }
+
+   return true;
+}
+
+pkgSrcRecords::Parser *rpmRepomdSrcIndex::CreateSrcParser() const
+{
+   return new rpmSrcRecordParser(IndexPath(), this);
+}
+
+string rpmRepomdSrcIndex::SourceInfo(pkgSrcRecords::Parser const &Record,
+                                    pkgSrcRecords::File const &File) const
+{
+   string Res;
+   Res = ::URI::SiteOnly(URI) + ' ';
+   if (Dist[Dist.size() - 1] == '/')
+   {
+      if (Dist != "/")
+        Res += Dist;
+   }      
+   else
+      Res += Dist + '/' + Section;
+   
+   Res += " ";
+   Res += Record.Package();
+   Res += " ";
+   Res += Record.Version();
+   if (File.Type.empty() == false)
+      Res += " (" + File.Type + ")";
+   return Res;
+}
 
 // DatabaseIndex::rpmDatabaseIndex - Constructor                       /*{{{*/
 // ---------------------------------------------------------------------
@@ -670,6 +906,7 @@ class rpmSLTypeGen : public pkgSourceList::Type
       else
         BaseURI = URI + Dist + '/';
 
+      //cout << "XXXX GetRepo " << URI << " " << Dist << " " << BaseURI << endl;
       Rep = new pkgRepository(URI,Dist,Vendor,BaseURI);
       RepList.push_back(Rep);
       return Rep;
@@ -757,10 +994,99 @@ class rpmSLTypeSrpmDir : public rpmSLTypeGen
    }   
 };
 
+class rpmSLTypeRepomd : public rpmSLTypeGen
+{
+   public:
+
+   pkgRepository *GetRepository(string URI,string Dist,
+                               const pkgSourceList::Vendor *Vendor) const
+   {
+      pkgRepository *Rep = FindRepository(URI,Dist,Vendor);
+      if (Rep != NULL)
+        return Rep;
+
+      string BaseURI;
+      if (Dist[Dist.size() - 1] == '/')
+      {
+        if (Dist != "/")
+           BaseURI = URI + Dist;
+        else 
+           BaseURI = URI + '/';
+      }
+      else
+        BaseURI = URI + Dist + '/';
+
+      Rep = new repomdRepository(URI,Dist,Vendor,BaseURI);
+      RepList.push_back(Rep);
+      return Rep;
+   }
+
+   bool CreateItem(vector<pkgIndexFile *> &List,
+                  string URI, string Dist, string Section,
+                  pkgSourceList::Vendor const *Vendor) const 
+   {
+      pkgRepository *Rep = GetRepository(URI,Dist,Vendor);
+      List.push_back(new rpmRepomdPkgIndex(URI,Dist,Section,Rep));
+      return true;
+   };
+
+   bool ParseLine(vector<pkgIndexFile *> &List,
+                  pkgSourceList::Vendor const *Vendor,
+                  const char *Buffer,
+                  unsigned long CurLine,string File) const
+   {
+      string URI;
+      string Dist;
+      if (ParseQuoteWord(Buffer,URI) == false)
+        return _error->Error(_("Malformed line %lu in source list %s (URI)"),CurLine,File.c_str());
+      if (ParseQuoteWord(Buffer,Dist) == false)
+        return _error->Error(_("Malformed line %lu in source list %s (dist)"),CurLine,File.c_str());
+
+      if (FixupURI(URI) == false)
+        return _error->Error(_("Malformed line %lu in source list %s (URI parse)"),CurLine,File.c_str());
+      
+      Dist = SubstVar(Dist,"$(ARCH)",_config->Find("APT::Architecture"));
+      Dist = SubstVar(Dist,"$(VERSION)",_config->Find("APT::DistroVersion"));
+
+      if (CreateItem(List,URI,Dist,"",Vendor) == false)
+        return false;
+
+      return true;
+   };
+
+
+   rpmSLTypeRepomd()
+   {
+      Name = "repomd";
+      Label = "RepoMD tree";
+   }   
+};
+class rpmSLTypeRepomdSrc : public rpmSLTypeRepomd
+{
+   public:
+
+   bool CreateItem(vector<pkgIndexFile *> &List,
+                  string URI, string Dist, string Section,
+                  pkgSourceList::Vendor const *Vendor) const 
+   {
+      pkgRepository *Rep = GetRepository(URI,Dist,Vendor);
+      List.push_back(new rpmRepomdSrcIndex(URI,Dist,Section,Rep));
+      return true;
+   };
+
+   rpmSLTypeRepomdSrc()
+   {
+      Name = "repomd-src";
+      Label = "RepoMD src tree";
+   }   
+};
+
 rpmSLTypeRpm _apt_rpmType;
 rpmSLTypeSrpm _apt_rpmSrcType;
 rpmSLTypeRpmDir _apt_rpmDirType;
 rpmSLTypeSrpmDir _apt_rpmSrcDirType;
+rpmSLTypeRepomd _apt_repomdType;
+rpmSLTypeRepomdSrc _apt_repomdSrcType;
                                                                        /*}}}*/
 // Index File types for rpm                                            /*{{{*/
 class rpmIFTypeSrc : public pkgIndexFile::Type
@@ -821,6 +1147,14 @@ const pkgIndexFile::Type *rpmDatabaseIndex::GetType() const
 {
    return &_apt_DB;
 }
+const pkgIndexFile::Type *rpmRepomdPkgIndex::GetType() const
+{
+   return &_apt_Pkg;
+}
+const pkgIndexFile::Type *rpmRepomdSrcIndex::GetType() const
+{
+   return &_apt_Src;
+}
 
                                                                        /*}}}*/
 #endif /* HAVE_RPM */
index 023d727..b1d96c3 100644 (file)
@@ -107,6 +107,7 @@ class rpmPkgListIndex : public rpmListIndex
    protected:
 
    virtual string MainType() const {return "pkglist";}
+   virtual string IndexPath() const {return IndexFile(MainType());};
 
    public:
 
@@ -276,4 +277,96 @@ class rpmSingleSrcIndex : public rpmSrcListIndex
           rpmSrcListIndex("", "", "", NULL), FilePath(File) {};
 };
 
+class rpmRepomdIndex : public rpmIndexFile
+{
+   protected:
+
+   string URI;
+   string Dist;
+   string Section;
+   pkgRepository *Repository;
+
+   string ReleaseFile(string Type) const;
+   string ReleaseURI(string Type) const;
+   string ReleaseInfo(string Type) const;
+
+   string Info(string Type) const;
+   string IndexFile(string Type) const;
+   string IndexURI(string Type) const;
+
+   virtual string MainType() const = 0;
+   virtual string IndexPath() const {return IndexFile(MainType());};
+   virtual string ReleasePath() const;
+
+   public:
+
+   // Creates a RPMHandler suitable for usage with this object
+   virtual RPMHandler *CreateHandler() const
+          { return new RPMRepomdHandler(IndexPath()); };
+
+   virtual bool GetReleases(pkgAcquire *Owner) const;
+
+   // Interface for the Cache Generator
+   virtual bool Exists() const;
+   virtual unsigned long Size() const {};
+
+   // Interface for acquire
+   virtual string Describe(bool Short) const;
+   virtual bool GetIndexes(pkgAcquire *Owner) const;
+   virtual string ChecksumType() {return "SHA1-Hash";};
+
+   virtual string ArchiveInfo(pkgCache::VerIterator Ver) const;
+   virtual string ArchiveURI(string File) const;
+
+   virtual bool Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const;
+   virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
+
+   rpmRepomdIndex(string URI,string Dist,string Section,
+               pkgRepository *Repository) :
+                       URI(URI), Dist(Dist), Section(Section),
+               Repository(Repository)
+       {};
+
+};
+
+class rpmRepomdPkgIndex : public rpmRepomdIndex
+{
+   protected:
+
+   virtual string MainType() const {return "repomd";};
+
+   public:
+
+   virtual bool HasPackages() const {return true;};
+   virtual const Type *GetType() const;
+
+
+   rpmRepomdPkgIndex(string URI,string Dist,string Section,
+                     pkgRepository *Repository) :
+          rpmRepomdIndex(URI,Dist,Section,Repository) {};
+
+};
+
+class rpmRepomdSrcIndex : public rpmRepomdIndex
+{
+   protected:
+
+   virtual string MainType() const {return "repomd-src";};
+
+   public:
+
+   virtual const Type *GetType() const;
+
+   // Stuff for accessing files on remote items
+   virtual string SourceInfo(pkgSrcRecords::Parser const &Record,
+                            pkgSrcRecords::File const &File) const;
+
+   // Interface for the record parsers
+   virtual pkgSrcRecords::Parser *CreateSrcParser() const;
+
+   rpmRepomdSrcIndex(string URI,string Dist,string Section,
+                     pkgRepository *Repository) :
+          rpmRepomdIndex(URI,Dist,Section,Repository) {};
+
+};
 #endif
index 34dee2e..6ab4646 100644 (file)
@@ -24,6 +24,7 @@
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/crc-16.h>
 #include <apt-pkg/tagfile.h>
+#include <apt-pkg/error.h>
 
 #include <apti18n.h>
 
@@ -44,7 +45,6 @@ rpmListParser::rpmListParser(RPMHandler *Handler)
        : Handler(Handler), VI(0)
 {
    Handler->Rewind();
-   header = NULL;
    if (Handler->IsDatabase() == true)
    {
 #ifdef WITH_HASH_MAP
@@ -66,32 +66,6 @@ rpmListParser::~rpmListParser()
    delete SeenPackages;
 }
 
-// ListParser::UniqFindTagWrite - Find the tag and write a unq string  /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-unsigned long rpmListParser::UniqFindTagWrite(int Tag)
-{
-   char *Start;
-   char *Stop;
-   int type;
-   int count;
-   void *data;
-   
-   if (headerGetEntry(header, Tag, &type, &data, &count) != 1)
-      return 0;
-   
-   if (type == RPM_STRING_TYPE) 
-   {
-      Start = (char*)data;
-      Stop = Start + strlen(Start);
-   } else {
-      cout << "oh shit, not handled:"<<type<<" Package:"<<Package()<<endl;
-      abort();
-   }
-   
-   return WriteUniqString(Start,Stop - Start);
-}
-
                                                                         /*}}}*/
 // ListParser::Package - Return the package name                       /*{{{*/
 // ---------------------------------------------------------------------
@@ -108,19 +82,19 @@ string rpmListParser::Package()
    }
 #endif
 
-   char *str;
+   string Name = Handler->Name();
    int type, count;
    
    Duplicated = false;
    
-   if (headerGetEntry(header, RPMTAG_NAME, &type, (void**)&str, &count) != 1) 
+   
+   if (Name.empty() == true)
    {
       _error->Error(_("Corrupt pkglist: no RPMTAG_NAME in header entry"));
       return "";
    } 
 
    bool IsDup = false;
-   string Name = str;
 
    if (RpmData->IsMultilibSys() && RpmData->IsCompatArch(Architecture())) {
         Name += ".32bit";       
@@ -176,12 +150,7 @@ string rpmListParser::Architecture()
    if (VI != NULL)
       return VI->Arch();
 #endif
-
-   int type, count;
-   char *arch;
-   int res;
-   res = headerGetEntry(header, RPMTAG_ARCH, &type, (void **)&arch, &count);
-   return string(res?arch:"");
+   return Handler->Arch();
 }
                                                                         /*}}}*/
 // ListParser::Version - Return the version string                     /*{{{*/
@@ -196,35 +165,18 @@ string rpmListParser::Version()
       return VI->VerStr();
 #endif
 
-   char *ver, *rel;
-   int_32 *ser;
-   bool has_epoch = false;
-   int type, count;
-   string str;
-   str.reserve(10);
-
-   if (headerGetEntry(header, RPMTAG_EPOCH, &type, (void **)&ser, &count) == 1
-       && count > 0) 
-      has_epoch = true;
+   string epoch, ver, rel, verstr;
    
-   headerGetEntry(header, RPMTAG_VERSION, &type, (void **)&ver, &count);
-   headerGetEntry(header, RPMTAG_RELEASE, &type, (void **)&rel, &count);
-
-   if (has_epoch == true) {
-      char buf[32];
-      snprintf(buf, sizeof(buf), "%i", ser[0]);
-      str += buf;
-      str += ":";
-      str += ver;
-      str += "-";
-      str += rel;
-   }
-   else {
-      str += ver;
-      str += "-";
-      str += rel;
-   }
-   return str;
+   epoch = Handler->Epoch();
+   ver = Handler->Version();
+   rel = Handler->Release();
+
+   if (epoch.empty() == true)
+      verstr = ver + "-" + rel;
+   else
+      verstr = epoch + ":" + ver + "-" + rel;
+
+   return verstr;
 }
                                                                         /*}}}*/
 // ListParser::NewVersion - Fill in the version structure              /*{{{*/
@@ -241,15 +193,14 @@ bool rpmListParser::NewVersion(pkgCache::VerIterator Ver)
 #endif
    
    // Parse the section
-   Ver->Section = UniqFindTagWrite(RPMTAG_GROUP);
-   Ver->Arch = UniqFindTagWrite(RPMTAG_ARCH);
+   Ver->Section = WriteUniqString(Handler->Group());
+   Ver->Arch = WriteUniqString(Handler->Arch());
    
    // Archive Size
    Ver->Size = Handler->FileSize();
    
    // Unpacked Size (in kbytes)
-   headerGetEntry(header, RPMTAG_SIZE, &type, (void**)&num, &count);
-   Ver->InstalledSize = (unsigned)num[0];
+   Ver->InstalledSize = Handler->InstalledSize();
      
    if (ParseDepends(Ver,pkgCache::Dep::Depends) == false)
        return false;
@@ -282,7 +233,7 @@ bool rpmListParser::UsePackage(pkgCache::PkgIterator Pkg,
    if (SeenPackages != NULL)
       (*SeenPackages)[Pkg.Name()] = true;
    if (Pkg->Section == 0)
-      Pkg->Section = UniqFindTagWrite(RPMTAG_GROUP);
+      Pkg->Section = WriteUniqString(Handler->Group());
    if (_error->PendingError()) 
        return false;
    string PkgName = Pkg.Name();
@@ -316,57 +267,7 @@ unsigned short rpmListParser::VersionHash()
       return (*VI)->Hash;
 #endif
       
-   int Sections[] = {
-         RPMTAG_VERSION,
-         RPMTAG_RELEASE,
-         RPMTAG_ARCH,
-         RPMTAG_REQUIRENAME,
-         RPMTAG_OBSOLETENAME,
-         RPMTAG_CONFLICTNAME,
-         0
-   };
-   unsigned long Result = INIT_FCS;
-   
-   for (const int *sec = Sections; *sec != 0; sec++)
-   {
-      char *Str;
-      int Len;
-      int type, count;
-      int res;
-      char **strings = NULL;
-      
-      res = headerGetEntry(header, *sec, &type, (void **)&strings, &count);
-      if (res != 1)
-        continue;
-      
-      switch (type) 
-      {
-      case RPM_STRING_ARRAY_TYPE:
-        //qsort(strings, count, sizeof(char*), compare);
-        while (count-- > 0) 
-        {
-           Str = strings[count];
-           Len = strlen(Str);
-
-           /* Suse patch.rpm hack. */
-           if (Len == 17 && *Str == 'r' && *sec == RPMTAG_REQUIRENAME &&
-               strcmp(Str, "rpmlib(PatchRPMs)") == 0)
-              continue;
-           
-           Result = AddCRC16(Result,Str,Len);
-        }
-        free(strings);
-        break;
-        
-      case RPM_STRING_TYPE:
-        Str = (char*)strings;
-        Len = strlen(Str);
-        Result = AddCRC16(Result,Str,Len);
-        break;
-      }
-   }
-   
-   return Result;
+   return Handler->VersionHash();
 }
                                                                         /*}}}*/
 // ListParser::ParseStatus - Parse the status field                    /*{{{*/
@@ -388,170 +289,6 @@ bool rpmListParser::ParseStatus(pkgCache::PkgIterator Pkg,
    return true;
 }
 
-
-bool rpmListParser::ParseDepends(pkgCache::VerIterator Ver,
-                                char **namel, char **verl, int_32 *flagl,
-                                int count, unsigned int Type)
-{
-   int i = 0;
-   unsigned int Op = 0;
-   bool DepMode = false;
-   if (Type == pkgCache::Dep::Depends)
-      DepMode = true;
-   
-   for (; i < count; i++) 
-   {
-      if (DepMode == true) {
-        if (flagl[i] & RPMSENSE_PREREQ)
-           Type = pkgCache::Dep::PreDepends;
-#if RPM_VERSION >= 0x040403
-        else if (flagl[i] & RPMSENSE_MISSINGOK)
-           Type = pkgCache::Dep::Suggests;
-#endif
-        else
-           Type = pkgCache::Dep::Depends;
-      }
-
-#if RPM_VERSION >= 0x040404
-      // uhhuh, any of these changing would require full cache rebuild...
-      if (strncmp(namel[i], "getconf(", sizeof("getconf(")-1) == 0)
-      {
-        rpmds getconfProv = NULL;
-        rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
-                               namel[i], verl?verl[i]:NULL, flagl[i]);
-        rpmdsGetconf(&getconfProv, NULL);
-        int res = rpmdsSearch(getconfProv, ds);
-        rpmdsFree(ds);
-        rpmdsFree(getconfProv);
-        if (res) continue;
-      }
-
-      if (strncmp(namel[i], "cpuinfo(", sizeof("cpuinfo(")-1) == 0)
-      {
-        rpmds cpuinfoProv = NULL;
-        rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
-                               namel[i], verl?verl[i]:NULL, flagl[i]);
-        rpmdsCpuinfo(&cpuinfoProv, NULL);
-        int res = rpmdsSearch(cpuinfoProv, ds);
-        rpmdsFree(ds);
-        rpmdsFree(cpuinfoProv);
-        if (res) continue;
-      }
-
-      if (strncmp(namel[i], "sysinfo(", sizeof("sysinfo(")-1) == 0)
-      {
-        rpmds sysinfoProv = NULL;
-        rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
-                               namel[i], verl?verl[i]:NULL, flagl[i]);
-        rpmdsCpuinfo(&sysinfoProv, NULL);
-        int res = rpmdsSearch(sysinfoProv, ds);
-        rpmdsFree(ds);
-        rpmdsFree(sysinfoProv);
-        if (res) continue;
-      }
-
-      if (strncmp(namel[i], "uname(", sizeof("uname(")-1) == 0)
-      {
-        rpmds unameProv = NULL;
-        rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
-                               namel[i], verl?verl[i]:NULL, flagl[i]);
-        rpmdsUname(&unameProv, NULL);
-        int res = rpmdsSearch(unameProv, ds);
-        rpmdsFree(ds);
-        rpmdsFree(unameProv);
-        if (res) continue;
-      }
-
-      if (strlen(namel[i]) > 5 && namel[i][strlen(namel[i])-1] == ')' &&
-         ((strchr("Rr_", namel[i][0]) != NULL &&
-           strchr("Ww_", namel[i][1]) != NULL &&
-           strchr("Xx_", namel[i][2]) != NULL &&
-           namel[i][3] == '(') ||
-           strncmp(namel[i], "exists(", sizeof("exists(")-1) == 0 ||
-           strncmp(namel[i], "executable(", sizeof("executable(")-1) == 0 ||
-           strncmp(namel[i], "readable(", sizeof("readable(")-1) == 0 ||
-           strncmp(namel[i], "writable(", sizeof("writable(")-1)== 0 ))
-      {
-        int res = rpmioAccess(namel[i], NULL, X_OK);
-        if (res == 0)
-           continue;
-      }
-
-      /* TODO
-       * - /etc/rpm/sysinfo provides
-       * - macro probe provides 
-       * - actually implement soname() and access() dependencies
-       */
-      if (strncmp(namel[i], "soname(", sizeof("soname(")-1) == 0)
-      {
-        cout << "FIXME, ignoring soname() dependency: " << namel[i] << endl;
-        continue;
-      }
-      
-
-#endif
-      
-      if (strncmp(namel[i], "rpmlib(", sizeof("rpmlib(")-1) == 0)
-      {
-#if RPM_VERSION >= 0x040404
-        rpmds rpmlibProv = NULL;
-        rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
-                               namel[i], verl?verl[i]:NULL, flagl[i]);
-        rpmdsRpmlib(&rpmlibProv, NULL);
-        int res = rpmdsSearch(rpmlibProv, ds) >= 0;
-        rpmdsFree(ds);
-        rpmdsFree(rpmlibProv);
-#elif RPM_VERSION >= 0x040100
-        rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
-                               namel[i], verl?verl[i]:NULL, flagl[i]);
-        int res = rpmCheckRpmlibProvides(ds);
-        rpmdsFree(ds);
-#else
-        int res = rpmCheckRpmlibProvides(namel[i], verl?verl[i]:NULL,
-                                         flagl[i]);
-#endif
-        if (res) continue;
-      }
-
-      if (verl) 
-      {
-        if (!*verl[i]) 
-        {
-           Op = pkgCache::Dep::NoOp;
-        }
-        else 
-        {
-           if (flagl[i] & RPMSENSE_LESS) 
-           {
-              if (flagl[i] & RPMSENSE_EQUAL)
-                  Op = pkgCache::Dep::LessEq;
-              else
-                  Op = pkgCache::Dep::Less;
-           } 
-           else if (flagl[i] & RPMSENSE_GREATER) 
-           {
-              if (flagl[i] & RPMSENSE_EQUAL)
-                  Op = pkgCache::Dep::GreaterEq;
-              else
-                  Op = pkgCache::Dep::Greater;
-           } 
-           else if (flagl[i] & RPMSENSE_EQUAL) 
-           {
-              Op = pkgCache::Dep::Equals;
-           }
-        }
-        
-        if (NewDepends(Ver,namel[i],verl[i],Op,Type) == false)
-            return false;
-      } 
-      else 
-      {
-        if (NewDepends(Ver,namel[i],"",pkgCache::Dep::NoOp,Type) == false)
-            return false;
-      }
-   }
-   return true;
-}
                                                                         /*}}}*/
 // ListParser::ParseDepends - Parse a dependency list                  /*{{{*/
 // ---------------------------------------------------------------------
@@ -560,77 +297,20 @@ bool rpmListParser::ParseDepends(pkgCache::VerIterator Ver,
 bool rpmListParser::ParseDepends(pkgCache::VerIterator Ver,
                                 unsigned int Type)
 {
-   char **namel = NULL;
-   char **verl = NULL;
-   int *flagl = NULL;
-   int res, type, count;
-   
-   switch (Type) 
-   {
-   case pkgCache::Dep::Depends:
-      res = headerGetEntry(header, RPMTAG_REQUIRENAME, &type, 
-                          (void **)&namel, &count);
-      if (res != 1)
-         return true;
-      res = headerGetEntry(header, RPMTAG_REQUIREVERSION, &type, 
-                          (void **)&verl, &count);
-      res = headerGetEntry(header, RPMTAG_REQUIREFLAGS, &type,
-                          (void **)&flagl, &count);
-      break;
-      
-   case pkgCache::Dep::Obsoletes:
-      res = headerGetEntry(header, RPMTAG_OBSOLETENAME, &type,
-                          (void **)&namel, &count);
-      if (res != 1)
-         return true;
-      res = headerGetEntry(header, RPMTAG_OBSOLETEVERSION, &type,
-                          (void **)&verl, &count);
-      res = headerGetEntry(header, RPMTAG_OBSOLETEFLAGS, &type,
-                          (void **)&flagl, &count);      
-      break;
-
-   case pkgCache::Dep::Conflicts:
-      res = headerGetEntry(header, RPMTAG_CONFLICTNAME, &type, 
-                          (void **)&namel, &count);
-      if (res != 1)
-         return true;
-      res = headerGetEntry(header, RPMTAG_CONFLICTVERSION, &type, 
-                          (void **)&verl, &count);
-      res = headerGetEntry(header, RPMTAG_CONFLICTFLAGS, &type,
-                          (void **)&flagl, &count);
-      break;
-#if RPM_VERSION >= 0x040403
-   case pkgCache::Dep::Suggests:
-      res = headerGetEntry(header, RPMTAG_SUGGESTSNAME, &type, 
-                          (void **)&namel, &count);
-      if (res != 1)
-         return true;
-      res = headerGetEntry(header, RPMTAG_SUGGESTSVERSION, &type, 
-                          (void **)&verl, &count);
-      res = headerGetEntry(header, RPMTAG_SUGGESTSFLAGS, &type,
-                          (void **)&flagl, &count);
-      break;
-#if 0 // Enhances is not even known to apt, sigh...
-   case pkgCache::Dep::Enhances:
-      res = headerGetEntry(header, RPMTAG_ENHANCESNAME, &type, 
-                          (void **)&namel, &count);
-      if (res != 1)
-         return true;
-      res = headerGetEntry(header, RPMTAG_ENHANCESVERSION, &type, 
-                          (void **)&verl, &count);
-      res = headerGetEntry(header, RPMTAG_ENHANCESFLAGS, &type,
-                          (void **)&flagl, &count);
-      break;
-#endif
-#endif
-   }
-   
-   ParseDepends(Ver, namel, verl, flagl, count, Type);
+   vector<Dependency*> Deps;
 
-   free(namel);
-   free(verl);
+   if (Handler->Depends(Type, Deps) == false)
+      return false;
    
+   for (vector<Dependency*>::iterator I = Deps.begin(); I != Deps.end(); I++) {
+      if (NewDepends(Ver,(*I)->Name,(*I)->Version,
+                   (*I)->Op,(*I)->Type) == false) {
+        cout << "failed adding dep!" << endl; 
+        return false;
+      }
+   }
    return true;
+
 }
                                                                         /*}}}*/
 #ifdef OLD_FILEDEPS
@@ -657,14 +337,14 @@ bool rpmListParser::ProcessFileProvides(pkgCache::VerIterator Ver)
 bool rpmListParser::CollectFileProvides(pkgCache &Cache,
                                        pkgCache::VerIterator Ver)
 {
-   const char **names = NULL;
-   int_32 count = 0;
+   vector<string> Files;
    bool ret = true;
-   rpmHeaderGetEntry(header, RPMTAG_OLDFILENAMES,
-                    NULL, (void **) &names, &count);
-   while (count--) 
-   {
-      const char *FileName = names[count];
+
+   if (Handler->FileProvides(Files) == false) {
+      return false;
+   }
+   for (vector<string>::iterator I = Files.begin(); I != Files.end(); I++) {
+      const char *FileName = (*I).c_str();
       pkgCache::Package *P = Cache.FindPackage(FileName);
       if (P != NULL) {
         // Check if this is already provided.
@@ -682,7 +362,6 @@ bool rpmListParser::CollectFileProvides(pkgCache &Cache,
         }
       }
    }
-   free(names);
    return ret;
 }
 
@@ -691,49 +370,19 @@ bool rpmListParser::CollectFileProvides(pkgCache &Cache,
 /* */
 bool rpmListParser::ParseProvides(pkgCache::VerIterator Ver)
 {
-   int type, count;
-   char **namel = NULL;
-   char **verl = NULL;
-   int res;
-
-   res = headerGetEntry(header, RPMTAG_PROVIDENAME, &type,
-                       (void **)&namel, &count);
-   if (res != 1)
-       return true;
-   /*
-    res = headerGetEntry(header, RPMTAG_PROVIDEFLAGS, &type,
-    (void **)&flagl, &count);
-    if (res != 1)
-    return true;
-    */
-   res = headerGetEntry(header, RPMTAG_PROVIDEVERSION, &type, 
-                       (void **)&verl, NULL);
-   if (res != 1)
-       verl = NULL;
+   vector<Dependency*> Provs;
 
-   bool ret = true;
-   for (int i = 0; i < count; i++) 
-   {      
-      if (verl && *verl[i]) 
-      {
-        if (NewProvides(Ver,namel[i],verl[i]) == false) {
-           ret = false;
-           break;
-        }
-      } 
-      else 
-      {
-        if (NewProvides(Ver,namel[i],"") == false) {
-           ret = false;
-           break;
-        }
+   if (Handler->Provides(Provs) == false) {
+      return false;
+   }
+   for (vector<Dependency*>::iterator I = Provs.begin(); I != Provs.end(); I++) {
+      if (NewProvides(Ver,(*I)->Name,(*I)->Version) == false) {
+        cout << "failed adding provide!" << endl; 
+        return false;
       }
    }
+   return true;
 
-   free(namel);
-   free(verl);
-    
-   return ret;
 }
                                                                         /*}}}*/
 // ListParser::Step - Move to the next section in the file             /*{{{*/
@@ -743,7 +392,6 @@ bool rpmListParser::Step()
 {
    while (Handler->Skip() == true)
    {
-      header = Handler->GetHeader();
       CurrentName = "";
 
 #ifdef WITH_VERSION_CACHING
@@ -775,7 +423,6 @@ bool rpmListParser::Step()
         return true;
 #endif
    }
-   header = NULL;
    return false;
 }
                                                                         /*}}}*/
@@ -815,11 +462,7 @@ bool rpmListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI,
 
 unsigned long rpmListParser::Size() 
 {
-   uint_32 *size;
-   int type, count;
-   if (headerGetEntry(header, RPMTAG_SIZE, &type, (void **)&size, &count)!=1)
-       return 1;
-   return (size[0]+512)/1024;
+   return (Handler->InstalledSize()+512)/1024;
 }
 
 // This is a slightly complex operation. It must take a package, and
@@ -895,6 +538,55 @@ void rpmListParser::VirtualizePackage(string Name)
    FromPkgI->CurrentState = 0;
 }
 
+xmlNode *rpmRepomdParser::FindNode(xmlNode *n, const string Name)
+{
+   for (n = n->children; n; n = n->next) {
+      if (strcmp((char*)n->name, Name.c_str()) == 0) {
+        return n;
+      }
+   }
+   return NULL;
+}
+
+bool rpmRepomdParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI,
+                                   string File)
+{
+   xmlDocPtr RepoMD = NULL;
+   xmlNode *Root = NULL;
+
+   //cout << "Load repomd release " << endl;
+   RepoMD = xmlReadFile(File.c_str(), NULL, XML_PARSE_NONET);
+   if ((Root = xmlDocGetRootElement(RepoMD)) == NULL) {
+      xmlFreeDoc(RepoMD);
+      return _error->Error(_("could not open Release file '%s'"),File.c_str());
+   }
+
+   /* Parse primary, filelists and other location from here */
+   for (xmlNode *n = Root->children; n; n = n->next) {
+      if (n->type == XML_ELEMENT_NODE && strcmp((char*)n->name, "data") == 0) {
+        string type = (char*)xmlGetProp(n, (xmlChar*)"type");
+        if (type == "primary") {
+           xmlNode *loc = FindNode(n, "location");
+           if (loc) {
+              Primary = (char*)xmlGetProp(loc, (xmlChar*)"href");
+             //cout << "found primary " << Primary << endl;
+           }
+       } else if (type == "filelists") {
+           xmlNode *loc = FindNode(n, "location");
+           if (loc) {
+              Filelist = (char*)xmlGetProp(loc, (xmlChar*)"href");
+              //cout << "found filelist " << Filelist << endl;
+           }
+        }
+      }
+
+      //cout << "XXXX " << n->name << endl;
+   }
+
+   xmlFreeDoc(RepoMD);
+   return true;
+}
+
 #endif /* HAVE_RPM */
 
 // vim:sts=3:sw=3
index 319dc53..6360488 100644 (file)
@@ -17,6 +17,9 @@
 #include <apt-pkg/rpmhandler.h>
 #include <apt-pkg/rpmmisc.h>
 #include <rpm/rpmlib.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
 #include <map>
 #include <vector>
 #include <regex.h>
@@ -30,7 +33,6 @@ class rpmListParser : public pkgCacheGenerator::ListParser
 {
    RPMHandler *Handler;
    RPMPackageData *RpmData;
-   Header header;
 
    string CurrentName;
    const pkgCache::VerIterator *VI;
@@ -45,7 +47,6 @@ class rpmListParser : public pkgCacheGenerator::ListParser
 
    bool Duplicated;
    
-   unsigned long UniqFindTagWrite(int Tag);
    bool ParseStatus(pkgCache::PkgIterator Pkg,pkgCache::VerIterator Ver);
    bool ParseDepends(pkgCache::VerIterator Ver,
                     char **namel, char **verl, int_32 *flagl,
@@ -90,4 +91,21 @@ class rpmListParser : public pkgCacheGenerator::ListParser
    ~rpmListParser();
 };
 
+class rpmRepomdParser : public rpmListParser
+{
+   protected:
+
+   string Primary;
+   string Filelist;
+   string Other;
+
+   xmlNode *FindNode(xmlNode *n, const string Name);
+
+   public:
+   bool LoadReleaseInfo(pkgCache::PkgFileIterator FileI,string File);
+
+   rpmRepomdParser(RPMHandler *Handler) : rpmListParser(Handler) {};
+};
+
 #endif
index 6f8f270..774a293 100644 (file)
 
 #include <apti18n.h>
 
+using namespace std;
+
 // RecordParser::rpmRecordParser - Constructor                         /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 rpmRecordParser::rpmRecordParser(string File, pkgCache &Cache)
-   : Handler(0), HeaderP(0), Buffer(0), BufSize(0), BufUsed(0)
+   : Handler(0), Buffer(0), BufSize(0), BufUsed(0)
 {
    if (File == RPMDBHandler::DataPath(false)) {
       IsDatabase = true;
@@ -41,6 +43,8 @@ rpmRecordParser::rpmRecordParser(string File, pkgCache &Cache)
         Handler = new RPMDirHandler(File);
       else if (flExtension(File) == "rpm")
         Handler = new RPMSingleFileHandler(File);
+      else if (flExtension(File) == "xml")
+        Handler = new RPMRepomdHandler(File);
       else
         Handler = new RPMFileHandler(File);
    }
@@ -63,9 +67,7 @@ rpmRecordParser::~rpmRecordParser()
 /* */
 bool rpmRecordParser::Jump(pkgCache::VerFileIterator const &Ver)
 {
-   Handler->Jump(Ver->Offset);
-   HeaderP = Handler->GetHeader();
-   return (HeaderP != NULL);
+   return Handler->Jump(Ver->Offset);
 }
                                                                        /*}}}*/
 // RecordParser::FileName - Return the archive filename on the site    /*{{{*/
@@ -84,12 +86,7 @@ string rpmRecordParser::FileName()
 /* */
 string rpmRecordParser::Name()
 {
-   char *str;
-   int_32 count, type;
-   assert(HeaderP != NULL);
-   int rc = headerGetEntry(HeaderP, RPMTAG_NAME,
-                          &type, (void**)&str, &count);
-   return string(rc?str:"");
+   return Handler->Name();
 }
                                                                        /*}}}*/
 // RecordParser::MD5Hash - Return the archive hash                     /*{{{*/
@@ -100,17 +97,17 @@ string rpmRecordParser::MD5Hash()
    return Handler->MD5Sum();
 }
                                                                        /*}}}*/
+string rpmRecordParser::SHA1Hash()
+{
+   return Handler->SHA1Sum();
+}
+
 // RecordParser::Maintainer - Return the maintainer email              /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 string rpmRecordParser::Maintainer()
 {
-   char *str;
-   int_32 count, type;
-   assert(HeaderP != NULL);
-   int rc = headerGetEntry(HeaderP, RPMTAG_PACKAGER,
-                          &type, (void**)&str, &count);
-   return string(rc?str:"");
+   return Handler->Packager();
 }
                                                                        /*}}}*/
 // RecordParser::ShortDesc - Return a 1 line description               /*{{{*/
@@ -118,15 +115,7 @@ string rpmRecordParser::Maintainer()
 /* */
 string rpmRecordParser::ShortDesc()
 {
-   char *str;
-   int_32 count, type;
-   assert(HeaderP != NULL);
-   int rc = headerGetEntry(HeaderP, RPMTAG_SUMMARY,
-                          &type, (void**)&str, &count);
-   if (rc != 1)
-      return string();
-   else
-      return string(str,0,string(str).find('\n'));
+   return Handler->Summary();
 }
                                                                        /*}}}*/
 // RecordParser::LongDesc - Return a longer description                        /*{{{*/
@@ -134,41 +123,7 @@ string rpmRecordParser::ShortDesc()
 /* */
 string rpmRecordParser::LongDesc()
 {
-   char *str, *ret, *x, *y;
-   int_32 count, type;
-   int len;
-   assert(HeaderP != NULL);
-   int rc = headerGetEntry(HeaderP, RPMTAG_DESCRIPTION,
-                          &type, (void**)&str, &count);
-   if (rc != 1)
-      return "";
-
-   // Count size plus number of newlines
-   for (x = str, len = 0; *x; x++, len++)
-      if (*x == '\n')
-        len++;
-   
-   ret = (char*)malloc(len+1);
-   if (ret == NULL)
-      return "out of mem";
-
-   // Copy string, inserting a space after each newline
-   for (x = str, y = ret; *x; x++, y++)
-   {
-      *y = *x;
-      if (*x == '\n')
-        *++y = ' ';
-   }
-   *y = 0;
-
-   // Remove spaces and newlines from end of string
-   for (y--; y > ret && (*y == ' ' || *y == '\n'); y--)
-      *y = 0;
-   
-   string Ret = string(ret);
-   free(ret);
-   
-   return Ret;
+   return Handler->Description();
 }
                                                                        /*}}}*/
 // RecordParser::SourcePkg - Return the source package name if any     /*{{{*/
@@ -214,42 +169,35 @@ void rpmRecordParser::BufCatTag(const char *tag, const char *value)
    BufCat(value);
 }
 
-void rpmRecordParser::BufCatDep(const char *pkg,
-                               const char *version,
-                               int flags)
+void rpmRecordParser::BufCatDep(Dependency *Dep)
 {
-   char buf[16];
-   char *ptr = buf;
+   string buf;
 
-   BufCat(pkg);
-   if (*version
+   BufCat(Dep->Name.c_str());
+   if (Dep->Version.empty() == false
    {
-      int c = 0;
-      *ptr++ = ' ';
-      *ptr++ = '(';
-      if (flags & RPMSENSE_LESS)
-      {
-        *ptr++ = '<';
-        c = '<';
+      BufCat(" ");
+      switch (Dep->Op) {
+        case pkgCache::Dep::Less:
+           buf += "<";
+           break;
+        case pkgCache::Dep::LessEq:
+           buf += "<=";
+           break;
+        case pkgCache::Dep::Equals: 
+           buf += "=";
+           break;
+        case pkgCache::Dep::Greater:
+           buf += ">";
+           break;
+        case pkgCache::Dep::GreaterEq:
+           buf += ">=";
+           break;
       }
-      if (flags & RPMSENSE_GREATER) 
-      {
-        *ptr++ = '>';
-        c = '>';
-      }
-      if (flags & RPMSENSE_EQUAL) 
-      {
-        *ptr++ = '=';
-      }/* else {
-        if (c)
-          fputc(c, f);
-      }*/
-      *ptr++ = ' ';
-      *ptr = '\0';
-
-      BufCat(buf);
-      BufCat(version);
-      BufCat(")");
+
+      BufCat(buf.c_str());
+      BufCat(" ");
+      BufCat(Dep->Version.c_str());
    }
 }
 
@@ -287,125 +235,95 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
 
    BufUsed = 0;
 
-   assert(HeaderP != NULL);
-   
-   headerGetEntry(HeaderP, RPMTAG_NAME, &type, (void **)&str, &count);
-   BufCatTag("Package: ", str);
+   BufCatTag("Package: ", Handler->Name().c_str());
 
-   headerGetEntry(HeaderP, RPMTAG_GROUP, &type, (void **)&str, &count);
-   BufCatTag("\nSection: ", str);
+   BufCatTag("\nSection: ", Handler->Group().c_str());
 
-   headerGetEntry(HeaderP, RPMTAG_SIZE, &type, (void **)&numv, &count);
-   snprintf(buf, sizeof(buf), "%d", numv[0]);
+   snprintf(buf, sizeof(buf), "%d", Handler->InstalledSize());
    BufCatTag("\nInstalled Size: ", buf);
 
-   str = NULL;
-   headerGetEntry(HeaderP, RPMTAG_PACKAGER, &type, (void **)&str, &count);
-   if (!str)
-       headerGetEntry(HeaderP, RPMTAG_VENDOR, &type, (void **)&str, &count);
-   BufCatTag("\nMaintainer: ", str);
+   BufCatTag("\nPackager: ", Handler->Packager().c_str());
+   //BufCatTag("\nVendor: ", Handler->Vendor().c_str());
    
    BufCat("\nVersion: ");
-   headerGetEntry(HeaderP, RPMTAG_VERSION, &type, (void **)&str, &count);
-   if (headerGetEntry(HeaderP, RPMTAG_EPOCH, &type, (void **)&numv, &count)==1)
-       snprintf(buf, sizeof(buf), "%i:%s-", numv[0], str);
-   else
-       snprintf(buf, sizeof(buf), "%s-", str);
-   BufCat(buf);
-   headerGetEntry(HeaderP, RPMTAG_RELEASE, &type, (void **)&str, &count);
-   BufCat(str);
-
-//   headerGetEntry(HeaderP, RPMTAG_DISTRIBUTION, &type, (void **)&str, &count);
-//   fprintf(f, "Distribution: %s\n", str);
-
-   headerGetEntry(HeaderP, RPMTAG_REQUIRENAME, &type, (void **)&strv, &count);
-   assert(type == RPM_STRING_ARRAY_TYPE || count == 0);
-
-   headerGetEntry(HeaderP, RPMTAG_REQUIREVERSION, &type2, (void **)&strv2, &count);
-   headerGetEntry(HeaderP, RPMTAG_REQUIREFLAGS, &type3, (void **)&numv, &count);
    
-   if (count > 0)
-   {
-      int i, j;
-
-      for (j = i = 0; i < count; i++) 
-      {
-        if ((numv[i] & RPMSENSE_PREREQ))
-        {
-           if (j == 0) 
-               BufCat("\nPre-Depends: ");
-           else
-               BufCat(", ");
-           BufCatDep(strv[i], strv2[i], numv[i]);
-           j++;
-        }
+   string e, v, r, verstr;
+   e = Handler->Epoch();
+   v = Handler->Version();
+   r = Handler->Release();
+   
+   if (e.empty() == false)
+      verstr = e + ":" + v + "-" + r;
+   else
+      verstr = v + "-" + r;
+      
+   BufCat(verstr.c_str());
+
+
+   vector<Dependency*> Deps, Provides, Obsoletes, Conflicts;
+   vector<Dependency*>::iterator I;
+   bool start = true;
+
+   Handler->Depends(pkgCache::Dep::Depends, Deps);
+   for (I = Deps.begin(); I != Deps.end(); I++) {
+      if ((*I)->Type != pkgCache::Dep::PreDepends)
+        continue;
+      if (start) {
+        BufCat("\nPre-Depends: ");
+        start = false;
+      } else {
+        BufCat(", ");
       }
+      BufCatDep(*I);
+   }
 
-      for (j = 0, i = 0; i < count; i++) 
-      {
-        if (!(numv[i] & RPMSENSE_PREREQ)) 
-        {
-           if (j == 0)
-               BufCat("\nDepends: ");
-           else
-               BufCat(", ");
-           BufCatDep(strv[i], strv2[i], numv[i]);
-           j++;
-        }
+   start = true;
+   for (I = Deps.begin(); I != Deps.end(); I++) {
+      if ((*I)->Type != pkgCache::Dep::Depends)
+        continue;
+      if (start) {
+        BufCat("\nDepends: ");
+        start = false;
+      } else {
+        BufCat(", ");
       }
+      BufCatDep(*I);
    }
-   
-   headerGetEntry(HeaderP, RPMTAG_CONFLICTNAME, &type, (void **)&strv, &count);
-   assert(type == RPM_STRING_ARRAY_TYPE || count == 0);
-
-   headerGetEntry(HeaderP, RPMTAG_CONFLICTVERSION, &type2, (void **)&strv2, &count);
-   headerGetEntry(HeaderP, RPMTAG_CONFLICTFLAGS, &type3, (void **)&numv, &count);
-   
-   if (count > 0) 
-   {
+      
+   Handler->Depends(pkgCache::Dep::Conflicts, Conflicts);
+   I = Conflicts.begin();
+   if (I != Conflicts.end()) {
       BufCat("\nConflicts: ");
-      for (int i = 0; i < count; i++) 
-      {
-        if (i > 0)
-            BufCat(", ");
-        BufCatDep(strv[i], strv2[i], numv[i]);
-      }
+      BufCatDep(*I);
+   }
+   for (; I != Conflicts.end(); I++) {
+      BufCat(", ");
+      BufCatDep(*I);
    }
 
-   headerGetEntry(HeaderP, RPMTAG_PROVIDENAME, &type, (void **)&strv, &count);
-   assert(type == RPM_STRING_ARRAY_TYPE || count == 0);
-
-   headerGetEntry(HeaderP, RPMTAG_PROVIDEVERSION, &type2, (void **)&strv2, &count);
-   headerGetEntry(HeaderP, RPMTAG_PROVIDEFLAGS, &type3, (void **)&numv, &count);
-   
-   if (count > 0) 
-   {
+   Handler->Provides(Provides);
+   I = Provides.begin();
+   if (I != Provides.end()) {
       BufCat("\nProvides: ");
-      for (int i = 0; i < count; i++) 
-      {
-        if (i > 0)
-            BufCat(", ");
-        BufCatDep(strv[i], strv2[i], numv[i]);
-      }
+      BufCatDep(*I);
+   }
+   for (; I != Provides.end(); I++) {
+      BufCat(", ");
+      BufCatDep(*I);
    }
 
-   headerGetEntry(HeaderP, RPMTAG_OBSOLETENAME, &type, (void **)&strv, &count);
-   assert(type == RPM_STRING_ARRAY_TYPE || count == 0);
-
-   headerGetEntry(HeaderP, RPMTAG_OBSOLETEVERSION, &type2, (void **)&strv2, &count);
-   headerGetEntry(HeaderP, RPMTAG_OBSOLETEFLAGS, &type3, (void **)&numv, &count);
-   if (count > 0) {
+   Handler->Depends(pkgCache::Dep::Obsoletes, Obsoletes);
+   I = Obsoletes.begin();
+   if (I != Obsoletes.end()) {
       BufCat("\nObsoletes: ");
-      for (int i = 0; i < count; i++) 
-      {
-        if (i > 0)
-            BufCat(", ");
-        BufCatDep(strv[i], strv2[i], numv[i]);
-      }
+      BufCatDep(*I);
+   }
+   for (; I != Obsoletes.end(); I++) {
+      BufCat(", ");
+      BufCatDep(*I);
    }
 
-   headerGetEntry(HeaderP, RPMTAG_ARCH, &type, (void **)&str, &count);
-   BufCatTag("\nArchitecture: ", str);
+   BufCatTag("\nArchitecture: ", Handler->Arch().c_str());
    
    snprintf(buf, sizeof(buf), "%d", Handler->FileSize());
    BufCatTag("\nSize: ", buf);
@@ -414,11 +332,10 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
 
    BufCatTag("\nFilename: ", Handler->FileName().c_str());
 
-   headerGetEntry(HeaderP, RPMTAG_SUMMARY, &type, (void **)&str, &count);
-   BufCatTag("\nDescription: ", str);
+   BufCatTag("\nSummary: ", Handler->Summary().c_str());
+   BufCat("\nDescription: ");
    BufCat("\n");
-   headerGetEntry(HeaderP, RPMTAG_DESCRIPTION, &type, (void **)&str, &count);
-   BufCatDescr(str);
+   BufCatDescr(Handler->Description().c_str());
    BufCat("\n");
    
    Start = Buffer;
@@ -428,20 +345,7 @@ void rpmRecordParser::GetRec(const char *&Start,const char *&Stop)
 
 bool rpmRecordParser::HasFile(const char *File)
 {
-   if (*File == '\0')
-      return false;
-   char **names = NULL;
-   int_32 count = 0;
-   rpmHeaderGetEntry(HeaderP, RPMTAG_OLDFILENAMES,
-                    NULL, (void **) &names, &count);
-   while (count--) 
-   {
-      char *name = names[count];
-      if (strcmp(name, File) == 0)
-        return true;
-   }
-   free(names);
-   return false;
+   return Handler->HasFile(File);
 }
 
 #endif /* HAVE_RPM */
index 71e3325..6b2df34 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <apt-pkg/pkgrecords.h>
 #include <apt-pkg/fileutl.h>
+#include <apt-pkg/rpmhandler.h>
 #include <rpm/rpmlib.h>
 
   
@@ -31,8 +32,6 @@ class rpmRecordParser : public pkgRecords::Parser
    RPMHandler *Handler;
    bool IsDatabase;
 
-   Header HeaderP;
-
    char *Buffer;
    unsigned BufSize;
    unsigned BufUsed;
@@ -40,7 +39,7 @@ class rpmRecordParser : public pkgRecords::Parser
    void BufCat(const char *text);
    void BufCat(const char *begin, const char *end);
    void BufCatTag(const char *tag, const char *value);
-   void BufCatDep(const char *pkg, const char *version, int flags);
+   void BufCatDep(Dependency *Dep);
    void BufCatDescr(const char *descr);
 
    protected:
@@ -52,6 +51,7 @@ class rpmRecordParser : public pkgRecords::Parser
    // These refer to the archive file for the Version
    virtual string FileName();
    virtual string MD5Hash();
+   virtual string SHA1Hash();
    virtual string SourcePkg();
    
    // These are some general stats about the package
@@ -60,8 +60,6 @@ class rpmRecordParser : public pkgRecords::Parser
    virtual string LongDesc();
    virtual string Name();
    
-   inline Header GetRecord() { return HeaderP; };
-
    // The record in raw text, in standard Debian format
    virtual void GetRec(const char *&Start,const char *&Stop);
 
index 1fdb148..3f48e8d 100644 (file)
 #include <rpm/rpmds.h>
 #endif
 
+using namespace std;
+
 // SrcRecordParser::rpmSrcRecordParser - Constructor                   /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 rpmSrcRecordParser::rpmSrcRecordParser(string File,pkgIndexFile const *Index)
-    : Parser(Index), HeaderP(0), Buffer(0), BufSize(0), BufUsed(0)
+    : Parser(Index), Buffer(0), BufSize(0), BufUsed(0)
 {
    struct stat Buf;
    if (stat(File.c_str(),&Buf) == 0 && S_ISDIR(Buf.st_mode))
       Handler = new RPMDirHandler(File);
    else if (flExtension(File) == "rpm")
       Handler = new RPMSingleFileHandler(File);
+   else if (flExtension(File) == "xml")
+      Handler = new RPMRepomdHandler(File);
    else
       Handler = new RPMFileHandler(File);
 }
@@ -63,6 +67,12 @@ rpmSrcRecordParser::~rpmSrcRecordParser()
    reused by the next Binaries function call. */
 const char **rpmSrcRecordParser::Binaries()
 {
+   return NULL;
+
+// WTF is this ?!? If we're looking for sources why would be interested
+// in binaries? Maybe there's an inner Zen to this all but
+// apt-cache showsrc seems to work without just fine so disabled for now...
+#if 0
    int i = 0;
    char **bins;
    int type, count;
@@ -76,6 +86,7 @@ const char **rpmSrcRecordParser::Binaries()
       StaticBinList[i] = bins[i];
    StaticBinList[i] = 0;
    return StaticBinList;
+#endif
 }
                                                                        /*}}}*/
 // SrcRecordParser::Files - Return a list of files for this source     /*{{{*/
@@ -84,8 +95,6 @@ const char **rpmSrcRecordParser::Binaries()
    a complete source package */
 bool rpmSrcRecordParser::Files(vector<pkgSrcRecords::File> &List)
 {
-   assert(HeaderP != NULL);
-    
    List.clear();
    
    pkgSrcRecords::File F;
@@ -109,64 +118,31 @@ bool rpmSrcRecordParser::Restart()
 
 bool rpmSrcRecordParser::Step() 
 {
-   if (Handler->Skip() == false)
-       return false;
-   HeaderP = Handler->GetHeader();
-   return true;
+   return Handler->Skip();
 }
 
 bool rpmSrcRecordParser::Jump(unsigned long Off)
 {
-   if (!Handler->Jump(Off))
-       return false;
-   HeaderP = Handler->GetHeader();
-   return true;
+   return Handler->Jump(Off);
 }
 
 string rpmSrcRecordParser::Package() const
 {
-   char *str;
-   int_32 count, type;
-   int rc = headerGetEntry(HeaderP, RPMTAG_NAME,
-                          &type, (void**)&str, &count);
-   return string(rc?str:"");
+   return Handler->Name();
 }
 
 string rpmSrcRecordParser::Version() const
 {
-   char *version, *release;
-   int_32 *epoch;
-   int type, count;
-   int rc;
-   
-   rc = headerGetEntry(HeaderP, RPMTAG_VERSION,
-                      &type, (void **)&version, &count);
-   if (rc != 1)
-   {
-      _error->Error(_("error parsing source list %s"), "(RPMTAG_VERSION)");
-      return "";
-   }
-   rc = headerGetEntry(HeaderP, RPMTAG_RELEASE,
-                      &type, (void **)&release, &count);
-   if (rc != 1)
-   {
-      _error->Error(_("error parsing source list %s"), "(RPMTAG_RELEASE)");
-      return "";
-   }
+   string e, v, r, verstr;
+   e = Handler->Epoch();
+   v = Handler->Version();
+   r = Handler->Release();
 
-   rc = headerGetEntry(HeaderP, RPMTAG_EPOCH,
-                          &type, (void **)&epoch, &count);
-   string ret;
-   if (rc == 1 && count > 0) 
-   {
-      char buf[32];
-      sprintf(buf, "%i", *epoch);
-      ret = string(buf)+":"+string(version)+"-"+string(release);
-   }
-   else 
-      ret = string(version)+"-"+string(release);
-   
-   return ret;
+   if (e.empty() == false)
+      verstr = e + ":" + v + "-" + r;
+   else
+      verstr = v + "-" + r;
+   return verstr;
 }
     
 
@@ -175,20 +151,12 @@ string rpmSrcRecordParser::Version() const
 /* */
 string rpmSrcRecordParser::Maintainer() const
 {
-   char *str;
-   int_32 count, type;
-   int rc = headerGetEntry(HeaderP, RPMTAG_PACKAGER,
-                          &type, (void**)&str, &count);
-   return string(rc?str:"");
+   return Handler->Packager();
 }
 
 string rpmSrcRecordParser::Section() const
 {
-   char *str;
-   int_32 count, type;
-   int rc = headerGetEntry(HeaderP, RPMTAG_GROUP,
-                          &type, (void**)&str, &count);
-   return string(rc?str:"");
+   return Handler->Group();
 }
 
 unsigned long rpmSrcRecordParser::Offset() 
@@ -196,13 +164,13 @@ unsigned long rpmSrcRecordParser::Offset()
     return Handler->Offset();
 }
 
-void rpmSrcRecordParser::BufCat(char *text)
+void rpmSrcRecordParser::BufCat(const char *text)
 {
    if (text != NULL)
       BufCat(text, text+strlen(text));
 }
 
-void rpmSrcRecordParser::BufCat(char *begin, char *end)
+void rpmSrcRecordParser::BufCat(const char *begin, const char *end)
 {
    unsigned len = end - begin;
     
@@ -222,52 +190,47 @@ void rpmSrcRecordParser::BufCat(char *begin, char *end)
    BufUsed += len;
 }
 
-void rpmSrcRecordParser::BufCatTag(char *tag, char *value)
+void rpmSrcRecordParser::BufCatTag(const char *tag, const char *value)
 {
    BufCat(tag);
    BufCat(value);
 }
 
-void rpmSrcRecordParser::BufCatDep(char *pkg, char *version, int flags)
+void rpmSrcRecordParser::BufCatDep(Dependency *Dep)
 {
-   char buf[16];
-   char *ptr = (char*)buf;
+   string buf;
 
-   BufCat(pkg);
-   if (*version
+   BufCat(Dep->Name.c_str());
+   if (Dep->Version.empty() == false
    {
-      int c = 0;
-      *ptr++ = ' ';
-      *ptr++ = '(';
-      if (flags & RPMSENSE_LESS)
-      {
-        *ptr++ = '<';
-        c = '<';
-      }
-      if (flags & RPMSENSE_GREATER) 
-      {
-        *ptr++ = '>';
-        c = '>';
+      BufCat(" ");
+      switch (Dep->Op) {
+        case pkgCache::Dep::Less:
+           buf += "<";
+           break;
+        case pkgCache::Dep::LessEq:
+           buf += "<=";
+           break;
+        case pkgCache::Dep::Equals: 
+           buf += "=";
+           break;
+        case pkgCache::Dep::Greater:
+           buf += ">";
+           break;
+        case pkgCache::Dep::GreaterEq:
+           buf += ">=";
+           break;
       }
-      if (flags & RPMSENSE_EQUAL) 
-      {
-        *ptr++ = '=';
-      }/* else {
-        if (c)
-          fputc(c, f);
-      }*/
-      *ptr++ = ' ';
-      *ptr = '\0';
-
-      BufCat(buf);
-      BufCat(version);
-      BufCat(")");
+
+      BufCat(buf.c_str());
+      BufCat(" ");
+      BufCat(Dep->Version.c_str());
    }
 }
 
-void rpmSrcRecordParser::BufCatDescr(char *descr)
+void rpmSrcRecordParser::BufCatDescr(const char *descr)
 {
-   char *begin = descr;
+   const char *begin = descr;
 
    while (*descr) 
    {
@@ -288,114 +251,86 @@ void rpmSrcRecordParser::BufCatDescr(char *descr)
 // -----------------------------------------------
 string rpmSrcRecordParser::AsStr() 
 {
-   // FIXME: This method is leaking memory from headerGetEntry().
    int type, type2, type3, count;
    char *str;
    char **strv;
    char **strv2;
-   int num;
    int_32 *numv;
    char buf[32];
 
    BufUsed = 0;
-   
-   headerGetEntry(HeaderP, RPMTAG_NAME, &type, (void **)&str, &count);
-   BufCatTag("Package: ", str);
 
-   headerGetEntry(HeaderP, RPMTAG_GROUP, &type, (void **)&str, &count);
-   BufCatTag("\nSection: ", str);
+   BufCatTag("Package: ", Handler->Name().c_str());
 
-   headerGetEntry(HeaderP, RPMTAG_SIZE, &type, (void **)&numv, &count);
-   snprintf(buf, sizeof(buf), "%d", numv[0]);
-   BufCatTag("\nInstalled Size: ", buf);
+   BufCatTag("\nSection: ", Handler->Group().c_str());
 
-   str = NULL;
-   headerGetEntry(HeaderP, RPMTAG_PACKAGER, &type, (void **)&str, &count);
-   if (!str)
-       headerGetEntry(HeaderP, RPMTAG_VENDOR, &type, (void **)&str, &count);
-   BufCatTag("\nMaintainer: ", str);
-   
-   BufCat("\nVersion: ");
-   headerGetEntry(HeaderP, RPMTAG_VERSION, &type, (void **)&str, &count);
-   if (headerGetEntry(HeaderP, RPMTAG_EPOCH, &type, (void **)&numv, &count)==1)
-       snprintf(buf, sizeof(buf), "%i:%s-", numv[0], str);
-   else
-       snprintf(buf, sizeof(buf), "%s-", str);
-   BufCat(buf);
-   headerGetEntry(HeaderP, RPMTAG_RELEASE, &type, (void **)&str, &count);
-   BufCat(str);
+   snprintf(buf, sizeof(buf), "%d", Handler->InstalledSize());
+   BufCatTag("\nInstalled Size: ", buf);
 
-   headerGetEntry(HeaderP, RPMTAG_REQUIRENAME, &type, (void **)&strv, &count);
-   assert(type == RPM_STRING_ARRAY_TYPE || count == 0);
+   BufCatTag("\nPackager: ", Handler->Packager().c_str());
+   //BufCatTag("\nVendor: ", Handler->Vendor().c_str());
 
-   headerGetEntry(HeaderP, RPMTAG_REQUIREVERSION, &type2, (void **)&strv2, &count);
-   headerGetEntry(HeaderP, RPMTAG_REQUIREFLAGS, &type3, (void **)&numv, &count);
-   
-   if (count > 0)
-   {
-      int i, j;
+   BufCat("\nVersion: ");
+   // XXX FIXME: handle the epoch madness somewhere central instead of
+   // figuring it out on every damn occasion separately
 
-      for (j = i = 0; i < count; i++) 
-      {
-        if ((numv[i] & RPMSENSE_PREREQ))
-        {
-           if (j == 0) 
-               BufCat("\nPre-Depends: ");
-           else
-               BufCat(", ");
-           BufCatDep(strv[i], strv2[i], numv[i]);
-           j++;
-        }
-      }
+   string e, v, r, verstr;
+   e = Handler->Epoch();
+   v = Handler->Version();
+   r = Handler->Release();
 
-      for (j = 0, i = 0; i < count; i++) 
-      {
-        if (!(numv[i] & RPMSENSE_PREREQ)) 
-        {
-           if (j == 0)
-               BufCat("\nDepends: ");
-           else
-               BufCat(", ");
-           BufCatDep(strv[i], strv2[i], numv[i]);
-           j++;
-        }
+   if (e.empty() == false)
+      verstr = e + ":" + v + "-" + r;
+   else
+      verstr = v + "-" + r;
+
+   BufCat(verstr.c_str());
+
+   vector<Dependency*> Deps, Conflicts;
+   vector<Dependency*>::iterator I;
+   bool start = true;
+
+   Handler->Depends(pkgCache::Dep::Depends, Deps);
+   for (I = Deps.begin(); I != Deps.end(); I++) {
+      if ((*I)->Type != pkgCache::Dep::Depends)
+        continue;
+      if (start) {
+        BufCat("\nBuild-Depends: ");
+        start = false;
+      } else {
+        BufCat(", ");
       }
+      BufCatDep(*I);
    }
-   
-   headerGetEntry(HeaderP, RPMTAG_CONFLICTNAME, &type, (void **)&strv, &count);
-   assert(type == RPM_STRING_ARRAY_TYPE || count == 0);
 
-   headerGetEntry(HeaderP, RPMTAG_CONFLICTVERSION, &type2, (void **)&strv2, &count);
-   headerGetEntry(HeaderP, RPMTAG_CONFLICTFLAGS, &type3, (void **)&numv, &count);
-   
-   if (count > 0) 
-   {
-      BufCat("\nConflicts: ");
-      for (int i = 0; i < count; i++) 
-      {
-        if (i > 0)
-            BufCat(", ");
-        BufCatDep(strv[i], strv2[i], numv[i]);
+   // Doesn't do anything yet, build conflicts aren't recorded yet...
+   Handler->Depends(pkgCache::Dep::Conflicts, Conflicts);
+   start = true;
+   for (I = Conflicts.begin(); I != Conflicts.end(); I++) {
+      if (start) {
+        BufCat("\nBuild-Conflicts: ");
+        start = false;
+      } else {
+        BufCat(", ");
       }
+      BufCatDep(*I);
    }
 
-   headerGetEntry(HeaderP, CRPMTAG_FILESIZE, &type, (void **)&num, &count);
-   snprintf(buf, sizeof(buf), "%d", num);
+   BufCatTag("\nArchitecture: ", Handler->Arch().c_str());
+
+   snprintf(buf, sizeof(buf), "%d", Handler->FileSize());
    BufCatTag("\nSize: ", buf);
 
-   headerGetEntry(HeaderP, CRPMTAG_MD5, &type, (void **)&str, &count);
-   BufCatTag("\nMD5Sum: ", str);
+   BufCatTag("\nMD5Sum: ", Handler->MD5Sum().c_str());
 
-   headerGetEntry(HeaderP, CRPMTAG_FILENAME, &type, (void **)&str, &count);
-   BufCatTag("\nFilename: ", str);
+   BufCatTag("\nFilename: ", Handler->FileName().c_str());
 
-   headerGetEntry(HeaderP, RPMTAG_SUMMARY, &type, (void **)&str, &count);
-   BufCatTag("\nDescription: ", str);
+   BufCatTag("\nSummary: ", Handler->Summary().c_str());
+   BufCat("\nDescription: ");
    BufCat("\n");
-   headerGetEntry(HeaderP, RPMTAG_DESCRIPTION, &type, (void **)&str, &count);
-   BufCatDescr(str);
+   BufCatDescr(Handler->Description().c_str());
    BufCat("\n");
-   
+
    return string(Buffer, BufUsed);
 }
 
@@ -405,108 +340,28 @@ string rpmSrcRecordParser::AsStr()
 bool rpmSrcRecordParser::BuildDepends(vector<pkgSrcRecords::Parser::BuildDepRec> &BuildDeps,
                                      bool ArchOnly)
 {
-   // FIXME: This method is leaking memory from headerGetEntry().
-   int RpmTypeTag[] = {RPMTAG_REQUIRENAME,
-                      RPMTAG_REQUIREVERSION,
-                      RPMTAG_REQUIREFLAGS,
-                      RPMTAG_CONFLICTNAME,
-                      RPMTAG_CONFLICTVERSION,
-                      RPMTAG_CONFLICTFLAGS};
-   int BuildType[] = {pkgSrcRecords::Parser::BuildDepend,
-                     pkgSrcRecords::Parser::BuildConflict};
    BuildDepRec rec;
-
    BuildDeps.clear();
 
-   for (unsigned char Type = 0; Type != 2; Type++)
-   {
-      char **namel = NULL;
-      char **verl = NULL;
-      int *flagl = NULL;
-      int res, type, count;
-
-      res = headerGetEntry(HeaderP, RpmTypeTag[0+Type*3], &type, 
-                        (void **)&namel, &count);
-      if (res != 1)
-        return true;
-      res = headerGetEntry(HeaderP, RpmTypeTag[1+Type*3], &type, 
-                        (void **)&verl, &count);
-      res = headerGetEntry(HeaderP, RpmTypeTag[2+Type*3], &type,
-                        (void **)&flagl, &count);
+   vector<Dependency*> Deps, Conflicts;
+   Handler->Depends(pkgCache::Dep::Depends, Deps);
+
+   for (vector<Dependency*>::iterator I = Deps.begin(); I != Deps.end(); I++) {
+      rec.Package = (*I)->Name;
+      rec.Version = (*I)->Version;
+      rec.Op = (*I)->Op;
+      rec.Type = pkgSrcRecords::Parser::BuildDepend;
+      BuildDeps.push_back(rec);
+   }
       
-      for (int i = 0; i < count; i++) 
-      {
-#if RPM_VERSION >= 0x040404
-         if (namel[i][0] == 'g' && strncmp(namel[i], "getconf", 7) == 0)
-         {
-            rpmds getconfProv = NULL;
-            rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
-                                   namel[i], verl?verl[i]:NULL, flagl[i]);
-            rpmdsGetconf(&getconfProv, NULL);
-            int res = rpmdsSearch(getconfProv, ds) >= 0;
-            rpmdsFree(ds);
-            rpmdsFree(getconfProv);
-            if (res) continue;
-         }
-#endif
-        if (strncmp(namel[i], "rpmlib", 6) == 0) 
-        {
-#if RPM_VERSION >= 0x040404
-           rpmds rpmlibProv = NULL;
-           rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
-                                  namel[i], verl?verl[i]:NULL, flagl[i]);
-           rpmdsRpmlib(&rpmlibProv, NULL);
-           int res = rpmdsSearch(rpmlibProv, ds) >= 0;
-           rpmdsFree(ds);
-           rpmdsFree(rpmlibProv);
-#elif RPM_VERSION >= 0x040100
-           rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
-                                  namel[i], verl?verl[i]:NULL, flagl[i]);
-           int res = rpmCheckRpmlibProvides(ds);
-           rpmdsFree(ds);
-#else
-           int res = rpmCheckRpmlibProvides(namel[i], verl?verl[i]:NULL,
-                                            flagl[i]);
-#endif
-           if (res) continue;
-        }
-
-        if (verl) 
-        {
-           if (!*verl[i]) 
-              rec.Op = pkgCache::Dep::NoOp;
-           else 
-           {
-              if (flagl[i] & RPMSENSE_LESS) 
-              {
-                 if (flagl[i] & RPMSENSE_EQUAL)
-                     rec.Op = pkgCache::Dep::LessEq;
-                 else
-                     rec.Op = pkgCache::Dep::Less;
-              } 
-              else if (flagl[i] & RPMSENSE_GREATER) 
-              {
-                 if (flagl[i] & RPMSENSE_EQUAL)
-                     rec.Op = pkgCache::Dep::GreaterEq;
-                 else
-                     rec.Op = pkgCache::Dep::Greater;
-              } 
-              else if (flagl[i] & RPMSENSE_EQUAL) 
-                 rec.Op = pkgCache::Dep::Equals;
-           }
-           
-           rec.Version = verl[i];
-        }
-        else
-        {
-           rec.Op = pkgCache::Dep::NoOp;
-           rec.Version = "";
-        }
-
-        rec.Type = BuildType[Type];
-        rec.Package = namel[i];
-        BuildDeps.push_back(rec);
-      }
+   Handler->Depends(pkgCache::Dep::Conflicts, Conflicts);
+
+   for (vector<Dependency*>::iterator I = Conflicts.begin(); I != Conflicts.end(); I++) {
+      rec.Package = (*I)->Name;
+      rec.Version = (*I)->Version;
+      rec.Op = (*I)->Op;
+      rec.Type = pkgSrcRecords::Parser::BuildConflict;
+      BuildDeps.push_back(rec);
    }
    return true;
 }
index 2e8f691..e6b104b 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <apt-pkg/srcrecords.h>
 #include <apt-pkg/fileutl.h>
+#include <apt-pkg/rpmhandler.h>
 #include <rpm/rpmlib.h>
 
   
@@ -25,7 +26,6 @@ class RPMHandler;
 class rpmSrcRecordParser : public pkgSrcRecords::Parser
 {
    RPMHandler *Handler;
-   Header HeaderP;
 
    const char *StaticBinList[400];
 
@@ -33,11 +33,11 @@ class rpmSrcRecordParser : public pkgSrcRecords::Parser
    unsigned int BufSize;
    unsigned int BufUsed;
    
-   void BufCat(char *text);
-   void BufCat(char *begin, char *end);
-   void BufCatTag(char *tag, char *value);
-   void BufCatDep(char *pkg, char *version, int flags);
-   void BufCatDescr(char *descr);
+   void BufCat(const char *text);
+   void BufCat(const char *begin, const char *end);
+   void BufCatTag(const char *tag, const char *value);
+   void BufCatDep(Dependency *Dep);
+   void BufCatDescr(const char *descr);
 
 public:
    virtual bool Restart();
index 326791a..91d60bd 100644 (file)
@@ -113,7 +113,7 @@ bool pkgSourceList::Type::ParseLine(vector<pkgIndexFile *> &List,
    
    // CNC:2004-05-18 
    Dist = SubstVar(Dist,"$(ARCH)",_config->Find("APT::Architecture"));
-   // PM:2006-02-06
+   // LORG:2006-02-06
    Dist = SubstVar(Dist,"$(VERSION)",_config->Find("APT::DistroVersion"));
 
    // Grab the rest of the dists
index 52f48c8..741b5ec 100644 (file)
@@ -122,6 +122,8 @@ LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSTDCPP_VER = @LIBSTDCPP_VER@
 LIBTOOL = @LIBTOOL@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
@@ -148,6 +150,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 POSUB = @POSUB@
 PTHREADLIB = @PTHREADLIB@
 RANLIB = @RANLIB@
@@ -169,6 +172,7 @@ ac_ct_CXX = @ac_ct_CXX@
 ac_ct_F77 = @ac_ct_F77@
 ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
 am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
index 4a54921..1560fcc 100644 (file)
@@ -200,6 +200,8 @@ LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSTDCPP_VER = @LIBSTDCPP_VER@
 LIBTOOL = @LIBTOOL@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
@@ -226,6 +228,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 POSUB = @POSUB@
 PTHREADLIB = @PTHREADLIB@
 RANLIB = @RANLIB@
@@ -247,6 +250,7 @@ ac_ct_CXX = @ac_ct_CXX@
 ac_ct_F77 = @ac_ct_F77@
 ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
 am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
index 42e467a..95cb5fd 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for apt 0.5.15lorg2.
+# Generated by GNU Autoconf 2.59 for apt 0.5.15lorg3.
 #
 # Copyright (C) 2003 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
@@ -421,8 +421,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='apt'
 PACKAGE_TARNAME='apt'
-PACKAGE_VERSION='0.5.15lorg2'
-PACKAGE_STRING='apt 0.5.15lorg2'
+PACKAGE_VERSION='0.5.15lorg3'
+PACKAGE_STRING='apt 0.5.15lorg3'
 PACKAGE_BUGREPORT=''
 
 ac_unique_file="configure.in"
@@ -463,7 +463,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL SOCKETLIBS PTHREADLIB RPM_PATH RPMLIBS WITH_LUA_TRUE WITH_LUA_FALSE COMPILE_STATIC_TRUE COMPILE_STATIC_FALSE COMPILE_APTSHELL_TRUE COMPILE_APTSHELL_FALSE NEED_INTTYPES_H_TRUE NEED_INTTYPES_H_FALSE NEED_STATVFS_H_TRUE NEED_STATVFS_H_FALSE HAVE_TIMEGM NEED_SOCKLEN_T_DEFINE NEED_NETDB_H_TRUE NEED_NETDB_H_FALSE DOCBOOK2MAN COMPILE_MANPAGES_TRUE COMPILE_MANPAGES_FALSE MKINSTALLDIRS MSGFMT GMSGFMT XGETTEXT MSGMERGE ALLOCA GLIBC21 LIBICONV LTLIBICONV INTLBISON USE_NLS BUILD_INCLUDED_LIBINTL USE_INCLUDED_LIBINTL CATOBJEXT INTLOBJS DATADIRNAME INSTOBJEXT GENCAT INTL_LIBTOOL_SUFFIX_PREFIX INTLLIBS LIBINTL LTLIBINTL POSUB GLIBC_VER LIBSTDCPP_VER LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL SOCKETLIBS PTHREADLIB RPM_PATH RPMLIBS PKG_CONFIG ac_pt_PKG_CONFIG LIBXML2_CFLAGS LIBXML2_LIBS WITH_LUA_TRUE WITH_LUA_FALSE COMPILE_STATIC_TRUE COMPILE_STATIC_FALSE COMPILE_APTSHELL_TRUE COMPILE_APTSHELL_FALSE NEED_INTTYPES_H_TRUE NEED_INTTYPES_H_FALSE NEED_STATVFS_H_TRUE NEED_STATVFS_H_FALSE HAVE_TIMEGM NEED_SOCKLEN_T_DEFINE NEED_NETDB_H_TRUE NEED_NETDB_H_FALSE DOCBOOK2MAN COMPILE_MANPAGES_TRUE COMPILE_MANPAGES_FALSE MKINSTALLDIRS MSGFMT GMSGFMT XGETTEXT MSGMERGE ALLOCA GLIBC21 LIBICONV LTLIBICONV INTLBISON USE_NLS BUILD_INCLUDED_LIBINTL USE_INCLUDED_LIBINTL CATOBJEXT INTLOBJS DATADIRNAME INSTOBJEXT GENCAT INTL_LIBTOOL_SUFFIX_PREFIX INTLLIBS LIBINTL LTLIBINTL POSUB GLIBC_VER LIBSTDCPP_VER LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -944,6 +944,18 @@ ac_env_FFLAGS_set=${FFLAGS+set}
 ac_env_FFLAGS_value=$FFLAGS
 ac_cv_env_FFLAGS_set=${FFLAGS+set}
 ac_cv_env_FFLAGS_value=$FFLAGS
+ac_env_PKG_CONFIG_set=${PKG_CONFIG+set}
+ac_env_PKG_CONFIG_value=$PKG_CONFIG
+ac_cv_env_PKG_CONFIG_set=${PKG_CONFIG+set}
+ac_cv_env_PKG_CONFIG_value=$PKG_CONFIG
+ac_env_LIBXML2_CFLAGS_set=${LIBXML2_CFLAGS+set}
+ac_env_LIBXML2_CFLAGS_value=$LIBXML2_CFLAGS
+ac_cv_env_LIBXML2_CFLAGS_set=${LIBXML2_CFLAGS+set}
+ac_cv_env_LIBXML2_CFLAGS_value=$LIBXML2_CFLAGS
+ac_env_LIBXML2_LIBS_set=${LIBXML2_LIBS+set}
+ac_env_LIBXML2_LIBS_value=$LIBXML2_LIBS
+ac_cv_env_LIBXML2_LIBS_set=${LIBXML2_LIBS+set}
+ac_cv_env_LIBXML2_LIBS_value=$LIBXML2_LIBS
 
 #
 # Report the --help message.
@@ -952,7 +964,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures apt 0.5.15lorg2 to adapt to many kinds of systems.
+\`configure' configures apt 0.5.15lorg3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1018,7 +1030,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of apt 0.5.15lorg2:";;
+     short | recursive ) echo "Configuration of apt 0.5.15lorg3:";;
    esac
   cat <<\_ACEOF
 
@@ -1070,6 +1082,11 @@ Some influential environment variables:
   CXXCPP      C++ preprocessor
   F77         Fortran 77 compiler command
   FFLAGS      Fortran 77 compiler flags
+  PKG_CONFIG  path to pkg-config utility
+  LIBXML2_CFLAGS
+              C compiler flags for LIBXML2, overriding pkg-config
+  LIBXML2_LIBS
+              linker flags for LIBXML2, overriding pkg-config
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
@@ -1169,7 +1186,7 @@ fi
 test -n "$ac_init_help" && exit 0
 if $ac_init_version; then
   cat <<\_ACEOF
-apt configure 0.5.15lorg2
+apt configure 0.5.15lorg3
 generated by GNU Autoconf 2.59
 
 Copyright (C) 2003 Free Software Foundation, Inc.
@@ -1183,7 +1200,7 @@ cat >&5 <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by apt $as_me 0.5.15lorg2, which was
+It was created by apt $as_me 0.5.15lorg3, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
   $ $0 $@
@@ -1881,7 +1898,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='apt'
- VERSION='0.5.15lorg2'
+ VERSION='0.5.15lorg3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3695,7 +3712,7 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 3698 "configure"' > conftest.$ac_ext
+  echo '#line 3715 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -5274,7 +5291,7 @@ fi
 
 
 # Provide some information about the compiler.
-echo "$as_me:5277:" \
+echo "$as_me:5294:" \
      "checking for Fortran 77 compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
 { (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
@@ -6372,11 +6389,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:6375: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:6392: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:6379: \$? = $ac_status" >&5
+   echo "$as_me:6396: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -6634,11 +6651,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:6637: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:6654: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:6641: \$? = $ac_status" >&5
+   echo "$as_me:6658: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -6696,11 +6713,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:6699: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:6716: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:6703: \$? = $ac_status" >&5
+   echo "$as_me:6720: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -8081,7 +8098,7 @@ linux*)
   libsuff=
   case "$host_cpu" in
   x86_64*|s390x*|powerpc64*)
-    echo '#line 8084 "configure"' > conftest.$ac_ext
+    echo '#line 8101 "configure"' > conftest.$ac_ext
     if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -8952,7 +8969,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 8955 "configure"
+#line 8972 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -9050,7 +9067,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 9053 "configure"
+#line 9070 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11298,11 +11315,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:11301: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:11318: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:11305: \$? = $ac_status" >&5
+   echo "$as_me:11322: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -11360,11 +11377,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:11363: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:11380: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:11367: \$? = $ac_status" >&5
+   echo "$as_me:11384: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -11875,7 +11892,7 @@ linux*)
   libsuff=
   case "$host_cpu" in
   x86_64*|s390x*|powerpc64*)
-    echo '#line 11878 "configure"' > conftest.$ac_ext
+    echo '#line 11895 "configure"' > conftest.$ac_ext
     if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -12746,7 +12763,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 12749 "configure"
+#line 12766 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12844,7 +12861,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 12847 "configure"
+#line 12864 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -13729,11 +13746,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:13732: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:13749: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:13736: \$? = $ac_status" >&5
+   echo "$as_me:13753: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -13791,11 +13808,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:13794: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:13811: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:13798: \$? = $ac_status" >&5
+   echo "$as_me:13815: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -15156,7 +15173,7 @@ linux*)
   libsuff=
   case "$host_cpu" in
   x86_64*|s390x*|powerpc64*)
-    echo '#line 15159 "configure"' > conftest.$ac_ext
+    echo '#line 15176 "configure"' > conftest.$ac_ext
     if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -15929,11 +15946,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:15932: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:15949: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:15936: \$? = $ac_status" >&5
+   echo "$as_me:15953: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -16191,11 +16208,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:16194: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:16211: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:16198: \$? = $ac_status" >&5
+   echo "$as_me:16215: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -16253,11 +16270,11 @@ else
    -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:16256: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:16273: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:16260: \$? = $ac_status" >&5
+   echo "$as_me:16277: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -17638,7 +17655,7 @@ linux*)
   libsuff=
   case "$host_cpu" in
   x86_64*|s390x*|powerpc64*)
-    echo '#line 17641 "configure"' > conftest.$ac_ext
+    echo '#line 17658 "configure"' > conftest.$ac_ext
     if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -18509,7 +18526,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 18512 "configure"
+#line 18529 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -18607,7 +18624,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 18610 "configure"
+#line 18627 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
 
 
 
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+
+if test -n "$PKG_CONFIG"; then
+  echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+
+if test -n "$ac_pt_PKG_CONFIG"; then
+  echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  PKG_CONFIG=$ac_pt_PKG_CONFIG
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+       else
+               echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+               PKG_CONFIG=""
+       fi
+
+fi
+
+pkg_failed=no
+echo "$as_me:$LINENO: checking for LIBXML2" >&5
+echo $ECHO_N "checking for LIBXML2... $ECHO_C" >&6
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBXML2_CFLAGS"; then
+        pkg_cv_LIBXML2_CFLAGS="$LIBXML2_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.4\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.4") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBXML2_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0 >= 2.4" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LIBXML2_LIBS"; then
+        pkg_cv_LIBXML2_LIBS="$LIBXML2_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.4\"") >&5
+  ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.4") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LIBXML2_LIBS=`$PKG_CONFIG --libs "libxml-2.0 >= 2.4" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+       pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               LIBXML2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libxml-2.0 >= 2.4"`
+        else
+               LIBXML2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libxml-2.0 >= 2.4"`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$LIBXML2_PKG_ERRORS" >&5
+
+       { { echo "$as_me:$LINENO: error: Package requirements (libxml-2.0 >= 2.4) were not met:
+
+$LIBXML2_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables LIBXML2_CFLAGS
+and LIBXML2_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&5
+echo "$as_me: error: Package requirements (libxml-2.0 >= 2.4) were not met:
+
+$LIBXML2_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables LIBXML2_CFLAGS
+and LIBXML2_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" >&2;}
+   { (exit 1); exit 1; }; }
+elif test $pkg_failed = untried; then
+       { { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables LIBXML2_CFLAGS
+and LIBXML2_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+See \`config.log' for more details." >&5
+echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables LIBXML2_CFLAGS
+and LIBXML2_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+else
+       LIBXML2_CFLAGS=$pkg_cv_LIBXML2_CFLAGS
+       LIBXML2_LIBS=$pkg_cv_LIBXML2_LIBS
+        echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+       :
+fi
+RPMLIBS="$LIBXML2_LIBS $RPMLIBS"
+CPPFLAGS="$LIBXML2_CFLAGS $CPPFLAGS"
+
+
+
 echo "$as_me:$LINENO: checking for g++ hash_map extension" >&5
 echo $ECHO_N "checking for g++ hash_map extension... $ECHO_C" >&6
 ac_ext=cc
@@ -29480,7 +29716,7 @@ _ASBOX
 } >&5
 cat >&5 <<_CSEOF
 
-This file was extended by apt $as_me 0.5.15lorg2, which was
+This file was extended by apt $as_me 0.5.15lorg3, which was
 generated by GNU Autoconf 2.59.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -29543,7 +29779,7 @@ _ACEOF
 
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-apt config.status 0.5.15lorg2
+apt config.status 0.5.15lorg3
 configured by $0, generated by GNU Autoconf 2.59,
   with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
 
@@ -29832,6 +30068,10 @@ s,@SOCKETLIBS@,$SOCKETLIBS,;t t
 s,@PTHREADLIB@,$PTHREADLIB,;t t
 s,@RPM_PATH@,$RPM_PATH,;t t
 s,@RPMLIBS@,$RPMLIBS,;t t
+s,@PKG_CONFIG@,$PKG_CONFIG,;t t
+s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t
+s,@LIBXML2_CFLAGS@,$LIBXML2_CFLAGS,;t t
+s,@LIBXML2_LIBS@,$LIBXML2_LIBS,;t t
 s,@WITH_LUA_TRUE@,$WITH_LUA_TRUE,;t t
 s,@WITH_LUA_FALSE@,$WITH_LUA_FALSE,;t t
 s,@COMPILE_STATIC_TRUE@,$COMPILE_STATIC_TRUE,;t t
index 00366c5..32133fc 100644 (file)
@@ -1,7 +1,7 @@
 dnl Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.54)
-AC_INIT([apt],[0.5.15lorg2])
+AC_INIT([apt],[0.5.15lorg3])
 dnl Check the archs, we want the target type.
 AC_CONFIG_AUX_DIR([buildlib])
 AC_CANONICAL_HOST
@@ -92,6 +92,12 @@ else
    AC_SUBST(RPMLIBS)
 fi
 
+dnl repomd support needs libxml2, not sure about the minimal version - I've
+dnl only tested it with 2.6.20
+PKG_CHECK_MODULES([LIBXML2],[libxml-2.0 >= 2.4])
+RPMLIBS="$LIBXML2_LIBS $RPMLIBS"
+CPPFLAGS="$LIBXML2_CFLAGS $CPPFLAGS"
+
 dnl Can we use g++ hash_map?
 AH_TEMPLATE(WITH_GNU_HASH_MAP,
            [Define to 1 if you want to use the g++ hash_map extension.])
index 75f2b30..505d6f6 100644 (file)
@@ -122,6 +122,8 @@ LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSTDCPP_VER = @LIBSTDCPP_VER@
 LIBTOOL = @LIBTOOL@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
@@ -148,6 +150,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 POSUB = @POSUB@
 PTHREADLIB = @PTHREADLIB@
 RANLIB = @RANLIB@
@@ -169,6 +172,7 @@ ac_ct_CXX = @ac_ct_CXX@
 ac_ct_F77 = @ac_ct_F77@
 ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
 am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
index f989ff5..dc693fd 100644 (file)
@@ -164,6 +164,8 @@ LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSTDCPP_VER = @LIBSTDCPP_VER@
 LIBTOOL = @LIBTOOL@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
@@ -190,6 +192,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 POSUB = @POSUB@
 PTHREADLIB = @PTHREADLIB@
 RANLIB = @RANLIB@
@@ -211,6 +214,7 @@ ac_ct_CXX = @ac_ct_CXX@
 ac_ct_F77 = @ac_ct_F77@
 ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
 am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
index abf1669..c7e7d81 100644 (file)
@@ -117,6 +117,8 @@ LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSTDCPP_VER = @LIBSTDCPP_VER@
 LIBTOOL = @LIBTOOL@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
@@ -143,6 +145,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 POSUB = @POSUB@
 PTHREADLIB = @PTHREADLIB@
 RANLIB = @RANLIB@
@@ -164,6 +167,7 @@ ac_ct_CXX = @ac_ct_CXX@
 ac_ct_F77 = @ac_ct_F77@
 ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
 am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
index 291846f..1146b90 100644 (file)
@@ -193,6 +193,8 @@ LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSTDCPP_VER = @LIBSTDCPP_VER@
 LIBTOOL = @LIBTOOL@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
@@ -219,6 +221,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 POSUB = @POSUB@
 PTHREADLIB = @PTHREADLIB@
 RANLIB = @RANLIB@
@@ -240,6 +243,7 @@ ac_ct_CXX = @ac_ct_CXX@
 ac_ct_F77 = @ac_ct_F77@
 ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
 am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
index e56cb4f..a43b789 100644 (file)
@@ -167,6 +167,8 @@ LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBSTDCPP_VER = @LIBSTDCPP_VER@
 LIBTOOL = @LIBTOOL@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
@@ -193,6 +195,7 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_VERSION = @PACKAGE_VERSION@
 PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
 POSUB = @POSUB@
 PTHREADLIB = @PTHREADLIB@
 RANLIB = @RANLIB@
@@ -214,6 +217,7 @@ ac_ct_CXX = @ac_ct_CXX@
 ac_ct_F77 = @ac_ct_F77@
 ac_ct_RANLIB = @ac_ct_RANLIB@
 ac_ct_STRIP = @ac_ct_STRIP@
+ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
 am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
 am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
 am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@