- implement and use generic VersionHash() method in rpmlistparser instead
authorpmatilai <pmatilai>
Sat, 8 Apr 2006 18:30:32 +0000 (18:30 +0000)
committerpmatilai <pmatilai>
Sat, 8 Apr 2006 18:30:32 +0000 (18:30 +0000)
  of handler-specific hashes
- show architecture in addition to version in apt-cache showpkg versions list

apt-pkg/rpm/rpmhandler.cc
apt-pkg/rpm/rpmhandler.h
apt-pkg/rpm/rpmlistparser.cc
cmdline/apt-cache.cc

index d6dfc2c..d792481 100644 (file)
@@ -379,61 +379,6 @@ bool RPMHandler::FileProvides(vector<string> &FileProvs)
 
 }
 
-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;
@@ -1335,17 +1280,6 @@ bool RPMRepomdHandler::FileProvides(vector<string> &FileProvs)
    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());
-   return Result;
-}
-
-
-
 RPMRepomdHandler::~RPMRepomdHandler()
 {
    xmlFreeDoc(Primary);
index 9c84663..e5d6504 100644 (file)
@@ -100,7 +100,6 @@ class RPMHandler
    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);
 
@@ -268,7 +267,6 @@ class RPMRepomdHandler : public RPMHandler
    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, bool useFilelist);
    virtual ~RPMRepomdHandler();
index 6b0634e..b4fab26 100644 (file)
@@ -238,21 +238,46 @@ bool rpmListParser::UsePackage(pkgCache::PkgIterator Pkg,
 // ---------------------------------------------------------------------
 /* */
 
-/*
-static int compare(const void *a, const void *b)
+static bool depsort(const Dependency *a, const Dependency *b)
 {   
-   return strcmp(*(char**)a, *(char**)b);
+   return a->Name < b->Name;
 }
-*/
 
+static bool depuniq(const Dependency *a, const Dependency *b)
+{   
+   return a->Name == b->Name;
+}
 unsigned short rpmListParser::VersionHash()
 {
 #ifdef WITH_VERSION_CACHING
    if (VI != NULL)
       return (*VI)->Hash;
 #endif
-      
-   return Handler->VersionHash();
+
+   unsigned long Result = INIT_FCS;
+   Result = AddCRC16(Result, Package().c_str(), Package().length());
+   Result = AddCRC16(Result, Version().c_str(), Version().length());
+   Result = AddCRC16(Result, Architecture().c_str(), Architecture().length());
+
+   int DepSections[] = { 
+      pkgCache::Dep::Depends,
+      pkgCache::Dep::Conflicts,
+      pkgCache::Dep::Obsoletes,
+   };
+   
+   for (int i = 0; i < sizeof(DepSections)/sizeof(int); i++) {
+      vector<Dependency*> Deps;
+      if (Handler->Depends(DepSections[i], Deps) == false) continue;
+
+      sort(Deps.begin(), Deps.end(), depsort);
+      // rpmdb can give out dupes for scriptlet dependencies, filter them out
+      vector<Dependency*>::iterator DepEnd = unique(Deps.begin(), Deps.end(), depuniq);
+      vector<Dependency*>::iterator I = Deps.begin();
+      for (; I != DepEnd; I++) { 
+        Result = AddCRC16(Result, (*I)->Name.c_str(), (*I)->Name.length());
+      }
+   }
+   return Result;
 }
                                                                         /*}}}*/
 // ListParser::ParseStatus - Parse the status field                    /*{{{*/
index 6240edc..f9b19fa 100644 (file)
@@ -202,7 +202,7 @@ bool DumpPackage(CommandLine &CmdL)
       cout << "Versions: " << endl;
       for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; Cur++)
       {
-        cout << Cur.VerStr();
+        cout << Cur.VerStr() << "." << Cur.Arch();
         for (pkgCache::VerFileIterator Vf = Cur.FileList(); Vf.end() == false; Vf++)
            cout << "(" << Vf.File().FileName() << ")";
         cout << endl;