61 lines
1.6 KiB
C++
61 lines
1.6 KiB
C++
#pragma once
|
|
#include <chrono>
|
|
#include <cstdlib>
|
|
#include <filesystem>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
inline std::string fix_path(const std::string &path) {
|
|
if (path.find('\\') == path.npos) return path;
|
|
std::string ret = path;
|
|
std::replace(ret.begin(), ret.end(), '\\', '/');
|
|
return ret;
|
|
}
|
|
|
|
inline std::string stupid_hash(const std::string &file) {
|
|
std::ifstream iff(file);
|
|
if (!iff.is_open()) {
|
|
return std::to_string(rand());
|
|
}
|
|
unsigned long long check_sum = 0x0ULL;
|
|
char tmp;
|
|
while (iff.get(tmp)) {
|
|
check_sum += (unsigned long long)tmp;
|
|
}
|
|
iff.close();
|
|
std::stringstream ret;
|
|
ret << std::hex << check_sum;
|
|
return ret.str();
|
|
}
|
|
|
|
inline std::map<std::string, std::string> createHashes(
|
|
const std::vector<std::string> &dirs, const std::string &extension) {
|
|
std::map<std::string, std::string> hashes;
|
|
for (auto const &it : dirs) {
|
|
for (const auto &file : std::filesystem::directory_iterator(it)) {
|
|
if (file.is_regular_file()) {
|
|
std::string path = fix_path(file.path().string());
|
|
if (path.length() > extension.length() && path.ends_with(extension)) {
|
|
hashes[path] = stupid_hash(path);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return hashes;
|
|
}
|
|
|
|
inline std::vector<std::filesystem::path> getChangedFiles(
|
|
const std::map<std::string, std::string> &oldHashes) {
|
|
std::vector<std::filesystem::path> changedFiles;
|
|
for (const auto &file : oldHashes) {
|
|
std::string newHash = stupid_hash(file.first);
|
|
if (newHash != file.second) {
|
|
changedFiles.push_back(std::filesystem::path(file.first));
|
|
}
|
|
}
|
|
return changedFiles;
|
|
}
|