From d5d4dc46386894b636c189da15978df11f8393c0 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 1 Apr 2025 11:17:23 +0800 Subject: [PATCH] FIX:Plugin first fails to install Mac jira: STUDIO-11242 Change-Id: I9c3484e18c3da75a5dee62523e32ac6ad6c9b207 --- src/libslic3r/Utils.hpp | 2 +- src/libslic3r/utils.cpp | 28 ++++++++++++++++++ src/slic3r/GUI/GUI_App.cpp | 59 ++++++++++++++++++++++++-------------- 3 files changed, 66 insertions(+), 23 deletions(-) diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index 39cd1bdcc..41a5557fc 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -229,7 +229,7 @@ CopyFileResult copy_file_inner(const std::string &from, const std::string &to, s // of the source file before renaming. // Additional error info is passed in error message. extern CopyFileResult copy_file(const std::string &from, const std::string &to, std::string& error_message, const bool with_check = false); - +extern bool copy_framework(const std::string &from, const std::string &to); // Compares two files if identical. extern CopyFileResult check_copy(const std::string& origin, const std::string& copy); diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index 27188923f..5bdc74de4 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -943,6 +943,34 @@ __finished: #endif } +bool copy_framework(const std::string &from, const std::string &to) +{ + boost::filesystem::path src(from), dst(to); + try { + if (!boost::filesystem::is_directory(src)) { + std::cerr << "Error: Source is not a directory: " << src << std::endl; + return false; + } + boost::filesystem::create_directories(dst); + for (boost::filesystem::directory_iterator it(src); it != boost::filesystem::directory_iterator(); ++it) { + const auto &entry = it->path(); + const auto dest_path = dst / entry.filename(); + + if (boost::filesystem::is_symlink(entry)) { + boost::filesystem::copy_symlink(entry, dest_path); + } else if (boost::filesystem::is_directory(entry)) { + copy_framework(it->path().string(), dest_path.string()); + } else { + boost::filesystem::copy(entry, dest_path, boost::filesystem::copy_options::overwrite_existing); + } + } + return true; + } catch (const boost::filesystem::filesystem_error &e) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << "Filesystem error: " << e.what(); + } + return false; +} + CopyFileResult check_copy(const std::string &origin, const std::string ©) { boost::nowide::ifstream f1(origin, std::ifstream::in | std::ifstream::binary | std::ifstream::ate); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 4f7f8ef37..6ec78236d 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1773,7 +1773,11 @@ int GUI_App::install_plugin(std::string name, std::string package_name, InstallP if (S_ISLNK(stat.m_external_attr >> 16)) { std::string link(stat.m_uncomp_size + 1, 0); res = mz_zip_reader_extract_to_mem(&archive, stat.m_file_index, link.data(), stat.m_uncomp_size, 0); - boost::filesystem::create_symlink(link, dest_path); + try { + boost::filesystem::create_symlink(link, dest_path); + } catch (const std::exception &e) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " create_symlink:" << e.what(); + } } else { #endif res = mz_zip_reader_extract_to_file(&archive, stat.m_file_index, dest_zip_file.c_str(), 0); @@ -1794,26 +1798,6 @@ int GUI_App::install_plugin(std::string name, std::string package_name, InstallP return InstallStatusUnzipFailed; } } - else { - if (pro_fn) { - pro_fn(InstallStatusNormal, 50 + i/num_entries, cancel); - } - try { - auto backup_path = boost::filesystem::path(backup_folder.string() + "/" + dest_file); - if (fs::exists(backup_path)) - fs::remove(backup_path); - std::string error_message; - CopyFileResult cfr = copy_file(dest_path.string(), backup_path.string(), error_message, false); - if (cfr != CopyFileResult::SUCCESS) { - BOOST_LOG_TRIVIAL(error) << "Copying to backup failed(" << cfr << "): " << error_message; - } - } - catch (const std::exception& e) - { - BOOST_LOG_TRIVIAL(error) << "Copying to backup failed: " << e.what(); - //continue - } - } } catch (const std::exception& e) { @@ -1833,7 +1817,38 @@ int GUI_App::install_plugin(std::string name, std::string package_name, InstallP } close_zip_reader(&archive); - + { + fs::path dir_path(plugin_folder); + if (fs::exists(dir_path) && fs::is_directory(dir_path)) { + int file_count = 0, file_index = 0; + for (fs::directory_iterator it(dir_path); it != fs::directory_iterator(); ++it) { + if (fs::is_regular_file(it->status())) { ++file_count; } + } + for (fs::directory_iterator it(dir_path); it != fs::directory_iterator(); ++it) { + BOOST_LOG_TRIVIAL(info) << " current path:" << it->path().string(); + if (it->path().string() == backup_folder) { + continue; + } + auto dest_path = backup_folder.string() + "/" + it->path().filename().string(); + if (fs::is_regular_file(it->status())) { + BOOST_LOG_TRIVIAL(info) << " copy file:" << it->path().string() << "," << it->path().filename(); + try { + if (pro_fn) { pro_fn(InstallStatusNormal, 50 + file_index / file_count, cancel); } + file_index++; + if (fs::exists(dest_path)) { fs::remove(dest_path); } + std::string error_message; + CopyFileResult cfr = copy_file(it->path().string(), dest_path, error_message, false); + if (cfr != CopyFileResult::SUCCESS) { BOOST_LOG_TRIVIAL(error) << "Copying to backup failed(" << cfr << "): " << error_message; } + } catch (const std::exception &e) { + BOOST_LOG_TRIVIAL(error) << "Copying to backup failed: " << e.what(); + } + } else { + BOOST_LOG_TRIVIAL(info) << " copy framework:" << it->path().string() << "," << it->path().filename(); + copy_framework(it->path().string(), dest_path); + } + } + } + } if (pro_fn) pro_fn(InstallStatusInstallCompleted, 100, cancel); if (name == "plugins")