Bug#869557: apt: please make the output of apt-ftparchive reproducible
tags 869557 + patch
thanks
Hi,
> apt: please make the output of apt-ftparchive reproducible
*Extremely* WIP patch attached:
commit 489251d0bcf32883e9028aa0278168c167f2f6e9
Author: Chris Lamb <lamby@debian.org>
Date: Mon Jul 24 15:04:03 2017 +0100
Make the output of ftp-archive reproducible by sorting non-deterministic file orders prior to output. (Closes: #869557)
ftparchive/writer.cc | 19 ++++++++++++++++++-
ftparchive/writer.h | 3 +++
2 files changed, 21 insertions(+), 1 deletion(-)
Regards,
--
,''`.
: :' : Chris Lamb, Debian Project Leader
`. `'` lamby@debian.org / chris-lamb.co.uk
`-
>From 489251d0bcf32883e9028aa0278168c167f2f6e9 Mon Sep 17 00:00:00 2001
From: Chris Lamb <lamby@debian.org>
Date: Mon, 24 Jul 2017 15:04:03 +0100
Subject: [PATCH] Make the output of ftp-archive reproducible by sorting
non-deterministic file orders prior to output. (Closes: #869557)
---
ftparchive/writer.cc | 19 ++++++++++++++++++-
ftparchive/writer.h | 3 +++
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc
index 5773f3aec..9c081c567 100644
--- a/ftparchive/writer.cc
+++ b/ftparchive/writer.cc
@@ -124,7 +124,6 @@ int FTWScanner::ScannerFTW(const char *File,const struct stat * /*sb*/,int Flag)
int FTWScanner::ScannerFile(const char *File, bool const &ReadLink)
{
const char *LastComponent = strrchr(File, '/');
- char *RealPath = NULL;
if (LastComponent == NULL)
LastComponent = File;
@@ -140,10 +139,18 @@ int FTWScanner::ScannerFile(const char *File, bool const &ReadLink)
if (I == Owner->Patterns.end())
return 0;
+ Owner->FilesToProcess.push_back(std::pair<string, bool>(File, ReadLink));
+
+ return 0;
+}
+
+int FTWScanner::ProcessFile(const char *File, bool const &ReadLink)
+{
/* Process it. If the file is a link then resolve it into an absolute
name.. This works best if the directory components the scanner are
given are not links themselves. */
char Jnk[2];
+ char *RealPath = NULL;
Owner->OriginalPath = File;
if (ReadLink &&
readlink(File,Jnk,sizeof(Jnk)) != -1 &&
@@ -209,6 +216,16 @@ bool FTWScanner::RecursiveScan(string const &Dir)
_error->Errno("ftw",_("Tree walking failed"));
return false;
}
+
+ sort(Owner->FilesToProcess.begin(), Owner->FilesToProcess.end(), [](const pair<string, bool>& a, const pair<string, bool>& b) {
+ return a.first.compare(b.first);
+ });
+
+ for (const pair<string, bool> &it : Owner->FilesToProcess)
+ {
+ if (Owner->ProcessFile(it.first.c_str(), it.second) != 0)
+ return false;
+ }
return true;
}
diff --git a/ftparchive/writer.h b/ftparchive/writer.h
index ea4c66da4..4cb775515 100644
--- a/ftparchive/writer.h
+++ b/ftparchive/writer.h
@@ -23,6 +23,7 @@
#include <set>
#include <stdlib.h>
#include <sys/types.h>
+#include <utility>
#include "contents.h"
#include "cachedb.h"
@@ -39,6 +40,7 @@ class FTWScanner
{
protected:
vector<string> Patterns;
+ vector<std::pair<string,bool> > FilesToProcess;
string Arch;
bool IncludeArchAll;
const char *OriginalPath;
@@ -50,6 +52,7 @@ class FTWScanner
static FTWScanner *Owner;
static int ScannerFTW(const char *File,const struct stat *sb,int Flag);
static int ScannerFile(const char *File, bool const &ReadLink);
+ static int ProcessFile(const char *File, bool const &ReadLink);
bool Delink(string &FileName,const char *OriginalPath,
unsigned long long &Bytes,unsigned long long const &FileSize);
--
2.13.3
Reply to: