]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/deb/debindexfile.cc
Merge last changes from apt--main--0.
[apt.git] / apt-pkg / deb / debindexfile.cc
index 67afc89e6e3cd9fc26eec0ba5adc6448982eea86..4113137eb921c6da4f4d13dcb2bff51df3a184fe 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: debindexfile.cc,v 1.2 2001/02/20 07:03:17 jgg Exp $
+// $Id: debindexfile.cc,v 1.5.2.3 2004/01/04 19:11:00 mdz Exp $
 /* ######################################################################
 
    Debian Specific sources.list types and the three sorts of Debian
@@ -23,6 +23,7 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/acquire-item.h>
+#include <apt-pkg/debmetaindex.h>
     
 #include <sys/stat.h>
                                                                        /*}}}*/
@@ -30,8 +31,8 @@
 // SourcesIndex::debSourcesIndex - Constructor                         /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-debSourcesIndex::debSourcesIndex(string URI,string Dist,string Section) :
-                                     URI(URI), Dist(Dist), Section(Section)
+debSourcesIndex::debSourcesIndex(string URI,string Dist,string Section,bool Trusted) :
+     pkgIndexFile(Trusted), URI(URI), Dist(Dist), Section(Section)
 {
 }
                                                                        /*}}}*/
@@ -66,15 +67,7 @@ string debSourcesIndex::SourceInfo(pkgSrcRecords::Parser const &Record,
 /* */
 pkgSrcRecords::Parser *debSourcesIndex::CreateSrcParser() const
 {
-   string SourcesURI;
-   if (Dist[Dist.size() - 1] == '/')
-      SourcesURI = URI + Dist;
-   else
-      SourcesURI = URI + "dists/" + Dist + '/' + Section +
-      "/source/";
-   
-   SourcesURI += "Sources";
-   SourcesURI = URItoFileName(SourcesURI);
+   string SourcesURI = URItoFileName(IndexURI("Sources"));
    return new debSrcRecordParser(_config->FindDir("Dir::State::lists") +
                                 SourcesURI,this);
 }
@@ -82,11 +75,15 @@ pkgSrcRecords::Parser *debSourcesIndex::CreateSrcParser() const
 // SourcesIndex::Describe - Give a descriptive path to the index       /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-string debSourcesIndex::Describe() const
+string debSourcesIndex::Describe(bool Short) const
 {
    char S[300];
-   snprintf(S,sizeof(S),"%s (%s)",Info("Packages").c_str(),
-           IndexFile("Sources").c_str());
+   if (Short == true)
+      snprintf(S,sizeof(S),"%s",Info("Sources").c_str());
+   else
+      snprintf(S,sizeof(S),"%s (%s)",Info("Sources").c_str(),
+              IndexFile("Sources").c_str());
+   
    return S;
 }
                                                                        /*}}}*/
@@ -133,16 +130,6 @@ string debSourcesIndex::IndexURI(const char *Type) const
    return Res;
 }
                                                                        /*}}}*/
-// SourcesIndex::GetIndexes - Fetch the index files                    /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool debSourcesIndex::GetIndexes(pkgAcquire *Owner) const
-{
-   new pkgAcqIndex(Owner,IndexURI("Sources"),Info("Sources"),"Sources");
-   new pkgAcqIndexRel(Owner,IndexURI("Release"),Info("Release"),"Release");
-   return true;
-}
-                                                                       /*}}}*/
 // SourcesIndex::Exists - Check if the index is available              /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -166,8 +153,8 @@ unsigned long debSourcesIndex::Size() const
 // PackagesIndex::debPackagesIndex - Contructor                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-debPackagesIndex::debPackagesIndex(string URI,string Dist,string Section) : 
-                  URI(URI), Dist(Dist), Section(Section)
+debPackagesIndex::debPackagesIndex(string URI,string Dist,string Section,bool Trusted) : 
+                  pkgIndexFile(Trusted), URI(URI), Dist(Dist), Section(Section)
 {
 }
                                                                        /*}}}*/
@@ -196,11 +183,14 @@ string debPackagesIndex::ArchiveInfo(pkgCache::VerIterator Ver) const
 // ---------------------------------------------------------------------
 /* This should help the user find the index in the sources.list and
    in the filesystem for problem solving */
-string debPackagesIndex::Describe() const
+string debPackagesIndex::Describe(bool Short) const
 {   
    char S[300];
-   snprintf(S,sizeof(S),"%s (%s)",Info("Packages").c_str(),
-           IndexFile("Packages").c_str());
+   if (Short == true)
+      snprintf(S,sizeof(S),"%s",Info("Packages").c_str());
+   else
+      snprintf(S,sizeof(S),"%s (%s)",Info("Packages").c_str(),
+              IndexFile("Packages").c_str());
    return S;
 }
                                                                        /*}}}*/
@@ -247,16 +237,6 @@ string debPackagesIndex::IndexURI(const char *Type) const
    return Res;
 }
                                                                        /*}}}*/
-// PackagesIndex::GetIndexes - Fetch the index files                   /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool debPackagesIndex::GetIndexes(pkgAcquire *Owner) const
-{
-   new pkgAcqIndex(Owner,IndexURI("Packages"),Info("Packages"),"Packages");
-   new pkgAcqIndexRel(Owner,IndexURI("Release"),Info("Release"),"Release");
-   return true;
-}
-                                                                       /*}}}*/
 // PackagesIndex::Exists - Check if the index is available             /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -304,7 +284,7 @@ bool debPackagesIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const
       return _error->Error("Problem with MergeList %s",PackageFile.c_str());
 
    // Check the release file
-   string ReleaseFile = IndexFile("Release");
+   string ReleaseFile = debReleaseIndex(URI,Dist).MetaIndexFile("Release");
    if (FileExists(ReleaseFile) == true)
    {
       FileFd Rel(ReleaseFile,FileFd::ReadOnly);
@@ -340,10 +320,144 @@ pkgCache::PkgFileIterator debPackagesIndex::FindInCache(pkgCache &Cache) const
 }
                                                                        /*}}}*/
 
+// TranslationsIndex::debTranslationsIndex - Contructor                        /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+debTranslationsIndex::debTranslationsIndex(string URI,string Dist,string Section) : 
+                  pkgIndexFile(true), URI(URI), Dist(Dist), Section(Section)
+{
+}
+                                                                       /*}}}*/
+// TranslationIndex::Trans* - Return the URI to the translation files  /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+inline string debTranslationsIndex::IndexFile(const char *Type) const
+{
+   return _config->FindDir("Dir::State::lists") + URItoFileName(IndexURI(Type));
+}
+string debTranslationsIndex::IndexURI(const char *Type) const
+{
+   string Res;
+   if (Dist[Dist.size() - 1] == '/')
+   {
+      if (Dist != "/")
+        Res = URI + Dist;
+      else 
+        Res = URI;
+   }
+   else
+      Res = URI + "dists/" + Dist + '/' + Section +
+      "/i18n/Translation-";
+   
+   Res += Type;
+   return Res;
+}
+                                                                       /*}}}*/
+// TranslationsIndex::GetIndexes - Fetch the index files               /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool debTranslationsIndex::GetIndexes(pkgAcquire *Owner) const
+{
+   if (UseTranslation()) {
+     string TranslationFile = "Translation-" + LanguageCode();
+     new pkgAcqIndexTrans(Owner, IndexURI(LanguageCode().c_str()),
+                         Info(TranslationFile.c_str()),
+                         TranslationFile);
+   }
+
+   return true;
+}
+                                                                       /*}}}*/
+// TranslationsIndex::Describe - Give a descriptive path to the index  /*{{{*/
+// ---------------------------------------------------------------------
+/* This should help the user find the index in the sources.list and
+   in the filesystem for problem solving */
+string debTranslationsIndex::Describe(bool Short) const
+{   
+   char S[300];
+   if (Short == true)
+      snprintf(S,sizeof(S),"%s",Info(TranslationFile().c_str()).c_str());
+   else
+      snprintf(S,sizeof(S),"%s (%s)",Info(TranslationFile().c_str()).c_str(),
+              IndexFile(LanguageCode().c_str()).c_str());
+   return S;
+}
+                                                                       /*}}}*/
+// TranslationsIndex::Info - One liner describing the index URI                /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string debTranslationsIndex::Info(const char *Type) const 
+{
+   string Info = ::URI::SiteOnly(URI) + ' ';
+   if (Dist[Dist.size() - 1] == '/')
+   {
+      if (Dist != "/")
+        Info += Dist;
+   }
+   else
+      Info += Dist + '/' + Section;   
+   Info += " ";
+   Info += Type;
+   return Info;
+}
+                                                                       /*}}}*/
+// TranslationsIndex::Exists - Check if the index is available         /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool debTranslationsIndex::Exists() const
+{
+   return true;
+}
+                                                                       /*}}}*/
+// TranslationsIndex::Size - Return the size of the index              /*{{{*/
+// ---------------------------------------------------------------------
+/* This is really only used for progress reporting. */
+unsigned long debTranslationsIndex::Size() const
+{
+   struct stat S;
+   if (stat(IndexFile(LanguageCode().c_str()).c_str(),&S) != 0)
+      return 0;
+   return S.st_size;
+}
+                                                                       /*}}}*/
+// TranslationsIndex::Merge - Load the index file into a cache         /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool debTranslationsIndex::Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const
+{
+   // Check the translation file, if in use
+   string TranslationFile = IndexFile(LanguageCode().c_str());
+   if (UseTranslation() && FileExists(TranslationFile))
+   {
+     FileFd Trans(TranslationFile,FileFd::ReadOnly);
+     debListParser TransParser(&Trans);
+     if (_error->PendingError() == true)
+       return false;
+     
+     Prog.SubProgress(0, Info(TranslationFile.c_str()));
+     if (Gen.SelectFile(TranslationFile,string(),*this) == false)
+       return _error->Error("Problem with SelectFile %s",TranslationFile.c_str());
+
+     // Store the IMS information
+     pkgCache::PkgFileIterator TransFile = Gen.GetCurFile();
+     struct stat TransSt;
+     if (fstat(Trans.Fd(),&TransSt) != 0)
+       return _error->Errno("fstat","Failed to stat");
+     TransFile->Size = TransSt.st_size;
+     TransFile->mtime = TransSt.st_mtime;
+   
+     if (Gen.MergeList(TransParser) == false)
+       return _error->Error("Problem with MergeList %s",TranslationFile.c_str());
+   }
+
+   return true;
+}
+                                                                       /*}}}*/
+
 // StatusIndex::debStatusIndex - Constructor                           /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-debStatusIndex::debStatusIndex(string File) : File(File)
+debStatusIndex::debStatusIndex(string File) : pkgIndexFile(true), File(File)
 {
 }
                                                                        /*}}}*/
@@ -419,46 +533,6 @@ bool debStatusIndex::Exists() const
 }
                                                                        /*}}}*/
 
-// Source List types for Debian                                                /*{{{*/
-class debSLTypeDeb : public pkgSourceList::Type
-{
-   public:
-
-   bool CreateItem(vector<pkgIndexFile *> &List,string URI,
-                  string Dist,string Section) const 
-   {
-      List.push_back(new debPackagesIndex(URI,Dist,Section));
-      return true;
-   };
-
-   debSLTypeDeb()
-   {
-      Name = "deb";
-      Label = "Standard Debian binary tree";
-   }   
-};
-
-class debSLTypeDebSrc : public pkgSourceList::Type
-{
-   public:
-
-   bool CreateItem(vector<pkgIndexFile *> &List,string URI,
-                  string Dist,string Section) const 
-   {
-      List.push_back(new debSourcesIndex(URI,Dist,Section));
-      return true;
-   };  
-   
-   debSLTypeDebSrc()
-   {
-      Name = "deb-src";
-      Label = "Standard Debian source tree";
-   }   
-};
-
-debSLTypeDeb _apt_DebType;
-debSLTypeDebSrc _apt_DebSrcType;
-                                                                       /*}}}*/
 // Index File types for Debian                                         /*{{{*/
 class debIFTypeSrc : public pkgIndexFile::Type
 {
@@ -498,6 +572,10 @@ const pkgIndexFile::Type *debPackagesIndex::GetType() const
 {
    return &_apt_Pkg;
 }
+const pkgIndexFile::Type *debTranslationsIndex::GetType() const
+{
+   return &_apt_Pkg;
+}
 const pkgIndexFile::Type *debStatusIndex::GetType() const
 {
    return &_apt_Status;