summaryrefslogtreecommitdiff
path: root/ftparchive
diff options
context:
space:
mode:
Diffstat (limited to 'ftparchive')
-rw-r--r--ftparchive/apt-ftparchive.cc20
-rw-r--r--ftparchive/override.cc78
-rw-r--r--ftparchive/override.h9
-rw-r--r--ftparchive/writer.cc104
-rw-r--r--ftparchive/writer.h12
5 files changed, 165 insertions, 58 deletions
diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc
index 9b68ff2b7..3fefafb2c 100644
--- a/ftparchive/apt-ftparchive.cc
+++ b/ftparchive/apt-ftparchive.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: apt-ftparchive.cc,v 1.3 2001/05/29 04:39:31 jgg Exp $
+// $Id: apt-ftparchive.cc,v 1.4 2001/06/26 02:50:27 jgg Exp $
/* ######################################################################
apt-scanpackages - Efficient work-alike for dpkg-scanpackages
@@ -55,10 +55,12 @@ struct PackageMap
string PkgFile;
string BinCacheDB;
string BinOverride;
+ string ExtraOverride;
// Stuff for the Source File
string SrcFile;
string SrcOverride;
+ string SrcExtraOverride;
// Contents
string Contents;
@@ -155,7 +157,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,BinOverride),
+ flCombine(OverrideDir,ExtraOverride));
if (PkgExt.empty() == false && Packages.SetExts(PkgExt) == false)
return _error->Error("Package extension list is too long");
if (_error->PendingError() == true)
@@ -167,7 +170,7 @@ bool PackageMap::GenPackages(Configuration &Setup,struct CacheDB::Stats &Stats)
Packages.Stats.DeLinkBytes = Stats.DeLinkBytes;
Packages.DeLinkLimit = DeLinkLimit;
-
+
// Create a compressor object
MultiCompress Comp(flCombine(ArchiveDir,PkgFile),
PkgCompress,Permissions);
@@ -221,7 +224,7 @@ bool PackageMap::GenPackages(Configuration &Setup,struct CacheDB::Stats &Stats)
return !_error->PendingError();
}
/*}}}*/
-// PackageMap::GenSources - Actually generate a Package file /*{{{*/
+// PackageMap::GenSources - Actually generate a Source file /*{{{*/
// ---------------------------------------------------------------------
/* This generates the Sources File described by this object. */
bool PackageMap::GenSources(Configuration &Setup,struct CacheDB::Stats &Stats)
@@ -240,7 +243,8 @@ bool PackageMap::GenSources(Configuration &Setup,struct CacheDB::Stats &Stats)
// Create a package writer object.
SourcesWriter Sources(flCombine(OverrideDir,BinOverride),
- flCombine(OverrideDir,SrcOverride));
+ flCombine(OverrideDir,SrcOverride),
+ flCombine(OverrideDir,SrcExtraOverride));
if (SrcExt.empty() == false && Sources.SetExts(SrcExt) == false)
return _error->Error("Source extension list is too long");
if (_error->PendingError() == true)
@@ -476,6 +480,7 @@ void LoadTree(vector<PackageMap> &PkgList,Configuration &Setup)
Itm.SrcFile = SubstVar(Block.Find("Sources",DSources.c_str()),Vars);
Itm.Tag = SubstVar("$(DIST)/$(SECTION)/source",Vars);
Itm.FLFile = SubstVar(Block.Find("SourceFileList",DSFLFile.c_str()),Vars);
+ Itm.SrcExtraOverride = SubstVar(Block.Find("SrcExtraOverride"),Vars);
}
else
{
@@ -486,6 +491,7 @@ void LoadTree(vector<PackageMap> &PkgList,Configuration &Setup)
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);
+ Itm.ExtraOverride = SubstVar(Block.Find("ExtraOverride"),Vars);
}
Itm.GetGeneral(Setup,Block);
@@ -513,6 +519,8 @@ void LoadBinDir(vector<PackageMap> &PkgList,Configuration &Setup)
Itm.SrcFile = Block.Find("Sources");
Itm.BinCacheDB = Block.Find("BinCacheDB");
Itm.BinOverride = Block.Find("BinOverride");
+ Itm.ExtraOverride = Block.Find("ExtraOverride");
+ Itm.SrcExtraOverride = Block.Find("SrcExtraOverride");
Itm.SrcOverride = Block.Find("SrcOverride");
Itm.BaseDir = Top->Tag;
Itm.FLFile = Block.Find("FileList");
@@ -594,7 +602,7 @@ bool SimpleGenPackages(CommandLine &CmdL)
// Create a package writer object.
PackagesWriter Packages(_config->Find("APT::FTPArchive::DB"),
- Override);
+ Override, "");
if (_error->PendingError() == true)
return false;
diff --git a/ftparchive/override.cc b/ftparchive/override.cc
index 93cc34e85..40047c5b0 100644
--- a/ftparchive/override.cc
+++ b/ftparchive/override.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: override.cc,v 1.2 2001/02/20 07:03:18 jgg Exp $
+// $Id: override.cc,v 1.3 2001/06/26 02:50:27 jgg Exp $
/* ######################################################################
Override
@@ -93,7 +93,7 @@ bool Override::ReadOverride(string File,bool Source)
continue;
}
*End = 0;
- Itm.Section = Start;
+ Itm.FieldOverride["Section"] = Start;
// Source override files only have the two columns
if (Source == true)
@@ -132,6 +132,80 @@ bool Override::ReadOverride(string File,bool Source)
return true;
}
/*}}}*/
+// Override::ReadExtraOverride - Read the extra override file /*{{{*/
+// ---------------------------------------------------------------------
+/* This parses the extra override file and reads it into the map */
+bool Override::ReadExtraOverride(string File,bool Source)
+{
+ if (File.empty() == true)
+ return true;
+
+ FILE *F = fopen(File.c_str(),"r");
+ if (F == 0)
+ return _error->Errno("fopen","Unable to open %s",File.c_str());
+
+ char Line[500];
+ unsigned long Counter = 0;
+ while (fgets(Line,sizeof(Line),F) != 0)
+ {
+ Counter++;
+
+ // Silence
+ for (char *I = Line; *I != 0; I++)
+ if (*I == '#')
+ *I = 0;
+
+ // Strip space leading up to the package name, skip blank lines
+ char *Pkg = Line;
+ for (; isspace(*Pkg) && *Pkg != 0;Pkg++);
+ if (Pkg == 0)
+ continue;
+
+ // Find the package and zero..
+ char *End = Pkg;
+ for (; isspace(*End) == 0 && *End != 0; End++);
+ if (*End == 0)
+ {
+ _error->Warning("Malformed override %s line %lu #1",File.c_str(),
+ Counter);
+ continue;
+ }
+ *End = 0;
+
+ // Find the field
+ for (End++; isspace(*End) != 0 && *End != 0; End++);
+ char *Field = End;
+ for (; isspace(*End) == 0 && *End != 0; End++);
+ if (*End == 0)
+ {
+ _error->Warning("Malformed override %s line %lu #2",File.c_str(),
+ Counter);
+ continue;
+ }
+ *End = 0;
+
+ // Find the field value
+ for (End++; isspace(*End) != 0 && *End != 0; End++);
+ char *Value = End;
+ for (; *End != 0; End++);
+ for (; isspace(*(End-1)) && End > Value; End--);
+ if (End == Value)
+ {
+ _error->Warning("Malformed override %s line %lu #3",File.c_str(),
+ Counter);
+ continue;
+ }
+ *End = 0;
+
+ Mapping[Pkg].FieldOverride[Field] = Value;
+ }
+
+ if (ferror(F))
+ _error->Errno("fgets","Failed to read the override file %s",File.c_str());
+ fclose(F);
+ return true;
+}
+ /*}}}*/
// Override::Item::SwapMaint - Swap the maintainer field if necessary /*{{{*/
// ---------------------------------------------------------------------
/* Returns the new maintainer string after evaluating the rewriting rule. If
diff --git a/ftparchive/override.h b/ftparchive/override.h
index 5917b9c92..2d6a4e27c 100644
--- a/ftparchive/override.h
+++ b/ftparchive/override.h
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: override.h,v 1.3 2001/05/29 03:49:53 jgg Exp $
+// $Id: override.h,v 1.4 2001/06/26 02:50:27 jgg Exp $
/* ######################################################################
Override
@@ -29,10 +29,10 @@ class Override
struct Item
{
string Priority;
- string Section;
string OldMaint;
string NewMaint;
-
+
+ map<string,string> FieldOverride;
string SwapMaint(string Orig,bool &Failed);
};
@@ -47,7 +47,8 @@ class Override
};
bool ReadOverride(string File,bool Source = false);
+ bool ReadExtraOverride(string File,bool Source = false);
};
-
+
#endif
diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc
index accdaeb61..a4877d635 100644
--- a/ftparchive/writer.cc
+++ b/ftparchive/writer.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: writer.cc,v 1.3 2001/05/29 04:08:09 jgg Exp $
+// $Id: writer.cc,v 1.4 2001/06/26 02:50:27 jgg Exp $
/* ######################################################################
Writer
@@ -36,6 +36,20 @@
using namespace std;
FTWScanner *FTWScanner::Owner;
+// SetTFRewriteData - Helper for setting rewrite lists /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+inline void SetTFRewriteData(struct TFRewriteData &tfrd,
+ const char *tag,
+ const char *rewrite,
+ const char *newtag = 0)
+{
+ tfrd.Tag = tag;
+ tfrd.Rewrite = rewrite;
+ tfrd.NewTag = newtag;
+}
+ /*}}}*/
+
// FTWScanner::FTWScanner - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -276,7 +290,7 @@ bool FTWScanner::SetExts(string Vals)
// PackagesWriter::PackagesWriter - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-PackagesWriter::PackagesWriter(string DB,string Overrides) :
+PackagesWriter::PackagesWriter(string DB,string Overrides,string ExtOverrides) :
Db(DB),Stats(Db.Stats)
{
Output = stdout;
@@ -291,12 +305,16 @@ PackagesWriter::PackagesWriter(string DB,string Overrides) :
if (Db.Loaded() == false)
DoContents = false;
-
+
// Read the override file
if (Overrides.empty() == false && Over.ReadOverride(Overrides) == false)
return;
else
NoOverride = true;
+
+ if (ExtOverrides.empty() == false)
+ Over.ReadExtraOverride(ExtOverrides);
+
_error->DumpErrors();
}
/*}}}*/
@@ -347,7 +365,7 @@ bool PackagesWriter::DoPackage(string FileName)
}
OverItem = &Tmp;
- Tmp.Section = Tags.FindS("Section");
+ Tmp.FieldOverride["Section"] = Tags.FindS("Section");
Tmp.Priority = Tags.FindS("Priority");
}
@@ -367,19 +385,17 @@ bool PackagesWriter::DoPackage(string FileName)
NewFileName = flCombine(PathPrefix,NewFileName);
// This lists all the changes to the fields we are going to make.
- TFRewriteData Changes[] = {{"Size",Size},
- {"MD5sum",MD5Res.c_str()},
- {"Filename",NewFileName.c_str()},
- {"Section",OverItem->Section.c_str()},
- {"Priority",OverItem->Priority.c_str()},
- {"Status",0},
- {"Optional",0},
- {}, // For maintainer
- {}, // For Suggests
- {}};
+ // (7 hardcoded + maintainer + suggests + end marker)
+ TFRewriteData Changes[6+2+OverItem->FieldOverride.size()+1];
+
unsigned int End = 0;
- for (End = 0; Changes[End].Tag != 0; End++);
-
+ SetTFRewriteData(Changes[End++], "Size", Size);
+ SetTFRewriteData(Changes[End++], "MD5sum", MD5Res.c_str());
+ SetTFRewriteData(Changes[End++], "Filename", NewFileName.c_str());
+ SetTFRewriteData(Changes[End++], "Priority", OverItem->Priority.c_str());
+ SetTFRewriteData(Changes[End++], "Status", 0);
+ SetTFRewriteData(Changes[End++], "Optional", 0);
+
// Rewrite the maintainer field if necessary
bool MaintFailed;
string NewMaint = OverItem->SwapMaint(Tags.FindS("Maintainer"),MaintFailed);
@@ -395,10 +411,7 @@ bool PackagesWriter::DoPackage(string FileName)
}
if (NewMaint.empty() == false)
- {
- Changes[End].Rewrite = NewMaint.c_str();
- Changes[End++].Tag = "Maintainer";
- }
+ SetTFRewriteData(Changes[End++], "Maintainer", NewMaint.c_str());
/* Get rid of the Optional tag. This is an ugly, ugly, ugly hack that
dpkg-scanpackages does.. Well sort of. dpkg-scanpackages just does renaming
@@ -410,10 +423,15 @@ bool PackagesWriter::DoPackage(string FileName)
{
if (Tags.FindS("Suggests").empty() == false)
OptionalStr = Tags.FindS("Suggests") + ", " + OptionalStr;
- Changes[End].Rewrite = OptionalStr.c_str();
- Changes[End++].Tag = "Suggests";
+ SetTFRewriteData(Changes[End++], "Suggests", OptionalStr.c_str());
}
-
+
+ for (map<string,string>::iterator I = OverItem->FieldOverride.begin();
+ I != OverItem->FieldOverride.end(); I++)
+ SetTFRewriteData(Changes[End++],I->first.c_str(),I->second.c_str());
+
+ SetTFRewriteData(Changes[End++], 0, 0);
+
// Rewrite and store the fields.
if (TFRewrite(Output,Tags,TFRewritePackageOrder,Changes) == false)
return false;
@@ -426,7 +444,8 @@ bool PackagesWriter::DoPackage(string FileName)
// SourcesWriter::SourcesWriter - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-SourcesWriter::SourcesWriter(string BOverrides,string SOverrides)
+SourcesWriter::SourcesWriter(string BOverrides,string SOverrides,
+ string ExtOverrides)
{
Output = stdout;
Ext[0] = ".dsc";
@@ -443,11 +462,12 @@ SourcesWriter::SourcesWriter(string BOverrides,string SOverrides)
return;
else
NoOverride = true;
+
+ if (ExtOverrides.empty() == false)
+ SOver.ReadExtraOverride(ExtOverrides);
- if (SOverrides.empty() == false && FileExists(SOverrides) == true &&
- SOver.ReadOverride(SOverrides,true) == false)
- return;
-// _error->DumpErrors();
+ if (SOverrides.empty() == false && FileExists(SOverrides) == true)
+ SOver.ReadOverride(SOverrides,true);
}
/*}}}*/
// SourcesWriter::DoPackage - Process a single package /*{{{*/
@@ -615,16 +635,15 @@ bool SourcesWriter::DoPackage(string FileName)
Directory.erase(Directory.end()-1);
// This lists all the changes to the fields we are going to make.
- TFRewriteData Changes[] = {{"Source",Package.c_str(),"Package"},
- {"Files",Files},
- {"Directory",Directory.c_str()},
- {"Section",SOverItem->Section.c_str()},
- {"Priority",BestPrio.c_str()},
- {"Status",0},
- {}, // For maintainer
- {}};
+ // (5 hardcoded + maintainer + end marker)
+ TFRewriteData Changes[5+1+SOverItem->FieldOverride.size()+1];
+
unsigned int End = 0;
- for (End = 0; Changes[End].Tag != 0; End++);
+ SetTFRewriteData(Changes[End++],"Source",Package.c_str(),"Package");
+ SetTFRewriteData(Changes[End++],"Files",Files);
+ SetTFRewriteData(Changes[End++],"Directory",Directory.c_str());
+ SetTFRewriteData(Changes[End++],"Priority",BestPrio.c_str());
+ SetTFRewriteData(Changes[End++],"Status",0);
// Rewrite the maintainer field if necessary
bool MaintFailed;
@@ -640,10 +659,13 @@ bool SourcesWriter::DoPackage(string FileName)
}
}
if (NewMaint.empty() == false)
- {
- Changes[End].Rewrite = NewMaint.c_str();
- Changes[End++].Tag = "Maintainer";
- }
+ SetTFRewriteData(Changes[End++], "Maintainer", NewMaint.c_str());
+
+ for (map<string,string>::iterator I = SOverItem->FieldOverride.begin();
+ I != SOverItem->FieldOverride.end(); I++)
+ SetTFRewriteData(Changes[End++],I->first.c_str(),I->second.c_str());
+
+ SetTFRewriteData(Changes[End++], 0, 0);
// Rewrite and store the fields.
if (TFRewrite(Output,Tags,TFRewriteSourceOrder,Changes) == false)
diff --git a/ftparchive/writer.h b/ftparchive/writer.h
index cc6375875..854d3424b 100644
--- a/ftparchive/writer.h
+++ b/ftparchive/writer.h
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: writer.h,v 1.3 2001/05/29 04:08:09 jgg Exp $
+// $Id: writer.h,v 1.4 2001/06/26 02:50:27 jgg Exp $
/* ######################################################################
Writer
@@ -20,6 +20,7 @@
#include <string>
#include <stdio.h>
#include <iostream>
+#include <vector>
#include "cachedb.h"
#include "override.h"
@@ -90,9 +91,11 @@ class PackagesWriter : public FTWScanner
struct CacheDB::Stats &Stats;
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);
+ PackagesWriter(string DB,string Overrides,string ExtOverrides=string());
virtual ~PackagesWriter() {};
};
@@ -138,11 +141,10 @@ class SourcesWriter : public FTWScanner
FILE *Output;
struct CacheDB::Stats Stats;
-/* inline bool ReadBinOverride(string File) {return BOver.ReadOverride(File);};
- bool ReadSrcOverride(string File); // {return BOver.ReadOverride(File);};*/
virtual bool DoPackage(string FileName);
- SourcesWriter(string BOverrides,string SOverrides);
+ SourcesWriter(string BOverrides,string SOverrides,
+ string ExtOverrides=string());
virtual ~SourcesWriter() {free(Buffer);};
};