#pragma once #include #include #include #include #include #include #include #include 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 createHashes(const std::vector &dirs, const std::string &extension) { std::map 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 getChangedFiles(const std::map &oldHashes) { std::vector 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; }