Quellcode durchsuchen

Multiple different versions support
Author: jgg
Date: 1999-05-23 22:55:54 GMT
Multiple different versions support

Arch Librarian vor 22 Jahren
Ursprung
Commit
204fbdcce6

+ 76 - 0
apt-pkg/contrib/crc-16.cc

@@ -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;
+}

+ 21 - 0
apt-pkg/contrib/crc-16.h

@@ -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

+ 36 - 1
apt-pkg/deb/deblistparser.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // 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/error.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/strutl.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			/*{{{*/
 // ListParser::ParseStatus - Parse the status field			/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* Status lines are of the form,
 /* Status lines are of the form,

+ 2 - 1
apt-pkg/deb/deblistparser.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // 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 Package();
    virtual string Version();
    virtual string Version();
    virtual bool NewVersion(pkgCache::VerIterator Ver);
    virtual bool NewVersion(pkgCache::VerIterator Ver);
+   virtual unsigned short VersionHash();
    virtual bool UsePackage(pkgCache::PkgIterator Pkg,
    virtual bool UsePackage(pkgCache::PkgIterator Pkg,
 			   pkgCache::VerIterator Ver);
 			   pkgCache::VerIterator Ver);
    virtual unsigned long Offset() {return iOffset;};
    virtual unsigned long Offset() {return iOffset;};

+ 3 - 3
apt-pkg/makefile

@@ -11,14 +11,14 @@ include ../buildlib/defaults.mak
 
 
 # The library name
 # The library name
 LIBRARY=apt-pkg
 LIBRARY=apt-pkg
-MAJOR=2.4
+MAJOR=2.5
 MINOR=0
 MINOR=0
 SLIBS=$(PTHREADLIB)
 SLIBS=$(PTHREADLIB)
 
 
 # Source code for the contributed non-core things
 # Source code for the contributed non-core things
 SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \
 SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \
          contrib/configuration.cc contrib/progress.cc contrib/cmndline.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 code for the main library
 SOURCE+= pkgcache.cc version.cc fileutl.cc pkgcachegen.cc depcache.cc \
 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 \
           version.h progress.h pkgrecords.h debrecords.h cmndline.h \
 	  acquire.h acquire-worker.h acquire-item.h acquire-method.h md5.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 \
 	  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))
 
 

+ 3 - 3
apt-pkg/pkgcache.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // 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 structures change the major version should be bumped,
       whenever the generator changes the minor version should be bumped. */
       whenever the generator changes the minor version should be bumped. */
-   MajorVersion = 2;
-   MinorVersion = 3;
+   MajorVersion = 3;
+   MinorVersion = 1;
    Dirty = true;
    Dirty = true;
    
    
    HeaderSz = sizeof(pkgCache::Header);
    HeaderSz = sizeof(pkgCache::Header);

+ 2 - 1
apt-pkg/pkgcache.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // 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 Size;              // These are the .deb size
    __apt_ptrloc InstalledSize;
    __apt_ptrloc InstalledSize;
+   unsigned short Hash;
    unsigned short ID;
    unsigned short ID;
    unsigned char Priority;
    unsigned char Priority;
 };
 };

+ 16 - 2
apt-pkg/pkgcachegen.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // 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
       /* We already have a version for this item, record that we
          saw it */
          saw it */
-      if (Res == 0)
+      unsigned long Hash = List.VersionHash();
+      if (Res == 0 && Ver->Hash == Hash)
       {
       {
 	 if (List.UsePackage(Pkg,Ver) == false)
 	 if (List.UsePackage(Pkg,Ver) == false)
 	    return _error->Error("Error occured while processing %s (UsePackage2)",PackageName.c_str());
 	    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
       // Add a new version
       *Last = NewVersion(Ver,Version,*Last);
       *Last = NewVersion(Ver,Version,*Last);
       Ver->ParentPkg = Pkg.Index();
       Ver->ParentPkg = Pkg.Index();
+      Ver->Hash = Hash;
       if (List.NewVersion(Ver) == false)
       if (List.NewVersion(Ver) == false)
 	 return _error->Error("Error occured while processing %s (NewVersion1)",PackageName.c_str());
 	 return _error->Error("Error occured while processing %s (NewVersion1)",PackageName.c_str());
 
 

+ 2 - 1
apt-pkg/pkgcachegen.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
 // 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 Package() = 0;
    virtual string Version() = 0;
    virtual string Version() = 0;
    virtual bool NewVersion(pkgCache::VerIterator Ver) = 0;
    virtual bool NewVersion(pkgCache::VerIterator Ver) = 0;
+   virtual unsigned short VersionHash() = 0;
    virtual bool UsePackage(pkgCache::PkgIterator Pkg,
    virtual bool UsePackage(pkgCache::PkgIterator Pkg,
 			   pkgCache::VerIterator Ver) = 0;
 			   pkgCache::VerIterator Ver) = 0;
    virtual unsigned long Offset() = 0;
    virtual unsigned long Offset() = 0;

+ 2 - 1
debian/changelog

@@ -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
   * Arranged for an ftp proxy specifing an http server to work. See the
     important note in the sources.list man page.
     important note in the sources.list man page.
   * Accounted for resumed files in the cps calculation. Closes: #36787
   * 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
  -- Jason Gunthorpe <jgg@debian.org>  Wed, 12 May 1999 09:18:49 -0700
  
  
 apt (0.3.6) unstable; urgency=low
 apt (0.3.6) unstable; urgency=low

+ 6 - 1
doc/cache.sgml

@@ -4,7 +4,7 @@
 <title>APT Cache File Format</title>
 <title>APT Cache File Format</title>
 
 
 <author>Jason Gunthorpe <email>jgg@debian.org</email></author>
 <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>
 <abstract>
 This document describes the complete implementation and format of the APT
 This document describes the complete implementation and format of the APT
@@ -425,6 +425,7 @@ VerStr).
       
       
       unsigned long Size;
       unsigned long Size;
       unsigned long InstalledSize;
       unsigned long InstalledSize;
+      unsigned long Hash;
       unsigned short ID;
       unsigned short ID;
       unsigned char Priority;
       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
 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
 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>
 <tag>ID<item>
 See Package::ID.
 See Package::ID.