Fix patch PCKs incorrectly marking imported resources for removal
This commit is contained in:
parent
6dc78c8aa1
commit
fddf30d028
1 changed files with 39 additions and 39 deletions
|
|
@ -50,6 +50,26 @@
|
|||
#include "scene/resources/image_texture.h"
|
||||
#include "scene/resources/packed_scene.h"
|
||||
|
||||
class EditorExportSaveProxy {
|
||||
HashSet<String> saved_paths;
|
||||
EditorExportPlatform::EditorExportSaveFunction save_func;
|
||||
bool tracking_saves = false;
|
||||
|
||||
public:
|
||||
bool has_saved(const String &p_path) const { return saved_paths.has(p_path); }
|
||||
|
||||
Error save_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total, const Vector<String> &p_enc_in_filters, const Vector<String> &p_enc_ex_filters, const Vector<uint8_t> &p_key, uint64_t p_seed) {
|
||||
if (tracking_saves) {
|
||||
saved_paths.insert(p_path.simplify_path().trim_prefix("res://"));
|
||||
}
|
||||
|
||||
return save_func(p_userdata, p_path, p_data, p_file, p_total, p_enc_in_filters, p_enc_ex_filters, p_key, p_seed);
|
||||
}
|
||||
|
||||
EditorExportSaveProxy(EditorExportPlatform::EditorExportSaveFunction p_save_func, bool p_track_saves) :
|
||||
save_func(p_save_func), tracking_saves(p_track_saves) {}
|
||||
};
|
||||
|
||||
static int _get_pad(int p_alignment, int p_n) {
|
||||
int rest = p_n % p_alignment;
|
||||
int pad = 0;
|
||||
|
|
@ -60,17 +80,6 @@ static int _get_pad(int p_alignment, int p_n) {
|
|||
return pad;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static bool _has_pack_path(const T &p_paths, const String &p_path) {
|
||||
for (const String &E : p_paths) {
|
||||
if (E.simplify_path().trim_prefix("res://") == p_path) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#define PCK_PADDING 16
|
||||
|
||||
bool EditorExportPlatform::fill_log_messages(RichTextLabel *p_log, Error p_err) {
|
||||
|
|
@ -1140,9 +1149,10 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
}
|
||||
}
|
||||
|
||||
EditorExportSaveProxy save_proxy(p_save_func, p_remove_func != nullptr);
|
||||
|
||||
Error err = OK;
|
||||
Vector<Ref<EditorExportPlugin>> export_plugins = EditorExport::get_singleton()->get_export_plugins();
|
||||
Vector<String> extra_paths;
|
||||
|
||||
struct SortByName {
|
||||
bool operator()(const Ref<EditorExportPlugin> &left, const Ref<EditorExportPlugin> &right) const {
|
||||
|
|
@ -1163,12 +1173,10 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
}
|
||||
}
|
||||
for (int j = 0; j < export_plugins[i]->extra_files.size(); j++) {
|
||||
err = p_save_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, 0, paths.size(), enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, 0, paths.size(), enc_in_filters, enc_ex_filters, key, seed);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
extra_paths.push_back(export_plugins[i]->extra_files[j].path);
|
||||
}
|
||||
|
||||
export_plugins.write[i]->_clear();
|
||||
|
|
@ -1281,7 +1289,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
}
|
||||
|
||||
for (int j = 0; j < export_plugins[i]->extra_files.size(); j++) {
|
||||
err = p_save_func(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, export_plugins[i]->extra_files[j].path, export_plugins[i]->extra_files[j].data, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
|
|
@ -1290,8 +1298,6 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
path_remaps.push_back(path);
|
||||
path_remaps.push_back(export_plugins[i]->extra_files[j].path);
|
||||
}
|
||||
|
||||
extra_paths.push_back(export_plugins[i]->extra_files[j].path);
|
||||
}
|
||||
|
||||
if (export_plugins[i]->skipped) {
|
||||
|
|
@ -1313,7 +1319,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
if (importer_type == "keep") {
|
||||
// Just keep file as-is.
|
||||
Vector<uint8_t> array = FileAccess::get_file_as_bytes(path);
|
||||
err = p_save_func(p_udata, path, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, path, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
|
||||
if (err != OK) {
|
||||
return err;
|
||||
|
|
@ -1356,13 +1362,13 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
sarr.resize(cs.size());
|
||||
memcpy(sarr.ptrw(), cs.ptr(), sarr.size());
|
||||
|
||||
err = p_save_func(p_udata, path + ".import", sarr, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, path + ".import", sarr, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
// Now actual remapped file:
|
||||
sarr = FileAccess::get_file_as_bytes(export_path);
|
||||
err = p_save_func(p_udata, export_path, sarr, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, export_path, sarr, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
|
|
@ -1392,14 +1398,14 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
if (remap == "path") {
|
||||
String remapped_path = config->get_value("remap", remap);
|
||||
Vector<uint8_t> array = FileAccess::get_file_as_bytes(remapped_path);
|
||||
err = p_save_func(p_udata, remapped_path, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, remapped_path, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
} else if (remap.begins_with("path.")) {
|
||||
String feature = remap.get_slice(".", 1);
|
||||
|
||||
if (remap_features.has(feature)) {
|
||||
String remapped_path = config->get_value("remap", remap);
|
||||
Vector<uint8_t> array = FileAccess::get_file_as_bytes(remapped_path);
|
||||
err = p_save_func(p_udata, remapped_path, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, remapped_path, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
} else {
|
||||
// Remove paths if feature not enabled.
|
||||
config->erase_section_key("remap", remap);
|
||||
|
|
@ -1425,7 +1431,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
sarr.resize(cs.size());
|
||||
memcpy(sarr.ptrw(), cs.ptr(), sarr.size());
|
||||
|
||||
err = p_save_func(p_udata, path + ".import", sarr, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, path + ".import", sarr, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
|
||||
if (err != OK) {
|
||||
return err;
|
||||
|
|
@ -1446,7 +1452,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
}
|
||||
|
||||
Vector<uint8_t> array = FileAccess::get_file_as_bytes(export_path);
|
||||
err = p_save_func(p_udata, export_path, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, export_path, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
|
|
@ -1510,7 +1516,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
new_file.write[j] = utf8[j];
|
||||
}
|
||||
|
||||
err = p_save_func(p_udata, from + ".remap", new_file, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, from + ".remap", new_file, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
|
|
@ -1532,7 +1538,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
} else {
|
||||
array = FileAccess::get_file_as_bytes(forced_export[i]);
|
||||
}
|
||||
err = p_save_func(p_udata, forced_export[i], array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, forced_export[i], array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
|
|
@ -1541,7 +1547,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
Dictionary int_export = get_internal_export_files(p_preset, p_debug);
|
||||
for (const Variant &int_name : int_export.keys()) {
|
||||
const PackedByteArray &array = int_export[int_name];
|
||||
err = p_save_func(p_udata, int_name, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, int_name, array, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
|
|
@ -1553,22 +1559,16 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
|
|||
Vector<uint8_t> data = FileAccess::get_file_as_bytes(engine_cfb);
|
||||
DirAccess::remove_file_or_error(engine_cfb);
|
||||
|
||||
err = p_save_func(p_udata, "res://" + config_file, data, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
err = save_proxy.save_file(p_udata, "res://" + config_file, data, idx, total, enc_in_filters, enc_ex_filters, key, seed);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (p_remove_func) {
|
||||
for (const String &E : PackedData::get_singleton()->get_file_paths()) {
|
||||
String simplified_path = E.simplify_path();
|
||||
if (simplified_path == config_file) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String pack_path = simplified_path.trim_suffix(".remap");
|
||||
|
||||
if (!_has_pack_path(paths, pack_path) && !_has_pack_path(extra_paths, pack_path) && !_has_pack_path(path_remaps, pack_path) && !_has_pack_path(forced_export, pack_path)) {
|
||||
err = p_remove_func(p_udata, E);
|
||||
HashSet<String> currently_loaded_paths = PackedData::get_singleton()->get_file_paths();
|
||||
for (const String &path : currently_loaded_paths) {
|
||||
if (!save_proxy.has_saved(path)) {
|
||||
err = p_remove_func(p_udata, path);
|
||||
if (err != OK) {
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue