Просмотр исходного кода

Merge with mvo
Patches applied:

* michael.vogt@ubuntu.com--2005/apt--bts225947--0--base-0
tag of apt@packages.debian.org/apt--main--0--patch-79

* michael.vogt@ubuntu.com--2005/apt--bts225947--0--patch-1
* merged with mainline and apt--fixes--0

* michael.vogt@ubuntu.com--2005/apt--bts225947--0--patch-2
* patch from aj (slighly modified to use auto_ptr<>) applied

* michael.vogt@ubuntu.com--2005/apt--bts225947--0--patch-3
* changelog updated

* michael.vogt@ubuntu.com--2005/apt--bts225947--0--patch-4
* work for arch=all packages too now

* michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-5
* merged with apt--main--0

* michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-7
* fixed incorrect man-page example

* michael.vogt@ubuntu.com--2005/apt--fixes--0--patch-8
* changelog udpate

* michael.vogt@ubuntu.com--2005/apt--sane-handle-timeout--0--base-0
tag of apt@packages.debian.org/apt--main--0--patch-87

* michael.vogt@ubuntu.com--2005/apt--sane-handle-timeout--0--patch-1
* report timeouts (from Connect) and fail if they happen in pkgAcqMetaSig

* michael.vogt@ubuntu.com--2005/apt--sane-handle-timeout--0--patch-2
* merged with the fixes branch to make it build again

* michael.vogt@ubuntu.com--2005/apt--ubuntu--0--patch-1
tag of apt@packages.debian.org/apt--main--0--patch-88

* michael.vogt@ubuntu.com--2005/apt--ubuntu--0--patch-2
* merged apt--mvo (to make pining on components work again)

* michael.vogt@ubuntu.com--2005/apt--ubuntu--0--patch-3
* merged with apt--fixes--0 (to make the building of the french manpages work and to fix a incorrect man-page example

* michael.vogt@ubuntu.com--2005/apt--ubuntu--0--patch-4
* merged with the bts225947 code

* michael.vogt@ubuntu.com--2005/apt--ubuntu--0--patch-5
* merged the imporoved timoeut handling patch

* michael.vogt@ubuntu.com--2005/apt--ubuntu--0--patch-6
* merged with matt

* michael.vogt@ubuntu.com--2005/apt--ubuntu--0--patch-7
* removed another conflict with apt--main

Matt Zimmerman лет назад: 21
Родитель
Сommit
29ba053e05

+ 6 - 0
apt-pkg/acquire-item.cc

@@ -400,6 +400,12 @@ void pkgAcqMetaSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
    string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
    unlink(Final.c_str());
 
+   // if we get a timeout if fail
+   if(LookupTag(Message,"FailReason") == "Timeout") {
+      Item::Failed(Message,Cnf);
+      return;
+   }
+
    // queue a pkgAcqMetaIndex with no sigfile
    new pkgAcqMetaIndex(Owner, MetaIndexURI, MetaIndexURIDesc, MetaIndexShortDesc,
 		       "", IndexTargets, MetaIndexParser);

+ 8 - 0
debian/changelog

@@ -6,6 +6,14 @@ apt (0.6.39) unstable; urgency=low
   * Merge aggregated translation updates:
     bubulle@debian.org--2005/apt--main--0
   * Update priority of apt-utils to important, to match the override file
+  * Michael Vogt
+    - Change debian/bugscript to use #!/bin/bash (Closes: #313402)
+    - Fix a incorrect example in the man-page (closes: #282918)
+    - Support architecture-specific extra overrides 
+      (closes: #225947). Thanks to  Anthony Towns for idea and 
+      the patch, thanks to Colin Watson for testing it.
+    - better report network timeouts from the methods to the acuire code, 
+      only timeout once per sources.list line 
 
  -- 
 

+ 1 - 1
doc/apt_preferences.5.xml

@@ -183,7 +183,7 @@ belonging to any distribution whose Archive name is "<literal>unstable</literal>
 <programlisting>
 Package: *
 Pin: release a=unstable
-Pin-Priority: 50
+Pin-Priority: 500
 </programlisting>
 
 <simpara>The following record assigns a high priority to all package versions

+ 6 - 1
ftparchive/apt-ftparchive.cc

@@ -56,6 +56,9 @@ struct PackageMap
    string BinCacheDB;
    string BinOverride;
    string ExtraOverride;
+
+   // We generate for this given arch
+   string Arch;
    
    // Stuff for the Source File
    string SrcFile;
@@ -158,7 +161,8 @@ bool PackageMap::GenPackages(Configuration &Setup,struct CacheDB::Stats &Stats)
    // Create a package writer object.
    PackagesWriter Packages(flCombine(CacheDir,BinCacheDB),
 			   flCombine(OverrideDir,BinOverride),
-			   flCombine(OverrideDir,ExtraOverride));
+			   flCombine(OverrideDir,ExtraOverride),
+			   Arch);
    if (PkgExt.empty() == false && Packages.SetExts(PkgExt) == false)
       return _error->Error(_("Package extension list is too long"));
    if (_error->PendingError() == true)
@@ -489,6 +493,7 @@ void LoadTree(vector<PackageMap> &PkgList,Configuration &Setup)
 	       Itm.BaseDir = SubstVar(Block.Find("Directory",DDir.c_str()),Vars);
 	       Itm.PkgFile = SubstVar(Block.Find("Packages",DPkg.c_str()),Vars);
 	       Itm.Tag = SubstVar("$(DIST)/$(SECTION)/$(ARCH)",Vars);
+	       Itm.Arch = Arch;
 	       Itm.Contents = SubstVar(Block.Find("Contents",DContents.c_str()),Vars);
 	       Itm.ContentsHead = SubstVar(Block.Find("Contents::Header",DContentsH.c_str()),Vars);
 	       Itm.FLFile = SubstVar(Block.Find("FileList",DFLFile.c_str()),Vars);

+ 38 - 0
ftparchive/override.cc

@@ -207,6 +207,44 @@ bool Override::ReadExtraOverride(string File,bool Source)
    return true;
 }
 									/*}}}*/
+
+// Override::GetItem - Get a architecture specific item 	/*{{{*/
+// ---------------------------------------------------------------------
+/* Returns a override item for the given package and the given architecture.
+ * Treats "all" special
+ */
+Override::Item* Override::GetItem(string Package, string Architecture)
+{
+   map<string,Item>::iterator I = Mapping.find(Package);
+   map<string,Item>::iterator J = Mapping.find(Package + "/" + Architecture);
+
+   if (I == Mapping.end() && J == Mapping.end())
+   {
+      return 0;
+   }
+
+   Item *result = new Item;
+   if (I == Mapping.end()) *result = J->second;
+   else
+   {
+      *result = I->second;
+      if (J != Mapping.end())
+      {
+	 Item *R = &J->second;
+	 if (R->Priority != "") result->Priority = R->Priority;
+	 if (R->OldMaint != "") result->OldMaint = R->OldMaint;
+	 if (R->NewMaint != "") result->NewMaint = R->NewMaint;
+	 for (map<string,string>::iterator foI = R->FieldOverride.begin();
+	      foI != R->FieldOverride.end(); foI++)
+         {
+	    result->FieldOverride[foI->first] = foI->second;
+	 }
+      } 
+   } 
+   return result;
+};
+
+
 // Override::Item::SwapMaint - Swap the maintainer field if necessary	/*{{{*/
 // ---------------------------------------------------------------------
 /* Returns the new maintainer string after evaluating the rewriting rule. If

+ 4 - 5
ftparchive/override.h

@@ -34,17 +34,16 @@ class Override
 
       map<string,string> FieldOverride;
       string SwapMaint(string Orig,bool &Failed);
+      ~Item() {};
    };
    
    map<string,Item> Mapping;
    
    inline Item *GetItem(string Package) 
    {
-      map<string,Item>::iterator I = Mapping.find(Package);
-      if (I == Mapping.end())
-	 return 0;
-      return &I->second;
-   };
+      return GetItem(Package, "");
+   }
+   Item *GetItem(string Package, string Architecture);
    
    bool ReadOverride(string File,bool Source = false);
    bool ReadExtraOverride(string File,bool Source = false);

+ 33 - 22
ftparchive/writer.cc

@@ -36,7 +36,6 @@
 #include "apt-ftparchive.h"
 #include "multicompress.h"
 									/*}}}*/
-
 using namespace std;
 FTWScanner *FTWScanner::Owner;
 
@@ -285,8 +284,9 @@ bool FTWScanner::Delink(string &FileName,const char *OriginalPath,
 // PackagesWriter::PackagesWriter - Constructor				/*{{{*/
 // ---------------------------------------------------------------------
 /* */
-PackagesWriter::PackagesWriter(string DB,string Overrides,string ExtOverrides) :
-		    Db(DB),Stats(Db.Stats)
+PackagesWriter::PackagesWriter(string DB,string Overrides,string ExtOverrides,
+			       string aArch) :
+   Db(DB),Stats(Db.Stats), Arch(aArch)
 {
    Output = stdout;
    SetExts(".deb .udeb .foo .bar .baz");
@@ -371,14 +371,22 @@ bool PackagesWriter::DoPackage(string FileName)
    // Lookup the overide information
    pkgTagSection &Tags = Db.Control.Section;
    string Package = Tags.FindS("Package");
-   Override::Item Tmp;
-   Override::Item *OverItem = Over.GetItem(Package);
+   string Architecture;
+   // if we generate a Packages file for a given arch, we use it to
+   // look for overrides. if we run in "simple" mode without the 
+   // "Architecures" variable in the config we use the architecure value
+   // from the deb file
+   if(Arch != "")
+      Architecture = Arch;
+   else
+      Architecture = Tags.FindS("Architecture");
+   auto_ptr<Override::Item> OverItem(Over.GetItem(Package,Architecture));
    
    if (Package.empty() == true)
       return _error->Error(_("Archive had no package field"));
-   
+
    // If we need to do any rewriting of the header do it now..
-   if (OverItem == 0)
+   if (OverItem.get() == 0)
    {
       if (NoOverride == false)
       {
@@ -386,9 +394,9 @@ bool PackagesWriter::DoPackage(string FileName)
 	 ioprintf(c1out, _("  %s has no override entry\n"), Package.c_str());
       }
       
-      OverItem = &Tmp;
-      Tmp.FieldOverride["Section"] = Tags.FindS("Section");
-      Tmp.Priority = Tags.FindS("Priority");
+      OverItem = auto_ptr<Override::Item>(new Override::Item);
+      OverItem->FieldOverride["Section"] = Tags.FindS("Section");
+      OverItem->Priority = Tags.FindS("Priority");
    }
 
    char Size[40];
@@ -557,7 +565,7 @@ bool SourcesWriter::DoPackage(string FileName)
    string BestPrio;
    string Bins = Tags.FindS("Binary");
    char Buffer[Bins.length() + 1];
-   Override::Item *OverItem = 0;
+   auto_ptr<Override::Item> OverItem(0);
    if (Bins.empty() == false)
    {
       strcpy(Buffer,Bins.c_str());
@@ -570,10 +578,10 @@ bool SourcesWriter::DoPackage(string FileName)
       unsigned char BestPrioV = pkgCache::State::Extra;
       for (unsigned I = 0; BinList[I] != 0; I++)
       {
-	 Override::Item *Itm = BOver.GetItem(BinList[I]);
-	 if (Itm == 0)
+	 auto_ptr<Override::Item> Itm(BOver.GetItem(BinList[I]));
+	 if (Itm.get() == 0)
 	    continue;
-	 if (OverItem == 0)
+	 if (OverItem.get() == 0)
 	    OverItem = Itm;
 
 	 unsigned char NewPrioV = debListParser::GetPrio(Itm->Priority);
@@ -586,8 +594,7 @@ bool SourcesWriter::DoPackage(string FileName)
    }
    
    // If we need to do any rewriting of the header do it now..
-   Override::Item Tmp;   
-   if (OverItem == 0)
+   if (OverItem.get() == 0)
    {
       if (NoOverride == false)
       {
@@ -595,15 +602,19 @@ bool SourcesWriter::DoPackage(string FileName)
 	 ioprintf(c1out, _("  %s has no override entry\n"), Tags.FindS("Source").c_str());
       }
       
-      OverItem = &Tmp;
+      OverItem = auto_ptr<Override::Item>(new Override::Item);
    }
    
-   Override::Item *SOverItem = SOver.GetItem(Tags.FindS("Source"));
-   if (SOverItem == 0)
+   auto_ptr<Override::Item> SOverItem(SOver.GetItem(Tags.FindS("Source")));
+   const auto_ptr<Override::Item> autoSOverItem(SOverItem);
+   if (SOverItem.get() == 0)
    {
-      SOverItem = BOver.GetItem(Tags.FindS("Source"));
-      if (SOverItem == 0)
-	 SOverItem = OverItem;
+      SOverItem = auto_ptr<Override::Item>(BOver.GetItem(Tags.FindS("Source")));
+      if (SOverItem.get() == 0)
+      {
+	 SOverItem = auto_ptr<Override::Item>(new Override::Item);
+	 *SOverItem = *OverItem;
+      }
    }
    
    // Add the dsc to the files hash list

+ 5 - 2
ftparchive/writer.h

@@ -92,13 +92,15 @@ class PackagesWriter : public FTWScanner
    string DirStrip;
    FILE *Output;
    struct CacheDB::Stats &Stats;
-   
+   string Arch;
+
    inline bool ReadOverride(string File) {return Over.ReadOverride(File);};
    inline bool ReadExtraOverride(string File) 
       {return Over.ReadExtraOverride(File);};
    virtual bool DoPackage(string FileName);
 
-   PackagesWriter(string DB,string Overrides,string ExtOverrides=string());
+   PackagesWriter(string DB,string Overrides,string ExtOverrides=string(),
+		  string Arch=string());
    virtual ~PackagesWriter() {};
 };
 
@@ -170,6 +172,7 @@ protected:
       string SHA1;
       // Limited by FileFd::Size()
       unsigned long size;
+      ~CheckSum() {};
    };
    map<string,struct CheckSum> CheckSums;
 };

+ 3 - 1
methods/connect.cc

@@ -88,9 +88,11 @@ static bool DoConnect(struct addrinfo *Addr,string Host,
    
    /* This implements a timeout for connect by opening the connection
       nonblocking */
-   if (WaitFd(Fd,true,TimeOut) == false)
+   if (WaitFd(Fd,true,TimeOut) == false) {
+      Owner->SetFailExtraMsg("\nFailReason: Timeout");
       return _error->Error(_("Could not connect to %s:%s (%s), "
 			   "connection timed out"),Host.c_str(),Service,Name);
+   }
 
    // Check the socket for an error condition
    unsigned int Err;