]> git.saurik.com Git - apt.git/commitdiff
Multiple different versions support
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:53:48 +0000 (16:53 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:53:48 +0000 (16:53 +0000)
Author: jgg
Date: 1999-05-23 22:55:54 GMT
Multiple different versions support

apt-pkg/contrib/crc-16.cc [new file with mode: 0644]
apt-pkg/contrib/crc-16.h [new file with mode: 0644]
apt-pkg/deb/deblistparser.cc
apt-pkg/deb/deblistparser.h
apt-pkg/makefile
apt-pkg/pkgcache.cc
apt-pkg/pkgcache.h
apt-pkg/pkgcachegen.cc
apt-pkg/pkgcachegen.h
debian/changelog
doc/cache.sgml

diff --git a/apt-pkg/contrib/crc-16.cc b/apt-pkg/contrib/crc-16.cc
new file mode 100644 (file)
index 0000000..52a5518
--- /dev/null
@@ -0,0 +1,76 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: crc-16.cc,v 1.1 1999/05/23 22:55:54 jgg Exp $
+/* ######################################################################
+   
+   CRC16 - Compute a 16bit crc very quickly
+   
+   This was ripped out of the linux 2.2 kernel source (irda/crc.c) and
+   is credited to ppp.c by Michael Callahan <callahan@maths.ox.ac.uk> and
+   Al Longyear <longyear@netcom.com>
+   
+   Modified by Jason Gunthorpe <jgg@debian.org> to fit the local coding
+   style, this code is belived to be in the Public Domain.
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+// Include Files                                                       /*{{{*/
+#ifdef __GNUG__
+#pragma implementation "apt-pkg/crc-16.h"
+#endif
+
+#include <apt-pkg/crc-16.h>
+                                                                       /*}}}*/
+
+/*
+ * This mysterious table is just the CRC of each possible byte.  It can be
+ * computed using the standard bit-at-a-time methods.  The polynomial can
+ * be seen in entry 128, 0x8408.  This corresponds to x^0 + x^5 + x^12.
+ * Add the implicit x^16, and you have the standard CRC-CCITT.
+ */
+static unsigned short const crc16_table[256] =
+{
+       0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+       0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+       0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+       0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+       0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+       0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+       0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+       0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+       0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+       0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+       0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+       0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+       0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+       0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+       0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+       0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+       0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+       0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+       0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+       0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+       0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+       0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+       0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+       0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+       0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+       0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+       0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+       0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+       0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+       0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+       0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+       0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+};
+
+/* Recompute the FCS with one more character appended. */
+#define CalcFCS(fcs, c) (((fcs) >> 8) ^ crc16_table[((fcs) ^ (c)) & 0xff])
+unsigned short AddCRC16(unsigned short fcs, void const *Buf,
+                       unsigned long len) 
+{
+   unsigned char const *buf = (unsigned char const *)Buf;
+   while (len--)
+      fcs = CalcFCS(fcs, *buf++);
+   return fcs;
+}
diff --git a/apt-pkg/contrib/crc-16.h b/apt-pkg/contrib/crc-16.h
new file mode 100644 (file)
index 0000000..757104c
--- /dev/null
@@ -0,0 +1,21 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: crc-16.h,v 1.1 1999/05/23 22:55:54 jgg Exp $
+/* ######################################################################
+
+   CRC16 - Compute a 16bit crc very quickly
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+#ifndef APTPKG_CRC16_H
+#define APTPKG_CRC16_H
+
+#ifdef __GNUG__
+#pragma interface "apt-pkg/crc-16.h"
+#endif 
+
+#define INIT_FCS  0xffff
+unsigned short AddCRC16(unsigned short fcs, void const *buf,
+                       unsigned long len);
+
+#endif
index 9adc6004408ee0ebf30dfc2ca6a9690020935a88..273b7fd42c0d64c02d018c96a9459db95955d123 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: deblistparser.cc,v 1.18 1999/04/12 19:16:11 jgg Exp $
+// $Id: deblistparser.cc,v 1.19 1999/05/23 22:55:54 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
@@ -14,6 +14,7 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/strutl.h>
+#include <apt-pkg/crc-16.h>
 
 #include <system.h>
                                                                        /*}}}*/
 
 #include <system.h>
                                                                        /*}}}*/
@@ -130,6 +131,40 @@ bool debListParser::UsePackage(pkgCache::PkgIterator Pkg,
    return true;
 }
                                                                        /*}}}*/
    return true;
 }
                                                                        /*}}}*/
+// ListParser::VersionHash - Compute a unique hash for this version    /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+unsigned short debListParser::VersionHash()
+{
+   const char *Sections[] ={"Installed-Size",
+                            "Depends",
+                            "Pre-Depends",
+                            "Suggests",
+                            "Recommends",
+                            "Conflicts",
+                            "Replaces",0};
+   unsigned long Result = INIT_FCS;
+   char S[300];
+   for (const char **I = Sections; *I != 0; I++)
+   {
+      const char *Start;
+      const char *End;
+      if (Section.Find(*I,Start,End) == false || End - Start >= (signed)sizeof(S))
+        continue;
+      
+      /* Strip out any spaces from the text, this undoes dpkgs reformatting
+         of certain fields */
+      char *I = S;
+      for (; Start != End; Start++)
+        if (isspace(*Start) == 0)
+           *I++ = *Start;
+      
+      Result = AddCRC16(Result,S,I - S);
+   }
+   
+   return Result;
+}
+                                                                       /*}}}*/
 // ListParser::ParseStatus - Parse the status field                    /*{{{*/
 // ---------------------------------------------------------------------
 /* Status lines are of the form,
 // ListParser::ParseStatus - Parse the status field                    /*{{{*/
 // ---------------------------------------------------------------------
 /* Status lines are of the form,
index 6888c1a5eba7ece96c777693f8132ab39a7e0c8b..3c8ea5b0a7e6cbb4e5cd196aae27b9b6b72f56b7 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: deblistparser.h,v 1.6 1998/12/14 02:23:47 jgg Exp $
+// $Id: deblistparser.h,v 1.7 1999/05/23 22:55:55 jgg Exp $
 /* ######################################################################
    
    Debian Package List Parser - This implements the abstract parser 
 /* ######################################################################
    
    Debian Package List Parser - This implements the abstract parser 
@@ -43,6 +43,7 @@ class debListParser : public pkgCacheGenerator::ListParser
    virtual string Package();
    virtual string Version();
    virtual bool NewVersion(pkgCache::VerIterator Ver);
    virtual string Package();
    virtual string Version();
    virtual bool NewVersion(pkgCache::VerIterator Ver);
+   virtual unsigned short VersionHash();
    virtual bool UsePackage(pkgCache::PkgIterator Pkg,
                           pkgCache::VerIterator Ver);
    virtual unsigned long Offset() {return iOffset;};
    virtual bool UsePackage(pkgCache::PkgIterator Pkg,
                           pkgCache::VerIterator Ver);
    virtual unsigned long Offset() {return iOffset;};
index 8bba845b3a98242b719836b3ab237531e8f32701..099b54cec724462db238c5843088a6a64cd87f9e 100644 (file)
@@ -11,14 +11,14 @@ include ../buildlib/defaults.mak
 
 # The library name
 LIBRARY=apt-pkg
 
 # The library name
 LIBRARY=apt-pkg
-MAJOR=2.4
+MAJOR=2.5
 MINOR=0
 SLIBS=$(PTHREADLIB)
 
 # Source code for the contributed non-core things
 SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \
          contrib/configuration.cc contrib/progress.cc contrib/cmndline.cc \
 MINOR=0
 SLIBS=$(PTHREADLIB)
 
 # Source code for the contributed non-core things
 SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \
          contrib/configuration.cc contrib/progress.cc contrib/cmndline.cc \
-        contrib/md5.cc contrib/cdromutl.h
+        contrib/md5.cc contrib/cdromutl.cc contrib/crc-16.cc
 
 # Source code for the main library
 SOURCE+= pkgcache.cc version.cc fileutl.cc pkgcachegen.cc depcache.cc \
 
 # Source code for the main library
 SOURCE+= pkgcache.cc version.cc fileutl.cc pkgcachegen.cc depcache.cc \
@@ -38,7 +38,7 @@ HEADERS = algorithms.h depcache.h mmap.h pkgcachegen.h cacheiterators.h \
           version.h progress.h pkgrecords.h debrecords.h cmndline.h \
          acquire.h acquire-worker.h acquire-item.h acquire-method.h md5.h \
          dpkgpm.h dpkginit.h cdromutl.h strutl.h clean.h srcrecords.h \
           version.h progress.h pkgrecords.h debrecords.h cmndline.h \
          acquire.h acquire-worker.h acquire-item.h acquire-method.h md5.h \
          dpkgpm.h dpkginit.h cdromutl.h strutl.h clean.h srcrecords.h \
-         debsrcrecords.h cachefile.h
+         debsrcrecords.h cachefile.h crc-16.h
 
 HEADERS := $(addprefix apt-pkg/,$(HEADERS))
 
 
 HEADERS := $(addprefix apt-pkg/,$(HEADERS))
 
index 6af04268ac0cee71083f972a8ce950a6912a7707..4ff5a27ea10d792a46f7e0c4557ecadbdcbe425a 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: pkgcache.cc,v 1.24 1999/04/12 04:21:20 jgg Exp $
+// $Id: pkgcache.cc,v 1.25 1999/05/23 22:55:54 jgg Exp $
 /* ######################################################################
    
    Package Cache - Accessor code for the cache
 /* ######################################################################
    
    Package Cache - Accessor code for the cache
@@ -43,8 +43,8 @@ pkgCache::Header::Header()
    
    /* Whenever the structures change the major version should be bumped,
       whenever the generator changes the minor version should be bumped. */
    
    /* Whenever the structures change the major version should be bumped,
       whenever the generator changes the minor version should be bumped. */
-   MajorVersion = 2;
-   MinorVersion = 3;
+   MajorVersion = 3;
+   MinorVersion = 1;
    Dirty = true;
    
    HeaderSz = sizeof(pkgCache::Header);
    Dirty = true;
    
    HeaderSz = sizeof(pkgCache::Header);
index 10e68f20d8fd521e1167f89e98f3ef229e3cf78a..f7349c7a12ed001437f07c07fb1914ff6f2fcda1 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: pkgcache.h,v 1.19 1999/04/12 04:21:20 jgg Exp $
+// $Id: pkgcache.h,v 1.20 1999/05/23 22:55:54 jgg Exp $
 /* ######################################################################
    
    Cache - Structure definitions for the cache file
 /* ######################################################################
    
    Cache - Structure definitions for the cache file
@@ -238,6 +238,7 @@ struct pkgCache::Version
    
    __apt_ptrloc Size;              // These are the .deb size
    __apt_ptrloc InstalledSize;
    
    __apt_ptrloc Size;              // These are the .deb size
    __apt_ptrloc InstalledSize;
+   unsigned short Hash;
    unsigned short ID;
    unsigned char Priority;
 };
    unsigned short ID;
    unsigned char Priority;
 };
index fd4f8965b4775ae603e79081cf9a57b0a12315f4..11d539dffa99e9e1fc2801f62620dc5479f92ab3 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: pkgcachegen.cc,v 1.37 1999/04/19 02:35:38 jgg Exp $
+// $Id: pkgcachegen.cc,v 1.38 1999/05/23 22:55:54 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
@@ -111,7 +111,8 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
       
       /* We already have a version for this item, record that we
          saw it */
       
       /* We already have a version for this item, record that we
          saw it */
-      if (Res == 0)
+      unsigned long Hash = List.VersionHash();
+      if (Res == 0 && Ver->Hash == Hash)
       {
         if (List.UsePackage(Pkg,Ver) == false)
            return _error->Error("Error occured while processing %s (UsePackage2)",PackageName.c_str());
       {
         if (List.UsePackage(Pkg,Ver) == false)
            return _error->Error("Error occured while processing %s (UsePackage2)",PackageName.c_str());
@@ -122,9 +123,22 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
         continue;
       }      
 
         continue;
       }      
 
+      // Skip to the end of the same version set.
+      if (Res == 0)
+      {
+        for (; Ver.end() == false; Last = &Ver->NextVer, Ver++)
+        {
+           Res = pkgVersionCompare(Version.begin(),Version.end(),Ver.VerStr(),
+                                   Ver.VerStr() + strlen(Ver.VerStr()));
+           if (Res != 0)
+              break;
+        }
+      }
+
       // Add a new version
       *Last = NewVersion(Ver,Version,*Last);
       Ver->ParentPkg = Pkg.Index();
       // Add a new version
       *Last = NewVersion(Ver,Version,*Last);
       Ver->ParentPkg = Pkg.Index();
+      Ver->Hash = Hash;
       if (List.NewVersion(Ver) == false)
         return _error->Error("Error occured while processing %s (NewVersion1)",PackageName.c_str());
 
       if (List.NewVersion(Ver) == false)
         return _error->Error("Error occured while processing %s (NewVersion1)",PackageName.c_str());
 
index af234bae2d2a786edbcc8c83ab1fe1874750d013..90b2e18af9fe5424f86476db91e3ff2df382ecc7 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: pkgcachegen.h,v 1.14 1999/04/28 22:48:45 jgg Exp $
+// $Id: pkgcachegen.h,v 1.15 1999/05/23 22:55:54 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
@@ -101,6 +101,7 @@ class pkgCacheGenerator::ListParser
    virtual string Package() = 0;
    virtual string Version() = 0;
    virtual bool NewVersion(pkgCache::VerIterator Ver) = 0;
    virtual string Package() = 0;
    virtual string Version() = 0;
    virtual bool NewVersion(pkgCache::VerIterator Ver) = 0;
+   virtual unsigned short VersionHash() = 0;
    virtual bool UsePackage(pkgCache::PkgIterator Pkg,
                           pkgCache::VerIterator Ver) = 0;
    virtual unsigned long Offset() = 0;
    virtual bool UsePackage(pkgCache::PkgIterator Pkg,
                           pkgCache::VerIterator Ver) = 0;
    virtual unsigned long Offset() = 0;
index 458a524b99027f730dc1ff70a23e256d36be32cd..078582cc1d702bb6daa69c55d18ee5c8ed359ff7 100644 (file)
@@ -14,7 +14,8 @@ apt (0.3.6.1) unstable; urgency=low
   * Arranged for an ftp proxy specifing an http server to work. See the
     important note in the sources.list man page.
   * Accounted for resumed files in the cps calculation. Closes: #36787
   * Arranged for an ftp proxy specifing an http server to work. See the
     important note in the sources.list man page.
   * Accounted for resumed files in the cps calculation. Closes: #36787
-  
+  * Deal with duplicate same version different packages. Closes: #30237
+
  -- Jason Gunthorpe <jgg@debian.org>  Wed, 12 May 1999 09:18:49 -0700
  
 apt (0.3.6) unstable; urgency=low
  -- Jason Gunthorpe <jgg@debian.org>  Wed, 12 May 1999 09:18:49 -0700
  
 apt (0.3.6) unstable; urgency=low
index 2e80838fab41bda9698d684c18cf17a7ca96dc74..6c2307579fa0d33fd01ca616a5aa7584c097794c 100644 (file)
@@ -4,7 +4,7 @@
 <title>APT Cache File Format</title>
 
 <author>Jason Gunthorpe <email>jgg@debian.org</email></author>
 <title>APT Cache File Format</title>
 
 <author>Jason Gunthorpe <email>jgg@debian.org</email></author>
-<version>$Id: cache.sgml,v 1.6 1999/02/01 02:22:11 jgg Exp $</version>
+<version>$Id: cache.sgml,v 1.7 1999/05/23 22:55:55 jgg Exp $</version>
 
 <abstract>
 This document describes the complete implementation and format of the APT
 
 <abstract>
 This document describes the complete implementation and format of the APT
@@ -425,6 +425,7 @@ VerStr).
       
       unsigned long Size;
       unsigned long InstalledSize;
       
       unsigned long Size;
       unsigned long InstalledSize;
+      unsigned long Hash;
       unsigned short ID;
       unsigned char Priority;
    };
       unsigned short ID;
       unsigned char Priority;
    };
@@ -465,6 +466,10 @@ Head of the linked list of Provides::NextPkgProv, forward provides.
 The archive size for this version. For debian this is the size of the .deb
 file. Installed size is the uncompressed size for this version
 
 The archive size for this version. For debian this is the size of the .deb
 file. Installed size is the uncompressed size for this version
 
+<tag>Hash<item>
+This is a characteristic value representing this package. No two packages
+in existance should have the same VerStr and Hash with different contents.
+
 <tag>ID<item>
 See Package::ID.
 
 <tag>ID<item>
 See Package::ID.