From b2cc4b8310ea2bb23514a369fb846819d392be9f Mon Sep 17 00:00:00 2001 From: Ian McInerney Date: Sun, 12 Nov 2023 20:42:45 +0000 Subject: [PATCH] Warn when installing PCM local package that is incompatible Fixes https://gitlab.com/kicad/code/kicad/-/issues/14243 --- kicad/pcm/pcm.cpp | 8 ++++---- kicad/pcm/pcm.h | 20 ++++++++++---------- kicad/pcm/pcm_task_manager.cpp | 10 ++++++++++ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/kicad/pcm/pcm.cpp b/kicad/pcm/pcm.cpp index 8afa256b0b..ba466cac5f 100644 --- a/kicad/pcm/pcm.cpp +++ b/kicad/pcm/pcm.cpp @@ -179,7 +179,7 @@ PLUGIN_CONTENT_MANAGER::PLUGIN_CONTENT_MANAGER( std::for_each( m_installed.begin(), m_installed.end(), [&]( std::pair& entry ) { - preparePackage( entry.second.package ); + PreparePackage( entry.second.package ); } ); } @@ -442,7 +442,7 @@ bool PLUGIN_CONTENT_MANAGER::CacheRepository( const wxString& aRepositoryId ) for( size_t i = 0; i < saved_repo.package_list.size(); i++ ) { - preparePackage( saved_repo.package_list[i] ); + PreparePackage( saved_repo.package_list[i] ); saved_repo.package_map[saved_repo.package_list[i].identifier] = i; } @@ -472,7 +472,7 @@ bool PLUGIN_CONTENT_MANAGER::CacheRepository( const wxString& aRepositoryId ) for( size_t i = 0; i < current_repo.package_list.size(); i++ ) { - preparePackage( current_repo.package_list[i] ); + PreparePackage( current_repo.package_list[i] ); current_repo.package_map[current_repo.package_list[i].identifier] = i; } @@ -612,7 +612,7 @@ void PLUGIN_CONTENT_MANAGER::updateInstalledPackagesMetadata( const wxString& aR } -void PLUGIN_CONTENT_MANAGER::preparePackage( PCM_PACKAGE& aPackage ) +void PLUGIN_CONTENT_MANAGER::PreparePackage( PCM_PACKAGE& aPackage ) { // Parse package version strings for( PACKAGE_VERSION& ver : aPackage.versions ) diff --git a/kicad/pcm/pcm.h b/kicad/pcm/pcm.h index 4285d60e7e..c670943dcf 100644 --- a/kicad/pcm/pcm.h +++ b/kicad/pcm/pcm.h @@ -342,6 +342,16 @@ public: */ void ReadEnvVar(); + /** + * @brief Parses version strings and calculates compatibility + * + * This should be called after loading package metadata from repository or from + * installation entries + * + * @param aPackage package metadata object + */ + static void PreparePackage( PCM_PACKAGE& aPackage ); + private: ///< Default download limit of 10 Mb to not use too much memory static constexpr size_t DEFAULT_DOWNLOAD_MEM_LIMIT = 10 * 1024 * 1024; @@ -378,16 +388,6 @@ private: */ void updateInstalledPackagesMetadata( const wxString& aRepositoryId ); - /** - * @brief Parses version strings and calculates compatibility - * - * This should be called after loading package metadata from repository or from - * installation entries - * - * @param aPackage package metadata object - */ - static void preparePackage( PCM_PACKAGE& aPackage ); - ///< Returns current UTC timestamp time_t getCurrentTimestamp() const; diff --git a/kicad/pcm/pcm_task_manager.cpp b/kicad/pcm/pcm_task_manager.cpp index 91aaeebbae..658375cb10 100644 --- a/kicad/pcm/pcm_task_manager.cpp +++ b/kicad/pcm/pcm_task_manager.cpp @@ -371,6 +371,7 @@ PCM_TASK_MANAGER::STATUS PCM_TASK_MANAGER::InstallFromFile( wxWindow* aPar } PCM_PACKAGE package = metadata.get(); + PLUGIN_CONTENT_MANAGER::PreparePackage( package ); if( package.versions.size() != 1 ) { @@ -378,6 +379,15 @@ PCM_TASK_MANAGER::STATUS PCM_TASK_MANAGER::InstallFromFile( wxWindow* aPar return PCM_TASK_MANAGER::STATUS::FAILED; } + if( !package.versions[0].compatible + && wxMessageBox( _( "This package version is incompatible with your kicad version or " + "platform. Are you sure you want to install it anyway?" ), + _( "Install package" ), wxICON_EXCLAMATION | wxYES_NO, aParent ) + == wxNO ) + { + return PCM_TASK_MANAGER::STATUS::FAILED; + } + bool isUpdate = false; // wxRegEx is not CopyConstructible hence the weird choice of forward_list std::forward_list keep_on_update;