@@ -71,12 +71,12 @@ std::string GetEnginePath(std::string_view e) {
7171
7272cpp::result<void , std::string> EngineService::InstallEngineAsyncV2 (
7373 const std::string& engine, const std::string& version,
74- const std::string& variant_name) {
74+ const std::optional<std:: string> variant_name) {
7575 auto ne = NormalizeEngine (engine);
7676 CTL_INF (" InstallEngineAsyncV2: " << ne << " , " << version << " , "
77- << variant_name);
77+ << variant_name. value_or ( " " ) );
7878
79- auto result = DownloadEngineV2 (ne, version, variant_name, true /* async */ );
79+ auto result = DownloadEngineV2 (ne, version, variant_name);
8080 if (result.has_error ()) {
8181 return result;
8282 }
@@ -191,21 +191,11 @@ cpp::result<bool, std::string> EngineService::UninstallEngineVariant(
191191
192192cpp::result<void , std::string> EngineService::DownloadEngineV2 (
193193 const std::string& engine, const std::string& version,
194- const std::string& variant_name, bool async) {
194+ const std::optional<std::string> variant_name) {
195+ auto normalized_version = version == " latest"
196+ ? " latest"
197+ : string_utils::RemoveSubstring (version, " v" );
195198
196- // check if engine variant is installed
197- bool is_installed = false ;
198- if (is_installed) {
199- // set default
200- // TODO: namh implement this
201- return {};
202- }
203-
204- // TODO: namh add back the github_token
205-
206- auto normalized_version = string_utils::RemoveSubstring (version, " v" );
207- auto merged_variant_name =
208- engine + " -" + normalized_version + " -" + variant_name + " .tar.gz" ;
209199 auto res = GetEngineVariants (engine, version);
210200 if (res.has_error ()) {
211201 return cpp::fail (" Failed to fetch engine releases: " + res.error ());
@@ -216,33 +206,70 @@ cpp::result<void, std::string> EngineService::DownloadEngineV2(
216206 }
217207
218208 std::optional<EngineVariant> selected_variant = std::nullopt ;
219- for (const auto & asset : res.value ()) {
220- if (asset.name == merged_variant_name) {
221- selected_variant = asset;
222- break ;
209+
210+ if (variant_name.has_value ()) {
211+ auto merged_variant_name = engine + " -" + normalized_version + " -" +
212+ variant_name.value () + " .tar.gz" ;
213+
214+ for (const auto & asset : res.value ()) {
215+ if (asset.name == merged_variant_name) {
216+ selected_variant = asset;
217+ break ;
218+ }
219+ }
220+ } else {
221+ std::vector<std::string> variants;
222+ for (const auto & asset : res.value ()) {
223+ variants.push_back (asset.name );
224+ }
225+
226+ auto matched_variant_name = GetMatchedVariant (engine, variants);
227+ for (const auto & v : res.value ()) {
228+ if (v.name == matched_variant_name) {
229+ selected_variant = v;
230+ break ;
231+ }
223232 }
224233 }
225234
226235 if (selected_variant == std::nullopt ) {
227- return cpp::fail (" Not found variant: " + variant_name );
236+ return cpp::fail (" Failed to find a suitable variant for " + engine );
228237 }
238+ auto normalize_version = " v" + selected_variant->version ;
239+
240+ auto variant_folder_name = engine_matcher_utils::GetVariantFromNameAndVersion (
241+ selected_variant->name , engine, selected_variant->version );
229242
230- auto engine_folder_path =
231- file_manager_utils::GetEnginesContainerPath () / engine;
232- auto variant_folder_path = engine_folder_path / variant_name / version;
233- auto variant_path = variant_folder_path / merged_variant_name;
243+ auto variant_folder_path = file_manager_utils::GetEnginesContainerPath () /
244+ engine / variant_folder_name.value () /
245+ normalize_version;
246+
247+ auto variant_path = variant_folder_path / selected_variant->name ;
234248 std::filesystem::create_directories (variant_folder_path);
235249 CLI_LOG (" variant_folder_path: " + variant_folder_path.string ());
236-
237- auto on_finished = [ ](const DownloadTask& finishedTask) {
250+ auto on_finished = [ this , engine, selected_variant,
251+ normalize_version ](const DownloadTask& finishedTask) {
238252 // try to unzip the downloaded file
239253 CLI_LOG (" Engine zip path: " << finishedTask.items [0 ].localPath .string ());
254+ CLI_LOG (" Version: " + normalize_version);
240255
241256 auto extract_path = finishedTask.items [0 ].localPath .parent_path ();
242257
243258 archive_utils::ExtractArchive (finishedTask.items [0 ].localPath .string (),
244259 extract_path.string (), true );
245260
261+ auto variant = engine_matcher_utils::GetVariantFromNameAndVersion (
262+ selected_variant->name , engine, normalize_version);
263+ CLI_LOG (" Extracted variant: " + variant.value ());
264+ // set as default
265+ auto res =
266+ SetDefaultEngineVariant (engine, normalize_version, variant.value ());
267+ if (res.has_error ()) {
268+ CTL_ERR (" Failed to set default engine variant: " << res.error ());
269+ } else {
270+ CTL_INF (" Set default engine variant: " << res.value ().variant );
271+ }
272+
246273 // remove the downloaded file
247274 try {
248275 std::filesystem::remove (finishedTask.items [0 ].localPath );
@@ -270,33 +297,6 @@ cpp::result<void, std::string> EngineService::DownloadEngineV2(
270297
271298cpp::result<bool , std::string> EngineService::DownloadEngine (
272299 const std::string& engine, const std::string& version, bool async) {
273-
274- // auto get_params = [&engine, &version]() -> std::vector<std::string> {
275- // if (version == "latest") {
276- // return {"repos", "janhq", engine, "releases", version};
277- // } else {
278- // return {"repos", "janhq", engine, "releases"};
279- // }
280- // };
281- //
282- // auto url_obj = url_parser::Url{
283- // .protocol = "https",
284- // .host = "api.github.com",
285- // .pathParams = get_params(),
286- // };
287-
288- // std::unordered_map<std::string, std::string> headers;
289-
290- // Check if GITHUB_TOKEN env exist
291- // const char* github_token = std::getenv("GITHUB_TOKEN");
292- // if (github_token) {
293- // std::string auth_header = "token " + std::string(github_token);
294- // headers.insert({"Authorization", auth_header});
295- // CTL_INF("Using authentication with GitHub token.");
296- // } else {
297- // CTL_INF("No GitHub token found. Sending request without authentication.");
298- // }
299-
300300 auto res = GetEngineVariants (engine, version);
301301 if (res.has_error ()) {
302302 return cpp::fail (" Failed to fetch engine releases: " + res.error ());
@@ -335,7 +335,6 @@ cpp::result<bool, std::string> EngineService::DownloadEngine(
335335 CTL_INF (" Creating " << engine_folder_path.string ());
336336 std::filesystem::create_directories (engine_folder_path);
337337 }
338-
339338 CTL_INF (" Engine folder path: " << engine_folder_path.string () << " \n " );
340339 auto local_path = engine_folder_path / asset.name ;
341340 auto downloadTask{
@@ -549,7 +548,11 @@ cpp::result<bool, std::string> EngineService::IsEngineVariantReady(
549548 auto normalized_version = string_utils::RemoveSubstring (version, " v" );
550549 auto installed_engines = GetInstalledEngineVariants (ne);
551550
551+ CLI_LOG (" IsEngineVariantReady: " << ne << " , " << normalized_version << " , "
552+ << variant);
552553 for (const auto & installed_engine : installed_engines) {
554+ CLI_LOG (" Installed: name: " + installed_engine.name +
555+ " , version: " + installed_engine.version );
553556 if (installed_engine.name == variant &&
554557 installed_engine.version == normalized_version) {
555558 return true ;
0 commit comments