summaryrefslogtreecommitdiff
path: root/ftparchive
diff options
context:
space:
mode:
authorArch Librarian <arch@canonical.com>2004-09-20 17:04:30 +0000
committerArch Librarian <arch@canonical.com>2004-09-20 17:04:30 +0000
commit989539655e3bb8e6934b5f69ece67c173a26c4f2 (patch)
treee0aaabbd66519a4d3a1b3bb3e12c089a61c20705 /ftparchive
parenta7a58a763a2a07d32f02d597f15740c7cee070c3 (diff)
* Enable apt-ftparchive to generate Release files
Author: mdz Date: 2003-12-26 20:08:56 GMT * Enable apt-ftparchive to generate Release files
Diffstat (limited to 'ftparchive')
-rw-r--r--ftparchive/apt-ftparchive.cc19
-rw-r--r--ftparchive/writer.cc149
-rw-r--r--ftparchive/writer.h22
3 files changed, 154 insertions, 36 deletions
diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc
index 426ec5637..c811343b6 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.8 2003/07/18 15:28:58 mdz Exp $
+// $Id: apt-ftparchive.cc,v 1.9 2003/12/26 20:08:56 mdz Exp $
/* ######################################################################
apt-scanpackages - Efficient work-alike for dpkg-scanpackages
@@ -223,6 +223,7 @@ bool PackageMap::GenPackages(Configuration &Setup,struct CacheDB::Stats &Stats)
return !_error->PendingError();
}
+
/*}}}*/
// PackageMap::GenSources - Actually generate a Source file /*{{{*/
// ---------------------------------------------------------------------
@@ -672,6 +673,21 @@ bool SimpleGenSources(CommandLine &CmdL)
return true;
}
/*}}}*/
+// SimpleGenRelease - Generate a Release file for a directory tree /*{{{*/
+// ---------------------------------------------------------------------
+bool SimpleGenRelease(CommandLine &CmdL)
+{
+ ReleaseWriter Release("");
+ if (_error->PendingError() == true)
+ return false;
+
+ if (Release.RecursiveScan(CmdL.FileList[1]) == false)
+ return false;
+
+ return true;
+}
+
+ /*}}}*/
// Generate - Full generate, using a config file /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -887,6 +903,7 @@ int main(int argc, const char *argv[])
CommandLine::Dispatch Cmds[] = {{"packages",&SimpleGenPackages},
{"contents",&SimpleGenContents},
{"sources",&SimpleGenSources},
+ {"release",&SimpleGenRelease},
{"generate",&Generate},
{"clean",&Clean},
{"help",&ShowHelp},
diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc
index 94d88388a..68fd85091 100644
--- a/ftparchive/writer.cc
+++ b/ftparchive/writer.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: writer.cc,v 1.7 2003/02/10 07:34:41 doogie Exp $
+// $Id: writer.cc,v 1.8 2003/12/26 20:08:56 mdz Exp $
/* ######################################################################
Writer
@@ -26,7 +26,9 @@
#include <sys/types.h>
#include <unistd.h>
+#include <ctime>
#include <ftw.h>
+#include <fnmatch.h>
#include <iostream>
#include "cachedb.h"
@@ -58,8 +60,6 @@ FTWScanner::FTWScanner()
{
ErrorPrinted = false;
NoLinkAct = !_config->FindB("APT::FTPArchive::DeLinkAct",true);
- TmpExt = 0;
- Ext[0] = 0;
RealPath = 0;
long PMax = pathconf(".",_PC_PATH_MAX);
if (PMax > 0)
@@ -85,16 +85,19 @@ int FTWScanner::Scanner(const char *File,const struct stat *sb,int Flag)
if (Flag != FTW_F)
return 0;
- // See if it is a .deb
- if (strlen(File) < 4)
- return 0;
-
- unsigned CurExt = 0;
- for (; Owner->Ext[CurExt] != 0; CurExt++)
- if (strcmp(File+strlen(File)-strlen(Owner->Ext[CurExt]),
- Owner->Ext[CurExt]) == 0)
- break;
- if (Owner->Ext[CurExt] == 0)
+ const char *LastComponent = strrchr(File, '/');
+ if (LastComponent == NULL)
+ LastComponent = File;
+ else
+ LastComponent++;
+
+ vector<string>::iterator I;
+ for(I = Owner->Patterns.begin(); I != Owner->Patterns.end(); ++I)
+ {
+ if (fnmatch((*I).c_str(), LastComponent, 0) == 0)
+ break;
+ }
+ if (I == Owner->Patterns.end())
return 0;
/* Process it. If the file is a link then resolve it into an absolute
@@ -277,17 +280,6 @@ bool FTWScanner::Delink(string &FileName,const char *OriginalPath,
return true;
}
/*}}}*/
-// FTWScanner::SetExts - Set extensions to support /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool FTWScanner::SetExts(string Vals)
-{
- delete [] TmpExt;
- TmpExt = new char[Vals.length()+1];
- strcpy(TmpExt,Vals.c_str());
- return TokSplitString(' ',TmpExt,(char **)Ext,sizeof(Ext)/sizeof(Ext[0]));
-}
- /*}}}*/
// PackagesWriter::PackagesWriter - Constructor /*{{{*/
// ---------------------------------------------------------------------
@@ -296,8 +288,7 @@ PackagesWriter::PackagesWriter(string DB,string Overrides,string ExtOverrides) :
Db(DB),Stats(Db.Stats)
{
Output = stdout;
- Ext[0] = ".deb";
- Ext[1] = 0;
+ AddPattern("*.deb");
DeLinkLimit = 0;
// Process the command line options
@@ -319,6 +310,28 @@ PackagesWriter::PackagesWriter(string DB,string Overrides,string ExtOverrides) :
_error->DumpErrors();
}
+ /*}}}*/
+// FTWScanner::SetExts - Set extensions to support /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool FTWScanner::SetExts(string Vals)
+{
+ ClearPatterns();
+ string::size_type Start = 0;
+ for(string::size_type space = Vals.find(' ');
+ space != string::npos;
+ space = Vals.find(' ', space))
+ {
+ if (space > 0)
+ {
+ AddPattern(string("*") + string(Start, space-1));
+ Start = space + 1;
+ }
+ }
+
+ return true;
+}
+
/*}}}*/
// PackagesWriter::DoPackage - Process a single package /*{{{*/
// ---------------------------------------------------------------------
@@ -449,8 +462,7 @@ SourcesWriter::SourcesWriter(string BOverrides,string SOverrides,
string ExtOverrides)
{
Output = stdout;
- Ext[0] = ".dsc";
- Ext[1] = 0;
+ AddPattern("*.dsc");
DeLinkLimit = 0;
Buffer = 0;
BufSize = 0;
@@ -686,8 +698,7 @@ ContentsWriter::ContentsWriter(string DB) :
Db(DB), Stats(Db.Stats)
{
- Ext[0] = ".deb";
- Ext[1] = 0;
+ AddPattern("*.deb");
Output = stdout;
}
/*}}}*/
@@ -777,4 +788,82 @@ bool ContentsWriter::ReadFromPkgs(string PkgFile,string PkgCompress)
return true;
}
+
/*}}}*/
+
+// ReleaseWriter::ReleaseWriter - Constructor /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+ReleaseWriter::ReleaseWriter(string DB)
+{
+ AddPattern("Packages");
+ AddPattern("Packages.gz");
+ Output = stdout;
+ time_t now = time(NULL);
+ char datestr[128];
+ if (strftime(datestr, sizeof(datestr), "%a, %d %b %Y %H:%M:%S UTC",
+ gmtime(&now)) == 0)
+ {
+ datestr[0] = '\0';
+ }
+
+ map<string,string> Fields;
+ Fields["Origin"] = "";
+ Fields["Label"] = "";
+ Fields["Suite"] = "";
+ Fields["Version"] = "";
+ Fields["Codename"] = "";
+ Fields["Date"] = datestr;
+ Fields["Architectures"] = "";
+ Fields["Components"] = "";
+ Fields["Description"] = "";
+
+ for(map<string,string>::const_iterator I = Fields.begin();
+ I != Fields.end();
+ ++I)
+ {
+ string Config = string("APT::FTPArchive::Release::") + (*I).first;
+ string Value = _config->Find(Config, (*I).second.c_str());
+ if (Value == "")
+ continue;
+
+ fprintf(Output, "%s: %s\n", (*I).first.c_str(), Value.c_str());
+ }
+
+ fprintf(Output, "MD5Sum:\n");
+}
+ /*}}}*/
+// ReleaseWriter::DoPackage - Process a single package /*{{{*/
+// ---------------------------------------------------------------------
+bool ReleaseWriter::DoPackage(string FileName)
+{
+ // Strip the DirStrip prefix from the FileName and add the PathPrefix
+ string NewFileName;
+ if (DirStrip.empty() == false &&
+ FileName.length() > DirStrip.length() &&
+ stringcmp(FileName.begin(),FileName.begin() + DirStrip.length(),
+ DirStrip.begin(),DirStrip.end()) == 0)
+ NewFileName = string(FileName.begin() + DirStrip.length(),FileName.end());
+ else
+ NewFileName = FileName;
+ if (PathPrefix.empty() == false)
+ NewFileName = flCombine(PathPrefix,NewFileName);
+
+ FileFd fd(FileName, FileFd::ReadOnly);
+
+ if (!fd.IsOpen())
+ {
+ return false;
+ }
+
+ MD5Summation MD5;
+ MD5.AddFD(fd.Fd(), fd.Size());
+
+ string MD5Sum = MD5.Result();
+ fprintf(Output, " %s %16d %s\n",
+ MD5Sum.c_str(), fd.Size(), FileName.c_str());
+
+ fd.Close();
+
+ return true;
+}
diff --git a/ftparchive/writer.h b/ftparchive/writer.h
index 854d3424b..6f728dd1b 100644
--- a/ftparchive/writer.h
+++ b/ftparchive/writer.h
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: writer.h,v 1.4 2001/06/26 02:50:27 jgg Exp $
+// $Id: writer.h,v 1.5 2003/12/26 20:08:56 mdz Exp $
/* ######################################################################
Writer
@@ -29,13 +29,12 @@
using std::string;
using std::cout;
using std::endl;
+using std::vector;
class FTWScanner
{
protected:
-
- char *TmpExt;
- const char *Ext[10];
+ vector<string> Patterns;
const char *OriginalPath;
char *RealPath;
bool ErrorPrinted;
@@ -66,10 +65,12 @@ class FTWScanner
virtual bool DoPackage(string FileName) = 0;
bool RecursiveScan(string Dir);
bool LoadFileList(string BaseDir,string File);
+ bool ClearPatterns() { Patterns.clear(); };
+ bool AddPattern(string Pattern) { Patterns.push_back(Pattern); };
bool SetExts(string Vals);
FTWScanner();
- virtual ~FTWScanner() {delete [] RealPath; delete [] TmpExt;};
+ virtual ~FTWScanner() {delete [] RealPath;};
};
class PackagesWriter : public FTWScanner
@@ -148,5 +149,16 @@ class SourcesWriter : public FTWScanner
virtual ~SourcesWriter() {free(Buffer);};
};
+class ReleaseWriter : public FTWScanner
+{
+public:
+ ReleaseWriter(string DB);
+ virtual bool DoPackage(string FileName);
+protected:
+ // General options
+ string PathPrefix;
+ string DirStrip;
+ FILE *Output;
+};
#endif