summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2013-04-04 18:31:54 +0200
committerMichael Vogt <michael.vogt@ubuntu.com>2013-04-04 18:31:54 +0200
commitcf0528428a3d39a54da1591437b6c0a867c44c51 (patch)
tree080c1eba76a2e3254448c5dca5b6a8dc54f6057c
parentca18208fbda302b767c10bb567f90d7c6127db44 (diff)
merged lp:~mvo/apt/add-missing-dsc-hashes/
-rw-r--r--debian/changelog11
-rw-r--r--ftparchive/apt-ftparchive.cc5
-rw-r--r--ftparchive/writer.cc51
-rw-r--r--ftparchive/writer.h4
-rwxr-xr-xtest/integration/test-bug-1078697-missing-source-hashes35
5 files changed, 93 insertions, 13 deletions
diff --git a/debian/changelog b/debian/changelog
index 51a7662db..f8a7af04d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+apt (0.9.7.7ubuntu4) UNRELEASED; urgency=low
+
+ [ Michael Vogt ]
+ * test/integration/test-bug-1078697-missing-source-hashes:
+ - add test for deb-src hash generation
+
+ [ Marc Deslauriers ]
+ * make apt-ftparchive generate missing deb-src hashes (LP: #1078697)
+
+ -- Christian Perrier <bubulle@debian.org> Mon, 24 Dec 2012 07:01:20 +0100
+
apt (0.9.7.7ubuntu3) raring; urgency=low
* SECURITY UPDATE: InRelease verification bypass
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);};
};
diff --git a/test/integration/test-bug-1078697-missing-source-hashes b/test/integration/test-bug-1078697-missing-source-hashes
new file mode 100755
index 000000000..6fcb856b5
--- /dev/null
+++ b/test/integration/test-bug-1078697-missing-source-hashes
@@ -0,0 +1,35 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture "i386"
+
+msgtest 'Test apt-ftparchive source with missing hashes in .dsc'
+
+touch aptarchive/foo_1.0.tar.gz
+cat > aptarchive/foo_1.0.dsc << EOF
+Format: 3.0 (native)
+Source: foo
+Binary: foo
+Architecture: all
+Version: 1.0
+Package-List:
+ foo deb admin extra
+Files:
+ d41d8cd98f00b204e9800998ecf8427e 0 foo_1.0.tar.gz
+EOF
+
+# check for the SHA hashes
+aptftparchive sources aptarchive/ > aptarchive/Sources 2>/dev/null || msgfail
+test -n "$(grep Checksums-Sha512 aptarchive/Sources)" && msgpass || msgfail
+
+for hash in sha512sum sha256sum sha1sum; do
+ for f in foo_1.0.tar.gz foo_1.0.dsc; do
+ SUM=$($hash aptarchive/$f | cut -d' ' -f1)
+ msgtest "Test $hash hash matches for $f"
+ NEEDLE="$SUM $(stat -c%s aptarchive/$f) $f"
+ test -n "$SUM" && test -n "$(grep "$NEEDLE" aptarchive/Sources)" && msgpass || msgfail
+ done
+done