summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2013-04-08 08:45:06 +0200
committerMichael Vogt <michael.vogt@ubuntu.com>2013-04-08 08:45:06 +0200
commit37cc828e003f51d63ed991be5acac36765b8230a (patch)
treecc4482aeda5532dfcc8914806ad484d683feb364
parentb57220d815aedbc023847d0885e08c6ed50e629a (diff)
parent90ceb0b5113cc6b65416553fcebbf6d5fd8c6752 (diff)
merged lp:~mvo/apt/add-missing-dsc-hashes
-rw-r--r--debian/changelog6
-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, 87 insertions, 14 deletions
diff --git a/debian/changelog b/debian/changelog
index 87fe0bb04..a84dfe47e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,12 +1,16 @@
apt (0.9.7.9~exp3) UNRELEASED; urgency=low
+ [ Michael Vogt ]
* apt-pkg/sourcelist.cc:
- fix segfault when a hostname contains a [, thanks to
Tzafrir Cohen (closes: #704653)
* debian/control:
- replace manpages-it (closes: #704723)
- -- Michael Vogt <michael.vogt@ubuntu.com> Thu, 04 Apr 2013 18:21:06 +0200
+ [ Marc Deslauriers ]
+ * make apt-ftparchive generate missing deb-src hashes (LP: #1078697)
+
+ -- Michael Vogt <mvo@debian.org> Mon, 08 Apr 2013 08:43:21 +0200
apt (0.9.7.9~exp2) experimental; urgency=low
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 d26b160f9..3283128d8 100644
--- a/ftparchive/writer.cc
+++ b/ftparchive/writer.cc
@@ -564,8 +564,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");
@@ -577,7 +578,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)
@@ -727,19 +730,16 @@ bool SourcesWriter::DoPackage(string FileName)
if (DoSHA1 == true && Tags.Exists("Checksums-Sha1"))
ostreamSha1 << "\n " << string(DscHashes.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(DscHashes.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(DscHashes.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;
@@ -755,7 +755,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;
@@ -767,9 +767,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)
{
@@ -784,6 +811,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];
@@ -831,7 +862,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