11#include " engine_service.h"
22#include < cstdlib>
33#include < filesystem>
4- #include < iostream>
54#include < optional>
65#include " algorithm"
76#include " utils/archive_utils.h"
@@ -74,6 +73,9 @@ cpp::result<void, std::string> EngineService::InstallEngineAsyncV2(
7473 const std::string& engine, const std::string& version,
7574 const std::string& variant_name) {
7675 auto ne = NormalizeEngine (engine);
76+ CTL_INF (" InstallEngineAsyncV2: " << ne << " , " << version << " , "
77+ << variant_name);
78+
7779 auto result = DownloadEngineV2 (ne, version, variant_name, true /* async*/ );
7880 if (result.has_error ()) {
7981 return result;
@@ -173,7 +175,6 @@ cpp::result<bool, std::string> EngineService::UninstallEngineVariant(
173175 auto ne = NormalizeEngine (engine);
174176 auto engine_path =
175177 file_manager_utils::GetEnginesContainerPath () / ne / variant / version;
176- std::cout << " engine_path: " << engine_path.string () << std::endl;
177178 if (!std::filesystem::exists (engine_path)) {
178179 return cpp::fail (" Engine " + ne + " is not installed!" );
179180 }
@@ -259,7 +260,7 @@ cpp::result<void, std::string> EngineService::DownloadEngineV2(
259260 .downloadUrl = selected_variant->browser_download_url ,
260261 .localPath = variant_path,
261262 }}}};
262- std::cout << downloadTask. ToString () << std::endl;
263+
263264 auto add_task_result = download_service_->AddTask (downloadTask, on_finished);
264265 if (res.has_error ()) {
265266 return cpp::fail (res.error ());
@@ -540,12 +541,8 @@ cpp::result<bool, std::string> EngineService::IsEngineVariantReady(
540541 auto ne = NormalizeEngine (engine);
541542 auto normalized_version = string_utils::RemoveSubstring (version, " v" );
542543 auto installed_engines = GetInstalledEngineVariants (ne);
543- if (installed_engines.has_error ()) {
544- return cpp::fail (" Failed to get installed engines: " +
545- installed_engines.error ());
546- }
547544
548- for (const auto & installed_engine : installed_engines. value () ) {
545+ for (const auto & installed_engine : installed_engines) {
549546 if (installed_engine.name == variant &&
550547 installed_engine.version == normalized_version) {
551548 return true ;
@@ -564,8 +561,8 @@ EngineService::GetDefaultEngineVariant(const std::string& engine) {
564561 return default_variants_[ne];
565562}
566563
567- cpp::result< std::vector<EngineVariantResponse>, std::string>
568- EngineService::GetInstalledEngineVariants ( const std::string& engine) const {
564+ std::vector<EngineVariantResponse> EngineService::GetInstalledEngineVariants (
565+ const std::string& engine) const {
569566 auto ne = NormalizeEngine (engine);
570567 auto engines_variants_dir =
571568 file_manager_utils::GetEnginesContainerPath () / ne;
@@ -774,12 +771,6 @@ cpp::result<bool, std::string> EngineService::IsEngineReady(
774771 const std::string& engine) const {
775772 auto ne = NormalizeEngine (engine);
776773 auto installed_variants = GetInstalledEngineVariants (engine);
777- if (installed_variants.has_error ()) {
778- CTL_WRN (" Failed to get installed engine variants: " +
779- installed_variants.error ());
780- return cpp::fail (" Failed to get installed engine variants: " +
781- installed_variants.error ());
782- }
783774
784775 auto os = hw_inf_.sys_inf ->os ;
785776 if (os == kMacOs && (ne == kOnnxRepo || ne == kTrtLlmRepo )) {
@@ -790,5 +781,62 @@ cpp::result<bool, std::string> EngineService::IsEngineReady(
790781 return cpp::fail (" Engine " + engine + " is not supported on Linux" );
791782 }
792783
793- return installed_variants.value ().size () > 0 ;
784+ return installed_variants.size () > 0 ;
785+ }
786+
787+ cpp::result<EngineUpdateResult, std::string> EngineService::UpdateEngine (
788+ const std::string& engine) {
789+ auto ne = NormalizeEngine (engine);
790+ auto default_variant = GetDefaultEngineVariant (ne);
791+
792+ if (default_variant.has_error ()) {
793+ // if we don't have a default variant, just stop
794+ CTL_INF (" No default variant found for " << ne << " . Exit update engine" );
795+ return cpp::fail (default_variant.error ());
796+ }
797+ CTL_INF (" Default variant: " << default_variant->variant
798+ << " , version: " + default_variant->version );
799+
800+ auto latest_version = GetLatestEngineVersion (ne);
801+ if (latest_version.has_error ()) {
802+ // if can't get latest version, stop
803+ CTL_INF (" Can't get latest version for "
804+ << ne << " error: " << latest_version.error ());
805+ return cpp::fail (" Failed to get latest version: " + latest_version.error ());
806+ }
807+ CTL_INF (" Latest version: " + latest_version.value ().name );
808+
809+ // check if local engines variants if latest version already exist
810+ auto installed_variants = GetInstalledEngineVariants (ne);
811+
812+ bool is_installed = false ;
813+ for (const auto & v : installed_variants) {
814+ CTL_INF (" Installed version: " + v.version );
815+ if (default_variant->variant == v.name &&
816+ v.version == latest_version.value ().name ) {
817+ is_installed = true ;
818+ break ;
819+ }
820+ }
821+
822+ if (is_installed) {
823+ CTL_INF (" Engine " + ne + " , " + default_variant->variant +
824+ " is already up-to-date! Version " +
825+ latest_version.value ().tag_name );
826+ return cpp::fail (" Engine " + ne + " , " + default_variant->variant +
827+ " is already up-to-date! Version " +
828+ latest_version.value ().tag_name );
829+ }
830+
831+ CTL_INF (" Engine variant "
832+ << default_variant->variant << " is not up-to-date! Current: "
833+ << default_variant->version << " , latest: " << latest_version->name );
834+
835+ auto res = InstallEngineAsyncV2 (engine, latest_version->tag_name ,
836+ default_variant->variant );
837+
838+ return EngineUpdateResult{.engine = engine,
839+ .variant = default_variant->variant ,
840+ .from = default_variant->version ,
841+ .to = latest_version->name };
794842}
0 commit comments