From cf0528428a3d39a54da1591437b6c0a867c44c51 Mon Sep 17 00:00:00 2001
From: Michael Vogt <michael.vogt@ubuntu.com>
Date: Thu, 4 Apr 2013 18:31:54 +0200
Subject: merged lp:~mvo/apt/add-missing-dsc-hashes/

---
 ftparchive/apt-ftparchive.cc |  5 +++--
 ftparchive/writer.cc         | 51 +++++++++++++++++++++++++++++++++++---------
 ftparchive/writer.h          |  4 +++-
 3 files changed, 47 insertions(+), 13 deletions(-)

(limited to 'ftparchive')

diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc
index 4b2c3ba12..2639bc2f6 100644
--- a/ftparchive/apt-ftparchive.cc
+++ b/ftparchive/apt-ftparchive.cc
@@ -254,7 +254,8 @@ bool PackageMap::GenSources(Configuration &Setup,struct CacheDB::Stats &Stats)
    SrcDone = true;
    
    // Create a package writer object.
-   SourcesWriter Sources(flCombine(OverrideDir,BinOverride),
+   SourcesWriter Sources(_config->Find("APT::FTPArchive::DB"),
+			 flCombine(OverrideDir,BinOverride),
 			 flCombine(OverrideDir,SrcOverride),
 			 flCombine(OverrideDir,SrcExtraOverride));
    if (SrcExt.empty() == false && Sources.SetExts(SrcExt) == false)
@@ -705,7 +706,7 @@ bool SimpleGenSources(CommandLine &CmdL)
 			     SOverride.c_str());
        
    // Create a package writer object.
-   SourcesWriter Sources(Override,SOverride);
+   SourcesWriter Sources(_config->Find("APT::FTPArchive::DB"),Override,SOverride);
    if (_error->PendingError() == true)
       return false;
    
diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc
index 3065526ad..f58d4bc1f 100644
--- a/ftparchive/writer.cc
+++ b/ftparchive/writer.cc
@@ -562,8 +562,9 @@ TranslationWriter::~TranslationWriter()
 // SourcesWriter::SourcesWriter - Constructor				/*{{{*/
 // ---------------------------------------------------------------------
 /* */
-SourcesWriter::SourcesWriter(string const &BOverrides,string const &SOverrides,
-			     string const &ExtOverrides)
+SourcesWriter::SourcesWriter(string const &DB, string const &BOverrides,string const &SOverrides,
+			     string const &ExtOverrides) :
+   Db(DB), Stats(Db.Stats)
 {
    Output = stdout;
    AddPattern("*.dsc");
@@ -575,7 +576,9 @@ SourcesWriter::SourcesWriter(string const &BOverrides,string const &SOverrides,
    DoMD5 = _config->FindB("APT::FTPArchive::Sources::MD5",DoMD5);
    DoSHA1 = _config->FindB("APT::FTPArchive::Sources::SHA1",DoSHA1);
    DoSHA256 = _config->FindB("APT::FTPArchive::Sources::SHA256",DoSHA256);
+   DoSHA512 = _config->FindB("APT::FTPArchive::Sources::SHA512",DoSHA512);
    NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false);
+   DoAlwaysStat = _config->FindB("APT::FTPArchive::AlwaysStat", false);
 
    // Read the override file
    if (BOverrides.empty() == false && BOver.ReadOverride(BOverrides) == false)
@@ -740,19 +743,16 @@ bool SourcesWriter::DoPackage(string FileName)
    if (DoSHA1 == true && Tags.Exists("Checksums-Sha1"))
       ostreamSha1 << "\n " << string(SHA1.Result()) << " " << St.st_size << " "
 		   << strippedName << "\n " << Tags.FindS("Checksums-Sha1");
-   string const ChecksumsSha1 = ostreamSha1.str();
 
    std::ostringstream ostreamSha256;
    if (DoSHA256 == true && Tags.Exists("Checksums-Sha256"))
       ostreamSha256 << "\n " << string(SHA256.Result()) << " " << St.st_size << " "
 		   << strippedName << "\n " << Tags.FindS("Checksums-Sha256");
-   string const ChecksumsSha256 = ostreamSha256.str();
 
    std::ostringstream ostreamSha512;
-   if (Tags.Exists("Checksums-Sha512"))
+   if (DoSHA512 == true && Tags.Exists("Checksums-Sha512"))
       ostreamSha512 << "\n " << string(SHA512.Result()) << " " << St.st_size << " "
 		   << strippedName << "\n " << Tags.FindS("Checksums-Sha512");
-   string const ChecksumsSha512 = ostreamSha512.str();
 
    // Strip the DirStrip prefix from the FileName and add the PathPrefix
    string NewFileName;
@@ -768,7 +768,7 @@ bool SourcesWriter::DoPackage(string FileName)
    string Directory = flNotFile(OriginalPath);
    string Package = Tags.FindS("Source");
 
-   // Perform the delinking operation over all of the files
+   // Perform operation over all of the files
    string ParseJnk;
    const char *C = Files.c_str();
    char *RealPath = NULL;
@@ -780,9 +780,36 @@ bool SourcesWriter::DoPackage(string FileName)
 	  ParseQuoteWord(C,ParseJnk) == false ||
 	  ParseQuoteWord(C,ParseJnk) == false)
 	 return _error->Error("Error parsing file record");
-      
-      char Jnk[2];
+
       string OriginalPath = Directory + ParseJnk;
+
+      // Add missing hashes to source files
+      if ((DoSHA1 == true && !Tags.Exists("Checksums-Sha1")) ||
+          (DoSHA256 == true && !Tags.Exists("Checksums-Sha256")) ||
+          (DoSHA512 == true && !Tags.Exists("Checksums-Sha512")))
+      {
+         if (Db.GetFileInfo(OriginalPath, false, false, false, DoMD5, DoSHA1, DoSHA256, DoSHA512, DoAlwaysStat)
+               == false)
+         {
+            return _error->Error("Error getting file info");
+         }
+
+         if (DoSHA1 == true && !Tags.Exists("Checksums-Sha1"))
+            ostreamSha1 << "\n " << string(Db.SHA1Res) << " "
+               << Db.GetFileSize() << " " << ParseJnk;
+
+         if (DoSHA256 == true && !Tags.Exists("Checksums-Sha256"))
+            ostreamSha256 << "\n " << string(Db.SHA256Res) << " "
+               << Db.GetFileSize() << " " << ParseJnk;
+
+         if (DoSHA512 == true && !Tags.Exists("Checksums-Sha512"))
+            ostreamSha512 << "\n " << string(Db.SHA512Res) << " "
+               << Db.GetFileSize() << " " << ParseJnk;
+      }
+
+      // Perform the delinking operation
+      char Jnk[2];
+
       if (readlink(OriginalPath.c_str(),Jnk,sizeof(Jnk)) != -1 &&
 	  (RealPath = realpath(OriginalPath.c_str(),NULL)) != 0)
       {
@@ -797,6 +824,10 @@ bool SourcesWriter::DoPackage(string FileName)
    if (Directory.length() > 2)
       Directory.erase(Directory.end()-1);
 
+   string const ChecksumsSha1 = ostreamSha1.str();
+   string const ChecksumsSha256 = ostreamSha256.str();
+   string const ChecksumsSha512 = ostreamSha512.str();
+
    // This lists all the changes to the fields we are going to make.
    // (5 hardcoded + checksums + maintainer + end marker)
    TFRewriteData Changes[5+2+1+SOverItem->FieldOverride.size()+1];
@@ -844,7 +875,7 @@ bool SourcesWriter::DoPackage(string FileName)
 
    Stats.Packages++;
    
-   return true;
+   return Db.Finish();
 }
 									/*}}}*/
 
diff --git a/ftparchive/writer.h b/ftparchive/writer.h
index 76a3dfd1e..4932b0cc8 100644
--- a/ftparchive/writer.h
+++ b/ftparchive/writer.h
@@ -157,6 +157,7 @@ class ContentsWriter : public FTWScanner
 
 class SourcesWriter : public FTWScanner
 {
+   CacheDB Db;
    Override BOver;
    Override SOver;
    char *Buffer;
@@ -165,6 +166,7 @@ class SourcesWriter : public FTWScanner
    public:
 
    bool NoOverride;
+   bool DoAlwaysStat;
    
    // General options
    string PathPrefix;
@@ -174,7 +176,7 @@ class SourcesWriter : public FTWScanner
 
    virtual bool DoPackage(string FileName);
 
-   SourcesWriter(string const &BOverrides,string const &SOverrides,
+   SourcesWriter(string const &DB,string const &BOverrides,string const &SOverrides,
 		 string const &ExtOverrides=string());
    virtual ~SourcesWriter() {free(Buffer);};
 };
-- 
cgit v1.2.3