Ensure permissions are written.

This commit is contained in:
Your Name 2025-05-17 11:54:07 +12:00
parent 1f58feb64e
commit e641e02478

View File

@ -87,15 +87,27 @@ static void base64_decode(const char* encoded_data, size_t encoded_len, unsigned
// Utility function to recreate a file with proper permissions // Utility function to recreate a file with proper permissions
static bool _recreate_file_(const std::filesystem::path& outpath, uint64_t file_hash, std::filesystem::perms file_perms, const unsigned char* filedata, size_t filedata_len) { static bool _recreate_file_(const std::filesystem::path& outpath, uint64_t file_hash, std::filesystem::perms file_perms, const unsigned char* filedata, size_t filedata_len) {
namespace fs = std::filesystem; namespace fs = std::filesystem;
uint64_t existing_hash = 0; bool needs_write = false;
// Check if file exists and has correct hash
if (fs::exists(outpath)) { if (fs::exists(outpath)) {
// Check content hash
std::ifstream in(outpath, std::ios::binary); std::ifstream in(outpath, std::ios::binary);
std::ostringstream oss; std::ostringstream oss;
oss << in.rdbuf(); oss << in.rdbuf();
std::string data = oss.str(); std::string data = oss.str();
existing_hash = fnv1a_64(data.data(), data.size()); uint64_t existing_hash = fnv1a_64(data.data(), data.size());
needs_write = existing_hash != file_hash;
} else {
needs_write = true; // File doesn't exist, need to create it
} }
bool needs_write = !fs::exists(outpath) || existing_hash != file_hash;
bool needs_permission_update = true;
if (!needs_write) { // we always update permissions if the file is written or changed. Othewise we check.
fs::perms current_perms = fs::status(outpath).permissions();
needs_permission_update = current_perms != file_perms;
}
if (needs_write) { if (needs_write) {
fs::create_directories(outpath.parent_path()); fs::create_directories(outpath.parent_path());
std::ofstream out(outpath, std::ios::binary); std::ofstream out(outpath, std::ios::binary);
@ -103,14 +115,23 @@ static bool _recreate_file_(const std::filesystem::path& outpath, uint64_t file_
out.close(); out.close();
// Set the file permissions // Set the file permissions
fs::permissions(outpath, file_perms); fs::permissions(outpath, file_perms);
}
if (!fs::exists(outpath)) { if (!fs::exists(outpath)) {
std::cout << "[dehydrate] " << outpath.filename() << ": created\n"; std::cout << "[dehydrate] " << outpath.filename() << ": created\n";
} else if (needs_write) { } else {
std::cout << "[dehydrate] " << outpath.filename() << ": updated (hash changed)\n"; std::cout << "[dehydrate] " << outpath.filename() << ": updated (hash changed)\n";
} }
return needs_write; return true;
}
if (needs_permission_update) {
// Update only permissions
fs::permissions(outpath, file_perms);
std::cout << "[dehydrate] " << outpath.filename() << ": updated (permissions changed)\n";
return true;
}
return false;
} }
)cpp"; )cpp";
} }