Ensure permissions are written.
This commit is contained in:
parent
1f58feb64e
commit
e641e02478
@ -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)) {
|
||||||
|
std::cout << "[dehydrate] " << outpath.filename() << ": created\n";
|
||||||
|
} else {
|
||||||
|
std::cout << "[dehydrate] " << outpath.filename() << ": updated (hash changed)\n";
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fs::exists(outpath)) {
|
if (needs_permission_update) {
|
||||||
std::cout << "[dehydrate] " << outpath.filename() << ": created\n";
|
// Update only permissions
|
||||||
} else if (needs_write) {
|
fs::permissions(outpath, file_perms);
|
||||||
std::cout << "[dehydrate] " << outpath.filename() << ": updated (hash changed)\n";
|
std::cout << "[dehydrate] " << outpath.filename() << ": updated (permissions changed)\n";
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return needs_write;
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
)cpp";
|
)cpp";
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user