61 lines
1.8 KiB
C++
61 lines
1.8 KiB
C++
// -*- 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;
|
|
}
|