diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-05 18:07:13 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-05 18:07:13 +0000 |
commit | 636c7dc17286d93d788c741d15fd756aeda066d5 (patch) | |
tree | e7ae158cc54f591041a061b9865bcae51854f15c /ftparchive/byhash.cc | |
parent | Initial commit. (diff) | |
download | apt-636c7dc17286d93d788c741d15fd756aeda066d5.tar.xz apt-636c7dc17286d93d788c741d15fd756aeda066d5.zip |
Adding upstream version 1.8.2.3.upstream/1.8.2.3upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ftparchive/byhash.cc')
-rw-r--r-- | ftparchive/byhash.cc | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/ftparchive/byhash.cc b/ftparchive/byhash.cc new file mode 100644 index 0000000..b24f615 --- /dev/null +++ b/ftparchive/byhash.cc @@ -0,0 +1,61 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +/* ###################################################################### + + ByHash + + ByHash helper functions + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#include <config.h> + +#include <algorithm> +#include <string> + +#include <sys/stat.h> +#include <unistd.h> + +#include "byhash.h" +#include <apt-pkg/fileutl.h> +#include <apt-pkg/hashes.h> + +// Delete all files in a directory except the most recent N ones +void DeleteAllButMostRecent(std::string dir, int KeepFiles) +{ + struct Cmp { + bool operator() (const std::string& lhs, const std::string& rhs) { + struct stat buf_l, buf_r; + stat(lhs.c_str(), &buf_l); + stat(rhs.c_str(), &buf_r); + if (buf_l.st_mtim.tv_sec == buf_r.st_mtim.tv_sec) + return buf_l.st_mtim.tv_nsec < buf_r.st_mtim.tv_nsec; + return buf_l.st_mtim.tv_sec < buf_r.st_mtim.tv_sec; + } + }; + + if (!DirectoryExists(dir)) + return; + + auto files = GetListOfFilesInDir(dir, false); + std::sort(files.begin(), files.end(), Cmp()); + + for (auto I=files.begin(); I<files.end()-KeepFiles; ++I) + RemoveFile("DeleteAllButMostRecent", *I); +} + +// Takes a input filename (e.g. binary-i386/Packages) and a hashstring +// of the Input data and transforms it into a suitable by-hash filename +std::string GenByHashFilename(std::string ByHashOutputFile, HashString const &h) +{ + std::string const ByHash = "/by-hash/" + h.HashType() + "/" + h.HashValue(); + size_t trailing_slash = ByHashOutputFile.find_last_of("/"); + if (trailing_slash == std::string::npos) + trailing_slash = 0; + ByHashOutputFile = ByHashOutputFile.replace( + trailing_slash, + ByHashOutputFile.substr(trailing_slash+1).size()+1, + ByHash); + return ByHashOutputFile; +} |