- Deal with compression on per-file, not per repository type, needed for
authorPanu Matilainen <pmatilai@turre.koti.laiskiainen.org>
Wed, 25 Apr 2007 12:05:17 +0000 (15:05 +0300)
committerPanu Matilainen <pmatilai@turre.koti.laiskiainen.org>
Wed, 25 Apr 2007 12:05:17 +0000 (15:05 +0300)
  repomd which uses bz2 for sqlite and gz for xml files. If this doesn't
  break Synaptic in some funny subtle (or not) way ... I'll be damned.
- Make automatic sqlite vs xml selection + use actually work

apt-pkg/acquire-item.cc
apt-pkg/contrib/fileutl.cc
apt-pkg/contrib/fileutl.h
apt-pkg/repository.h
apt-pkg/rpm/repomd.cc
apt-pkg/rpm/rpmindexfile.cc
apt-pkg/rpm/rpmindexfile.h

index 676330a..6022964 100644 (file)
@@ -208,8 +208,7 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,pkgRepository *Repository,
    DestFile += URItoFileName(URI);
 
    // Create the item
-   // CNC:2002-07-03
-   Desc.URI = URI + "." + Repository->GetComprMethod();
+   Desc.URI = URI; 
    Desc.Description = URIDesc;
    Desc.Owner = this;
    Desc.ShortDesc = ShortDesc;
@@ -296,7 +295,7 @@ void pkgAcqIndex::Done(string Message,off_t Size,string MD5,
       string MD5Hash;
 
       if (Repository != NULL && Repository->HasRelease() == true &&
-         Repository->FindChecksums(RealURI,FSize,MD5Hash) == true)
+         Repository->FindChecksums(flUnCompressed(RealURI),FSize,MD5Hash) == true)
       {
         // We must always get here if the repository is authenticated
         
@@ -333,14 +332,14 @@ void pkgAcqIndex::Done(string Message,off_t Size,string MD5,
         
       // Done, move it into position
       string FinalFile = _config->FindDir("Dir::State::lists");
-      FinalFile += URItoFileName(RealURI);
+      FinalFile += URItoFileName(flUnCompressed(RealURI));
       Rename(DestFile,FinalFile);
       chmod(FinalFile.c_str(),0644);
       
       /* We restore the original name to DestFile so that the clean operation
          will work OK */
       DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-      DestFile += URItoFileName(RealURI);
+      DestFile += URItoFileName(flUnCompressed(RealURI));
       
       // Remove the compressed version.
       if (Erase == true)
@@ -386,16 +385,15 @@ void pkgAcqIndex::Done(string Message,off_t Size,string MD5,
    
    Decompression = true;
    DestFile += ".decomp";
-   // LORG:2006-02-23 compression is a feature of repository type
-   if (Repository->GetComprMethod() == "gz") {
+   if (flExtension(FileName) == "gz") {
       Desc.URI = "gzip:" + FileName;
       Mode = "gzip";
-   } else if (Repository->GetComprMethod() == "bz2") {
+   } else if (flExtension(FileName) == "bz2") {
       Desc.URI = "bzip2:" + FileName;
       Mode = "bzip2";
    } else {
-      _error->Warning(_("Unknown compression extension, trying uncompressed"));
-      Desc.URI = FileName;
+      Desc.URI = "copy:" + FileName;
+      Mode = "copy";
    }
    QueueURI(Desc);
 }
index 4ff212f..0bc1c76 100644 (file)
@@ -191,6 +191,16 @@ string flNoExtension(string File)
    return string(File, 0, Res-1);
 }
 
+string flUnCompressed(string File)
+{
+   string Ext = flExtension(File);
+   if (Ext == "gz" or Ext == "bz2") {
+      return flNoExtension(File);
+   }
+   return File;
+}
+
+
 // flNoLink - If file is a symlink then deref it                       /*{{{*/
 // ---------------------------------------------------------------------
 /* If the name is not a link then the returned path is the input. */
@@ -610,3 +620,5 @@ bool FileFd::Sync()
    return true;
 }
                                                                        /*}}}*/
+
+// vim:sts=3:sw=3
index 0b8874d..595dd37 100644 (file)
@@ -96,6 +96,7 @@ string flNotFile(string File);
 string flNoLink(string File);
 string flExtension(string File);
 string flNoExtension(string File);
+string flUnCompressed(string File);
 string flCombine(string Dir,string File);
 
 #endif
index b59a96e..a60f8e4 100644 (file)
@@ -28,7 +28,6 @@ class pkgRepository
    map<string,Checksum> IndexChecksums; // path -> checksum data   
 
    bool GotRelease;
-   string ComprMethod;
    string CheckMethod;
 
    public:   
@@ -49,7 +48,6 @@ class pkgRepository
    // Only used in repomd atm
    virtual bool FindURI(string DataType, string &URI) {return false;};
    // LORG:2006-02-23 
-   virtual string GetComprMethod() {return ComprMethod;};
    virtual string GetCheckMethod() {return CheckMethod;};
    
    pkgRepository(string URI,string Dist, const pkgSourceList::Vendor *Vendor,
@@ -58,7 +56,6 @@ class pkgRepository
        Acquire(1)
    {
       if (Vendor) FingerPrint = Vendor->FingerPrint;
-      ComprMethod = "bz2";
       CheckMethod = "MD5-Hash";
    };
 
index 8647fe1..ee56e73 100644 (file)
@@ -72,7 +72,6 @@ bool repomdRepository::ParseRelease(string File)
 
       n = NULL;
       if (flExtension(Path) == "gz" || flExtension(Path) == "bz2") {
-        Path = Path.substr(0, Path.size()-flExtension(Path).size()-1);
         n = FindNode(Node, "open-checksum");
       } else {
         n = FindNode(Node, "checksum");
@@ -97,13 +96,7 @@ bool repomdRepository::ParseRelease(string File)
       }
       xmlFree(type);
    }
-   
    GotRelease = true;
-   if (RepoFiles.find("primary_db") != RepoFiles.end()) {
-      ComprMethod = "bz2";
-   } else {
-      ComprMethod = "gz";
-   }
 
    xmlFreeDoc(RepoMD);
    return true;
index 9daad8c..f70e0a0 100644 (file)
@@ -151,7 +151,8 @@ string rpmListIndex::Info(string Type) const
 /* */
 inline string rpmListIndex::IndexFile(string Type) const
 {
-   return _config->FindDir("Dir::State::lists")+URItoFileName(IndexURI(Type));
+   return _config->FindDir("Dir::State::lists") +
+         URItoFileName(flNoExtension(IndexURI(Type)));
 }
 
 
@@ -170,6 +171,9 @@ string rpmListIndex::IndexURI(string Type) const
       Res = URI + Dist + "/base/";
    
    Res += Type + '.' + Section;
+   if (Type == "pkglist" || Type == "srclist") {
+      Res += ".bz2";
+   }
 
    if (rpmdata->HasIndexTranslation() == true)
    {
@@ -530,6 +534,16 @@ string rpmRepomdIndex::ArchiveURI(string File) const
    return Res;
 }
 
+bool rpmRepomdIndex::HasDBExtension() const
+{
+   string TypeURI;
+   if (Repository->FindURI("primary_db", TypeURI)) {
+      return true;
+   } else {
+      return false;
+   }
+}
+
 string rpmRepomdIndex::ArchiveInfo(pkgCache::VerIterator Ver) const
 {
    string Res = ::URI::SiteOnly(URI) + ' ';
@@ -597,6 +611,8 @@ string rpmRepomdIndex::ReleaseInfo(string Type) const
 string rpmRepomdIndex::Info(string Type) const 
 {
    string Info = ::URI::SiteOnly(URI) + ' ';
+   string File;
+   Repository->FindURI(Type, File);
    assert( Dist.size() > 0 );
    if (Dist[Dist.size() - 1] == '/')
    {
@@ -606,7 +622,7 @@ string rpmRepomdIndex::Info(string Type) const
    else
       Info += Dist + '/' ;   
    Info += " ";
-   Info += Type;
+   Info += flNotDir(File);
    return Info;
 }
 
@@ -626,7 +642,16 @@ string rpmRepomdIndex::IndexURI(string Type) const
    assert(Res.size() > 0);
    return Res;
 }
-                                                                       /*}}}*/
+
+string rpmRepomdIndex::AutoType(string Type) const
+{
+   string TypeURI;
+   if (Repository->FindURI(Type + "_db", TypeURI)) {
+      return Type + "_db";
+   }
+   return Type;
+}
+
 bool rpmRepomdIndex::GetReleases(pkgAcquire *Owner) const
 {
    if (!Repository->Acquire)
@@ -641,31 +666,28 @@ bool rpmRepomdIndex::GetIndexes(pkgAcquire *Owner) const
 {
    string TypeURI;
    bool AcqOther = _config->FindB("Acquire::RepoMD::OtherData", false);
-   if (Repository->FindURI("primary_db", TypeURI)) {
-      new pkgAcqIndex(Owner,Repository,IndexURI("primary_db"),
-                     Info("primary.sqlite"), "primary.sqlite");
-      new pkgAcqIndex(Owner,Repository,IndexURI("filelists_db"),
-                     Info("filelists.sqlite"), "filelists.sqlite");
-      if (AcqOther) {
-        new pkgAcqIndex(Owner,Repository,IndexURI("other_db"),
-                       Info("other.sqlite"), "other.sqlite");
-      }
-      return true;
-   } 
-   
+   bool AcqGroup = _config->FindB("Acquire::RepoMD::Group", false);
+   bool Res = false;
    if (! Repository->FindURI("primary", TypeURI)) {
-      _error->Error(_("Primary metadata not found in repository %s %s"),
-                    Repository->URI.c_str(), Repository->Dist.c_str());
-      return false;
+      return _error->Error(_("Primary metadata not found in repository %s %s"),
+                       Repository->URI.c_str(), Repository->Dist.c_str());
    }
 
-   new pkgAcqIndex(Owner,Repository,IndexURI("primary"),
-                  Info("primary.xml"), "primary.xml");
-   new pkgAcqIndex(Owner,Repository,IndexURI("filelists"),
-                  Info("filelists.xml"), "filelists.xml");
+   new pkgAcqIndex(Owner,Repository,IndexURI(AutoType("primary")),
+                  Info(AutoType("primary")), "primary");
+   new pkgAcqIndex(Owner,Repository,IndexURI(AutoType("filelists")),
+                  Info(AutoType("filelists")), "filelists");
    if (AcqOther) {
-      new pkgAcqIndex(Owner,Repository,IndexURI("other"),
-                    Info("other.xml"), "other.xml");
+      new pkgAcqIndex(Owner,Repository,IndexURI(AutoType("other")),
+                    Info(AutoType("other")), "other");
+   }
+
+   if (Res && AcqGroup) {
+      string GroupURI;
+      if (Repository->FindURI("group", GroupURI)) {
+        new pkgAcqIndex(Owner,Repository,IndexURI("group"),
+                          ReleaseInfo("comps.xml"), "comps.xml");
+      }
    }
    return true;
 }
@@ -681,9 +703,15 @@ string rpmRepomdIndex::Describe(bool Short) const
    return S;
 }
 
+string rpmRepomdIndex::IndexPath() const
+{
+   return IndexFile("primary");
+}
+
 string rpmRepomdIndex::IndexFile(string Type) const
 {
-   return _config->FindDir("Dir::State::lists")+URItoFileName(IndexURI(Type));
+   return _config->FindDir("Dir::State::lists") +
+         URItoFileName(flNoExtension(IndexURI(AutoType(Type))));
 }
 
 
@@ -694,14 +722,15 @@ bool rpmRepomdIndex::Exists() const
 
 string rpmRepomdIndex::ReleasePath() const
 {
-   return _config->FindDir("Dir::State::lists")+URItoFileName(ReleaseURI("repomd.xml"));
+   return _config->FindDir("Dir::State::lists") +
+         URItoFileName(ReleaseURI("repomd.xml"));
 }
 
 RPMHandler* rpmRepomdIndex::CreateHandler() const
 {
    string TypeURI;
-   if (Repository->FindURI("primary_db", TypeURI)) {
-      return new RPMSqliteHandler(IndexFile("primary_db"));
+   if (HasDBExtension()) {
+      return new RPMSqliteHandler(IndexFile("primary"));
    } else {
       return new RPMRepomdHandler(IndexFile("primary"));
    }
@@ -760,7 +789,12 @@ bool rpmRepomdIndex::MergeFileProvides(pkgCacheGenerator &Gen,
                                        OpProgress &Prog) const
 {
    string PackageFile = IndexPath();
-   RPMHandler *Handler = new RPMRepomdFLHandler(IndexFile("filelists"));
+   RPMHandler *Handler = NULL;
+   if (HasDBExtension()) {
+      Handler = CreateHandler();
+   } else {
+      Handler = new RPMRepomdFLHandler(IndexFile("filelists"));
+   }
    rpmListParser Parser(Handler);
    if (_error->PendingError() == true) {
       delete Handler;
index f909839..6481c2f 100644 (file)
@@ -295,8 +295,11 @@ class rpmRepomdIndex : public rpmIndexFile
    string IndexFile(string Type) const;
    string IndexURI(string Type) const;
 
+   string AutoType(string Type) const;
+   bool HasDBExtension() const;
+
    virtual string MainType() const = 0;
-   virtual string IndexPath() const {return IndexFile("primary");};
+   virtual string IndexPath() const;
    virtual string ReleasePath() const;
 
    public: