diff options
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 000000000..354d089c3 --- /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 <unistd.h> +#include <sys/stat.h> + +#include <apt-pkg/fileutl.h> +#include <apt-pkg/hashes.h> +#include "byhash.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; +} |